Whamcloud - gitweb
851e64c71f53818315ab6f4f2d14e0816d5e575b
[fs/lustre-release.git] / lustre / tests / conf-sanity.sh
1 #!/bin/bash
2
3 set -e
4
5 ONLY=${ONLY:-"$*"}
6
7 # bug number for skipped test:  LU-8972
8 ALWAYS_EXCEPT="$CONF_SANITY_EXCEPT 101"
9 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
10
11 is_sles11()                                             # LU-2181
12 {
13         if [ -r /etc/SuSE-release ]
14         then
15                 local vers=$(grep VERSION /etc/SuSE-release | awk '{print $3}')
16                 local patchlev=$(grep PATCHLEVEL /etc/SuSE-release |
17                         awk '{ print $3 }')
18                 if [ $vers -eq 11 ] && [ $patchlev -eq 2 ]
19                 then
20                         return 0
21                 fi
22         fi
23         return 1
24 }
25
26 if [ "$FAILURE_MODE" = "HARD" ]; then
27         CONFIG_EXCEPTIONS="24a " &&
28         echo "Except the tests: $CONFIG_EXCEPTIONS for " \
29              "FAILURE_MODE=$FAILURE_MODE, b=23573" &&
30                 ALWAYS_EXCEPT="$ALWAYS_EXCEPT $CONFIG_EXCEPTIONS"
31 fi
32
33 # bug number for skipped test:
34 # a tool to create lustre filesystem images
35 ALWAYS_EXCEPT="32newtarball $ALWAYS_EXCEPT"
36
37 SRCDIR=$(dirname $0)
38 PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH
39
40 PTLDEBUG=${PTLDEBUG:--1}
41 SAVE_PWD=$PWD
42 LUSTRE=${LUSTRE:-$(dirname $0)/..}
43 RLUSTRE=${RLUSTRE:-$LUSTRE}
44 export MULTIOP=${MULTIOP:-multiop}
45
46 . $LUSTRE/tests/test-framework.sh
47 init_test_env $@
48 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
49
50 # use small MDS + OST size to speed formatting time
51 # do not use too small MDSSIZE/OSTSIZE, which affect the default journal size
52 # STORED_MDSSIZE is used in test_18
53 STORED_MDSSIZE=$MDSSIZE
54 STORED_OSTSIZE=$OSTSIZE
55 MDSSIZE=200000
56 OSTSIZE=200000
57
58 fs2mds_HOST=$mds_HOST
59 fs2ost_HOST=$ost_HOST
60 fs3ost_HOST=$ost_HOST
61
62 MDSDEV1_2=$fs2mds_DEV
63 OSTDEV1_2=$fs2ost_DEV
64 OSTDEV2_2=$fs3ost_DEV
65
66 if ! combined_mgs_mds; then
67         # bug number for skipped test: LU-9860 LU-9860 LU-9860
68         ALWAYS_EXCEPT="$ALWAYS_EXCEPT  43b     53b     54b"
69         # bug number for skipped test: LU-9875 LU-9879 LU-9879 LU-9879 LU-9879
70         ALWAYS_EXCEPT="$ALWAYS_EXCEPT  70e     80      84      87      100"
71         # bug number for skipped test: LU-8110 LU-9400 LU-9879 LU-9879 LU-9879
72         ALWAYS_EXCEPT="$ALWAYS_EXCEPT  102     103     104     105     107"
73 fi
74
75 # pass "-E lazy_itable_init" to mke2fs to speed up the formatting time
76 if [[ "$LDISKFS_MKFS_OPTS" != *lazy_itable_init* ]]; then
77         LDISKFS_MKFS_OPTS=$(csa_add "$LDISKFS_MKFS_OPTS" -E lazy_itable_init)
78 fi
79
80 [ $(facet_fstype $SINGLEMDS) = "zfs" ] &&
81 # bug number for skipped test:
82         ALWAYS_EXCEPT="$ALWAYS_EXCEPT"
83
84 init_logging
85
86 #
87 require_dsh_mds || exit 0
88 require_dsh_ost || exit 0
89
90 #                                  8  22   (min)"
91 [ "$SLOW" = "no" ] && EXCEPT_SLOW="45 69"
92
93 assert_DIR
94
95 gen_config() {
96         # The MGS must be started before the OSTs for a new fs, so start
97         # and stop to generate the startup logs.
98         start_mds
99         start_ost
100         wait_osc_import_state mds ost FULL
101         stop_ost
102         stop_mds
103 }
104
105 reformat_and_config() {
106         reformat
107         if ! combined_mgs_mds ; then
108                 start_mgs
109         fi
110         gen_config
111 }
112
113 writeconf_or_reformat() {
114         # There are at most 2 OSTs for write_conf test
115         # who knows if/where $TUNEFS is installed?
116         # Better reformat if it fails...
117         writeconf_all $MDSCOUNT 2 ||
118                 { echo "tunefs failed, reformatting instead" &&
119                   reformat_and_config && return 0; }
120         return 0
121 }
122
123 reformat() {
124         formatall
125 }
126
127 start_mgs () {
128         echo "start mgs"
129         start mgs $(mgsdevname) $MGS_MOUNT_OPTS
130 }
131
132 start_mdt() {
133         local num=$1
134         local facet=mds$num
135         local dev=$(mdsdevname $num)
136         shift 1
137
138         echo "start mds service on `facet_active_host $facet`"
139         start $facet ${dev} $MDS_MOUNT_OPTS $@ || return 94
140 }
141
142 stop_mdt() {
143         local num=$1
144         local facet=mds$num
145         local dev=$(mdsdevname $num)
146         shift 1
147
148         echo "stop mds service on `facet_active_host $facet`"
149         # These tests all use non-failover stop
150         stop $facet -f || return 97
151 }
152
153 start_mds() {
154         local num
155
156         for num in $(seq $MDSCOUNT); do
157                 start_mdt $num $@ || return 94
158         done
159 }
160
161 start_mgsmds() {
162         if ! combined_mgs_mds ; then
163                 start_mgs
164         fi
165         start_mds $@
166 }
167
168 stop_mds() {
169         local num
170         for num in $(seq $MDSCOUNT); do
171                 stop_mdt $num || return 97
172         done
173 }
174
175 stop_mgs() {
176        echo "stop mgs service on `facet_active_host mgs`"
177        # These tests all use non-failover stop
178        stop mgs -f  || return 97
179 }
180
181 start_ost() {
182         echo "start ost1 service on `facet_active_host ost1`"
183         start ost1 $(ostdevname 1) $OST_MOUNT_OPTS $@ || return 95
184 }
185
186 stop_ost() {
187         echo "stop ost1 service on `facet_active_host ost1`"
188         # These tests all use non-failover stop
189         stop ost1 -f || return 98
190 }
191
192 start_ost2() {
193         echo "start ost2 service on `facet_active_host ost2`"
194         start ost2 $(ostdevname 2) $OST_MOUNT_OPTS $@ || return 92
195 }
196
197 stop_ost2() {
198         echo "stop ost2 service on `facet_active_host ost2`"
199         # These tests all use non-failover stop
200         stop ost2 -f || return 93
201 }
202
203 mount_client() {
204         local MOUNTPATH=$1
205         echo "mount $FSNAME on ${MOUNTPATH}....."
206         zconf_mount $(hostname) $MOUNTPATH || return 96
207 }
208
209 remount_client() {
210         local mountopt="remount,$1"
211         local MOUNTPATH=$2
212         echo "remount '$1' lustre on ${MOUNTPATH}....."
213         zconf_mount $(hostname) $MOUNTPATH "$mountopt" || return 96
214 }
215
216 umount_client() {
217         local mountpath=$1
218         shift
219         echo "umount lustre on $mountpath....."
220         zconf_umount $HOSTNAME $mountpath $@ || return 97
221 }
222
223 manual_umount_client(){
224         local rc
225         local FORCE=$1
226         echo "manual umount lustre on ${MOUNT}...."
227         do_facet client "umount ${FORCE} $MOUNT"
228         rc=$?
229         return $rc
230 }
231
232 setup() {
233         start_mds || error "MDT start failed"
234         start_ost || error "Unable to start OST1"
235         mount_client $MOUNT || error "client start failed"
236         client_up || error "client_up failed"
237 }
238
239 setup_noconfig() {
240         start_mgsmds
241         start_ost
242         mount_client $MOUNT
243 }
244
245 unload_modules_conf () {
246         if combined_mgs_mds || ! local_mode; then
247                 unload_modules || return 1
248         fi
249 }
250
251 cleanup_nocli() {
252         stop_ost || return 202
253         stop_mds || return 201
254         unload_modules_conf || return 203
255 }
256
257 cleanup() {
258         local force=""
259         [ "x$1" != "x" ] && force='-f'
260         umount_client $MOUNT $force|| return 200
261         cleanup_nocli || return $?
262 }
263
264 cleanup_fs2() {
265         trap 0
266         echo "umount $MOUNT2 ..."
267         umount $MOUNT2 || true
268         echo "stopping fs2mds ..."
269         stop fs2mds -f || true
270         echo "stopping fs2ost ..."
271         stop fs2ost -f || true
272 }
273
274 check_mount() {
275         do_facet client "cp /etc/passwd $DIR/a" || return 71
276         do_facet client "rm $DIR/a" || return 72
277         # make sure lustre is actually mounted (touch will block,
278         # but grep won't, so do it after)
279         do_facet client "grep $MOUNT' ' /proc/mounts > /dev/null" || return 73
280         echo "setup single mount lustre success"
281 }
282
283 check_mount2() {
284         do_facet client "touch $DIR/a" || return 71
285         do_facet client "rm $DIR/a" || return 72
286         do_facet client "touch $DIR2/a" || return 73
287         do_facet client "rm $DIR2/a" || return 74
288         echo "setup double mount lustre success"
289 }
290
291 build_test_filter
292
293 if [ "$ONLY" == "setup" ]; then
294         setup
295         exit
296 fi
297
298 if [ "$ONLY" == "cleanup" ]; then
299         cleanup
300         exit
301 fi
302
303 init_gss
304
305 #create single point mountpoint
306
307 reformat_and_config
308
309 test_0() {
310         setup
311         check_mount || error "check_mount failed"
312         cleanup || error "cleanup failed with $?"
313 }
314 run_test 0 "single mount setup"
315
316 test_1() {
317         start_mds || error "MDS start failed"
318         start_ost || error "unable to start OST"
319         echo "start ost second time..."
320         start_ost && error "2nd OST start should fail"
321         mount_client $MOUNT || error "client start failed"
322         check_mount || error "check_mount failed"
323         cleanup || error "cleanup failed with $?"
324 }
325 run_test 1 "start up ost twice (should return errors)"
326
327 test_2() {
328         start_mds || error "MDT start failed"
329         echo "start mds second time.."
330         start_mds && error "2nd MDT start should fail"
331         start_ost || error "OST start failed"
332         mount_client $MOUNT || error "mount_client failed to start client"
333         check_mount || error "check_mount failed"
334         cleanup || error "cleanup failed with $?"
335 }
336 run_test 2 "start up mds twice (should return err)"
337
338 test_3() {
339         setup
340         #mount.lustre returns an error if already in mtab
341         mount_client $MOUNT && error "2nd client mount should fail"
342         check_mount || error "check_mount failed"
343         cleanup || error "cleanup failed with $?"
344 }
345 run_test 3 "mount client twice (should return err)"
346
347 test_4() {
348         setup
349         touch $DIR/$tfile || error "touch $DIR/$tfile failed"
350         stop_ost || error "Unable to stop OST1"
351         umount_client $MOUNT -f || error “unmount $MOUNT failed”
352         cleanup_nocli
353         eno=$?
354         # ok for ost to fail shutdown
355         if [ 202 -ne $eno ] && [ 0 -ne $eno ]; then
356                 error "cleanup failed with $?"
357         fi
358 }
359 run_test 4 "force cleanup ost, then cleanup"
360
361 test_5a() {     # was test_5
362         setup
363         touch $DIR/$tfile || error "touch $DIR/$tfile failed"
364         fuser -m -v $MOUNT && echo "$MOUNT is in use by user space process."
365
366         stop_mds || error "Unable to stop MDS"
367
368         # cleanup may return an error from the failed
369         # disconnects; for now I'll consider this successful
370         # if all the modules have unloaded.
371         $UMOUNT -f $MOUNT &
372         UMOUNT_PID=$!
373         sleep 6
374         echo "killing umount"
375         kill -TERM $UMOUNT_PID
376         echo "waiting for umount to finish"
377         wait $UMOUNT_PID
378         if grep " $MOUNT " /proc/mounts; then
379                 echo "test 5: /proc/mounts after failed umount"
380                 umount -f $MOUNT &
381                 UMOUNT_PID=$!
382                 sleep 2
383                 echo "killing umount"
384                 kill -TERM $UMOUNT_PID
385                 echo "waiting for umount to finish"
386                 wait $UMOUNT_PID
387                 grep " $MOUNT " /proc/mounts &&
388                         error "/proc/mounts after second umount"
389         fi
390
391         # manual_mount_client may fail due to umount succeeding above
392         manual_umount_client
393         # stop_mds is a no-op here, and should not fail
394         cleanup_nocli || error "cleanup_nocli failed with $?"
395         # df may have lingering entry
396         manual_umount_client
397         # mtab may have lingering entry
398         local WAIT=0
399         local MAX_WAIT=20
400         local sleep=1
401         while [ "$WAIT" -ne "$MAX_WAIT" ]; do
402                 sleep $sleep
403                 grep -q $MOUNT" " /etc/mtab || break
404                 echo "Waiting /etc/mtab updated ... "
405                 WAIT=$(( WAIT + sleep))
406         done
407         [ "$WAIT" -eq "$MAX_WAIT" ] &&
408                 error "/etc/mtab is not updated in $WAIT secs"
409         echo "/etc/mtab updated in $WAIT secs"
410 }
411 run_test 5a "force cleanup mds, then cleanup"
412
413 cleanup_5b () {
414         trap 0
415         start_mgs
416 }
417
418 test_5b() {
419         grep " $MOUNT " /etc/mtab &&
420                 error false "unexpected entry in mtab before mount" && return 10
421
422         start_ost || error "OST start failed"
423         if ! combined_mgs_mds ; then
424                 trap cleanup_5b EXIT ERR
425                 start_mds || error "MDS start failed"
426                 stop mgs
427         fi
428
429         mount_client $MOUNT && error "mount_client $MOUNT should fail"
430         grep " $MOUNT " /etc/mtab &&
431                 error "$MOUNT entry in mtab after failed mount"
432         umount_client $MOUNT
433         # stop_mds is a no-op here, and should not fail
434         cleanup_nocli || error "cleanup_nocli failed with $?"
435         if ! combined_mgs_mds ; then
436                 cleanup_5b
437         fi
438 }
439 run_test 5b "Try to start a client with no MGS (should return errs)"
440
441 test_5c() {
442         grep " $MOUNT " /etc/mtab &&
443                 error false "unexpected entry in mtab before mount" && return 10
444
445         start_mds || error "MDS start failed"
446         start_ost || error "OST start failed"
447         local oldfs="${FSNAME}"
448         FSNAME="wrong.${FSNAME}"
449         mount_client $MOUNT || :
450         FSNAME=${oldfs}
451         grep " $MOUNT " /etc/mtab &&
452                 error "$MOUNT entry in mtab after failed mount"
453         umount_client $MOUNT
454         cleanup_nocli || error "cleanup_nocli failed with $?"
455 }
456 run_test 5c "cleanup after failed mount (bug 2712) (should return errs)"
457
458 test_5d() {
459         grep " $MOUNT " /etc/mtab &&
460                 error "unexpected entry in mtab before mount"
461
462         start_ost || error "OST start failed"
463         start_mds || error "MDS start failed"
464         stop_ost -f || error "Unable to stop OST1"
465         mount_client $MOUNT || error "mount_client $MOUNT failed"
466         umount_client $MOUNT -f || error "umount_client $MOUNT failed"
467         cleanup_nocli || error "cleanup_nocli failed with $?"
468         ! grep " $MOUNT " /etc/mtab ||
469                 error "$MOUNT entry in mtab after unmount"
470 }
471 run_test 5d "mount with ost down"
472
473 test_5e() {
474         grep " $MOUNT " /etc/mtab &&
475                 error false "unexpected entry in mtab before mount" && return 10
476
477         start_mds || error "MDS start failed"
478         start_ost || error "OST start failed"
479
480         #define OBD_FAIL_PTLRPC_DELAY_SEND       0x506
481         do_facet client "$LCTL set_param fail_loc=0x80000506"
482         mount_client $MOUNT || echo "mount failed (not fatal)"
483         cleanup || error "cleanup failed with $?"
484         grep " $MOUNT " /etc/mtab &&
485                 error "$MOUNT entry in mtab after unmount"
486         pass
487 }
488 run_test 5e "delayed connect, don't crash (bug 10268)"
489
490 test_5f() {
491         if combined_mgs_mds ; then
492                 skip "needs separate mgs and mds"
493                 return 0
494         fi
495
496         grep " $MOUNT " /etc/mtab &&
497                 error false "unexpected entry in mtab before mount" && return 10
498
499         local rc=0
500         start_ost || error "OST start failed"
501         mount_client $MOUNT &
502         local pid=$!
503         echo client_mount pid is $pid
504
505         sleep 5
506
507         if ! ps -f -p $pid >/dev/null; then
508                 wait $pid
509                 rc=$?
510                 grep " $MOUNT " /etc/mtab && echo "test 5f: mtab after mount"
511                 error "mount returns $rc, expected to hang"
512                 rc=11
513                 cleanup || error "cleanup failed with $?"
514                 return $rc
515         fi
516
517         # start mds
518         start_mds || error "start MDS failed"
519
520         # mount should succeed after start mds
521         wait $pid
522         grep " $MOUNT " /etc/mtab && echo "test 5f: mtab after mount"
523         cleanup || error "final call to cleanup failed with rc $?"
524 }
525 run_test 5f "mds down, cleanup after failed mount (bug 2712)"
526
527 test_5g() {
528         modprobe lustre
529         [ $(lustre_version_code client) -lt $(version_code 2.9.53) ] &&
530                 { skip "automount of debugfs missing before 2.9.53" && return 0; }
531         umount /sys/kernel/debug
532         $LCTL get_param -n devices | egrep -v "error" && \
533                 error "lctl can't access debugfs data"
534         grep " debugfs " /etc/mtab || error "debugfs failed to remount"
535 }
536 run_test 5g "handle missing debugfs"
537
538 test_6() {
539         setup
540         manual_umount_client
541         mount_client $MOUNT || error "mount_client $MOUNT failed"
542         touch $DIR/$tfile || error "touch $DIR/$tfile failed"
543         cleanup || error "cleanup failed with rc $?"
544 }
545 run_test 6 "manual umount, then mount again"
546
547 test_7() {
548         setup
549         manual_umount_client
550         cleanup_nocli || error "cleanup_nocli failed with $?"
551 }
552 run_test 7 "manual umount, then cleanup"
553
554 test_8() {
555         setup
556         mount_client $MOUNT2 || error "mount_client $MOUNT2 failed"
557         check_mount2 || error "check_mount2 failed"
558         umount_client $MOUNT2 || error "umount_client $MOUNT2 failed"
559         cleanup || error "cleanup failed with rc $?"
560 }
561 run_test 8 "double mount setup"
562
563 test_9() {
564         start_ost || error "OST start failed"
565
566         do_facet ost1 $LCTL set_param debug=\'inode trace\' ||
567                 error "do_facet ost1 set_param inode trace failed."
568         do_facet ost1 $LCTL set_param subsystem_debug=\'mds ost\' ||
569                 error "do_facet ost1 set_param debug mds ost failed."
570
571         CHECK_PTLDEBUG="`do_facet ost1 $LCTL get_param -n debug`"
572         if [ "$CHECK_PTLDEBUG" ] && { \
573            [ "$CHECK_PTLDEBUG" = "trace inode warning error emerg console" ] ||
574            [ "$CHECK_PTLDEBUG" = "trace inode" ]; }; then
575                 echo "lnet.debug success"
576         else
577                 error "lnet.debug: want 'trace inode', have '$CHECK_PTLDEBUG'"
578         fi
579         CHECK_SUBSYS="`do_facet ost1 $LCTL get_param -n subsystem_debug`"
580         if [ "$CHECK_SUBSYS" ] && [ "$CHECK_SUBSYS" = "mds ost" ]; then
581                 echo "lnet.subsystem_debug success"
582         else
583                 error "lnet.subsystem_debug: want 'mds ost' got '$CHECK_SUBSYS'"
584         fi
585         stop_ost || error "Unable to stop OST1"
586 }
587 run_test 9 "test ptldebug and subsystem for mkfs"
588
589 is_blkdev () {
590         local facet=$1
591         local dev=$2
592         local size=${3:-""}
593
594         local rc=0
595         do_facet $facet "test -b $dev" || rc=1
596         if [[ "$size" ]]; then
597                 local in=$(do_facet $facet "dd if=$dev of=/dev/null bs=1k \
598                            count=1 skip=$size 2>&1" |
599                         awk '($3 == "in") { print $1 }')
600                 [[ $in  = "1+0" ]] || rc=1
601         fi
602         return $rc
603 }
604
605 #
606 # Test 16 was to "verify that lustre will correct the mode of OBJECTS".
607 # But with new MDS stack we don't care about the mode of local objects
608 # anymore, so this test is removed. See bug 22944 for more details.
609 #
610
611 test_17() {
612         if [ $(facet_fstype $SINGLEMDS) != ldiskfs ]; then
613                 skip "ldiskfs only test"
614                 return
615         fi
616
617         setup
618         check_mount || error "check_mount failed"
619         cleanup || error "cleanup failed with rc $?"
620
621         echo "Remove mds config log"
622         if ! combined_mgs_mds ; then
623                 stop mgs
624         fi
625
626         do_facet mgs "$DEBUGFS -w -R 'unlink CONFIGS/$FSNAME-MDT0000' \
627                       $(mgsdevname) || return \$?" ||
628                 error "do_facet mgs failed with $?"
629
630         if ! combined_mgs_mds ; then
631                 start_mgs
632         fi
633
634         start_ost || error "OST start failed"
635         start_mds && error "MDS start succeeded, but should fail"
636         reformat_and_config
637 }
638 run_test 17 "Verify failed mds_postsetup won't fail assertion (2936) (should return errs)"
639
640 test_18() {
641         if [ $(facet_fstype $SINGLEMDS) != ldiskfs ]; then
642                 skip "ldiskfs only test"
643                 return
644         fi
645
646         local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
647
648         local MIN=2000000
649
650         local OK=
651         # check if current MDSSIZE is large enough
652         [ $MDSSIZE -ge $MIN ] && OK=1 && myMDSSIZE=$MDSSIZE &&
653                 log "use MDSSIZE=$MDSSIZE"
654
655         # check if the global config has a large enough MDSSIZE
656         [ -z "$OK" -a ! -z "$STORED_MDSSIZE" ] &&
657                 [ $STORED_MDSSIZE -ge $MIN ] &&
658                 OK=1 && myMDSSIZE=$STORED_MDSSIZE &&
659                 log "use STORED_MDSSIZE=$STORED_MDSSIZE"
660
661         # check if the block device is large enough
662         is_blkdev $SINGLEMDS $MDSDEV $MIN
663         local large_enough=$?
664         if [ -n "$OK" ]; then
665                 [ $large_enough -ne 0 ] && OK=""
666         else
667                 [ $large_enough -eq 0 ] && OK=1 && myMDSSIZE=$MIN &&
668                         log "use device $MDSDEV with MIN=$MIN"
669         fi
670
671         # check if a loopback device has enough space for fs metadata (5%)
672
673         if [ -z "$OK" ]; then
674                 local SPACE=$(do_facet $SINGLEMDS "[ -f $MDSDEV -o ! \
675                               -e $MDSDEV ] && df -P \\\$(dirname $MDSDEV)" |
676                         awk '($1 != "Filesystem") { print $4 }')
677                 ! [ -z "$SPACE" ] && [ $SPACE -gt $((MIN / 20)) ] &&
678                         OK=1 && myMDSSIZE=$MIN &&
679                         log "use file $MDSDEV with MIN=$MIN"
680         fi
681
682         [ -z "$OK" ] && skip_env "$MDSDEV too small for ${MIN}kB MDS" && return
683
684         echo "mount mds with large journal..."
685
686         local OLD_MDSSIZE=$MDSSIZE
687         MDSSIZE=$myMDSSIZE
688
689         reformat_and_config
690         echo "mount lustre system..."
691         setup
692         check_mount || error "check_mount failed"
693
694         echo "check journal size..."
695         local FOUNDSIZE=$(do_facet $SINGLEMDS "$DEBUGFS -c -R 'stat <8>' $MDSDEV" | awk '/Size: / { print $NF; exit;}')
696         if [ $FOUNDSIZE -gt $((32 * 1024 * 1024)) ]; then
697                 log "Success: mkfs creates large journals. Size: $((FOUNDSIZE >> 20))M"
698         else
699                 error "expected journal size > 32M, found $((FOUNDSIZE >> 20))M"
700         fi
701
702         cleanup || error "cleanup failed with rc $?"
703
704         MDSSIZE=$OLD_MDSSIZE
705         reformat_and_config
706 }
707 run_test 18 "check mkfs creates large journals"
708
709 test_19a() {
710         start_mds || error "MDS start failed"
711         stop_mds || error "Unable to stop MDS"
712 }
713 run_test 19a "start/stop MDS without OSTs"
714
715 test_19b() {
716         start_ost || error "Unable to start OST1"
717         stop_ost -f || error "Unable to stop OST1"
718 }
719 run_test 19b "start/stop OSTs without MDS"
720
721 test_20() {
722         # first format the ost/mdt
723         start_mds || error "MDS start failed"
724         start_ost || error "Unable to start OST1"
725         mount_client $MOUNT || error "mount_client $MOUNT failed"
726         check_mount || error "check_mount failed"
727         rm -f $DIR/$tfile || error "remove $DIR/$tfile failed."
728         remount_client ro $MOUNT || error "remount_client with ro failed"
729         touch $DIR/$tfile && error "$DIR/$tfile created incorrectly"
730         [ -e $DIR/$tfile ] && error "$DIR/$tfile exists incorrectly"
731         remount_client rw $MOUNT || error "remount_client with rw failed"
732         touch $DIR/$tfile || error "touch $DIR/$tfile failed"
733         MCNT=$(grep -c $MOUNT /etc/mtab)
734         [ "$MCNT" -ne 1 ] && error "$MOUNT in /etc/mtab $MCNT times"
735         umount_client $MOUNT
736         stop_mds || error "Unable to stop MDS"
737         stop_ost || error "Unable to stop OST1"
738 }
739 run_test 20 "remount ro,rw mounts work and doesn't break /etc/mtab"
740
741 test_21a() {
742         start_mds || error "MDS start failed"
743         start_ost || error "unable to start OST1"
744         wait_osc_import_state mds ost FULL
745         stop_ost || error "unable to stop OST1"
746         stop_mds || error "unable to stop MDS"
747 }
748 run_test 21a "start mds before ost, stop ost first"
749
750 test_21b() {
751         start_ost || error "unable to start OST1"
752         start_mds || error "MDS start failed"
753         wait_osc_import_state mds ost FULL
754         stop_mds || error "unable to stop MDS"
755         stop_ost || error "unable to stop OST1"
756 }
757 run_test 21b "start ost before mds, stop mds first"
758
759 test_21c() {
760         start_ost || error "Unable to start OST1"
761         start_mds || error "MDS start failed"
762         start_ost2 || error "Unable to start OST2"
763         wait_osc_import_state mds ost2 FULL
764         stop_ost || error "Unable to stop OST1"
765         stop_ost2 || error "Unable to stop OST2"
766         stop_mds || error "Unable to stop MDS"
767         #writeconf to remove all ost2 traces for subsequent tests
768         writeconf_or_reformat
769 }
770 run_test 21c "start mds between two osts, stop mds last"
771
772 test_21d() {
773         if combined_mgs_mds ; then
774                 skip "need separate mgs device" && return 0
775         fi
776         stopall
777
778         reformat
779
780         start_mgs || error "unable to start MGS"
781         start_ost || error "unable to start OST1"
782         start_ost2 || error "unable to start OST2"
783         start_mds || error "MDS start failed"
784         wait_osc_import_state mds ost2 FULL
785
786         stop_ost || error "Unable to stop OST1"
787         stop_ost2 || error "Unable to stop OST2"
788         stop_mds || error "Unable to stop MDS"
789         stop_mgs
790         #writeconf to remove all ost2 traces for subsequent tests
791         writeconf_or_reformat
792         start_mgs || error "unable to start MGS"
793 }
794 run_test 21d "start mgs then ost and then mds"
795
796 cleanup_21e() {
797         MGSNID="$saved_mgsnid"
798         cleanup_fs2
799         echo "stopping fs2mgs ..."
800         stop $fs2mgs -f || true
801 }
802
803 test_21e() { # LU-5863
804         if [[ -z "$fs3ost_DEV" || -z "$fs2ost_DEV" || -z "$fs2mds_DEV" ]]; then
805                 is_blkdev $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) &&
806                 skip_env "mixed loopback and real device not working" && return
807         fi
808
809         local fs2mdsdev=$(mdsdevname 1_2)
810         local fs2ostdev=$(ostdevname 1_2)
811         local fs3ostdev=$(ostdevname 2_2)
812
813         local fs2mdsvdev=$(mdsvdevname 1_2)
814         local fs2ostvdev=$(ostvdevname 1_2)
815         local fs3ostvdev=$(ostvdevname 2_2)
816
817         # temporarily use fs3ost as fs2mgs
818         local fs2mgs=fs3ost
819         local fs2mgsdev=$fs3ostdev
820         local fs2mgsvdev=$fs3ostvdev
821
822         local fsname=test1234
823
824         add $fs2mgs $(mkfs_opts mgs $fs2mgsdev) --fsname=$fsname \
825                 --reformat $fs2mgsdev $fs2mgsvdev || error "add fs2mgs failed"
826         start $fs2mgs $fs2mgsdev $MGS_MOUNT_OPTS && trap cleanup_21e EXIT INT ||
827                 error "start fs2mgs failed"
828
829         local saved_mgsnid="$MGSNID"
830         MGSNID=$(do_facet $fs2mgs $LCTL list_nids | xargs | tr ' ' ,)
831
832         add fs2mds $(mkfs_opts mds1 $fs2mdsdev $fsname) \
833                 --reformat $fs2mdsdev $fs2mdsvdev || error "add fs2mds failed"
834         add fs2ost $(mkfs_opts ost1 $fs2ostdev $fsname) \
835                 --reformat $fs2ostdev $fs2ostvdev || error "add fs2ost failed"
836
837         start fs2ost $fs2ostdev $OST_MOUNT_OPTS || error "start fs2ost failed"
838         start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS || error "start fs2mds failed"
839
840         mkdir -p $MOUNT2 || error "mkdir $MOUNT2 failed"
841         $MOUNT_CMD $MGSNID:/$fsname $MOUNT2 || error "mount $MOUNT2 failed"
842         DIR=$MOUNT2 MOUNT=$MOUNT2 check_mount || error "check $MOUNT2 failed"
843
844         cleanup_21e
845 }
846 run_test 21e "separate MGS and MDS"
847
848 test_22() {
849         start_mds || error "MDS start failed"
850
851         echo "Client mount with ost in logs, but none running"
852         start_ost || error "unable to start OST1"
853         # wait until mds connected to ost and open client connection
854         wait_osc_import_state mds ost FULL
855         stop_ost || error "unable to stop OST1"
856         mount_client $MOUNT || error "mount_client $MOUNT failed"
857         # check_mount will block trying to contact ost
858         mcreate $DIR/$tfile || error "mcreate $DIR/$tfile failed"
859         rm -f $DIR/$tfile || error "remove $DIR/$tfile failed"
860         umount_client $MOUNT -f
861         pass
862
863         echo "Client mount with a running ost"
864         start_ost || error "unable to start OST1"
865         if $GSS; then
866                 # if gss enabled, wait full time to let connection from
867                 # mds to ost be established, due to the mismatch between
868                 # initial connect timeout and gss context negotiation timeout.
869                 # This perhaps could be remove after AT landed.
870                 echo "sleep $((TIMEOUT + TIMEOUT + TIMEOUT))s"
871                 sleep $((TIMEOUT + TIMEOUT + TIMEOUT))
872         fi
873         mount_client $MOUNT || error "mount_client $MOUNT failed"
874         wait_osc_import_state mds ost FULL
875         wait_osc_import_state client ost FULL
876         check_mount || error "check_mount failed"
877         pass
878
879         cleanup || error "cleanup failed with rc $?"
880 }
881 run_test 22 "start a client before osts (should return errs)"
882
883 test_23a() {    # was test_23
884         setup
885         # fail mds
886         stop $SINGLEMDS || error "failed to stop $SINGLEMDS"
887         # force down client so that recovering mds waits for reconnect
888         local running=$(grep -c $MOUNT /proc/mounts) || true
889         if [ $running -ne 0 ]; then
890                 echo "Stopping client $MOUNT (opts: -f)"
891                 umount -f $MOUNT
892         fi
893
894         # enter recovery on failed mds
895         local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
896         start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "MDS start failed"
897         # try to start a new client
898         mount_client $MOUNT &
899         sleep 5
900         MOUNT_PID=$(ps -ef | grep "t lustre" | grep -v grep | awk '{print $2}')
901         MOUNT_LUSTRE_PID=$(ps -ef | grep mount.lustre |
902                            grep -v grep | awk '{print $2}')
903         echo mount pid is ${MOUNT_PID}, mount.lustre pid is ${MOUNT_LUSTRE_PID}
904         ps --ppid $MOUNT_PID
905         ps --ppid $MOUNT_LUSTRE_PID
906         echo "waiting for mount to finish"
907         ps -ef | grep mount
908         # "ctrl-c" sends SIGINT but it usually (in script) does not work on child process
909         # SIGTERM works but it does not spread to offspring processses
910         kill -s TERM $MOUNT_PID
911         kill -s TERM $MOUNT_LUSTRE_PID
912         # we can not wait $MOUNT_PID because it is not a child of this shell
913         local PID1
914         local PID2
915         local WAIT=0
916         local MAX_WAIT=30
917         local sleep=1
918         while [ "$WAIT" -lt "$MAX_WAIT" ]; do
919                 sleep $sleep
920                 PID1=$(ps -ef | awk '{print $2}' | grep -w $MOUNT_PID)
921                 PID2=$(ps -ef | awk '{print $2}' | grep -w $MOUNT_LUSTRE_PID)
922                 echo PID1=$PID1
923                 echo PID2=$PID2
924                 [ -z "$PID1" -a -z "$PID2" ] && break
925                 echo "waiting for mount to finish ... "
926                 WAIT=$(( WAIT + sleep))
927         done
928         if [ "$WAIT" -eq "$MAX_WAIT" ]; then
929                 error "MOUNT_PID $MOUNT_PID and "\
930                 "MOUNT_LUSTRE_PID $MOUNT_LUSTRE_PID still not killed in $WAIT secs"
931                 ps -ef | grep mount
932         fi
933         stop_mds || error "stopping MDSes failed"
934         stop_ost || error "stopping OSSes failed"
935 }
936 run_test 23a "interrupt client during recovery mount delay"
937
938 umount_client $MOUNT
939 cleanup_nocli
940
941 test_23b() {    # was test_23
942         start_mds || error "MDS start failed"
943         start_ost || error "Unable to start OST1"
944         # Simulate -EINTR during mount OBD_FAIL_LDLM_CLOSE_THREAD
945         $LCTL set_param fail_loc=0x80000313
946         mount_client $MOUNT
947         cleanup || error "cleanup failed with rc $?"
948 }
949 run_test 23b "Simulate -EINTR during mount"
950
951 test_24a() {
952         local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
953
954         if [ -z "$fs2ost_DEV" -o -z "$fs2mds_DEV" ]; then
955                 is_blkdev $SINGLEMDS $MDSDEV &&
956                 skip_env "mixed loopback and real device not working" && return
957         fi
958
959         [ -n "$ost1_HOST" ] && fs2ost_HOST=$ost1_HOST
960
961         local fs2mdsdev=$(mdsdevname 1_2)
962         local fs2ostdev=$(ostdevname 1_2)
963         local fs2mdsvdev=$(mdsvdevname 1_2)
964         local fs2ostvdev=$(ostvdevname 1_2)
965         local cl_user
966
967         # LU-9733 test fsname started with numbers as well
968         local FSNAME2=969362ae
969
970         add fs2mds $(mkfs_opts mds1 ${fs2mdsdev} ) --nomgs --mgsnode=$MGSNID \
971                 --fsname=${FSNAME2} --reformat $fs2mdsdev $fs2mdsvdev || exit 10
972
973         add fs2ost $(mkfs_opts ost1 ${fs2ostdev}) --fsname=${FSNAME2} \
974                 --reformat $fs2ostdev $fs2ostvdev || exit 10
975
976         setup
977         start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && trap cleanup_fs2 EXIT INT
978         start fs2ost $fs2ostdev $OST_MOUNT_OPTS
979         mkdir -p $MOUNT2 || error "mkdir $MOUNT2 failed"
980         $MOUNT_CMD $MGSNID:/${FSNAME2} $MOUNT2 || error "$MOUNT_CMD failed"
981
982         # LU-9733 test fsname started with numbers
983         cl_user=$(do_facet $SINGLEMDS lctl --device $FSNAME2-MDT0000 \
984                         changelog_register -n) ||
985                                 error "register changelog failed"
986
987         do_facet $SINGLEMDS lctl --device $FSNAME2-MDT0000 \
988                         changelog_deregister $cl_user ||
989                                 error "deregister changelog failed"
990         # 1 still works
991         check_mount || error "check_mount failed"
992         # files written on 1 should not show up on 2
993         cp /etc/passwd $DIR/$tfile
994         sleep 10
995         [ -e $MOUNT2/$tfile ] && error "File bleed"
996         # 2 should work
997         sleep 5
998         cp /etc/passwd $MOUNT2/$tfile ||
999                 error "cp /etc/passwd $MOUNT2/$tfile failed"
1000         rm $MOUNT2/$tfile || error "remove $MOUNT2/$tfile failed"
1001         # 2 is actually mounted
1002         grep $MOUNT2' ' /proc/mounts > /dev/null || error "$MOUNT2 not mounted"
1003         # failover
1004         facet_failover fs2mds
1005         facet_failover fs2ost
1006         df
1007         umount_client $MOUNT
1008         # the MDS must remain up until last MDT
1009         stop_mds
1010         MDS=$(do_facet $SINGLEMDS "$LCTL get_param -n devices" |
1011               awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }' | head -1)
1012         [ -z "$MDS" ] && error "No MDT"
1013         cleanup_fs2
1014         cleanup_nocli || error "cleanup_nocli failed with rc $?"
1015 }
1016 run_test 24a "Multiple MDTs on a single node"
1017
1018 test_24b() {
1019         local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
1020
1021         if [ -z "$fs2mds_DEV" ]; then
1022                 local dev=${SINGLEMDS}_dev
1023                 local MDSDEV=${!dev}
1024                 is_blkdev $SINGLEMDS $MDSDEV &&
1025                 skip_env "mixed loopback and real device not working" && return
1026         fi
1027
1028         local fs2mdsdev=$(mdsdevname 1_2)
1029         local fs2mdsvdev=$(mdsvdevname 1_2)
1030
1031         add fs2mds $(mkfs_opts mds1 ${fs2mdsdev} ) --mgs --fsname=${FSNAME}2 \
1032                 --reformat $fs2mdsdev $fs2mdsvdev || exit 10
1033         setup
1034         start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS &&
1035                 error "start MDS should fail"
1036         stop fs2mds -f
1037         cleanup || error "cleanup failed with rc $?"
1038 }
1039 run_test 24b "Multiple MGSs on a single node (should return err)"
1040
1041 test_25() {
1042         setup
1043         check_mount || error "check_mount failed"
1044         local MODULES=$($LCTL modules | awk '{ print $2 }')
1045         rmmod $MODULES 2>/dev/null || true
1046         cleanup || error "cleanup failed with $?"
1047 }
1048 run_test 25 "Verify modules are referenced"
1049
1050 test_26() {
1051         load_modules
1052         # we need modules before mount for sysctl, so make sure...
1053         do_facet $SINGLEMDS "lsmod | grep -q lustre || modprobe lustre"
1054         #define OBD_FAIL_MDS_FS_SETUP            0x135
1055         do_facet $SINGLEMDS "$LCTL set_param fail_loc=0x80000135"
1056         start_mds && error "MDS started but should not have started"
1057         $LCTL get_param -n devices
1058         DEVS=$($LCTL get_param -n devices | egrep -v MG | wc -l)
1059         [ $DEVS -gt 0 ] && error "number of devices is $DEVS, should be zero"
1060         # start mds to drop writeconf setting
1061         start_mds || error "Unable to start MDS"
1062         stop_mds || error "Unable to stop MDS"
1063         unload_modules_conf || error "unload_modules_conf failed with $?"
1064 }
1065 run_test 26 "MDT startup failure cleans LOV (should return errs)"
1066
1067 test_27a() {
1068         start_ost || error "Unable to start OST1"
1069         start_mds || error "Unable to start MDS"
1070         echo "Requeue thread should have started: "
1071         ps -e | grep ll_cfg_requeue
1072         set_conf_param_and_check ost1                                         \
1073            "$LCTL get_param -n obdfilter.$FSNAME-OST0000.client_cache_seconds" \
1074            "$FSNAME-OST0000.ost.client_cache_seconds" ||
1075                 error "set_conf_param_and_check ost1 failed"
1076         cleanup_nocli || error "cleanup_nocli failed with rc $?"
1077 }
1078 run_test 27a "Reacquire MGS lock if OST started first"
1079
1080 test_27b() {
1081         # FIXME. ~grev
1082         setup
1083         local device=$(do_facet $SINGLEMDS "$LCTL get_param -n devices" |
1084                         awk '($3 ~ "mdt" && $4 ~ "MDT0000") { print $4 }')
1085
1086         facet_failover $SINGLEMDS
1087         set_conf_param_and_check $SINGLEMDS                             \
1088                 "$LCTL get_param -n mdt.$device.identity_acquire_expire" \
1089                 "$device.mdt.identity_acquire_expire" ||
1090                 error "set_conf_param_and_check $SINGLEMDS failed"
1091         set_conf_param_and_check client                          \
1092                 "$LCTL get_param -n mdc.$device-mdc-*.max_rpcs_in_flight"\
1093                 "$device.mdc.max_rpcs_in_flight" ||
1094                 error "set_conf_param_and_check client failed"
1095         check_mount
1096         cleanup || error "cleanup failed with $?"
1097 }
1098 run_test 27b "Reacquire MGS lock after failover"
1099
1100 test_28() {
1101         setup
1102         TEST="$LCTL get_param -n llite.$FSNAME-*.max_read_ahead_whole_mb"
1103         PARAM="$FSNAME.llite.max_read_ahead_whole_mb"
1104         ORIG=$($TEST)
1105         FINAL=$(($ORIG + 1))
1106         set_conf_param_and_check client "$TEST" "$PARAM" $FINAL ||
1107                 error "first set_conf_param_and_check client failed"
1108         FINAL=$(($FINAL + 1))
1109         set_conf_param_and_check client "$TEST" "$PARAM" $FINAL ||
1110                 error "second set_conf_param_and_check client failed"
1111         umount_client $MOUNT || error "umount_client $MOUNT failed"
1112         mount_client $MOUNT || error "mount_client $MOUNT failed"
1113         RESULT=$($TEST)
1114         if [ $RESULT -ne $FINAL ]; then
1115                 error "New config not seen: wanted $FINAL got $RESULT"
1116         else
1117                 echo "New config success: got $RESULT"
1118         fi
1119         set_conf_param_and_check client "$TEST" "$PARAM" $ORIG ||
1120                 error "third set_conf_param_and_check client failed"
1121         cleanup || error "cleanup failed with rc $?"
1122 }
1123 run_test 28 "permanent parameter setting"
1124
1125 test_28a() { # LU-4221
1126         [[ $(lustre_version_code ost1) -ge $(version_code 2.5.52) ]] ||
1127                 { skip "Need OST version at least 2.5.52" && return 0; }
1128         [ "$(facet_fstype ost1)" = "zfs" ] &&
1129                 skip "LU-4221: no such proc params for ZFS OSTs" && return
1130
1131         local name
1132         local param
1133         local cmd
1134         local old
1135         local new
1136         local device="$FSNAME-OST0000"
1137
1138         setup
1139
1140         # In this test we will set three kinds of proc parameters with
1141         # lctl conf_param:
1142         # 1. the ones moved from the OFD to the OSD, and only their
1143         #    symlinks kept in obdfilter
1144         # 2. non-symlink ones in the OFD
1145         # 3. non-symlink ones in the OSD
1146
1147         # Check 1.
1148         # prepare a symlink parameter in the OFD
1149         name="writethrough_cache_enable"
1150         param="$device.ost.$name"
1151         cmd="$LCTL get_param -n obdfilter.$device.$name"
1152
1153         # conf_param the symlink parameter in the OFD
1154         old=$(do_facet ost1 $cmd)
1155         new=$(((old + 1) % 2))
1156         set_conf_param_and_check ost1 "$cmd" "$param" $new ||
1157                 error "lctl conf_param $device.ost.$param=$new failed"
1158
1159         # conf_param the target parameter in the OSD
1160         param="$device.osd.$name"
1161         cmd="$LCTL get_param -n osd-*.$device.$name"
1162         set_conf_param_and_check ost1 "$cmd" "$param" $old ||
1163                 error "lctl conf_param $device.osd.$param=$old failed"
1164
1165         # Check 2.
1166         # prepare a non-symlink parameter in the OFD
1167         name="client_cache_seconds"
1168         param="$device.ost.$name"
1169         cmd="$LCTL get_param -n obdfilter.$device.$name"
1170
1171         # conf_param the parameter in the OFD
1172         old=$(do_facet ost1 $cmd)
1173         new=$((old * 2))
1174         set_conf_param_and_check ost1 "$cmd" "$param" $new ||
1175                 error "lctl conf_param $device.ost.$param=$new failed"
1176         set_conf_param_and_check ost1 "$cmd" "$param" $old ||
1177                 error "lctl conf_param $device.ost.$param=$old failed"
1178
1179         # Check 3.
1180         # prepare a non-symlink parameter in the OSD
1181         name="auto_scrub"
1182         param="$device.osd.$name"
1183         cmd="$LCTL get_param -n osd-*.$device.$name"
1184
1185         # conf_param the parameter in the OSD
1186         old=$(do_facet ost1 $cmd)
1187         new=$(((old + 1) % 2))
1188         set_conf_param_and_check ost1 "$cmd" "$param" $new ||
1189                 error "lctl conf_param $device.osd.$param=$new failed"
1190         set_conf_param_and_check ost1 "$cmd" "$param" $old ||
1191                 error "lctl conf_param $device.osd.$param=$old failed"
1192
1193         cleanup || error "cleanup failed with $?"
1194 }
1195 run_test 28a "set symlink parameters permanently with conf_param"
1196
1197 test_29() {
1198         [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs" && return
1199         setup > /dev/null 2>&1
1200         start_ost2 || error "Unable to start OST2"
1201         sleep 10
1202
1203         local PARAM="$FSNAME-OST0001.osc.active"
1204         local PROC_ACT="osc.$FSNAME-OST0001-osc-[^M]*.active"
1205         local PROC_UUID="osc.$FSNAME-OST0001-osc-[^M]*.ost_server_uuid"
1206
1207         ACTV=$($LCTL get_param -n $PROC_ACT)
1208         DEAC=$((1 - $ACTV))
1209         set_conf_param_and_check client \
1210                 "$LCTL get_param -n $PROC_ACT" "$PARAM" $DEAC ||
1211                 error "set_conf_param_and_check client failed"
1212         # also check ost_server_uuid status
1213         RESULT=$($LCTL get_param -n $PROC_UUID | grep DEACTIV)
1214         if [ -z "$RESULT" ]; then
1215                 error "Client not deactivated: $($LCTL get_param \
1216                        -n $PROC_UUID)"
1217         else
1218                 echo "Live client success: got $RESULT"
1219         fi
1220
1221         # check MDTs too
1222         wait_osp_active ost ${FSNAME}-OST0001 1 0
1223
1224         # test new client starts deactivated
1225         umount_client $MOUNT || error "umount_client $MOUNT failed"
1226         mount_client $MOUNT || error "mount_client $MOUNT failed"
1227         RESULT=$($LCTL get_param -n $PROC_UUID | grep DEACTIV | grep NEW)
1228         if [ -z "$RESULT" ]; then
1229                 error "New client start active: $(lctl get_param -n $PROC_UUID)"
1230         else
1231                 echo "New client success: got $RESULT"
1232         fi
1233
1234         # make sure it reactivates
1235         set_conf_param_and_check client \
1236                 "$LCTL get_param -n $PROC_ACT" "$PARAM" $ACTV ||
1237                 error "lctl get_param $PROC_ACT $PARAM $ACTV failed"
1238
1239         umount_client $MOUNT
1240         stop_ost2 || error "Unable to stop OST2"
1241         cleanup_nocli || error "cleanup_nocli failed with $?"
1242         #writeconf to remove all ost2 traces for subsequent tests
1243         writeconf_or_reformat
1244 }
1245 run_test 29 "permanently remove an OST"
1246
1247 test_30a() {
1248         setup
1249
1250         echo Big config llog
1251         TEST="$LCTL get_param -n llite.$FSNAME-*.max_read_ahead_whole_mb"
1252         ORIG=$($TEST)
1253         LIST=(1 2 3 4 5 4 3 2 1 2 3 4 5 4 3 2 1 2 3 4 5)
1254         for i in ${LIST[@]}; do
1255                 set_conf_param_and_check client "$TEST" \
1256                         "$FSNAME.llite.max_read_ahead_whole_mb" $i ||
1257                         error "Set $FSNAME.llite.max_read_ahead_whole_mb failed"
1258         done
1259         # make sure client restart still works
1260         umount_client $MOUNT
1261         mount_client $MOUNT || error "mount_client $MOUNT failed"
1262         [ "$($TEST)" -ne "$i" ] &&
1263                 error "Param didn't stick across restart $($TEST) != $i"
1264         pass
1265
1266         echo Erase parameter setting
1267         do_facet mgs "$LCTL conf_param \
1268                       -d $FSNAME.llite.max_read_ahead_whole_mb" ||
1269                 error "Erase param $FSNAME.llite.max_read_ahead_whole_mb failed"
1270         umount_client $MOUNT
1271         mount_client $MOUNT || error "mount_client $MOUNT failed"
1272         FINAL=$($TEST)
1273         echo "deleted (default) value=$FINAL, orig=$ORIG"
1274         # assumes this parameter started at the default value
1275         [ "$FINAL" -eq "$ORIG" ] || fail "Deleted value=$FINAL, orig=$ORIG"
1276
1277         cleanup || error "cleanup failed with rc $?"
1278 }
1279 run_test 30a "Big config llog and conf_param deletion"
1280
1281 test_30b() {
1282         setup
1283
1284         local orignids=$($LCTL get_param -n \
1285                 osc.$FSNAME-OST0000-osc-[^M]*.import | grep failover_nids)
1286
1287         local orignidcount=$(echo "$orignids" | wc -w)
1288
1289         # Make a fake nid.  Use the OST nid, and add 20 to the least significant
1290         # numerical part of it. Hopefully that's not already a failover address
1291         # for the server.
1292         local OSTNID=$(do_facet ost1 "$LCTL get_param nis" | tail -1 | \
1293                 awk '{print $1}')
1294         local ORIGVAL=$(echo $OSTNID | egrep -oi "[0-9]*@")
1295         local NEWVAL=$((($(echo $ORIGVAL | egrep -oi "[0-9]*") + 20) % 256))
1296         local NEW=$(echo $OSTNID | sed "s/$ORIGVAL/$NEWVAL@/")
1297         echo "Using fake nid $NEW"
1298
1299         local TEST="$LCTL get_param -n osc.$FSNAME-OST0000-osc-[^M]*.import |
1300                 grep failover_nids | sed -n 's/.*\($NEW\).*/\1/p'"
1301         set_conf_param_and_check client "$TEST" \
1302                 "$FSNAME-OST0000.failover.node" $NEW ||
1303                 error "didn't add failover nid $NEW"
1304         local NIDS=$($LCTL get_param -n osc.$FSNAME-OST0000-osc-[^M]*.import |
1305                 grep failover_nids)
1306         echo $NIDS
1307         local NIDCOUNT=$(echo "$NIDS" | wc -w)
1308         echo "should have $((orignidcount + 1)) entries \
1309                 in failover nids string, have $NIDCOUNT"
1310         [ $NIDCOUNT -eq $((orignidcount + 1)) ] ||
1311                 error "Failover nid not added"
1312
1313         do_facet mgs "$LCTL conf_param -d $FSNAME-OST0000.failover.node" ||
1314                 error "conf_param delete failed"
1315         umount_client $MOUNT
1316         mount_client $MOUNT || error "mount_client $MOUNT failed"
1317
1318         NIDS=$($LCTL get_param -n osc.$FSNAME-OST0000-osc-[^M]*.import |
1319                 grep failover_nids)
1320         echo $NIDS
1321         NIDCOUNT=$(echo "$NIDS" | wc -w)
1322         echo "only $orignidcount final entries should remain \
1323                 in failover nids string, have $NIDCOUNT"
1324         [ $NIDCOUNT -eq $orignidcount ] || error "Failover nids not removed"
1325
1326         cleanup || error "cleanup failed with rc $?"
1327 }
1328 run_test 30b "Remove failover nids"
1329
1330 test_31() { # bug 10734
1331         # ipaddr must not exist
1332         $MOUNT_CMD 4.3.2.1@tcp:/lustre $MOUNT || true
1333         cleanup || error "cleanup failed with rc $?"
1334 }
1335 run_test 31 "Connect to non-existent node (shouldn't crash)"
1336
1337
1338 T32_QID=60000
1339 T32_BLIMIT=40960 # Kbytes
1340 T32_ILIMIT=4
1341
1342 #
1343 # This is not really a test but a tool to create new disk
1344 # image tarballs for the upgrade tests.
1345 #
1346 # Disk image tarballs should be created on single-node
1347 # clusters by running this test with default configurations
1348 # plus a few mandatory environment settings that are verified
1349 # at the beginning of the test.
1350 #
1351 test_32newtarball() {
1352         local version
1353         local dst=.
1354         local src=/etc/rc.d
1355         local tmp=$TMP/t32_image_create
1356         local server_version=$(lustre_version_code $SINGLEMDS)
1357         local remote_dir
1358         local striped_dir
1359         local pushd_dir
1360
1361         if [ $FSNAME != t32fs -o \( -z "$MDSDEV" -a -z "$MDSDEV1" \) -o \
1362              $OSTCOUNT -ne 1 -o -z "$OSTDEV1" ]; then
1363                 error "Needs FSNAME=t32fs MDSCOUNT=2 "                  \
1364                       "MDSDEV1=<nonexistent_file>"                      \
1365                       "MDSDEV2=<nonexistent_file>"                      \
1366                       "(or MDSDEV, in the case of b1_8)"                \
1367                       "OSTCOUNT=1 OSTDEV1=<nonexistent_file>"
1368         fi
1369
1370         mkdir $tmp || {
1371                 echo "Found stale $tmp"
1372                 return 1
1373         }
1374
1375         mkdir $tmp/src || return 1
1376         tar cf - -C $src . | tar xf - -C $tmp/src
1377         dd if=/dev/zero of=$tmp/src/t32_qf_old bs=1M \
1378                 count=$(($T32_BLIMIT / 1024 / 4))
1379         chown $T32_QID.$T32_QID $tmp/src/t32_qf_old
1380
1381         # format ost with comma-separated NIDs to verify LU-4460
1382         local failnid="$(h2nettype 1.2.3.4),$(h2nettype 4.3.2.1)"
1383         MGSNID="$MGSNID,$MGSNID" OSTOPT="--failnode=$failnid" formatall
1384
1385         setupall
1386
1387         [[ $server_version -ge $(version_code 2.3.50) ]] ||
1388                 $LFS quotacheck -ug /mnt/$FSNAME
1389         $LFS setquota -u $T32_QID -b 0 -B $T32_BLIMIT -i 0 -I $T32_ILIMIT \
1390                 /mnt/$FSNAME
1391
1392         tar cf - -C $tmp/src . | tar xf - -C /mnt/$FSNAME
1393
1394         if [[ $MDSCOUNT -ge 2 ]]; then
1395                 remote_dir=/mnt/$FSNAME/remote_dir
1396                 $LFS mkdir -i 1 $remote_dir
1397                 tar cf - -C $tmp/src . | tar xf - -C $remote_dir
1398
1399                 if [[ $server_version -ge $(version_code 2.7.0) ]]; then
1400                         striped_dir=/mnt/$FSNAME/striped_dir_old
1401                         $LFS mkdir -i 1 -c 2 $striped_dir
1402                         tar cf - -C $tmp/src . | tar xf - -C $striped_dir
1403                 fi
1404         fi
1405
1406         stopall
1407
1408         mkdir $tmp/img || return 1
1409
1410         setupall
1411
1412         pushd_dir=/mnt/$FSNAME
1413         if [[ $MDSCOUNT -ge 2 ]]; then
1414                 pushd_dir=$remote_dir
1415                 if [[ $server_version -ge $(version_code 2.7.0) ]]; then
1416                         pushd $striped_dir
1417                         ls -Rni --time-style=+%s >$tmp/img/list2
1418                         popd
1419                 fi
1420         fi
1421
1422         pushd $pushd_dir
1423         ls -Rni --time-style=+%s >$tmp/img/list
1424         find ! -name .lustre -type f -exec sha1sum {} \; |
1425                 sort -k 2 >$tmp/img/sha1sums
1426         popd
1427         $LCTL get_param -n version | head -n 1 |
1428                 sed -e 's/^lustre: *//' >$tmp/img/commit
1429
1430         [[ $server_version -ge $(version_code 2.3.50) ]] ||
1431                 $LFS quotaon -ug /mnt/$FSNAME
1432         $LFS quota -u $T32_QID -v /mnt/$FSNAME
1433         $LFS quota -v -u $T32_QID /mnt/$FSNAME |
1434                 awk 'BEGIN { num='1' } { if ($1 == "'/mnt/$FSNAME'") \
1435                 { if (NF == 1) { getline } else { num++ } ; print $num;} }' \
1436                 | tr -d "*" > $tmp/img/bspace
1437         $LFS quota -v -u $T32_QID /mnt/$FSNAME |
1438                 awk 'BEGIN { num='5' } { if ($1 == "'/mnt/$FSNAME'") \
1439                 { if (NF == 1) { getline } else { num++ } ; print $num;} }' \
1440                 | tr -d "*" > $tmp/img/ispace
1441         echo $T32_BLIMIT > $tmp/img/blimit
1442         echo $T32_ILIMIT > $tmp/img/ilimit
1443
1444         stopall
1445
1446         pushd $tmp/src
1447         find -type f -exec sha1sum {} \; | sort -k 2 >$tmp/sha1sums.src
1448         popd
1449
1450         if ! diff -u $tmp/sha1sums.src $tmp/img/sha1sums; then
1451                 echo "Data verification failed"
1452         fi
1453
1454         uname -r >$tmp/img/kernel
1455         uname -m >$tmp/img/arch
1456
1457         mv ${MDSDEV1:-$MDSDEV} $tmp/img
1458         for num in $(seq 2 $MDSCOUNT); do
1459                 local devname=$(mdsdevname $num)
1460                 local facet=mds$num
1461                 [[ $(facet_fstype $facet) != zfs ]] ||
1462                         devname=$(mdsvdevname $num)
1463                 mv $devname $tmp/img
1464         done
1465         mv $OSTDEV1 $tmp/img
1466
1467         version=$(sed -e 's/\(^[0-9]\+\.[0-9]\+\)\(.*$\)/\1/' $tmp/img/commit |
1468                           sed -e 's/\./_/g')    # E.g., "1.8.7" -> "1_8"
1469         dst=$(cd $dst; pwd)
1470         pushd $tmp/img
1471         tar cjvf $dst/disk$version-$(facet_fstype $SINGLEMDS).tar.bz2 -S *
1472         popd
1473
1474         rm -r $tmp
1475 }
1476 #run_test 32newtarball "Create a new test_32 disk image tarball for this version"
1477
1478 #
1479 # The list of applicable tarballs is returned via the caller's
1480 # variable "tarballs".
1481 #
1482 t32_check() {
1483         local node=$(facet_active_host $SINGLEMDS)
1484         local r="do_node $node"
1485
1486         if [ "$CLIENTONLY" ]; then
1487                 skip "Client-only testing"
1488                 exit 0
1489         fi
1490
1491         if ! $r which $TUNEFS; then
1492                 skip_env "tunefs.lustre required on $node"
1493                 exit 0
1494         fi
1495
1496         local IMGTYPE=$(facet_fstype $SINGLEMDS)
1497
1498         tarballs=$($r find $RLUSTRE/tests -maxdepth 1 \
1499                    -name \'disk*-$IMGTYPE.tar.bz2\')
1500
1501         if [ -z "$tarballs" ]; then
1502                 skip "No applicable tarballs found"
1503                 exit 0
1504         fi
1505 }
1506
1507 t32_test_cleanup() {
1508         local tmp=$TMP/t32
1509         local facet=$SINGLEMDS
1510         local fstype=$(facet_fstype $facet)
1511         local rc=$?
1512
1513         if $shall_cleanup_lustre; then
1514                 umount $tmp/mnt/lustre || rc=$?
1515         fi
1516         if $shall_cleanup_mdt; then
1517                 $r $UMOUNT $tmp/mnt/mdt || rc=$?
1518         fi
1519         if $shall_cleanup_mdt1; then
1520                 $r $UMOUNT $tmp/mnt/mdt1 || rc=$?
1521         fi
1522         if $shall_cleanup_ost; then
1523                 $r $UMOUNT $tmp/mnt/ost || rc=$?
1524         fi
1525
1526         $r rm -rf $tmp
1527         rm -rf $tmp
1528         if [[ $fstype == zfs ]]; then
1529                 local poolname
1530                 local poolname_list="t32fs-mdt1 t32fs-ost1"
1531
1532                 ! $mdt2_is_available || poolname_list+=" t32fs-mdt2"
1533
1534                 for poolname in $poolname_list; do
1535                         destroy_zpool $facet $poolname
1536                 done
1537         fi
1538         combined_mgs_mds || start_mgs || rc=$?
1539         return $rc
1540 }
1541
1542 t32_bits_per_long() {
1543         #
1544         # Yes, this is not meant to be perfect.
1545         #
1546         case $1 in
1547                 ppc64|x86_64)
1548                         echo -n 64;;
1549                 i*86)
1550                         echo -n 32;;
1551         esac
1552 }
1553
1554 t32_reload_modules() {
1555         local node=$1
1556         local all_removed=false
1557         local i=0
1558
1559         while ((i < 20)); do
1560                 echo "Unloading modules on $node: Attempt $i"
1561                 do_rpc_nodes $node $LUSTRE_RMMOD $(facet_fstype $SINGLEMDS) &&
1562                         all_removed=true
1563                 do_rpc_nodes $node check_mem_leak || return 1
1564                 if $all_removed; then
1565                         do_rpc_nodes $node load_modules
1566                         return 0
1567                 fi
1568                 sleep 5
1569                 i=$((i + 1))
1570         done
1571         echo "Unloading modules on $node: Given up"
1572         return 1
1573 }
1574
1575 t32_wait_til_devices_gone() {
1576         local node=$1
1577         local devices
1578         local loops
1579         local i=0
1580
1581         echo wait for devices to go
1582         while ((i < 20)); do
1583                 devices=$(do_rpc_nodes $node $LCTL device_list | wc -l)
1584                 loops=$(do_rpc_nodes $node losetup -a | grep -c t32)
1585                 ((devices == 0 && loops == 0)) && return 0
1586                 sleep 5
1587                 i=$((i + 1))
1588         done
1589         echo "waiting for dev on $node: dev $devices loop $loops given up"
1590         do_rpc_nodes $node "losetup -a"
1591         do_rpc_nodes $node "$LCTL device_list"
1592         return 1
1593 }
1594
1595 t32_verify_quota() {
1596         local node=$1
1597         local fsname=$2
1598         local mnt=$3
1599         local fstype=$(facet_fstype $SINGLEMDS)
1600         local qval
1601         local cmd
1602
1603         # LU-2435: if the underlying zfs doesn't support userobj_accounting,
1604         # lustre will estimate the object count usage. This fails quota
1605         # verification in 32b. The object quota usage should be accurate after
1606         # zfs-0.7.0 is released.
1607         [ $fstype == "zfs" ] && {
1608                 local zfs_version=$(do_node $node cat /sys/module/zfs/version)
1609
1610                 [ $(version_code $zfs_version) -lt $(version_code 0.7.0) ] && {
1611                         echo "Skip quota verify for zfs: $zfs_version"
1612                         return 0
1613                 }
1614         }
1615
1616         $LFS quota -u $T32_QID -v $mnt
1617
1618         qval=$($LFS quota -v -u $T32_QID $mnt |
1619                 awk 'BEGIN { num='1' } { if ($1 == "'$mnt'") \
1620                 { if (NF == 1) { getline } else { num++ } ; print $num;} }' \
1621                 | tr -d "*")
1622         [ $qval -eq $img_bspace ] || {
1623                 echo "bspace, act:$qval, exp:$img_bspace"
1624                 return 1
1625         }
1626
1627         qval=$($LFS quota -v -u $T32_QID $mnt |
1628                 awk 'BEGIN { num='5' } { if ($1 == "'$mnt'") \
1629                 { if (NF == 1) { getline } else { num++ } ; print $num;} }' \
1630                 | tr -d "*")
1631         [ $qval -eq $img_ispace ] || {
1632                 echo "ispace, act:$qval, exp:$img_ispace"
1633                 return 1
1634         }
1635
1636         qval=$($LFS quota -v -u $T32_QID $mnt |
1637                 awk 'BEGIN { num='3' } { if ($1 == "'$mnt'") \
1638                 { if (NF == 1) { getline } else { num++ } ; print $num;} }' \
1639                 | tr -d "*")
1640         [ $qval -eq $img_blimit ] || {
1641                 echo "blimit, act:$qval, exp:$img_blimit"
1642                 return 1
1643         }
1644
1645         qval=$($LFS quota -v -u $T32_QID $mnt |
1646                 awk 'BEGIN { num='7' } { if ($1 == "'$mnt'") \
1647                 { if (NF == 1) { getline } else { num++ } ; print $num;} }' \
1648                 | tr -d "*")
1649         [ $qval -eq $img_ilimit ] || {
1650                 echo "ilimit, act:$qval, exp:$img_ilimit"
1651                 return 1
1652         }
1653
1654         do_node $node $LCTL conf_param $fsname.quota.mdt=ug
1655         cmd="$LCTL get_param -n osd-$fstype.$fsname-MDT0000"
1656         cmd=$cmd.quota_slave.enabled
1657         wait_update $node "$cmd" "ug" || {
1658                 echo "Enable mdt quota failed"
1659                 return 1
1660         }
1661
1662         do_node $node $LCTL conf_param $fsname.quota.ost=ug
1663         cmd="$LCTL get_param -n osd-$fstype.$fsname-OST0000"
1664         cmd=$cmd.quota_slave.enabled
1665         wait_update $node "$cmd" "ug" || {
1666                 echo "Enable ost quota failed"
1667                 return 1
1668         }
1669
1670         chmod 0777 $mnt
1671         runas -u $T32_QID -g $T32_QID dd if=/dev/zero of=$mnt/t32_qf_new \
1672                 bs=1M count=$((img_blimit / 1024)) oflag=sync && {
1673                 echo "Write succeed, but expect -EDQUOT"
1674                 return 1
1675         }
1676         rm -f $mnt/t32_qf_new
1677
1678         runas -u $T32_QID -g $T32_QID createmany -m $mnt/t32_qf_ \
1679                 $img_ilimit && {
1680                 echo "Create succeed, but expect -EDQUOT"
1681                 return 1
1682         }
1683         unlinkmany $mnt/t32_qf_ $img_ilimit
1684
1685         return 0
1686 }
1687
1688 t32_test() {
1689         local tarball=$1
1690         local writeconf=$2
1691         local dne_upgrade=${dne_upgrade:-"no"}
1692         local ff_convert=${ff_convert:-"no"}
1693         local shall_cleanup_mdt=false
1694         local shall_cleanup_mdt1=false
1695         local shall_cleanup_ost=false
1696         local shall_cleanup_lustre=false
1697         local mdt2_is_available=false
1698         local node=$(facet_active_host $SINGLEMDS)
1699         local r="do_node $node"
1700         local tmp=$TMP/t32
1701         local img_commit
1702         local img_kernel
1703         local img_arch
1704         local img_bspace
1705         local img_ispace
1706         local img_blimit
1707         local img_ilimit
1708         local fsname=t32fs
1709         local nid
1710         local mopts
1711         local uuid
1712         local nrpcs_orig
1713         local nrpcs
1714         local list
1715         local fstype=$(facet_fstype $SINGLEMDS)
1716         local mdt_dev=$tmp/mdt
1717         local mdt2_dev=$tmp/mdt2
1718         local ost_dev=$tmp/ost
1719         local stripe_index
1720         local stripe_count
1721         local dir
1722
1723         combined_mgs_mds || stop_mgs || error "Unable to stop MGS"
1724         trap 'trap - RETURN; t32_test_cleanup' RETURN
1725
1726         load_modules
1727         nid=$($r $LCTL list_nids | head -1)
1728
1729         mkdir -p $tmp/mnt/lustre || error "mkdir $tmp/mnt/lustre failed"
1730         $r mkdir -p $tmp/mnt/{mdt,mdt1,ost}
1731         $r tar xjvf $tarball -S -C $tmp || {
1732                 error_noexit "Unpacking the disk image tarball"
1733                 return 1
1734         }
1735         img_commit=$($r cat $tmp/commit)
1736         img_kernel=$($r cat $tmp/kernel)
1737         img_arch=$($r cat $tmp/arch)
1738         img_bspace=$($r cat $tmp/bspace)
1739         img_ispace=$($r cat $tmp/ispace)
1740
1741         # older images did not have "blimit" and "ilimit" files
1742         # use old values for T32_BLIMIT and T32_ILIMIT
1743         $r test -f $tmp/blimit && img_blimit=$($r cat $tmp/blimit) ||
1744                 img_blimit=20480
1745         $r test -f $tmp/ilimit && img_ilimit=$($r cat $tmp/ilimit) ||
1746                 img_ilimit=2
1747
1748         echo "Upgrading from $(basename $tarball), created with:"
1749         echo "  Commit: $img_commit"
1750         echo "  Kernel: $img_kernel"
1751         echo "    Arch: $img_arch"
1752         echo "OST version: $(lustre_build_version ost1)"
1753
1754         # The conversion can be made only when both of the following
1755         # conditions are satisfied:
1756         # - ost device img version < 2.3.64
1757         # - ost server version >= 2.5
1758         [ $(version_code $img_commit) -ge $(version_code 2.3.64) -o \
1759                 $(lustre_version_code ost1) -lt $(version_code 2.5.0) ] &&
1760                         ff_convert="no"
1761
1762         ! $r test -f $mdt2_dev || mdt2_is_available=true
1763
1764         if [[ $fstype == zfs ]]; then
1765                 # import pool first
1766                 local poolname
1767                 local poolname_list="t32fs-mdt1 t32fs-ost1"
1768
1769                 ! $mdt2_is_available || poolname_list+=" t32fs-mdt2"
1770
1771                 for poolname in $poolname_list; do
1772                         $r "modprobe zfs;
1773                                 $ZPOOL list -H $poolname >/dev/null 2>&1 ||
1774                                 $ZPOOL import -f -d $tmp $poolname"
1775                 done
1776
1777                 # upgrade zpool to latest supported features, including
1778                 # dnode quota accounting in 0.7.0
1779                 $r "$ZPOOL upgrade -a"
1780
1781                 mdt_dev=t32fs-mdt1/mdt1
1782                 ost_dev=t32fs-ost1/ost1
1783                 ! $mdt2_is_available || mdt2_dev=t32fs-mdt2/mdt2
1784                 wait_update_facet $SINGLEMDS "$ZPOOL list |
1785                         awk '/^t32fs-mdt1/ { print \\\$1 }'" "t32fs-mdt1" || {
1786                                 error_noexit "import zfs pool failed"
1787                                 return 1
1788                         }
1789         fi
1790
1791         $r $LCTL set_param debug="$PTLDEBUG"
1792
1793         $r $TUNEFS --dryrun $mdt_dev || {
1794                 $r losetup -a
1795                 error_noexit "tunefs.lustre before mounting the MDT"
1796                 return 1
1797         }
1798
1799         if $mdt2_is_available; then
1800                 $r $TUNEFS --dryrun $mdt2_dev || {
1801                         $r losetup -a
1802                         error_noexit "tunefs.lustre before mounting the MDT"
1803                         return 1
1804                 }
1805         fi
1806
1807         if [ "$writeconf" ]; then
1808                 mopts=writeconf
1809                 if [ $fstype == "ldiskfs" ]; then
1810                         mopts="loop,$mopts"
1811                         $r $TUNEFS --quota $mdt_dev || {
1812                                 $r losetup -a
1813                                 error_noexit "Enable mdt quota feature"
1814                                 return 1
1815                         }
1816                         if $mdt2_is_available; then
1817                                 $r $TUNEFS --quota $mdt2_dev || {
1818                                         $r losetup -a
1819                                         error_noexit "Enable mdt quota feature"
1820                                         return 1
1821                                 }
1822                         fi
1823                 fi
1824         else
1825                 if [ -n "$($LCTL list_nids | grep -v '\(tcp\|lo\)[[:digit:]]*$')" ]; then
1826                         [[ $(lustre_version_code mgs) -ge $(version_code 2.3.59) ]] ||
1827                         { skip "LU-2200: Cannot run over Inifiniband w/o lctl replace_nids "
1828                                 "(Need MGS version at least 2.3.59)"; return 0; }
1829
1830                         local osthost=$(facet_active_host ost1)
1831                         local ostnid=$(do_node $osthost $LCTL list_nids | head -1)
1832
1833                         mopts=nosvc
1834                         if [ $fstype == "ldiskfs" ]; then
1835                                 mopts="loop,$mopts"
1836                         fi
1837                         $r $MOUNT_CMD -o $mopts $mdt_dev $tmp/mnt/mdt
1838                         $r $LCTL replace_nids $fsname-OST0000 $ostnid
1839                         $r $LCTL replace_nids $fsname-MDT0000 $nid
1840                         $r $UMOUNT $tmp/mnt/mdt
1841                 fi
1842
1843                 mopts=exclude=$fsname-OST0000
1844                 if [ $fstype == "ldiskfs" ]; then
1845                         mopts="loop,$mopts"
1846                 fi
1847         fi
1848
1849         t32_wait_til_devices_gone $node
1850
1851         $r $MOUNT_CMD -o $mopts $mdt_dev $tmp/mnt/mdt || {
1852                 $r losetup -a
1853                 error_noexit "Mounting the MDT"
1854                 return 1
1855         }
1856         shall_cleanup_mdt=true
1857
1858         if $mdt2_is_available; then
1859                 mopts=mgsnode=$nid,$mopts
1860                 $r $MOUNT_CMD -o $mopts $mdt2_dev $tmp/mnt/mdt1 || {
1861                         $r losetup -a
1862                         error_noexit "Mounting the MDT"
1863                         return 1
1864                 }
1865
1866                 echo "mount new MDT....$mdt2_dev"
1867                 $r $LCTL set_param -n mdt.${fsname}*.enable_remote_dir=1 ||
1868                         error_noexit "enable remote dir create failed"
1869
1870                 shall_cleanup_mdt1=true
1871         elif [ "$dne_upgrade" != "no" ]; then
1872                 local fs2mdsdev=$(mdsdevname 1_2)
1873                 local fs2mdsvdev=$(mdsvdevname 1_2)
1874
1875                 echo "mkfs new MDT on ${fs2mdsdev}...."
1876                 if [ $(facet_fstype mds1) == ldiskfs ]; then
1877                         mkfsoptions="--mkfsoptions=\\\"-J size=8\\\""
1878                 fi
1879
1880                 add $SINGLEMDS $(mkfs_opts mds2 $fs2mdsdev $fsname) --reformat \
1881                            $mkfsoptions $fs2mdsdev $fs2mdsvdev > /dev/null || {
1882                         error_noexit "Mkfs new MDT failed"
1883                         return 1
1884                 }
1885
1886                 [[ $(facet_fstype mds1) != zfs ]] || import_zpool mds1
1887
1888                 $r $TUNEFS --dryrun $fs2mdsdev || {
1889                         error_noexit "tunefs.lustre before mounting the MDT"
1890                         return 1
1891                 }
1892
1893                 echo "mount new MDT....$fs2mdsdev"
1894                 $r $MOUNT_CMD -o $mopts $fs2mdsdev $tmp/mnt/mdt1 || {
1895                         error_noexit "mount mdt1 failed"
1896                         return 1
1897                 }
1898
1899                 $r $LCTL set_param -n mdt.${fsname}*.enable_remote_dir=1 ||
1900                         error_noexit "enable remote dir create failed"
1901
1902                 shall_cleanup_mdt1=true
1903         fi
1904
1905         uuid=$($r $LCTL get_param -n mdt.$fsname-MDT0000.uuid) || {
1906                 error_noexit "Getting MDT UUID"
1907                 return 1
1908         }
1909         if [ "$uuid" != $fsname-MDT0000_UUID ]; then
1910                 error_noexit "Unexpected MDT UUID: \"$uuid\""
1911                 return 1
1912         fi
1913
1914         $r $TUNEFS --dryrun $ost_dev || {
1915                 error_noexit "tunefs.lustre before mounting the OST"
1916                 return 1
1917         }
1918         if [ "$writeconf" ]; then
1919                 mopts=mgsnode=$nid,$writeconf
1920                 if [ $fstype == "ldiskfs" ]; then
1921                         mopts="loop,$mopts"
1922                         $r $TUNEFS --quota $ost_dev || {
1923                                 $r losetup -a
1924                                 error_noexit "Enable ost quota feature"
1925                                 return 1
1926                         }
1927                 fi
1928         else
1929                 mopts=mgsnode=$nid
1930                 if [ $fstype == "ldiskfs" ]; then
1931                         mopts="loop,$mopts"
1932                 fi
1933         fi
1934
1935         $r $MOUNT_CMD -onomgs -o$mopts $ost_dev $tmp/mnt/ost || {
1936                 error_noexit "Mounting the OST"
1937                 return 1
1938         }
1939         shall_cleanup_ost=true
1940
1941         uuid=$($r $LCTL get_param -n obdfilter.$fsname-OST0000.uuid) || {
1942                 error_noexit "Getting OST UUID"
1943                 return 1
1944         }
1945         if [ "$uuid" != $fsname-OST0000_UUID ]; then
1946                 error_noexit "Unexpected OST UUID: \"$uuid\""
1947                 return 1
1948         fi
1949
1950         $r $LCTL conf_param $fsname-OST0000.osc.max_dirty_mb=15 || {
1951                 error_noexit "Setting \"max_dirty_mb\""
1952                 return 1
1953         }
1954         $r $LCTL conf_param $fsname-OST0000.failover.node=$nid || {
1955                 error_noexit "Setting OST \"failover.node\""
1956                 return 1
1957         }
1958         $r $LCTL conf_param $fsname-MDT0000.mdc.max_rpcs_in_flight=9 || {
1959                 error_noexit "Setting \"max_rpcs_in_flight\""
1960                 return 1
1961         }
1962         $r $LCTL conf_param $fsname-MDT0000.failover.node=$nid || {
1963                 error_noexit "Setting MDT \"failover.node\""
1964                 return 1
1965         }
1966         $r $LCTL pool_new $fsname.interop || {
1967                 error_noexit "Setting \"interop\""
1968                 return 1
1969         }
1970         $r $LCTL conf_param $fsname-MDT0000.lov.stripesize=4M || {
1971                 error_noexit "Setting \"lov.stripesize\""
1972                 return 1
1973         }
1974         $r $LCTL conf_param $fsname-MDT0000.mdd.atime_diff=70 || {
1975                 error_noexit "Setting \"mdd.atime_diff\""
1976                 return 1
1977         }
1978
1979         if [ "$ff_convert" != "no" -a $(facet_fstype ost1) == "ldiskfs" ]; then
1980                 $r $LCTL lfsck_start -M $fsname-OST0000 || {
1981                         error_noexit "Start OI scrub on OST0"
1982                         return 1
1983                 }
1984
1985                 # The oi_scrub should be on ost1, but for test_32(),
1986                 # all on the SINGLEMDS.
1987                 wait_update_facet $SINGLEMDS "$LCTL get_param -n \
1988                         osd-ldiskfs.$fsname-OST0000.oi_scrub |
1989                         awk '/^status/ { print \\\$2 }'" "completed" 30 || {
1990                         error_noexit "Failed to get the expected 'completed'"
1991                         return 1
1992                 }
1993
1994                 local UPDATED=$($r $LCTL get_param -n \
1995                                 osd-ldiskfs.$fsname-OST0000.oi_scrub |
1996                                 awk '/^updated/ { print $2 }')
1997                 [ $UPDATED -ge 1 ] || {
1998                         error_noexit "Only $UPDATED objects have been converted"
1999                         return 1
2000                 }
2001         fi
2002
2003         if [ "$dne_upgrade" != "no" ]; then
2004                 $r $LCTL conf_param \
2005                                 $fsname-MDT0001.mdc.max_rpcs_in_flight=9 || {
2006                         error_noexit "Setting MDT1 \"max_rpcs_in_flight\""
2007                         return 1
2008                 }
2009                 $r $LCTL conf_param $fsname-MDT0001.failover.node=$nid || {
2010                         error_noexit "Setting MDT1 \"failover.node\""
2011                         return 1
2012                 }
2013                 $r $LCTL conf_param $fsname-MDT0001.lov.stripesize=4M || {
2014                         error_noexit "Setting MDT1 \"lov.stripesize\""
2015                         return 1
2016                 }
2017         fi
2018
2019         if [ "$writeconf" ]; then
2020                 $MOUNT_CMD $nid:/$fsname $tmp/mnt/lustre || {
2021                         error_noexit "Mounting the client"
2022                         return 1
2023                 }
2024
2025                 shall_cleanup_lustre=true
2026                 $r $LCTL set_param debug="$PTLDEBUG"
2027
2028                 t32_verify_quota $node $fsname $tmp/mnt/lustre || {
2029                         error_noexit "verify quota failed"
2030                         return 1
2031                 }
2032
2033                 if $r test -f $tmp/list; then
2034                         #
2035                         # There is not a Test Framework API to copy files to or
2036                         # from a remote node.
2037                         #
2038                         # LU-2393 - do both sorts on same node to ensure locale
2039                         # is identical
2040                         local list_file=$tmp/list
2041
2042                         if $mdt2_is_available; then
2043                                 if [[ -d $tmp/mnt/lustre/striped_dir_old ]] &&
2044                                    $r test -f $tmp/list2; then
2045                                         list_file=$tmp/list2
2046                                         pushd $tmp/mnt/lustre/striped_dir_old
2047                                 else
2048                                         pushd $tmp/mnt/lustre/remote_dir
2049                                 fi
2050                         else
2051                                 pushd $tmp/mnt/lustre
2052                         fi
2053                         $r cat $list_file | sort -k 6 >$tmp/list.orig
2054                         ls -Rni --time-style=+%s | sort -k 6 |
2055                                 sed 's/\. / /' >$tmp/list || {
2056                                 error_noexit "ls"
2057                                 return 1
2058                         }
2059                         popd
2060                         #
2061                         # 32-bit and 64-bit clients use different algorithms to
2062                         # convert FIDs into inode numbers.  Hence, remove the
2063                         # inode numbers from the lists, if the original list was
2064                         # created on an architecture with different number of
2065                         # bits per "long".
2066                         #
2067                         if [ $(t32_bits_per_long $(uname -m)) != \
2068                                 $(t32_bits_per_long $img_arch) ]; then
2069                                 echo "Different number of bits per \"long\"" \
2070                                      "from the disk image"
2071                                 for list in list.orig list; do
2072                                         sed -i -e 's/^[0-9]\+[ \t]\+//' \
2073                                                   $tmp/$list
2074                                 done
2075                         fi
2076                         if ! diff -ub $tmp/list.orig $tmp/list; then
2077                                 error_noexit "list verification failed"
2078                                 return 1
2079                         fi
2080                 else
2081                         echo "list verification skipped"
2082                 fi
2083
2084                 if [ "$dne_upgrade" != "no" ]; then
2085                         $LFS mkdir -i 1 -c2 $tmp/mnt/lustre/striped_dir || {
2086                                 error_noexit "set striped dir failed"
2087                                 return 1
2088                         }
2089
2090                         $LFS setdirstripe -D -c2 $tmp/mnt/lustre/striped_dir
2091
2092                         pushd $tmp/mnt/lustre
2093                         tar -cf - . --exclude=./striped_dir \
2094                                     --exclude=./striped_dir_old \
2095                                     --exclude=./remote_dir |
2096                                 tar -xvf - -C striped_dir 1>/dev/null || {
2097                                 error_noexit "cp to striped dir failed"
2098                                 return 1
2099                         }
2100                         popd
2101                 fi
2102
2103                 # If it is upgrade from DNE (2.5), then rename the remote dir,
2104                 # which is created in 2.5 to striped dir.
2105                 if $mdt2_is_available && [[ "$dne_upgrade" != "no" ]]; then
2106                         stripe_index=$($LFS getdirstripe -i     \
2107                                        $tmp/mnt/lustre/remote_dir)
2108
2109                         [[ $stripe_index -eq 1 ]] || {
2110                                 error_noexit "get index \"$stripe_index\"" \
2111                                              "from remote dir failed"
2112                                 return 1
2113                         }
2114                         mv $tmp/mnt/lustre/remote_dir   \
2115                                 $tmp/mnt/lustre/striped_dir/ || {
2116                                 error_noexit "mv remote dir failed"
2117                                 return 1
2118                         }
2119                 fi
2120
2121                 # If it is upgraded from DNE (2.7), then move the striped dir
2122                 # which was created in 2.7 to the new striped dir.
2123                 if $mdt2_is_available && [[ "$dne_upgrade" != "no" ]] &&
2124                         [[ -d $tmp/mnt/lustre/striped_dir_old ]]; then
2125                         stripe_count=$($LFS getdirstripe -c     \
2126                                        $tmp/mnt/lustre/striped_dir_old)
2127                         [[ $stripe_count -eq 2 ]] || {
2128                                 error_noexit "get count $stripe_count" \
2129                                              "from striped dir failed"
2130                                 return 1
2131                         }
2132                         mv $tmp/mnt/lustre/striped_dir_old      \
2133                                 $tmp/mnt/lustre/striped_dir/ || {
2134                                 error_noexit "mv striped dir failed"
2135                                 return 1
2136                         }
2137                 fi
2138
2139                 sync; sleep 5; sync
2140                 $r $LCTL set_param -n osd*.*.force_sync=1
2141                 dd if=/dev/zero of=$tmp/mnt/lustre/tmp_file bs=10k count=10 || {
2142                         error_noexit "dd failed"
2143                         return 1
2144                 }
2145                 rm -rf $tmp/mnt/lustre/tmp_file || {
2146                         error_noexit "rm failed"
2147                         return 1
2148                 }
2149
2150                 if $r test -f $tmp/sha1sums; then
2151                         # LU-2393 - do both sorts on same node to ensure locale
2152                         # is identical
2153                         $r cat $tmp/sha1sums | sort -k 2 >$tmp/sha1sums.orig
2154                         if [ "$dne_upgrade" != "no" ]; then
2155                                 pushd $tmp/mnt/lustre/striped_dir
2156                         else
2157                                 pushd $tmp/mnt/lustre
2158                         fi
2159
2160                         find ! -path "*remote_dir*" ! -path "*striped_dir*" \
2161                                 ! -name .lustre -type f -exec sha1sum {} \; |
2162                                 sort -k 2 >$tmp/sha1sums || {
2163                                 popd
2164                                 error_noexit "sha1sum"
2165                                 return 1
2166                         }
2167                         popd
2168                         if ! diff -ub $tmp/sha1sums.orig $tmp/sha1sums; then
2169                                 error_noexit "sha1sum verification failed"
2170                                 return 1
2171                         fi
2172
2173                         # if upgrade from DNE(2.5), then check remote directory
2174                         # if upgrade from DNE(2.7), then check striped directory
2175                         if $mdt2_is_available &&
2176                            [[ "$dne_upgrade" != "no" ]]; then
2177                                 local new_dir="$tmp/mnt/lustre/striped_dir"
2178                                 local striped_dir_old="$new_dir/striped_dir_old"
2179
2180                                 local dir_list="$new_dir/remote_dir"
2181                                 [[ ! -d $triped_dir_old ]] ||
2182                                         dir_list+=" $striped_dir_old"
2183
2184                                 for dir in $dir_list; do
2185                                         pushd $dir
2186                                         find ! -name .lustre -type f    \
2187                                                 -exec sha1sum {} \; |
2188                                                 sort -k 2 >$tmp/sha1sums || {
2189                                                         popd
2190                                                         error_noexit "sha1sum"
2191                                                         return 1
2192                                                 }
2193                                         popd
2194                                         if ! diff -ub $tmp/sha1sums.orig \
2195                                                 $tmp/sha1sums; then
2196                                                 error_noexit "sha1sum $dir" \
2197                                                              "failed"
2198                                                 return 1
2199                                         fi
2200                                 done
2201                         fi
2202                 else
2203                         echo "sha1sum verification skipped"
2204                 fi
2205
2206                 if [ "$dne_upgrade" != "no" ]; then
2207                         rm -rf $tmp/mnt/lustre/striped_dir || {
2208                                 error_noexit "remove remote dir failed"
2209                                 return 1
2210                         }
2211                 fi
2212
2213                 # migrate files/dirs to remote MDT, then move them back
2214                 if [ $(lustre_version_code mds1) -ge $(version_code 2.7.50) -a \
2215                      $dne_upgrade != "no" ]; then
2216                         $r $LCTL set_param -n   \
2217                                 mdt.${fsname}*.enable_remote_dir=1 2>/dev/null
2218
2219                         echo "test migration"
2220                         pushd $tmp/mnt/lustre
2221                         for dir in $(find ! -name .lustre ! -name . -type d); do
2222                                 mdt_index=$($LFS getdirstripe -i $dir)
2223                                 stripe_cnt=$($LFS getdirstripe -c $dir)
2224                                 if [ $mdt_index = 0 -a $stripe_cnt -le 1 ]; then
2225                                         $LFS mv -M 1 $dir || {
2226                                         popd
2227                                         error_noexit "migrate MDT1 failed"
2228                                         return 1
2229                                 }
2230                                 fi
2231                         done
2232
2233                         for dir in $(find ! -name . ! -name .lustre -type d); do
2234                                 mdt_index=$($LFS getdirstripe -i $dir)
2235                                 stripe_cnt=$($LFS getdirstripe -c $dir)
2236                                 if [ $mdt_index = 1 -a $stripe_cnt -le 1 ]; then
2237                                         $LFS mv -M 0 $dir || {
2238                                         popd
2239                                         error_noexit "migrate MDT0 failed"
2240                                         return 1
2241                                 }
2242                                 fi
2243                         done
2244                         popd
2245                 fi
2246
2247                 #
2248                 # When adding new data verification tests, please check for
2249                 # the presence of the required reference files first, like
2250                 # the "sha1sums" and "list" tests above, to avoid the need to
2251                 # regenerate every image for each test addition.
2252                 #
2253
2254                 nrpcs_orig=$($LCTL get_param \
2255                                 -n mdc.*MDT0000*.max_rpcs_in_flight) || {
2256                         error_noexit "Getting \"max_rpcs_in_flight\""
2257                         return 1
2258                 }
2259                 nrpcs=$((nrpcs_orig + 5))
2260                 $r $LCTL conf_param $fsname-MDT0000.mdc.max_rpcs_in_flight=$nrpcs || {
2261                         error_noexit "Changing \"max_rpcs_in_flight\""
2262                         return 1
2263                 }
2264                 wait_update $HOSTNAME "$LCTL get_param \
2265                         -n mdc.*MDT0000*.max_rpcs_in_flight" $nrpcs || {
2266                         error_noexit "Verifying \"max_rpcs_in_flight\""
2267                         return 1
2268                 }
2269
2270                 umount $tmp/mnt/lustre || {
2271                         error_noexit "Unmounting the client"
2272                         return 1
2273                 }
2274                 shall_cleanup_lustre=false
2275         else
2276                 if [[ "$dne_upgrade" != "no" ]] || $mdt2_is_available; then
2277                         $r $UMOUNT $tmp/mnt/mdt1 || {
2278                                 error_noexit "Unmounting the MDT2"
2279                                 return 1
2280                         }
2281                         shall_cleanup_mdt1=false
2282                 fi
2283
2284                 $r $UMOUNT $tmp/mnt/mdt || {
2285                         error_noexit "Unmounting the MDT"
2286                         return 1
2287                 }
2288                 shall_cleanup_mdt=false
2289
2290                 $r $UMOUNT $tmp/mnt/ost || {
2291                         error_noexit "Unmounting the OST"
2292                         return 1
2293                 }
2294                 shall_cleanup_ost=false
2295
2296                 t32_reload_modules $node || {
2297                         error_noexit "Reloading modules"
2298                         return 1
2299                 }
2300
2301                 if [[ $fstype == zfs ]]; then
2302                         local poolname=t32fs-mdt1
2303                         $r "modprobe zfs;
2304                             $ZPOOL list -H $poolname >/dev/null 2>&1 ||
2305                                 $ZPOOL import -f -d $tmp $poolname"
2306
2307                         # upgrade zpool to latest supported features,
2308                         # including dnode quota accounting in 0.7.0
2309                         $r "$ZPOOL upgrade $poolname"
2310                 fi
2311
2312                 # mount a second time to make sure we didnt leave upgrade flag on
2313                 $r $TUNEFS --dryrun $mdt_dev || {
2314                         $r losetup -a
2315                         error_noexit "tunefs.lustre before remounting the MDT"
2316                         return 1
2317                 }
2318
2319                 mopts=exclude=$fsname-OST0000
2320                 if [ $fstype == "ldiskfs" ]; then
2321                         mopts="loop,$mopts"
2322                 fi
2323                 $r $MOUNT_CMD -o $mopts $mdt_dev $tmp/mnt/mdt || {
2324                         error_noexit "Remounting the MDT"
2325                         return 1
2326                 }
2327                 shall_cleanup_mdt=true
2328         fi
2329 }
2330
2331 test_32a() {
2332         local tarballs
2333         local tarball
2334         local rc=0
2335
2336         t32_check
2337         for tarball in $tarballs; do
2338                 t32_test $tarball || let "rc += $?"
2339         done
2340         return $rc
2341 }
2342 run_test 32a "Upgrade (not live)"
2343
2344 test_32b() {
2345         local tarballs
2346         local tarball
2347         local rc=0
2348
2349         t32_check
2350         for tarball in $tarballs; do
2351                 t32_test $tarball writeconf || let "rc += $?"
2352         done
2353         return $rc
2354 }
2355 run_test 32b "Upgrade with writeconf"
2356
2357 test_32c() {
2358         local tarballs
2359         local tarball
2360         local rc=0
2361
2362         [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
2363         t32_check
2364         for tarball in $tarballs; do
2365                 # Do not support 1_8 and 2_1 direct upgrade to DNE2 anymore */
2366                 echo $tarball | grep "1_8" && continue
2367                 echo $tarball | grep "2_1" && continue
2368                 load_modules
2369                 dne_upgrade=yes t32_test $tarball writeconf || rc=$?
2370         done
2371         return $rc
2372 }
2373 run_test 32c "dne upgrade test"
2374
2375 test_32d() {
2376         local tarballs
2377         local tarball
2378         local rc=0
2379
2380         t32_check
2381         for tarball in $tarballs; do
2382                 ff_convert=yes t32_test $tarball || rc=$?
2383         done
2384         return $rc
2385 }
2386 run_test 32d "convert ff test"
2387
2388 test_33a() { # bug 12333, was test_33
2389         local FSNAME2=test-123
2390         local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
2391         local mkfsoptions
2392
2393         [ -n "$ost1_HOST" ] && fs2ost_HOST=$ost1_HOST
2394
2395         if [ -z "$fs2ost_DEV" -o -z "$fs2mds_DEV" ]; then
2396                 local dev=${SINGLEMDS}_dev
2397                 local MDSDEV=${!dev}
2398                 is_blkdev $SINGLEMDS $MDSDEV &&
2399                         skip_env "mixed loopback and real device not working" &&
2400                         return
2401         fi
2402
2403         local fs2mdsdev=$(mdsdevname 1_2)
2404         local fs2ostdev=$(ostdevname 1_2)
2405         local fs2mdsvdev=$(mdsvdevname 1_2)
2406         local fs2ostvdev=$(ostvdevname 1_2)
2407
2408         if [ $(facet_fstype mds1) == ldiskfs ]; then
2409                 mkfsoptions="--mkfsoptions=\\\"-J size=8\\\"" # See bug 17931.
2410         fi
2411
2412         if combined_mgs_mds; then
2413                 local mgs_flag="--mgs"
2414         fi
2415
2416         add fs2mds $(mkfs_opts mds1 ${fs2mdsdev}) --fsname=${FSNAME2} \
2417                 --reformat $mgs_flag $mkfsoptions $fs2mdsdev $fs2mdsvdev ||
2418                 exit 10
2419         add fs2ost $(mkfs_opts ost1 ${fs2ostdev}) --mgsnode=$MGSNID \
2420                 --fsname=${FSNAME2} --index=8191 --reformat $fs2ostdev \
2421                 $fs2ostvdev || exit 10
2422
2423         start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && trap cleanup_fs2 EXIT INT
2424         start fs2ost $fs2ostdev $OST_MOUNT_OPTS
2425         do_facet mgs "$LCTL conf_param $FSNAME2.sys.timeout=200" ||
2426                 error "$LCTL conf_param $FSNAME2.sys.timeout=200 failed"
2427         mkdir -p $MOUNT2 || error "mkdir $MOUNT2 failed"
2428         $MOUNT_CMD $MGSNID:/${FSNAME2} $MOUNT2 || error "$MOUNT_CMD failed"
2429         echo "ok."
2430
2431         cp /etc/hosts $MOUNT2/ || error "copy /etc/hosts $MOUNT2/ failed"
2432         $GETSTRIPE $MOUNT2/hosts || error "$GETSTRIPE $MOUNT2/hosts failed"
2433
2434         umount $MOUNT2
2435         stop fs2ost -f
2436         stop fs2mds -f
2437         cleanup_nocli || error "cleanup_nocli failed with $?"
2438 }
2439 run_test 33a "Mount ost with a large index number"
2440
2441 test_33b() {    # was test_34
2442         setup
2443
2444         do_facet client dd if=/dev/zero of=$MOUNT/24 bs=1024k count=1
2445         # Drop lock cancelation reply during umount
2446         #define OBD_FAIL_LDLM_CANCEL_NET                        0x304
2447         do_facet client $LCTL set_param fail_loc=0x80000304
2448         #lctl set_param debug=-1
2449         umount_client $MOUNT
2450         cleanup || error "cleanup failed with $?"
2451 }
2452 run_test 33b "Drop cancel during umount"
2453
2454 test_34a() {
2455         setup
2456         do_facet client "sh runmultiop_bg_pause $DIR/file O_c"
2457         manual_umount_client
2458         rc=$?
2459         do_facet client killall -USR1 multiop
2460         if [ $rc -eq 0 ]; then
2461                 error "umount not fail!"
2462         fi
2463         sleep 1
2464         cleanup || error "cleanup failed with rc $?"
2465 }
2466 run_test 34a "umount with opened file should be fail"
2467
2468 test_34b() {
2469         setup
2470         touch $DIR/$tfile || error "touch $DIR/$tfile failed"
2471         stop_mds || error "Unable to stop MDS"
2472
2473         manual_umount_client --force || error "mtab after failed umount with $?"
2474
2475         cleanup || error "cleanup failed with $?"
2476 }
2477 run_test 34b "force umount with failed mds should be normal"
2478
2479 test_34c() {
2480         setup
2481         touch $DIR/$tfile || error "touch $DIR/$tfile failed"
2482         stop_ost || error "Unable to stop OST1"
2483
2484         manual_umount_client --force || error "mtab after failed umount with $?"
2485
2486         cleanup || error "cleanup failed with $?"
2487 }
2488 run_test 34c "force umount with failed ost should be normal"
2489
2490 test_35a() { # bug 12459
2491         setup
2492
2493         DBG_SAVE="`$LCTL get_param -n debug`"
2494         $LCTL set_param debug="ha"
2495
2496         log "Set up a fake failnode for the MDS"
2497         FAKENID="127.0.0.2"
2498         local device=$(do_facet $SINGLEMDS "$LCTL get_param -n devices" |
2499                 awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }' | head -1)
2500         do_facet mgs "$LCTL conf_param \
2501                       ${device}.failover.node=$(h2nettype $FAKENID)" ||
2502                 error "Setting ${device}.failover.node=\
2503                        $(h2nettype $FAKENID) failed."
2504
2505         log "Wait for RECONNECT_INTERVAL seconds (10s)"
2506         sleep 10
2507
2508         MSG="conf-sanity.sh test_35a `date +%F%kh%Mm%Ss`"
2509         $LCTL clear
2510         log "$MSG"
2511         log "Stopping the MDT: $device"
2512         stop_mdt 1 || error "MDT0 stop fail"
2513
2514         df $MOUNT > /dev/null 2>&1 &
2515         DFPID=$!
2516         log "Restarting the MDT: $device"
2517         start_mdt 1 || error "MDT0 start fail"
2518         log "Wait for df ($DFPID) ... "
2519         wait $DFPID
2520         log "done"
2521         $LCTL set_param debug="$DBG_SAVE"
2522
2523         # retrieve from the log the first server that the client tried to
2524         # contact after the connection loss
2525         $LCTL dk $TMP/lustre-log-$TESTNAME.log
2526         NEXTCONN=`awk "/${MSG}/ {start = 1;}
2527                        /import_select_connection.*$device-mdc.* using connection/ {
2528                                 if (start) {
2529                                         if (\\\$NF ~ /$FAKENID/)
2530                                                 print \\\$NF;
2531                                         else
2532                                                 print 0;
2533                                         exit;
2534                                 }
2535                        }" $TMP/lustre-log-$TESTNAME.log`
2536         [ "$NEXTCONN" != "0" ] &&
2537                 error "Tried to connect to ${NEXTCONN} not last active server"
2538         cleanup || error "cleanup failed with $?"
2539         # remove nid settings
2540         writeconf_or_reformat
2541 }
2542 run_test 35a "Reconnect to the last active server first"
2543
2544 test_35b() { # bug 18674
2545         remote_mds || { skip "local MDS" && return 0; }
2546         setup
2547
2548         debugsave
2549         $LCTL set_param debug="ha"
2550         $LCTL clear
2551         MSG="conf-sanity.sh test_35b `date +%F%kh%Mm%Ss`"
2552         log "$MSG"
2553
2554         log "Set up a fake failnode for the MDS"
2555         FAKENID="127.0.0.2"
2556         local device=$(do_facet $SINGLEMDS "$LCTL get_param -n devices" |
2557                 awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }' | head -1)
2558         do_facet mgs "$LCTL conf_param \
2559                       ${device}.failover.node=$(h2nettype $FAKENID)" ||
2560                 error "Set ${device}.failover.node=\
2561                        $(h2nettype $FAKENID) failed"
2562
2563         local at_max_saved=0
2564         # adaptive timeouts may prevent seeing the issue
2565         if at_is_enabled; then
2566                 at_max_saved=$(at_max_get mds)
2567                 at_max_set 0 mds client
2568         fi
2569
2570         mkdir $MOUNT/$tdir || error "mkdir $MOUNT/$tdir failed"
2571
2572         log "Injecting EBUSY on MDS"
2573         # Setting OBD_FAIL_MDS_RESEND=0x136
2574         do_facet $SINGLEMDS "$LCTL set_param fail_loc=0x80000136" ||
2575                 error "unable to set param fail_loc=0x80000136"
2576
2577         $LCTL set_param mdc.${FSNAME}*.stats=clear
2578
2579         log "Creating a test file and stat it"
2580         touch $MOUNT/$tdir/$tfile || error "touch $MOUNT/$tdir/$tfile failed"
2581         stat $MOUNT/$tdir/$tfile
2582
2583         log "Stop injecting EBUSY on MDS"
2584         do_facet $SINGLEMDS "$LCTL set_param fail_loc=0" ||
2585                 error "unable to set param fail_loc=0"
2586         rm -f $MOUNT/$tdir/$tfile || error "remove $MOUNT/$tdir/$tfile failed"
2587
2588         log "done"
2589         # restore adaptive timeout
2590         [ $at_max_saved -ne 0 ] && at_max_set $at_max_saved mds client
2591
2592         $LCTL dk $TMP/lustre-log-$TESTNAME.log
2593
2594         CONNCNT=$($LCTL get_param mdc.${FSNAME}*.stats |
2595                   awk '/mds_connect/{print $2}')
2596
2597         # retrieve from the log if the client has ever tried to
2598         # contact the fake server after the loss of connection
2599         FAILCONN=`awk "BEGIN {ret = 0;}
2600                        /import_select_connection.*${FSNAME}-MDT0000-mdc.* using connection/ {
2601                                 ret = 1;
2602                                 if (\\\$NF ~ /$FAKENID/) {
2603                                         ret = 2;
2604                                         exit;
2605                                 }
2606                        }
2607                        END {print ret}" $TMP/lustre-log-$TESTNAME.log`
2608
2609         [ "$FAILCONN" == "0" ] &&
2610                 error "The client reconnection has not been triggered"
2611         [ "$FAILCONN" == "2" ] &&
2612                 error "Primary server busy, client reconnect to failover failed"
2613
2614         # LU-290
2615         # When OBD_FAIL_MDS_RESEND is hit, we sleep for 2 * obd_timeout
2616         # Reconnects are supposed to be rate limited to one every 5s
2617         [ $CONNCNT -gt $((2 * $TIMEOUT / 5 + 1)) ] &&
2618                 error "Too many reconnects $CONNCNT"
2619
2620         cleanup || error "cleanup failed with $?"
2621         # remove nid settings
2622         writeconf_or_reformat
2623 }
2624 run_test 35b "Continue reconnection retries, if the active server is busy"
2625
2626 test_36() { # 12743
2627         [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs" && return
2628
2629         [ "$ost_HOST" = "`hostname`" -o "$ost1_HOST" = "`hostname`" ] ||
2630                 { skip "remote OST" && return 0; }
2631
2632         local rc=0
2633         local FSNAME2=test1234
2634         local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
2635
2636         [ -n "$ost1_HOST" ] && fs2ost_HOST=$ost1_HOST && fs3ost_HOST=$ost1_HOST
2637
2638         if [ -z "$fs2ost_DEV" -o -z "$fs2mds_DEV" -o -z "$fs3ost_DEV" ]; then
2639                 is_blkdev $SINGLEMDS $MDSDEV &&
2640                 skip_env "mixed loopback and real device not working" && return
2641         fi
2642
2643         local fs2mdsdev=$(mdsdevname 1_2)
2644         local fs2ostdev=$(ostdevname 1_2)
2645         local fs3ostdev=$(ostdevname 2_2)
2646         local fs2mdsvdev=$(mdsvdevname 1_2)
2647         local fs2ostvdev=$(ostvdevname 1_2)
2648         local fs3ostvdev=$(ostvdevname 2_2)
2649
2650         add fs2mds $(mkfs_opts mds1 ${fs2mdsdev}) --mgs --fsname=${FSNAME2} \
2651                 --reformat $fs2mdsdev $fs2mdsvdev || exit 10
2652         # XXX after we support non 4K disk blocksize in ldiskfs, specify a
2653         #     different one than the default value here.
2654         add fs2ost $(mkfs_opts ost1 ${fs2ostdev}) --mgsnode=$MGSNID \
2655                 --fsname=${FSNAME2} --reformat $fs2ostdev $fs2ostvdev || exit 10
2656         add fs3ost $(mkfs_opts ost2 ${fs3ostdev}) --mgsnode=$MGSNID \
2657                 --fsname=${FSNAME2} --reformat $fs3ostdev $fs3ostvdev || exit 10
2658
2659         start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS
2660         start fs2ost $fs2ostdev $OST_MOUNT_OPTS
2661         start fs3ost $fs3ostdev $OST_MOUNT_OPTS
2662         mkdir -p $MOUNT2 || error "mkdir $MOUNT2 failed"
2663         $MOUNT_CMD $MGSNID:/${FSNAME2} $MOUNT2 || error "$MOUNT_CMD failed"
2664
2665         sleep 5 # until 11778 fixed
2666
2667         dd if=/dev/zero of=$MOUNT2/$tfile bs=1M count=7 || error "dd failed"
2668
2669         BKTOTAL=$($LCTL get_param -n obdfilter.*.kbytestotal |
2670                   awk 'BEGIN{total=0}; {total+=$1}; END{print total}')
2671         BKFREE=$($LCTL get_param -n obdfilter.*.kbytesfree |
2672                  awk 'BEGIN{free=0}; {free+=$1}; END{print free}')
2673         BKAVAIL=$($LCTL get_param -n obdfilter.*.kbytesavail |
2674                   awk 'BEGIN{avail=0}; {avail+=$1}; END{print avail}')
2675         STRING=$(df -P $MOUNT2 | tail -n 1 | awk '{print $2","$3","$4}')
2676         DFTOTAL=$(echo $STRING | cut -d, -f1)
2677         DFUSED=$(echo $STRING  | cut -d, -f2)
2678         DFAVAIL=$(echo $STRING | cut -d, -f3)
2679         DFFREE=$(($DFTOTAL - $DFUSED))
2680
2681         ALLOWANCE=$((64 * $OSTCOUNT))
2682
2683         if [ $DFTOTAL -lt $(($BKTOTAL - $ALLOWANCE)) ] ||
2684            [ $DFTOTAL -gt $(($BKTOTAL + $ALLOWANCE)) ] ; then
2685                 echo "**** FAIL: df total($DFTOTAL) mismatch OST total($BKTOTAL)"
2686                 rc=1
2687         fi
2688         if [ $DFFREE -lt $(($BKFREE - $ALLOWANCE)) ] ||
2689            [ $DFFREE -gt $(($BKFREE + $ALLOWANCE)) ] ; then
2690                 echo "**** FAIL: df free($DFFREE) mismatch OST free($BKFREE)"
2691                 rc=2
2692         fi
2693         if [ $DFAVAIL -lt $(($BKAVAIL - $ALLOWANCE)) ] ||
2694            [ $DFAVAIL -gt $(($BKAVAIL + $ALLOWANCE)) ] ; then
2695                 echo "**** FAIL: df avail($DFAVAIL) mismatch OST avail($BKAVAIL)"
2696                 rc=3
2697        fi
2698
2699         $UMOUNT $MOUNT2
2700         stop fs3ost -f || error "unable to stop OST3"
2701         stop fs2ost -f || error "unable to stop OST2"
2702         stop fs2mds -f || error "unable to stop second MDS"
2703         unload_modules_conf || error "unable unload modules"
2704         return $rc
2705 }
2706 run_test 36 "df report consistency on OSTs with different block size"
2707
2708 test_37() {
2709         local mntpt=$(facet_mntpt $SINGLEMDS)
2710         local mdsdev=$(mdsdevname ${SINGLEMDS//mds/})
2711         local mdsdev_sym="$TMP/sym_mdt.img"
2712         local opts=$MDS_MOUNT_OPTS
2713         local rc=0
2714
2715         if [ $(facet_fstype $SINGLEMDS) != ldiskfs ]; then
2716                 skip "ldiskfs only test"
2717                 return
2718         fi
2719
2720         echo "MDS :     $mdsdev"
2721         echo "SYMLINK : $mdsdev_sym"
2722         do_facet $SINGLEMDS rm -f $mdsdev_sym
2723
2724         do_facet $SINGLEMDS ln -s $mdsdev $mdsdev_sym
2725
2726         echo "mount symlink device - $mdsdev_sym"
2727
2728         if ! do_facet $SINGLEMDS test -b $mdsdev; then
2729                 opts=$(csa_add "$opts" -o loop)
2730         fi
2731         mount_op=$(do_facet $SINGLEMDS mount -v -t lustre $opts \
2732                 $mdsdev_sym $mntpt 2>&1)
2733         rc=${PIPESTATUS[0]}
2734
2735         echo mount_op=$mount_op
2736
2737         do_facet $SINGLEMDS "$UMOUNT $mntpt && rm -f $mdsdev_sym"
2738
2739         if $(echo $mount_op | grep -q "unable to set tunable"); then
2740                 error "set tunables failed for symlink device"
2741         fi
2742
2743         [ $rc -eq 0 ] || error "mount symlink $mdsdev_sym failed! rc=$rc"
2744 }
2745 run_test 37 "verify set tunables works for symlink device"
2746
2747 test_38() { # bug 14222
2748         local fstype=$(facet_fstype $SINGLEMDS)
2749         local mntpt=$(facet_mntpt $SINGLEMDS)
2750
2751         setup
2752         # like runtests
2753         local COUNT=10
2754         local SRC="/etc /bin"
2755         local FILES=$(find $SRC -type f -mtime +1 | head -n $COUNT)
2756         log "copying $(echo $FILES | wc -w) files to $DIR/$tdir"
2757         mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed"
2758         tar cf - $FILES | tar xf - -C $DIR/$tdir ||
2759                 error "copying $SRC to $DIR/$tdir"
2760         sync
2761         umount_client $MOUNT || error "umount_client $MOUNT failed"
2762         do_facet $SINGLEMDS "$LCTL get_param osp.*.prealloc_next_id"
2763         stop_mds || error "Unable to stop MDS"
2764         log "delete lov_objid file on MDS"
2765
2766         mount_fstype $SINGLEMDS || error "mount MDS failed (1)"
2767
2768         do_facet $SINGLEMDS "od -Ax -td8 $mntpt/lov_objid; rm $mntpt/lov_objid"
2769
2770         unmount_fstype $SINGLEMDS || error "umount failed (1)"
2771
2772         # check create in mds_lov_connect
2773         start_mds || error "unable to start MDS"
2774         mount_client $MOUNT || error "mount_client $MOUNT failed"
2775         for f in $FILES; do
2776                 [ $V ] && log "verifying $DIR/$tdir/$f"
2777                 diff -q $f $DIR/$tdir/$f || ERROR=y
2778         done
2779         do_facet $SINGLEMDS "$LCTL get_param osp.*.prealloc_next_id"
2780         if [ "$ERROR" = "y" ]; then
2781                 # check it's updates in sync
2782                 umount_client $MOUNT
2783                 stop_mds
2784                 mount_fstype $SIGNLEMDS
2785                 do_facet $SINGLEMDS "od -Ax -td8 $mntpt/lov_objid"
2786                 unmount_fstype $SINGLEMDS
2787                 error "old and new files are different after connect" || true
2788         fi
2789         touch $DIR/$tdir/f2 || error "f2 file create failed"
2790
2791         # check it's updates in sync
2792         umount_client $MOUNT || error "second umount_client $MOUNT failed"
2793         stop_mds
2794
2795         mount_fstype $SINGLEMDS || error "mount MDS failed (3)"
2796
2797         do_facet $SINGLEMDS "od -Ax -td8 $mntpt/lov_objid"
2798         do_facet $SINGLEMDS dd if=/dev/zero of=$mntpt/lov_objid.clear count=8
2799
2800         unmount_fstype $SINGLEMDS || error "umount failed (3)"
2801
2802         start_mds || error "unable to start MDS"
2803         mount_client $MOUNT || error "mount_client $MOUNT failed"
2804         for f in $FILES; do
2805                 [ $V ] && log "verifying $DIR/$tdir/$f"
2806                 diff -q $f $DIR/$tdir/$f || ERROR=y
2807         done
2808         touch $DIR/$tdir/f3 || error "f3 file create failed"
2809         do_facet $SINGLEMDS "$LCTL get_param osp.*.prealloc_next_id"
2810         umount_client $MOUNT || error "third umount_client $MOUNT failed"
2811         stop_mds
2812         mount_fstype $SINGLEMDS || error "mount MDS failed (4)"
2813         do_facet $SINGLEMDS "od -Ax -td8 $mntpt/lov_objid"
2814         unmount_fstype $SINGLEMDS || error "umount failed (4)"
2815
2816         [ "$ERROR" = "y" ] &&
2817                 error "old and new files are different after sync" || true
2818
2819         log "files compared the same"
2820         cleanup || error "cleanup failed with $?"
2821 }
2822 run_test 38 "MDS recreates missing lov_objid file from OST data"
2823
2824 test_39() {
2825         PTLDEBUG=+malloc
2826         setup
2827         cleanup || error "cleanup failed with $?"
2828         perl $SRCDIR/leak_finder.pl $TMP/debug 2>&1 | egrep '*** Leak:' &&
2829                 error "memory leak detected" || true
2830 }
2831 run_test 39 "leak_finder recognizes both LUSTRE and LNET malloc messages"
2832
2833 test_40() { # bug 15759
2834         start_ost || error "Unable to start OST1"
2835         #define OBD_FAIL_TGT_TOOMANY_THREADS     0x706
2836         do_facet $SINGLEMDS "$LCTL set_param fail_loc=0x80000706"
2837         start_mds
2838         cleanup || error "cleanup failed with rc $?"
2839 }
2840 run_test 40 "race during service thread startup"
2841
2842 test_41a() { #bug 14134
2843         if [ $(facet_fstype $SINGLEMDS) == ldiskfs ] &&
2844            ! do_facet $SINGLEMDS test -b $(mdsdevname 1); then
2845                 skip "Loop devices does not work with nosvc option"
2846                 return
2847         fi
2848
2849         combined_mgs_mds ||
2850                 { skip "needs combined MGT and MDT device" && return 0; }
2851
2852         start_mdt 1 -o nosvc -n
2853         if [ $MDSCOUNT -ge 2 ]; then
2854                 for num in $(seq 2 $MDSCOUNT); do
2855                         start_mdt $num || return
2856                 done
2857         fi
2858         start ost1 $(ostdevname 1) $OST_MOUNT_OPTS
2859         start_mdt 1 -o nomgs,force
2860         mount_client $MOUNT || error "mount_client $MOUNT failed"
2861         sleep 5
2862
2863         echo "blah blah" > $MOUNT/$tfile
2864         cat $MOUNT/$tfile
2865
2866         umount_client $MOUNT || error "umount_client $MOUNT failed"
2867         stop ost1 -f || error "unable to stop OST1"
2868         stop_mds || error "Unable to stop MDS"
2869         stop_mds || error "Unable to stop MDS on second try"
2870 }
2871 run_test 41a "mount mds with --nosvc and --nomgs"
2872
2873 test_41b() {
2874         if [ $(facet_fstype $SINGLEMDS) == ldiskfs ] &&
2875            ! do_facet $SINGLEMDS test -b $(mdsdevname 1); then
2876                 skip "Loop devices does not work with nosvc option"
2877                 return
2878         fi
2879
2880         ! combined_mgs_mds && skip "needs combined mgs device" && return 0
2881
2882         stopall
2883         reformat
2884         local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
2885
2886         start_mdt 1 -o nosvc -n
2887         if [ $MDSCOUNT -ge 2 ]; then
2888                 for num in $(seq 2 $MDSCOUNT); do
2889                         start_mdt $num || return
2890                 done
2891         fi
2892         start_ost || error "Unable to start OST1"
2893         start_mdt 1 -o nomgs,force
2894         mount_client $MOUNT || error "mount_client $MOUNT failed"
2895         sleep 5
2896
2897         echo "blah blah" > $MOUNT/$tfile
2898         cat $MOUNT/$tfile || error "cat $MOUNT/$tfile failed"
2899
2900         umount_client $MOUNT -f || error "umount_client $MOUNT failed"
2901         stop_ost || error "Unable to stop OST1"
2902         stop_mds || error "Unable to stop MDS"
2903         stop_mds || error "Unable to stop MDS on second try"
2904 }
2905 run_test 41b "mount mds with --nosvc and --nomgs on first mount"
2906
2907 test_41c() {
2908         local server_version=$(lustre_version_code $SINGLEMDS)
2909         local oss_list=$(comma_list $(osts_nodes))
2910
2911         [[ $server_version -ge $(version_code 2.6.52) ]] ||
2912         [[ $server_version -ge $(version_code 2.5.26) &&
2913            $server_version -lt $(version_code 2.5.50) ]] ||
2914         [[ $server_version -ge $(version_code 2.5.4) &&
2915            $server_version -lt $(version_code 2.5.11) ]] ||
2916                 { skip "Need MDS version 2.5.4+ or 2.5.26+ or 2.6.52+"; return; }
2917
2918         # ensure mds1 ost1 have been created even if running sub-test standalone
2919         cleanup
2920         setup
2921         cleanup || error "cleanup failed"
2922
2923         # using directly mount command instead of start() function to avoid
2924         # any side effect of // with others/externals tools/features
2925         # ("zpool import", ...)
2926
2927         # MDT concurrent start
2928
2929         LOAD_MODULES_REMOTE=true load_modules
2930         do_facet $SINGLEMDS "lsmod | grep -q libcfs" ||
2931                 error "MDT concurrent start: libcfs module not loaded"
2932
2933         local mds1dev=$(mdsdevname 1)
2934         local mds1mnt=$(facet_mntpt mds1)
2935         local mds1fstype=$(facet_fstype mds1)
2936         local mds1opts=$MDS_MOUNT_OPTS
2937
2938         if [ $mds1fstype == ldiskfs ] &&
2939            ! do_facet mds1 test -b $mds1dev; then
2940                 mds1opts=$(csa_add "$mds1opts" -o loop)
2941         fi
2942         if [[ $mds1fstype == zfs ]]; then
2943                 import_zpool mds1 || return ${PIPESTATUS[0]}
2944         fi
2945
2946         #define OBD_FAIL_TGT_MOUNT_RACE 0x716
2947         do_facet mds1 "$LCTL set_param fail_loc=0x80000716"
2948
2949         do_facet mds1 mount -t lustre $mds1dev $mds1mnt $mds1opts &
2950         local pid=$!
2951
2952         do_facet mds1 mount -t lustre $mds1dev $mds1mnt $mds1opts
2953         local rc2=$?
2954         wait $pid
2955         local rc=$?
2956         do_facet mds1 "$LCTL set_param fail_loc=0x0"
2957         if [ $rc -eq 0 ] && [ $rc2 -ne 0 ]; then
2958                 echo "1st MDT start succeed"
2959                 echo "2nd MDT start failed with $rc2"
2960         elif [ $rc2 -eq 0 ] && [ $rc -ne 0 ]; then
2961                 echo "1st MDT start failed with $rc"
2962                 echo "2nd MDT start succeed"
2963         else
2964                 stop mds1 -f
2965                 error "unexpected concurrent MDT mounts result, rc=$rc rc2=$rc2"
2966         fi
2967
2968         if [ $MDSCOUNT -ge 2 ]; then
2969                 for num in $(seq 2 $MDSCOUNT); do
2970                         start_mdt $num || return
2971                 done
2972         fi
2973
2974         # OST concurrent start
2975
2976         do_rpc_nodes $oss_list "lsmod | grep -q libcfs" ||
2977                 error "OST concurrent start: libcfs module not loaded"
2978
2979         local ost1dev=$(ostdevname 1)
2980         local ost1mnt=$(facet_mntpt ost1)
2981         local ost1fstype=$(facet_fstype ost1)
2982         local ost1opts=$OST_MOUNT_OPTS
2983
2984         if [ $ost1fstype == ldiskfs ] &&
2985            ! do_facet ost1 test -b $ost1dev; then
2986                 ost1opts=$(csa_add "$ost1opts" -o loop)
2987         fi
2988         if [[ $ost1fstype == zfs ]]; then
2989                 import_zpool ost1 || return ${PIPESTATUS[0]}
2990         fi
2991
2992         #define OBD_FAIL_TGT_MOUNT_RACE 0x716
2993         do_facet ost1 "$LCTL set_param fail_loc=0x80000716"
2994
2995         do_facet ost1 mount -t lustre $ost1dev $ost1mnt $ost1opts &
2996         pid=$!
2997
2998         do_facet ost1 mount -t lustre $ost1dev $ost1mnt $ost1opts
2999         rc2=$?
3000         wait $pid
3001         rc=$?
3002         do_facet ost1 "$LCTL set_param fail_loc=0x0"
3003         if [ $rc -eq 0 ] && [ $rc2 -ne 0 ]; then
3004                 echo "1st OST start succeed"
3005                 echo "2nd OST start failed with $rc2"
3006         elif [ $rc2 -eq 0 ] && [ $rc -ne 0 ]; then
3007                 echo "1st OST start failed with $rc"
3008                 echo "2nd OST start succeed"
3009         else
3010                 stop_mds -f
3011                 stop ost1 -f
3012                 error "unexpected concurrent OST mounts result, rc=$rc rc2=$rc2"
3013         fi
3014         # cleanup
3015         stop_mds
3016         stop ost1 -f
3017
3018         # verify everything ok
3019         start_mds
3020         if [ $? != 0 ]
3021         then
3022                 stop_mds
3023                 error "MDT(s) start failed"
3024         fi
3025
3026         start_ost
3027         if [ $? != 0 ]
3028         then
3029                 stop_mds
3030                 stop ost1 -f
3031                 error "OST(s) start failed"
3032         fi
3033
3034         mount_client $MOUNT
3035         if [ $? != 0 ]
3036         then
3037                 stop_mds
3038                 stop ost1 -f
3039                 error "client start failed"
3040         fi
3041         check_mount
3042         if [ $? != 0 ]
3043         then
3044                 stop_mds
3045                 stop ost1 -f
3046                 error "client mount failed"
3047         fi
3048         cleanup
3049 }
3050 run_test 41c "concurrent mounts of MDT/OST should all fail but one"
3051
3052 test_42() { #bug 14693
3053         setup
3054         check_mount || error "client was not mounted"
3055
3056         do_facet mgs $LCTL conf_param $FSNAME.llite.some_wrong_param=10
3057         umount_client $MOUNT ||
3058                 error "unmounting client failed with invalid llite param"
3059         mount_client $MOUNT ||
3060                 error "mounting client failed with invalid llite param"
3061
3062         do_facet mgs $LCTL conf_param $FSNAME.sys.some_wrong_param=20
3063         cleanup || error "stopping $FSNAME failed with invalid sys param"
3064         setup
3065         check_mount || error "client was not mounted with invalid sys param"
3066         cleanup || error "stopping $FSNAME failed with invalid sys param"
3067 }
3068 run_test 42 "allow client/server mount/unmount with invalid config param"
3069
3070 test_43a() {
3071         [[ $(lustre_version_code mgs) -ge $(version_code 2.5.58) ]] ||
3072                 { skip "Need MDS version at least 2.5.58" && return 0; }
3073         [ $UID -ne 0 -o $RUNAS_ID -eq 0 ] && skip_env "run as root"
3074
3075         ID1=${ID1:-501}
3076         USER1=$(getent passwd | grep :$ID1:$ID1: | cut -d: -f1)
3077         [ -z "$USER1" ] && skip_env "missing user with uid=$ID1 gid=$ID1" &&
3078                 return
3079
3080         setup
3081         chmod ugo+x $DIR || error "chmod 0 failed"
3082         set_conf_param_and_check mds1                                   \
3083                 "$LCTL get_param -n mdt.$FSNAME-MDT0000.root_squash"    \
3084                 "$FSNAME.mdt.root_squash"                               \
3085                 "0:0"
3086         wait_update $HOSTNAME                                           \
3087                 "$LCTL get_param -n llite.${FSNAME}*.root_squash"       \
3088                 "0:0" ||
3089                 error "check llite root_squash failed!"
3090         set_conf_param_and_check mds1                                   \
3091                 "$LCTL get_param -n mdt.$FSNAME-MDT0000.nosquash_nids"  \
3092                 "$FSNAME.mdt.nosquash_nids"                             \
3093                 "NONE"
3094         wait_update $HOSTNAME                                           \
3095                 "$LCTL get_param -n llite.${FSNAME}*.nosquash_nids"     \
3096                 "NONE" ||
3097                 error "check llite nosquash_nids failed!"
3098
3099     #
3100     # create set of test files
3101     #
3102     echo "111" > $DIR/$tfile-userfile || error "write 1 failed"
3103     chmod go-rw $DIR/$tfile-userfile  || error "chmod 1 failed"
3104     chown $RUNAS_ID.$RUNAS_ID $DIR/$tfile-userfile || error "chown failed"
3105
3106     echo "222" > $DIR/$tfile-rootfile || error "write 2 failed"
3107     chmod go-rw $DIR/$tfile-rootfile  || error "chmod 2 faield"
3108
3109         mkdir $DIR/$tdir-rootdir || error "mkdir failed"
3110         chmod go-rwx $DIR/$tdir-rootdir || error "chmod 3 failed"
3111         touch $DIR/$tdir-rootdir/tfile-1 || error "touch failed"
3112
3113         echo "777" > $DIR/$tfile-user1file || error "write 7 failed"
3114         chmod go-rw $DIR/$tfile-user1file || error "chmod 7 failed"
3115         chown $ID1.$ID1 $DIR/$tfile-user1file || error "chown failed"
3116
3117         #
3118         # check root_squash:
3119         #   set root squash UID:GID to RUNAS_ID
3120         #   root should be able to access only files owned by RUNAS_ID
3121         #
3122         set_conf_param_and_check mds1                                   \
3123                 "$LCTL get_param -n mdt.$FSNAME-MDT0000.root_squash"    \
3124                 "$FSNAME.mdt.root_squash"                               \
3125                 "$RUNAS_ID:$RUNAS_ID"
3126         wait_update $HOSTNAME                                           \
3127                 "$LCTL get_param -n llite.${FSNAME}*.root_squash"       \
3128                 "$RUNAS_ID:$RUNAS_ID" ||
3129                 error "check llite root_squash failed!"
3130
3131         ST=$(stat -c "%n: owner uid %u (%A)" $DIR/$tfile-userfile)
3132         dd if=$DIR/$tfile-userfile 1>/dev/null 2>/dev/null ||
3133                 error "$ST: root read permission is denied"
3134         echo "$ST: root read permission is granted - ok"
3135
3136         echo "444" |
3137         dd conv=notrunc of=$DIR/$tfile-userfile 1>/dev/null 2>/dev/null ||
3138                 error "$ST: root write permission is denied"
3139         echo "$ST: root write permission is granted - ok"
3140
3141         ST=$(stat -c "%n: owner uid %u (%A)" $DIR/$tfile-rootfile)
3142         dd if=$DIR/$tfile-rootfile 1>/dev/null 2>/dev/null &&
3143                 error "$ST: root read permission is granted"
3144         echo "$ST: root read permission is denied - ok"
3145
3146         echo "555" |
3147         dd conv=notrunc of=$DIR/$tfile-rootfile 1>/dev/null 2>/dev/null &&
3148                 error "$ST: root write permission is granted"
3149         echo "$ST: root write permission is denied - ok"
3150
3151         ST=$(stat -c "%n: owner uid %u (%A)" $DIR/$tdir-rootdir)
3152                 rm $DIR/$tdir-rootdir/tfile-1 1>/dev/null 2>/dev/null &&
3153                         error "$ST: root unlink permission is granted"
3154         echo "$ST: root unlink permission is denied - ok"
3155
3156         touch $DIR/tdir-rootdir/tfile-2 1>/dev/null 2>/dev/null &&
3157                 error "$ST: root create permission is granted"
3158         echo "$ST: root create permission is denied - ok"
3159
3160         # LU-1778
3161         # check root_squash is enforced independently
3162         # of client cache content
3163         #
3164         # access file by USER1, keep access open
3165         # root should be denied access to user file
3166
3167         runas -u $ID1 tail -f $DIR/$tfile-user1file 1>/dev/null 2>&1 &
3168         pid=$!
3169         sleep 1
3170
3171         ST=$(stat -c "%n: owner uid %u (%A)" $DIR/$tfile-user1file)
3172         dd if=$DIR/$tfile-user1file 1>/dev/null 2>&1 &&
3173             { kill $pid; error "$ST: root read permission is granted"; }
3174         echo "$ST: root read permission is denied - ok"
3175
3176         echo "777" |
3177         dd conv=notrunc of=$DIR/$tfile-user1file 1>/dev/null 2>&1 &&
3178             { kill $pid; error "$ST: root write permission is granted"; }
3179         echo "$ST: root write permission is denied - ok"
3180
3181         kill $pid
3182         wait $pid
3183
3184         #
3185         # check nosquash_nids:
3186         #   put client's NID into nosquash_nids list,
3187         #   root should be able to access root file after that
3188         #
3189         local NIDLIST=$($LCTL list_nids all | tr '\n' ' ')
3190         NIDLIST="2@gni $NIDLIST 192.168.0.[2,10]@tcp"
3191         NIDLIST=$(echo $NIDLIST | tr -s ' ' ' ')
3192         set_conf_param_and_check mds1                                   \
3193                 "$LCTL get_param -n mdt.$FSNAME-MDT0000.nosquash_nids"  \
3194                 "$FSNAME-MDTall.mdt.nosquash_nids"                      \
3195                 "$NIDLIST"
3196         wait_update $HOSTNAME                                           \
3197                 "$LCTL get_param -n llite.${FSNAME}*.nosquash_nids"     \
3198                 "$NIDLIST" ||
3199                 error "check llite nosquash_nids failed!"
3200
3201         ST=$(stat -c "%n: owner uid %u (%A)" $DIR/$tfile-rootfile)
3202         dd if=$DIR/$tfile-rootfile 1>/dev/null 2>/dev/null ||
3203                 error "$ST: root read permission is denied"
3204         echo "$ST: root read permission is granted - ok"
3205
3206         echo "666" |
3207         dd conv=notrunc of=$DIR/$tfile-rootfile 1>/dev/null 2>/dev/null ||
3208                 error "$ST: root write permission is denied"
3209         echo "$ST: root write permission is granted - ok"
3210
3211         ST=$(stat -c "%n: owner uid %u (%A)" $DIR/$tdir-rootdir)
3212         rm $DIR/$tdir-rootdir/tfile-1 ||
3213                 error "$ST: root unlink permission is denied"
3214         echo "$ST: root unlink permission is granted - ok"
3215         touch $DIR/$tdir-rootdir/tfile-2 ||
3216                 error "$ST: root create permission is denied"
3217         echo "$ST: root create permission is granted - ok"
3218         cleanup || error "cleanup failed with $?"
3219 }
3220 run_test 43a "check root_squash and nosquash_nids"
3221
3222 test_43b() { # LU-5690
3223         [[ $(lustre_version_code mgs) -ge $(version_code 2.7.62) ]] ||
3224                 { skip "Need MGS version 2.7.62+"; return; }
3225
3226         if [[ -z "$fs2mds_DEV" ]]; then
3227                 is_blkdev $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) &&
3228                 skip_env "mixed loopback and real device not working" && return
3229         fi
3230
3231         local fs2mdsdev=$(mdsdevname 1_2)
3232         local fs2mdsvdev=$(mdsvdevname 1_2)
3233
3234         # temporarily use fs2mds as fs2mgs
3235         local fs2mgs=fs2mds
3236         local fs2mgsdev=$fs2mdsdev
3237         local fs2mgsvdev=$fs2mdsvdev
3238
3239         local fsname=test1234
3240
3241         load_module llite/lustre
3242         local client_ip=$(host_nids_address $HOSTNAME $NETTYPE)
3243         local host=${client_ip//*./}
3244         local net=${client_ip/%$host/}
3245         local nosquash_nids=$(h2nettype $net[$host,$host,$host])
3246
3247         add $fs2mgs $(mkfs_opts mgs $fs2mgsdev) --fsname=$fsname \
3248                 --param mdt.root_squash=$RUNAS_ID:$RUNAS_ID \
3249                 --param mdt.nosquash_nids=$nosquash_nids \
3250                 --reformat $fs2mgsdev $fs2mgsvdev || error "add fs2mgs failed"
3251         start $fs2mgs $fs2mgsdev $MGS_MOUNT_OPTS  || error "start fs2mgs failed"
3252         stop $fs2mgs -f || error "stop fs2mgs failed"
3253 }
3254 run_test 43b "parse nosquash_nids with commas in expr_list"
3255
3256 umount_client $MOUNT
3257 cleanup_nocli
3258
3259 test_44() { # 16317
3260         setup
3261         check_mount || error "check_mount"
3262         UUID=$($LCTL get_param llite.${FSNAME}*.uuid | cut -d= -f2)
3263         STATS_FOUND=no
3264         UUIDS=$(do_facet $SINGLEMDS "$LCTL get_param mdt.${FSNAME}*.exports.*.uuid")
3265         for VAL in $UUIDS; do
3266                 NID=$(echo $VAL | cut -d= -f1)
3267                 CLUUID=$(echo $VAL | cut -d= -f2)
3268                 [ "$UUID" = "$CLUUID" ] && STATS_FOUND=yes && break
3269         done
3270         [ "$STATS_FOUND" = "no" ] && error "stats not found for client"
3271         cleanup || error "cleanup failed with $?"
3272 }
3273 run_test 44 "mounted client proc entry exists"
3274
3275 test_45() { #17310
3276         setup
3277         check_mount || error "check_mount"
3278         stop_mds || error "Unable to stop MDS"
3279         df -h $MOUNT &
3280         log "sleep 60 sec"
3281         sleep 60
3282         #define OBD_FAIL_PTLRPC_LONG_REPL_UNLINK        0x50f
3283         do_facet client "$LCTL set_param fail_loc=0x8000050f"
3284         log "sleep 10 sec"
3285         sleep 10
3286         manual_umount_client --force || error "manual_umount_client failed"
3287         do_facet client "$LCTL set_param fail_loc=0x0"
3288         start_mds || error "unable to start MDS"
3289         mount_client $MOUNT || error "mount_client $MOUNT failed"
3290         cleanup || error "cleanup failed with $?"
3291 }
3292 run_test 45 "long unlink handling in ptlrpcd"
3293
3294 cleanup_46a() {
3295         trap 0
3296         local rc=0
3297         local count=$1
3298
3299         umount_client $MOUNT2 || rc=$?
3300         umount_client $MOUNT || rc=$?
3301         while [ $count -gt 0 ]; do
3302                 stop ost${count} -f || rc=$?
3303                 let count=count-1
3304         done
3305         stop_mds || rc=$?
3306         cleanup_nocli || rc=$?
3307         #writeconf to remove all ost2 traces for subsequent tests
3308         writeconf_or_reformat
3309         return $rc
3310 }
3311
3312 test_46a() {
3313         echo "Testing with $OSTCOUNT OSTs"
3314         reformat_and_config
3315         start_mds || error "unable to start MDS"
3316         #first client should see only one ost
3317         start_ost || error "Unable to start OST1"
3318         wait_osc_import_state mds ost FULL
3319         #start_client
3320         mount_client $MOUNT || error "mount_client $MOUNT failed"
3321         trap "cleanup_46a $OSTCOUNT" EXIT ERR
3322
3323         local i
3324         for (( i=2; i<=$OSTCOUNT; i++ )); do
3325                 start ost$i $(ostdevname $i) $OST_MOUNT_OPTS ||
3326                         error "start_ost$i $(ostdevname $i) failed"
3327         done
3328
3329         # wait until osts in sync
3330         for (( i=2; i<=$OSTCOUNT; i++ )); do
3331             wait_osc_import_state mds ost$i FULL
3332             wait_osc_import_state client ost$i FULL
3333         done
3334
3335         #second client see all ost's
3336
3337         mount_client $MOUNT2 || error "mount_client failed"
3338         $SETSTRIPE -c -1 $MOUNT2 || error "$SETSTRIPE -c -1 $MOUNT2 failed"
3339         $GETSTRIPE $MOUNT2 || error "$GETSTRIPE $MOUNT2 failed"
3340
3341         echo "ok" > $MOUNT2/widestripe
3342         $GETSTRIPE $MOUNT2/widestripe ||
3343                 error "$GETSTRIPE $MOUNT2/widestripe failed"
3344         # fill acl buffer for avoid expand lsm to them
3345         awk -F : '{if (FNR < 25) { print "u:"$1":rwx" }}' /etc/passwd |
3346                 while read acl; do
3347             setfacl -m $acl $MOUNT2/widestripe
3348         done
3349
3350         # will be deadlock
3351         stat $MOUNT/widestripe || error "stat $MOUNT/widestripe failed"
3352
3353         cleanup_46a $OSTCOUNT || error "cleanup_46a failed"
3354 }
3355 run_test 46a "handle ost additional - wide striped file"
3356
3357 test_47() { #17674
3358         reformat
3359         setup_noconfig
3360         check_mount || error "check_mount failed"
3361         $LCTL set_param ldlm.namespaces.$FSNAME-*-*-*.lru_size=100
3362
3363         local lru_size=[]
3364         local count=0
3365         for ns in $($LCTL get_param ldlm.namespaces.$FSNAME-*-*-*.lru_size); do
3366             if echo $ns | grep "MDT[[:digit:]]*"; then
3367                 continue
3368             fi
3369             lrs=$(echo $ns | sed 's/.*lru_size=//')
3370             lru_size[count]=$lrs
3371             let count=count+1
3372         done
3373
3374         facet_failover ost1
3375         facet_failover $SINGLEMDS
3376         client_up || error "client_up failed"
3377
3378         count=0
3379         for ns in $($LCTL get_param ldlm.namespaces.$FSNAME-*-*-*.lru_size); do
3380             if echo $ns | grep "MDT[[:digit:]]*"; then
3381                 continue
3382             fi
3383             lrs=$(echo $ns | sed 's/.*lru_size=//')
3384             if ! test "$lrs" -eq "${lru_size[count]}"; then
3385                 n=$(echo $ns | sed -e 's/ldlm.namespaces.//' -e 's/.lru_size=.*//')
3386                 error "$n has lost lru_size: $lrs vs. ${lru_size[count]}"
3387             fi
3388             let count=count+1
3389         done
3390
3391         cleanup || error "cleanup failed with $?"
3392 }
3393 run_test 47 "server restart does not make client loss lru_resize settings"
3394
3395 cleanup_48() {
3396         trap 0
3397
3398         # reformat after this test is needed - if the test fails,
3399         # we will have unkillable file at FS
3400         reformat_and_config
3401 }
3402
3403 test_48() { # bz-17636 LU-7473
3404         local count
3405
3406         setup_noconfig
3407         check_mount || error "check_mount failed"
3408
3409         $SETSTRIPE -c -1 $MOUNT || error "$SETSTRIPE -c -1 $MOUNT failed"
3410         $GETSTRIPE $MOUNT || error "$GETSTRIPE $MOUNT failed"
3411
3412         echo "ok" > $MOUNT/widestripe
3413         $GETSTRIPE $MOUNT/widestripe ||
3414                 error "$GETSTRIPE $MOUNT/widestripe failed"
3415
3416         # In the future, we may introduce more EAs, such as selinux, enlarged
3417         # LOV EA, and so on. These EA will use some EA space that is shared by
3418         # ACL entries. So here we only check some reasonable ACL entries count,
3419         # instead of the max number that is calculated from the max_ea_size.
3420         if [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.57) ];
3421         then
3422                 count=28        # hard coded of RPC protocol
3423         elif [ $(facet_fstype $SINGLEMDS) != ldiskfs ]; then
3424                 count=4000      # max_num 4091 max_ea_size = 32768
3425         elif ! large_xattr_enabled; then
3426                 count=450       # max_num 497 max_ea_size = 4012
3427         else
3428                 count=4500      # max_num 8187 max_ea_size = 1048492
3429                                 # not create too much (>5000) to save test time
3430         fi
3431
3432         echo "It is expected to hold at least $count ACL entries"
3433         trap cleanup_48 EXIT ERR
3434         for ((i = 0; i < $count; i++)) do
3435                 setfacl -m u:$((i + 100)):rw $MOUNT/widestripe ||
3436                         error "Fail to setfacl for $MOUNT/widestripe at $i"
3437         done
3438
3439         cancel_lru_locks mdc
3440         stat $MOUNT/widestripe || error "stat $MOUNT/widestripe failed"
3441         local r_count=$(getfacl $MOUNT/widestripe | grep "user:" | wc -l)
3442         count=$((count + 1)) # for the entry "user::rw-"
3443
3444         [ $count -eq $r_count ] ||
3445                 error "Expected ACL entries $count, but got $r_count"
3446
3447         cleanup_48
3448 }
3449 run_test 48 "too many acls on file"
3450
3451 # check PARAM_SYS_LDLM_TIMEOUT option of MKFS.LUSTRE
3452 test_49a() { # bug 17710
3453         local timeout_orig=$TIMEOUT
3454         local ldlm_timeout_orig=$LDLM_TIMEOUT
3455         local LOCAL_TIMEOUT=20
3456
3457         LDLM_TIMEOUT=$LOCAL_TIMEOUT
3458         TIMEOUT=$LOCAL_TIMEOUT
3459
3460         reformat
3461         setup_noconfig
3462         check_mount || error "client mount failed"
3463
3464         echo "check ldlm_timout..."
3465         local LDLM_MDS="$(do_facet $SINGLEMDS $LCTL get_param -n ldlm_timeout)"
3466         local LDLM_OST1="$(do_facet ost1 $LCTL get_param -n ldlm_timeout)"
3467         local LDLM_CLIENT="$(do_facet client $LCTL get_param -n ldlm_timeout)"
3468
3469         if [ $LDLM_MDS -ne $LDLM_OST1 -o $LDLM_MDS -ne $LDLM_CLIENT ]; then
3470                 error "Different LDLM_TIMEOUT:$LDLM_MDS $LDLM_OST1 $LDLM_CLIENT"
3471         fi
3472
3473         if [ $LDLM_MDS -ne $((LOCAL_TIMEOUT / 3)) ]; then
3474                 error "LDLM_TIMEOUT($LDLM_MDS) is not $((LOCAL_TIMEOUT / 3))"
3475         fi
3476
3477         umount_client $MOUNT || error "umount_client $MOUNT failed"
3478         stop_ost || error "problem stopping OSS"
3479         stop_mds || error "problem stopping MDS"
3480
3481         LDLM_TIMEOUT=$ldlm_timeout_orig
3482         TIMEOUT=$timeout_orig
3483 }
3484 run_test 49a "check PARAM_SYS_LDLM_TIMEOUT option of mkfs.lustre"
3485
3486 test_49b() { # bug 17710
3487         local timeout_orig=$TIMEOUT
3488         local ldlm_timeout_orig=$LDLM_TIMEOUT
3489         local LOCAL_TIMEOUT=20
3490
3491         LDLM_TIMEOUT=$((LOCAL_TIMEOUT - 1))
3492         TIMEOUT=$LOCAL_TIMEOUT
3493
3494         reformat
3495         setup_noconfig
3496         check_mount || error "client mount failed"
3497
3498         local LDLM_MDS="$(do_facet $SINGLEMDS $LCTL get_param -n ldlm_timeout)"
3499         local LDLM_OST1="$(do_facet ost1 $LCTL get_param -n ldlm_timeout)"
3500         local LDLM_CLIENT="$(do_facet client $LCTL get_param -n ldlm_timeout)"
3501
3502         if [ $LDLM_MDS -ne $LDLM_OST1 -o $LDLM_MDS -ne $LDLM_CLIENT ]; then
3503                 error "Different LDLM_TIMEOUT:$LDLM_MDS $LDLM_OST1 $LDLM_CLIENT"
3504         fi
3505
3506         if [ $LDLM_MDS -ne $((LOCAL_TIMEOUT - 1)) ]; then
3507                 error "LDLM_TIMEOUT($LDLM_MDS) is not $((LOCAL_TIMEOUT - 1))"
3508         fi
3509
3510         cleanup || error "cleanup failed"
3511
3512         LDLM_TIMEOUT=$ldlm_timeout_orig
3513         TIMEOUT=$timeout_orig
3514 }
3515 run_test 49b "check PARAM_SYS_LDLM_TIMEOUT option of mkfs.lustre"
3516
3517 lazystatfs() {
3518         # Test both statfs and lfs df and fail if either one fails
3519         multiop_bg_pause $1 f_
3520         RC1=$?
3521         PID=$!
3522         killall -USR1 multiop
3523         [ $RC1 -ne 0 ] && log "lazystatfs multiop failed"
3524         wait $PID || { RC1=$?; log "multiop return error "; }
3525
3526         $LFS df &
3527         PID=$!
3528         sleep 5
3529         kill -s 0 $PID
3530         RC2=$?
3531         if [ $RC2 -eq 0 ]; then
3532             kill -s 9 $PID
3533             log "lazystatfs df failed"
3534         fi
3535
3536         RC=0
3537         [[ $RC1 -ne 0 || $RC2 -eq 0 ]] && RC=1
3538         return $RC
3539 }
3540
3541 test_50a() {
3542         setup
3543         $LCTL set_param llite.$FSNAME-*.lazystatfs=1
3544         touch $DIR/$tfile || error "touch $DIR/$tfile failed"
3545
3546         lazystatfs $MOUNT || error "lazystatfs failed but no down servers"
3547
3548         cleanup || error "cleanup failed with rc $?"
3549 }
3550 run_test 50a "lazystatfs all servers available"
3551
3552 test_50b() {
3553         setup
3554         $LCTL set_param llite.$FSNAME-*.lazystatfs=1
3555         touch $DIR/$tfile || error "touch $DIR/$tfile failed"
3556
3557         # Wait for client to detect down OST
3558         stop_ost || error "Unable to stop OST1"
3559         wait_osc_import_state mds ost DISCONN
3560
3561         lazystatfs $MOUNT || error "lazystatfs should not return EIO"
3562
3563         umount_client $MOUNT || error "Unable to unmount client"
3564         stop_mds || error "Unable to stop MDS"
3565 }
3566 run_test 50b "lazystatfs all servers down"
3567
3568 test_50c() {
3569         start_mds || error "Unable to start MDS"
3570         start_ost || error "Unable to start OST1"
3571         start_ost2 || error "Unable to start OST2"
3572         mount_client $MOUNT || error "Unable to mount client"
3573         $LCTL set_param llite.$FSNAME-*.lazystatfs=1
3574         touch $DIR/$tfile || error "touch $DIR/$tfile failed"
3575
3576         # Wait for client to detect down OST
3577         stop_ost || error "Unable to stop OST1"
3578         wait_osc_import_state mds ost DISCONN
3579         lazystatfs $MOUNT || error "lazystatfs failed with one down server"
3580
3581         umount_client $MOUNT || error "Unable to unmount client"
3582         stop_ost2 || error "Unable to stop OST2"
3583         stop_mds || error "Unable to stop MDS"
3584         #writeconf to remove all ost2 traces for subsequent tests
3585         writeconf_or_reformat
3586 }
3587 run_test 50c "lazystatfs one server down"
3588
3589 test_50d() {
3590         start_mds || error "Unable to start MDS"
3591         start_ost || error "Unable to start OST1"
3592         start_ost2 || error "Unable to start OST2"
3593         mount_client $MOUNT || error "Unable to mount client"
3594         $LCTL set_param llite.$FSNAME-*.lazystatfs=1
3595         touch $DIR/$tfile || error "touch $DIR/$tfile failed"
3596
3597         # Issue the statfs during the window where the client still
3598         # belives the OST to be available but it is in fact down.
3599         # No failure just a statfs which hangs for a timeout interval.
3600         stop_ost || error "Unable to stop OST1"
3601         lazystatfs $MOUNT || error "lazystatfs failed with one down server"
3602
3603         umount_client $MOUNT || error "Unable to unmount client"
3604         stop_ost2 || error "Unable to stop OST2"
3605         stop_mds || error "Unable to stop MDS"
3606         #writeconf to remove all ost2 traces for subsequent tests
3607         writeconf_or_reformat
3608 }
3609 run_test 50d "lazystatfs client/server conn race"
3610
3611 test_50e() {
3612         local RC1
3613         local pid
3614
3615         reformat_and_config
3616         start_mds || error "Unable to start MDS"
3617         #first client should see only one ost
3618         start_ost || error "Unable to start OST1"
3619         wait_osc_import_state mds ost FULL
3620
3621         # Wait for client to detect down OST
3622         stop_ost || error "Unable to stop OST1"
3623         wait_osc_import_state mds ost DISCONN
3624
3625         mount_client $MOUNT || error "Unable to mount client"
3626         $LCTL set_param llite.$FSNAME-*.lazystatfs=0
3627
3628         multiop_bg_pause $MOUNT _f
3629         RC1=$?
3630         pid=$!
3631
3632         if [ $RC1 -ne 0 ]; then
3633                 log "multiop failed $RC1"
3634         else
3635             kill -USR1 $pid
3636             sleep $(( $TIMEOUT+1 ))
3637             kill -0 $pid
3638             [ $? -ne 0 ] && error "process isn't sleep"
3639             start_ost || error "Unable to start OST1"
3640             wait $pid || error "statfs failed"
3641         fi
3642
3643         umount_client $MOUNT || error "Unable to unmount client"
3644         stop_ost || error "Unable to stop OST1"
3645         stop_mds || error "Unable to stop MDS"
3646 }
3647 run_test 50e "normal statfs all servers down"
3648
3649 test_50f() {
3650         local RC1
3651         local pid
3652         CONN_PROC="osc.$FSNAME-OST0001-osc-[M]*.ost_server_uuid"
3653
3654         start_mds || error "Unable to start mds"
3655         #first client should see only one ost
3656         start_ost || error "Unable to start OST1"
3657         wait_osc_import_state mds ost FULL
3658
3659         start_ost2 || error "Unable to start OST2"
3660         wait_osc_import_state mds ost2 FULL
3661
3662         # Wait for client to detect down OST
3663         stop_ost2 || error "Unable to stop OST2"
3664
3665         wait_osc_import_state mds ost2 DISCONN
3666         mount_client $MOUNT || error "Unable to mount client"
3667         $LCTL set_param llite.$FSNAME-*.lazystatfs=0
3668
3669         multiop_bg_pause $MOUNT _f
3670         RC1=$?
3671         pid=$!
3672
3673         if [ $RC1 -ne 0 ]; then
3674                 log "lazystatfs multiop failed $RC1"
3675         else
3676             kill -USR1 $pid
3677             sleep $(( $TIMEOUT+1 ))
3678             kill -0 $pid
3679             [ $? -ne 0 ] && error "process isn't sleep"
3680             start_ost2 || error "Unable to start OST2"
3681             wait $pid || error "statfs failed"
3682             stop_ost2 || error "Unable to stop OST2"
3683         fi
3684
3685         umount_client $MOUNT -f || error "Unable to unmount client"
3686         stop_ost || error "Unable to stop OST1"
3687         stop_mds || error "Unable to stop MDS"
3688         #writeconf to remove all ost2 traces for subsequent tests
3689         writeconf_or_reformat
3690 }
3691 run_test 50f "normal statfs one server in down"
3692
3693 test_50g() {
3694         [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >=2 OSTs" && return
3695         setup
3696         start_ost2 || error "Unable to start OST2"
3697         wait_osc_import_state mds ost2 FULL
3698         wait_osc_import_state client ost2 FULL
3699
3700         local PARAM="${FSNAME}-OST0001.osc.active"
3701
3702         $SETSTRIPE -c -1 $DIR/$tfile || error "$SETSTRIPE failed"
3703         do_facet mgs $LCTL conf_param $PARAM=0 ||
3704                 error "Unable to deactivate OST"
3705
3706