Whamcloud - gitweb
LU-9899 tests: mount client on MGS for tests with pools
[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-9879 LU-9879 LU-9879
72         ALWAYS_EXCEPT="$ALWAYS_EXCEPT  102     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 dom_upgrade=${dom_upgrade:-"no"}
1693         local ff_convert=${ff_convert:-"no"}
1694         local shall_cleanup_mdt=false
1695         local shall_cleanup_mdt1=false
1696         local shall_cleanup_ost=false
1697         local shall_cleanup_lustre=false
1698         local mdt2_is_available=false
1699         local node=$(facet_active_host $SINGLEMDS)
1700         local r="do_node $node"
1701         local tmp=$TMP/t32
1702         local img_commit
1703         local img_kernel
1704         local img_arch
1705         local img_bspace
1706         local img_ispace
1707         local img_blimit
1708         local img_ilimit
1709         local fsname=t32fs
1710         local nid
1711         local mopts
1712         local uuid
1713         local nrpcs_orig
1714         local nrpcs
1715         local list
1716         local fstype=$(facet_fstype $SINGLEMDS)
1717         local mdt_dev=$tmp/mdt
1718         local mdt2_dev=$tmp/mdt2
1719         local ost_dev=$tmp/ost
1720         local stripe_index
1721         local stripe_count
1722         local dir
1723
1724         combined_mgs_mds || stop_mgs || error "Unable to stop MGS"
1725         trap 'trap - RETURN; t32_test_cleanup' RETURN
1726
1727         load_modules
1728         nid=$($r $LCTL list_nids | head -1)
1729
1730         mkdir -p $tmp/mnt/lustre || error "mkdir $tmp/mnt/lustre failed"
1731         $r mkdir -p $tmp/mnt/{mdt,mdt1,ost}
1732         $r tar xjvf $tarball -S -C $tmp || {
1733                 error_noexit "Unpacking the disk image tarball"
1734                 return 1
1735         }
1736         img_commit=$($r cat $tmp/commit)
1737         img_kernel=$($r cat $tmp/kernel)
1738         img_arch=$($r cat $tmp/arch)
1739         img_bspace=$($r cat $tmp/bspace)
1740         img_ispace=$($r cat $tmp/ispace)
1741
1742         # older images did not have "blimit" and "ilimit" files
1743         # use old values for T32_BLIMIT and T32_ILIMIT
1744         $r test -f $tmp/blimit && img_blimit=$($r cat $tmp/blimit) ||
1745                 img_blimit=20480
1746         $r test -f $tmp/ilimit && img_ilimit=$($r cat $tmp/ilimit) ||
1747                 img_ilimit=2
1748
1749         echo "Upgrading from $(basename $tarball), created with:"
1750         echo "  Commit: $img_commit"
1751         echo "  Kernel: $img_kernel"
1752         echo "    Arch: $img_arch"
1753         echo "OST version: $(lustre_build_version ost1)"
1754
1755         # The conversion can be made only when both of the following
1756         # conditions are satisfied:
1757         # - ost device img version < 2.3.64
1758         # - ost server version >= 2.5
1759         [ $(version_code $img_commit) -ge $(version_code 2.3.64) -o \
1760                 $(lustre_version_code ost1) -lt $(version_code 2.5.0) ] &&
1761                         ff_convert="no"
1762
1763         ! $r test -f $mdt2_dev || mdt2_is_available=true
1764
1765         if [[ $fstype == zfs ]]; then
1766                 # import pool first
1767                 local poolname
1768                 local poolname_list="t32fs-mdt1 t32fs-ost1"
1769
1770                 ! $mdt2_is_available || poolname_list+=" t32fs-mdt2"
1771
1772                 for poolname in $poolname_list; do
1773                         $r "modprobe zfs;
1774                                 $ZPOOL list -H $poolname >/dev/null 2>&1 ||
1775                                 $ZPOOL import -f -d $tmp $poolname"
1776                 done
1777
1778                 # upgrade zpool to latest supported features, including
1779                 # dnode quota accounting in 0.7.0
1780                 $r "$ZPOOL upgrade -a"
1781
1782                 mdt_dev=t32fs-mdt1/mdt1
1783                 ost_dev=t32fs-ost1/ost1
1784                 ! $mdt2_is_available || mdt2_dev=t32fs-mdt2/mdt2
1785                 wait_update_facet $SINGLEMDS "$ZPOOL list |
1786                         awk '/^t32fs-mdt1/ { print \\\$1 }'" "t32fs-mdt1" || {
1787                                 error_noexit "import zfs pool failed"
1788                                 return 1
1789                         }
1790         fi
1791
1792         $r $LCTL set_param debug="$PTLDEBUG"
1793
1794         $r $TUNEFS --dryrun $mdt_dev || {
1795                 $r losetup -a
1796                 error_noexit "tunefs.lustre before mounting the MDT"
1797                 return 1
1798         }
1799
1800         if $mdt2_is_available; then
1801                 $r $TUNEFS --dryrun $mdt2_dev || {
1802                         $r losetup -a
1803                         error_noexit "tunefs.lustre before mounting the MDT"
1804                         return 1
1805                 }
1806         fi
1807
1808         if [ "$writeconf" ]; then
1809                 mopts=writeconf
1810                 if [ $fstype == "ldiskfs" ]; then
1811                         mopts="loop,$mopts"
1812                         $r $TUNEFS --quota $mdt_dev || {
1813                                 $r losetup -a
1814                                 error_noexit "Enable mdt quota feature"
1815                                 return 1
1816                         }
1817                         if $mdt2_is_available; then
1818                                 $r $TUNEFS --quota $mdt2_dev || {
1819                                         $r losetup -a
1820                                         error_noexit "Enable mdt quota feature"
1821                                         return 1
1822                                 }
1823                         fi
1824                 fi
1825         else
1826                 if [ -n "$($LCTL list_nids | grep -v '\(tcp\|lo\)[[:digit:]]*$')" ]; then
1827                         [[ $(lustre_version_code mgs) -ge $(version_code 2.3.59) ]] ||
1828                         { skip "LU-2200: Cannot run over Inifiniband w/o lctl replace_nids "
1829                                 "(Need MGS version at least 2.3.59)"; return 0; }
1830
1831                         local osthost=$(facet_active_host ost1)
1832                         local ostnid=$(do_node $osthost $LCTL list_nids | head -1)
1833
1834                         mopts=nosvc
1835                         if [ $fstype == "ldiskfs" ]; then
1836                                 mopts="loop,$mopts"
1837                         fi
1838                         $r $MOUNT_CMD -o $mopts $mdt_dev $tmp/mnt/mdt
1839                         $r $LCTL replace_nids $fsname-OST0000 $ostnid
1840                         $r $LCTL replace_nids $fsname-MDT0000 $nid
1841                         $r $UMOUNT $tmp/mnt/mdt
1842                 fi
1843
1844                 mopts=exclude=$fsname-OST0000
1845                 if [ $fstype == "ldiskfs" ]; then
1846                         mopts="loop,$mopts"
1847                 fi
1848         fi
1849
1850         t32_wait_til_devices_gone $node
1851
1852         $r $MOUNT_CMD -o $mopts $mdt_dev $tmp/mnt/mdt || {
1853                 $r losetup -a
1854                 error_noexit "Mounting the MDT"
1855                 return 1
1856         }
1857         shall_cleanup_mdt=true
1858
1859         if $mdt2_is_available; then
1860                 mopts=mgsnode=$nid,$mopts
1861                 $r $MOUNT_CMD -o $mopts $mdt2_dev $tmp/mnt/mdt1 || {
1862                         $r losetup -a
1863                         error_noexit "Mounting the MDT"
1864                         return 1
1865                 }
1866
1867                 echo "mount new MDT....$mdt2_dev"
1868                 $r $LCTL set_param -n mdt.${fsname}*.enable_remote_dir=1 ||
1869                         error_noexit "enable remote dir create failed"
1870
1871                 shall_cleanup_mdt1=true
1872         elif [ "$dne_upgrade" != "no" ]; then
1873                 local fs2mdsdev=$(mdsdevname 1_2)
1874                 local fs2mdsvdev=$(mdsvdevname 1_2)
1875
1876                 echo "mkfs new MDT on ${fs2mdsdev}...."
1877                 if [ $(facet_fstype mds1) == ldiskfs ]; then
1878                         mkfsoptions="--mkfsoptions=\\\"-J size=8\\\""
1879                 fi
1880
1881                 add $SINGLEMDS $(mkfs_opts mds2 $fs2mdsdev $fsname) --reformat \
1882                            $mkfsoptions $fs2mdsdev $fs2mdsvdev > /dev/null || {
1883                         error_noexit "Mkfs new MDT failed"
1884                         return 1
1885                 }
1886
1887                 [[ $(facet_fstype mds1) != zfs ]] || import_zpool mds1
1888
1889                 $r $TUNEFS --dryrun $fs2mdsdev || {
1890                         error_noexit "tunefs.lustre before mounting the MDT"
1891                         return 1
1892                 }
1893
1894                 echo "mount new MDT....$fs2mdsdev"
1895                 $r $MOUNT_CMD -o $mopts $fs2mdsdev $tmp/mnt/mdt1 || {
1896                         error_noexit "mount mdt1 failed"
1897                         return 1
1898                 }
1899
1900                 $r $LCTL set_param -n mdt.${fsname}*.enable_remote_dir=1 ||
1901                         error_noexit "enable remote dir create failed"
1902
1903                 shall_cleanup_mdt1=true
1904         fi
1905
1906         uuid=$($r $LCTL get_param -n mdt.$fsname-MDT0000.uuid) || {
1907                 error_noexit "Getting MDT UUID"
1908                 return 1
1909         }
1910         if [ "$uuid" != $fsname-MDT0000_UUID ]; then
1911                 error_noexit "Unexpected MDT UUID: \"$uuid\""
1912                 return 1
1913         fi
1914
1915         $r $TUNEFS --dryrun $ost_dev || {
1916                 error_noexit "tunefs.lustre before mounting the OST"
1917                 return 1
1918         }
1919         if [ "$writeconf" ]; then
1920                 mopts=mgsnode=$nid,$writeconf
1921                 if [ $fstype == "ldiskfs" ]; then
1922                         mopts="loop,$mopts"
1923                         $r $TUNEFS --quota $ost_dev || {
1924                                 $r losetup -a
1925                                 error_noexit "Enable ost quota feature"
1926                                 return 1
1927                         }
1928                 fi
1929         else
1930                 mopts=mgsnode=$nid
1931                 if [ $fstype == "ldiskfs" ]; then
1932                         mopts="loop,$mopts"
1933                 fi
1934         fi
1935
1936         $r $MOUNT_CMD -onomgs -o$mopts $ost_dev $tmp/mnt/ost || {
1937                 error_noexit "Mounting the OST"
1938                 return 1
1939         }
1940         shall_cleanup_ost=true
1941
1942         uuid=$($r $LCTL get_param -n obdfilter.$fsname-OST0000.uuid) || {
1943                 error_noexit "Getting OST UUID"
1944                 return 1
1945         }
1946         if [ "$uuid" != $fsname-OST0000_UUID ]; then
1947                 error_noexit "Unexpected OST UUID: \"$uuid\""
1948                 return 1
1949         fi
1950
1951         $r $LCTL conf_param $fsname-OST0000.osc.max_dirty_mb=15 || {
1952                 error_noexit "Setting \"max_dirty_mb\""
1953                 return 1
1954         }
1955         $r $LCTL conf_param $fsname-OST0000.failover.node=$nid || {
1956                 error_noexit "Setting OST \"failover.node\""
1957                 return 1
1958         }
1959         $r $LCTL conf_param $fsname-MDT0000.mdc.max_rpcs_in_flight=9 || {
1960                 error_noexit "Setting \"max_rpcs_in_flight\""
1961                 return 1
1962         }
1963         $r $LCTL conf_param $fsname-MDT0000.failover.node=$nid || {
1964                 error_noexit "Setting MDT \"failover.node\""
1965                 return 1
1966         }
1967         $r $LCTL pool_new $fsname.interop || {
1968                 error_noexit "Setting \"interop\""
1969                 return 1
1970         }
1971         $r $LCTL conf_param $fsname-MDT0000.lov.stripesize=4M || {
1972                 error_noexit "Setting \"lov.stripesize\""
1973                 return 1
1974         }
1975         $r $LCTL conf_param $fsname-MDT0000.mdd.atime_diff=70 || {
1976                 error_noexit "Setting \"mdd.atime_diff\""
1977                 return 1
1978         }
1979
1980         if [ "$ff_convert" != "no" -a $(facet_fstype ost1) == "ldiskfs" ]; then
1981                 $r $LCTL lfsck_start -M $fsname-OST0000 || {
1982                         error_noexit "Start OI scrub on OST0"
1983                         return 1
1984                 }
1985
1986                 # The oi_scrub should be on ost1, but for test_32(),
1987                 # all on the SINGLEMDS.
1988                 wait_update_facet $SINGLEMDS "$LCTL get_param -n \
1989                         osd-ldiskfs.$fsname-OST0000.oi_scrub |
1990                         awk '/^status/ { print \\\$2 }'" "completed" 30 || {
1991                         error_noexit "Failed to get the expected 'completed'"
1992                         return 1
1993                 }
1994
1995                 local UPDATED=$($r $LCTL get_param -n \
1996                                 osd-ldiskfs.$fsname-OST0000.oi_scrub |
1997                                 awk '/^updated/ { print $2 }')
1998                 [ $UPDATED -ge 1 ] || {
1999                         error_noexit "Only $UPDATED objects have been converted"
2000                         return 1
2001                 }
2002         fi
2003
2004         if [ "$dne_upgrade" != "no" ]; then
2005                 $r $LCTL conf_param \
2006                                 $fsname-MDT0001.mdc.max_rpcs_in_flight=9 || {
2007                         error_noexit "Setting MDT1 \"max_rpcs_in_flight\""
2008                         return 1
2009                 }
2010                 $r $LCTL conf_param $fsname-MDT0001.failover.node=$nid || {
2011                         error_noexit "Setting MDT1 \"failover.node\""
2012                         return 1
2013                 }
2014                 $r $LCTL conf_param $fsname-MDT0001.lov.stripesize=4M || {
2015                         error_noexit "Setting MDT1 \"lov.stripesize\""
2016                         return 1
2017                 }
2018         fi
2019
2020         if [ "$writeconf" ]; then
2021                 $MOUNT_CMD $nid:/$fsname $tmp/mnt/lustre || {
2022                         error_noexit "Mounting the client"
2023                         return 1
2024                 }
2025
2026                 shall_cleanup_lustre=true
2027                 $r $LCTL set_param debug="$PTLDEBUG"
2028
2029                 if $r test -f $tmp/list; then
2030                         #
2031                         # There is not a Test Framework API to copy files to or
2032                         # from a remote node.
2033                         #
2034                         # LU-2393 - do both sorts on same node to ensure locale
2035                         # is identical
2036                         local list_file=$tmp/list
2037
2038                         if $mdt2_is_available; then
2039                                 if [[ -d $tmp/mnt/lustre/striped_dir_old ]] &&
2040                                    $r test -f $tmp/list2; then
2041                                         list_file=$tmp/list2
2042                                         pushd $tmp/mnt/lustre/striped_dir_old
2043                                 else
2044                                         pushd $tmp/mnt/lustre/remote_dir
2045                                 fi
2046                         else
2047                                 pushd $tmp/mnt/lustre
2048                         fi
2049                         $r cat $list_file | sort -k 6 >$tmp/list.orig
2050                         ls -Rni --time-style=+%s | sort -k 6 |
2051                                 sed 's/\. / /' >$tmp/list || {
2052                                 error_noexit "ls"
2053                                 return 1
2054                         }
2055                         popd
2056                         #
2057                         # 32-bit and 64-bit clients use different algorithms to
2058                         # convert FIDs into inode numbers.  Hence, remove the
2059                         # inode numbers from the lists, if the original list was
2060                         # created on an architecture with different number of
2061                         # bits per "long".
2062                         #
2063                         if [ $(t32_bits_per_long $(uname -m)) != \
2064                                 $(t32_bits_per_long $img_arch) ]; then
2065                                 echo "Different number of bits per \"long\"" \
2066                                      "from the disk image"
2067                                 for list in list.orig list; do
2068                                         sed -i -e 's/^[0-9]\+[ \t]\+//' \
2069                                                   $tmp/$list
2070                                 done
2071                         fi
2072                         if ! diff -ub $tmp/list.orig $tmp/list; then
2073                                 error_noexit "list verification failed"
2074                                 return 1
2075                         fi
2076                 else
2077                         echo "list verification skipped"
2078                 fi
2079
2080                 if [ "$dom_upgrade" != "no" ]; then
2081                         echo "Check DoM file can be created"
2082                         $LFS setstripe -E 1M -L mdt -E EOF $tmp/mnt/lustre/dom || {
2083                                 error_noexit "Verify DoM creation"
2084                                 return 1
2085                         }
2086                         [ $($LFS getstripe -L $tmp/mnt/lustre/dom) == 100 ] || {
2087                                 error_noexit "Verify a DoM file"
2088                                 return 1
2089                         }
2090                         dd if=/dev/urandom of=$tmp/mnt/lustre/dom bs=4096 \
2091                                 count=1 conv=fsync || {
2092                                 error_noexit "Cannot write to DoM file"
2093                                 return 1
2094                         }
2095                         [ $(stat -c%s $tmp/mnt/lustre/dom) == 4096 ] || {
2096                                 error_noexit "DoM: bad size after write"
2097                                 return 1
2098                         }
2099                         rm $tmp/mnt/lustre/dom
2100
2101                         $r $LCTL get_param -n lod.*MDT0000*.dom_stripesize || {
2102                                 error_noexit "Getting \"dom_stripesize\""
2103                                 return 1
2104                         }
2105                         $r $LCTL conf_param \
2106                                 $fsname-MDT0000.lod.dom_stripesize=0 || {
2107                                 error_noexit "Changing \"dom_stripesize\""
2108                                 return 1
2109                         }
2110                         wait_update $(facet_host mds) "$LCTL get_param \
2111                                 -n lod.*MDT0000*.dom_stripesize" 0 || {
2112                                 error_noexit "Verifying \"dom_stripesize\""
2113                                 return 1
2114                         }
2115                 fi
2116
2117                 if [ "$dne_upgrade" != "no" ]; then
2118                         $LFS mkdir -i 1 -c2 $tmp/mnt/lustre/striped_dir || {
2119                                 error_noexit "set striped dir failed"
2120                                 return 1
2121                         }
2122
2123                         $LFS setdirstripe -D -c2 $tmp/mnt/lustre/striped_dir
2124
2125                         pushd $tmp/mnt/lustre
2126                         tar -cf - . --exclude=./striped_dir \
2127                                     --exclude=./striped_dir_old \
2128                                     --exclude=./remote_dir |
2129                                 tar -xvf - -C striped_dir 1>/dev/null || {
2130                                 error_noexit "cp to striped dir failed"
2131                                 return 1
2132                         }
2133                         popd
2134                 fi
2135
2136                 # If it is upgrade from DNE (2.5), then rename the remote dir,
2137                 # which is created in 2.5 to striped dir.
2138                 if $mdt2_is_available && [[ "$dne_upgrade" != "no" ]]; then
2139                         stripe_index=$($LFS getdirstripe -i     \
2140                                        $tmp/mnt/lustre/remote_dir)
2141
2142                         [[ $stripe_index -eq 1 ]] || {
2143                                 error_noexit "get index \"$stripe_index\"" \
2144                                              "from remote dir failed"
2145                                 return 1
2146                         }
2147                         mv $tmp/mnt/lustre/remote_dir   \
2148                                 $tmp/mnt/lustre/striped_dir/ || {
2149                                 error_noexit "mv remote dir failed"
2150                                 return 1
2151                         }
2152                 fi
2153
2154                 # If it is upgraded from DNE (2.7), then move the striped dir
2155                 # which was created in 2.7 to the new striped dir.
2156                 if $mdt2_is_available && [[ "$dne_upgrade" != "no" ]] &&
2157                         [[ -d $tmp/mnt/lustre/striped_dir_old ]]; then
2158                         stripe_count=$($LFS getdirstripe -c     \
2159                                        $tmp/mnt/lustre/striped_dir_old)
2160                         [[ $stripe_count -eq 2 ]] || {
2161                                 error_noexit "get count $stripe_count" \
2162                                              "from striped dir failed"
2163                                 return 1
2164                         }
2165                         mv $tmp/mnt/lustre/striped_dir_old      \
2166                                 $tmp/mnt/lustre/striped_dir/ || {
2167                                 error_noexit "mv striped dir failed"
2168                                 return 1
2169                         }
2170                 fi
2171
2172                 sync; sleep 5; sync
2173                 $r $LCTL set_param -n osd*.*.force_sync=1
2174                 dd if=/dev/zero of=$tmp/mnt/lustre/tmp_file bs=10k count=10 || {
2175                         error_noexit "dd failed"
2176                         return 1
2177                 }
2178                 rm -rf $tmp/mnt/lustre/tmp_file || {
2179                         error_noexit "rm failed"
2180                         return 1
2181                 }
2182
2183                 if $r test -f $tmp/sha1sums; then
2184                         # LU-2393 - do both sorts on same node to ensure locale
2185                         # is identical
2186                         $r cat $tmp/sha1sums | sort -k 2 >$tmp/sha1sums.orig
2187                         if [ "$dne_upgrade" != "no" ]; then
2188                                 pushd $tmp/mnt/lustre/striped_dir
2189                         else
2190                                 pushd $tmp/mnt/lustre
2191                         fi
2192
2193                         find ! -path "*remote_dir*" ! -path "*striped_dir*" \
2194                                 ! -name .lustre -type f -exec sha1sum {} \; |
2195                                 sort -k 2 >$tmp/sha1sums || {
2196                                 popd
2197                                 error_noexit "sha1sum"
2198                                 return 1
2199                         }
2200                         popd
2201                         if ! diff -ub $tmp/sha1sums.orig $tmp/sha1sums; then
2202                                 error_noexit "sha1sum verification failed"
2203                                 return 1
2204                         fi
2205
2206                         # if upgrade from DNE(2.5), then check remote directory
2207                         # if upgrade from DNE(2.7), then check striped directory
2208                         if $mdt2_is_available &&
2209                            [[ "$dne_upgrade" != "no" ]]; then
2210                                 local new_dir="$tmp/mnt/lustre/striped_dir"
2211                                 local striped_dir_old="$new_dir/striped_dir_old"
2212
2213                                 local dir_list="$new_dir/remote_dir"
2214                                 [[ ! -d $triped_dir_old ]] ||
2215                                         dir_list+=" $striped_dir_old"
2216
2217                                 for dir in $dir_list; do
2218                                         pushd $dir
2219                                         find ! -name .lustre -type f    \
2220                                                 -exec sha1sum {} \; |
2221                                                 sort -k 2 >$tmp/sha1sums || {
2222                                                         popd
2223                                                         error_noexit "sha1sum"
2224                                                         return 1
2225                                                 }
2226                                         popd
2227                                         if ! diff -ub $tmp/sha1sums.orig \
2228                                                 $tmp/sha1sums; then
2229                                                 error_noexit "sha1sum $dir" \
2230                                                              "failed"
2231                                                 return 1
2232                                         fi
2233                                 done
2234                         fi
2235                 else
2236                         echo "sha1sum verification skipped"
2237                 fi
2238
2239                 if [ "$dne_upgrade" != "no" ]; then
2240                         rm -rf $tmp/mnt/lustre/striped_dir || {
2241                                 error_noexit "remove remote dir failed"
2242                                 return 1
2243                         }
2244                 fi
2245
2246                 # migrate files/dirs to remote MDT, then move them back
2247                 if [ $(lustre_version_code mds1) -ge $(version_code 2.7.50) -a \
2248                      $dne_upgrade != "no" ]; then
2249                         $r $LCTL set_param -n   \
2250                                 mdt.${fsname}*.enable_remote_dir=1 2>/dev/null
2251
2252                         echo "test migration"
2253                         pushd $tmp/mnt/lustre
2254                         for dir in $(find ! -name .lustre ! -name . -type d); do
2255                                 mdt_index=$($LFS getdirstripe -i $dir)
2256                                 stripe_cnt=$($LFS getdirstripe -c $dir)
2257                                 if [ $mdt_index = 0 -a $stripe_cnt -le 1 ]; then
2258                                         $LFS mv -M 1 $dir || {
2259                                         popd
2260                                         error_noexit "migrate MDT1 failed"
2261                                         return 1
2262                                 }
2263                                 fi
2264                         done
2265
2266                         for dir in $(find ! -name . ! -name .lustre -type d); do
2267                                 mdt_index=$($LFS getdirstripe -i $dir)
2268                                 stripe_cnt=$($LFS getdirstripe -c $dir)
2269                                 if [ $mdt_index = 1 -a $stripe_cnt -le 1 ]; then
2270                                         $LFS mv -M 0 $dir || {
2271                                         popd
2272                                         error_noexit "migrate MDT0 failed"
2273                                         return 1
2274                                 }
2275                                 fi
2276                         done
2277                         popd
2278                 fi
2279
2280                 #
2281                 # When adding new data verification tests, please check for
2282                 # the presence of the required reference files first, like
2283                 # the "sha1sums" and "list" tests above, to avoid the need to
2284                 # regenerate every image for each test addition.
2285                 #
2286
2287                 nrpcs_orig=$($LCTL get_param \
2288                                 -n mdc.*MDT0000*.max_rpcs_in_flight) || {
2289                         error_noexit "Getting \"max_rpcs_in_flight\""
2290                         return 1
2291                 }
2292                 nrpcs=$((nrpcs_orig + 5))
2293                 $r $LCTL conf_param $fsname-MDT0000.mdc.max_rpcs_in_flight=$nrpcs || {
2294                         error_noexit "Changing \"max_rpcs_in_flight\""
2295                         return 1
2296                 }
2297                 wait_update $HOSTNAME "$LCTL get_param \
2298                         -n mdc.*MDT0000*.max_rpcs_in_flight" $nrpcs || {
2299                         error_noexit "Verifying \"max_rpcs_in_flight\""
2300                         return 1
2301                 }
2302
2303                 umount $tmp/mnt/lustre || {
2304                         error_noexit "Unmounting the client"
2305                         return 1
2306                 }
2307                 shall_cleanup_lustre=false
2308         else
2309                 if [[ "$dne_upgrade" != "no" ]] || $mdt2_is_available; then
2310                         $r $UMOUNT $tmp/mnt/mdt1 || {
2311                                 error_noexit "Unmounting the MDT2"
2312                                 return 1
2313                         }
2314                         shall_cleanup_mdt1=false
2315                 fi
2316
2317                 $r $UMOUNT $tmp/mnt/mdt || {
2318                         error_noexit "Unmounting the MDT"
2319                         return 1
2320                 }
2321                 shall_cleanup_mdt=false
2322
2323                 $r $UMOUNT $tmp/mnt/ost || {
2324                         error_noexit "Unmounting the OST"
2325                         return 1
2326                 }
2327                 shall_cleanup_ost=false
2328
2329                 t32_reload_modules $node || {
2330                         error_noexit "Reloading modules"
2331                         return 1
2332                 }
2333
2334                 if [[ $fstype == zfs ]]; then
2335                         local poolname=t32fs-mdt1
2336                         $r "modprobe zfs;
2337                             $ZPOOL list -H $poolname >/dev/null 2>&1 ||
2338                                 $ZPOOL import -f -d $tmp $poolname"
2339
2340                         # upgrade zpool to latest supported features,
2341                         # including dnode quota accounting in 0.7.0
2342                         $r "$ZPOOL upgrade $poolname"
2343                 fi
2344
2345                 # mount a second time to make sure we didnt leave upgrade flag on
2346                 $r $TUNEFS --dryrun $mdt_dev || {
2347                         $r losetup -a
2348                         error_noexit "tunefs.lustre before remounting the MDT"
2349                         return 1
2350                 }
2351
2352                 mopts=exclude=$fsname-OST0000
2353                 if [ $fstype == "ldiskfs" ]; then
2354                         mopts="loop,$mopts"
2355                 fi
2356                 $r $MOUNT_CMD -o $mopts $mdt_dev $tmp/mnt/mdt || {
2357                         error_noexit "Remounting the MDT"
2358                         return 1
2359                 }
2360                 shall_cleanup_mdt=true
2361         fi
2362 }
2363
2364 test_32a() {
2365         local tarballs
2366         local tarball
2367         local rc=0
2368
2369         t32_check
2370         for tarball in $tarballs; do
2371                 t32_test $tarball || let "rc += $?"
2372         done
2373         return $rc
2374 }
2375 run_test 32a "Upgrade (not live)"
2376
2377 test_32b() {
2378         local tarballs
2379         local tarball
2380         local rc=0
2381
2382         t32_check
2383         for tarball in $tarballs; do
2384                 t32_test $tarball writeconf || let "rc += $?"
2385         done
2386         return $rc
2387 }
2388 run_test 32b "Upgrade with writeconf"
2389
2390 test_32c() {
2391         local tarballs
2392         local tarball
2393         local rc=0
2394
2395         [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
2396         t32_check
2397         for tarball in $tarballs; do
2398                 # Do not support 1_8 and 2_1 direct upgrade to DNE2 anymore */
2399                 echo $tarball | grep "1_8" && continue
2400                 echo $tarball | grep "2_1" && continue
2401                 load_modules
2402                 dne_upgrade=yes t32_test $tarball writeconf || rc=$?
2403         done
2404         return $rc
2405 }
2406 run_test 32c "dne upgrade test"
2407
2408 test_32d() {
2409         local tarballs
2410         local tarball
2411         local rc=0
2412
2413         t32_check
2414         for tarball in $tarballs; do
2415                 ff_convert=yes t32_test $tarball || rc=$?
2416         done
2417         return $rc
2418 }
2419 run_test 32d "convert ff test"
2420
2421 test_32e() {
2422         local tarballs
2423         local tarball
2424         local rc=0
2425
2426         t32_check
2427         for tarball in $tarballs; do
2428                 echo $tarball | grep "2_9" || continue
2429                 #load_modules
2430                 dom_upgrade=yes t32_test $tarball writeconf || let "rc += $?"
2431         done
2432         return $rc
2433 }
2434 run_test 32e "dom upgrade test"
2435
2436 test_33a() { # bug 12333, was test_33
2437         local FSNAME2=test-123
2438         local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
2439         local mkfsoptions
2440
2441         [ -n "$ost1_HOST" ] && fs2ost_HOST=$ost1_HOST
2442
2443         if [ -z "$fs2ost_DEV" -o -z "$fs2mds_DEV" ]; then
2444                 local dev=${SINGLEMDS}_dev
2445                 local MDSDEV=${!dev}
2446                 is_blkdev $SINGLEMDS $MDSDEV &&
2447                         skip_env "mixed loopback and real device not working" &&
2448                         return
2449         fi
2450
2451         local fs2mdsdev=$(mdsdevname 1_2)
2452         local fs2ostdev=$(ostdevname 1_2)
2453         local fs2mdsvdev=$(mdsvdevname 1_2)
2454         local fs2ostvdev=$(ostvdevname 1_2)
2455
2456         if [ $(facet_fstype mds1) == ldiskfs ]; then
2457                 mkfsoptions="--mkfsoptions=\\\"-J size=8\\\"" # See bug 17931.
2458         fi
2459
2460         if combined_mgs_mds; then
2461                 local mgs_flag="--mgs"
2462         fi
2463
2464         add fs2mds $(mkfs_opts mds1 ${fs2mdsdev}) --fsname=${FSNAME2} \
2465                 --reformat $mgs_flag $mkfsoptions $fs2mdsdev $fs2mdsvdev ||
2466                 exit 10
2467         add fs2ost $(mkfs_opts ost1 ${fs2ostdev}) --mgsnode=$MGSNID \
2468                 --fsname=${FSNAME2} --index=8191 --reformat $fs2ostdev \
2469                 $fs2ostvdev || exit 10
2470
2471         start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && trap cleanup_fs2 EXIT INT
2472         start fs2ost $fs2ostdev $OST_MOUNT_OPTS
2473         do_facet mgs "$LCTL conf_param $FSNAME2.sys.timeout=200" ||
2474                 error "$LCTL conf_param $FSNAME2.sys.timeout=200 failed"
2475         mkdir -p $MOUNT2 || error "mkdir $MOUNT2 failed"
2476         $MOUNT_CMD $MGSNID:/${FSNAME2} $MOUNT2 || error "$MOUNT_CMD failed"
2477         echo "ok."
2478
2479         cp /etc/hosts $MOUNT2/ || error "copy /etc/hosts $MOUNT2/ failed"
2480         $GETSTRIPE $MOUNT2/hosts || error "$GETSTRIPE $MOUNT2/hosts failed"
2481
2482         umount $MOUNT2
2483         stop fs2ost -f
2484         stop fs2mds -f
2485         cleanup_nocli || error "cleanup_nocli failed with $?"
2486 }
2487 run_test 33a "Mount ost with a large index number"
2488
2489 test_33b() {    # was test_34
2490         setup
2491
2492         do_facet client dd if=/dev/zero of=$MOUNT/24 bs=1024k count=1
2493         # Drop lock cancelation reply during umount
2494         #define OBD_FAIL_LDLM_CANCEL_NET                        0x304
2495         do_facet client $LCTL set_param fail_loc=0x80000304
2496         #lctl set_param debug=-1
2497         umount_client $MOUNT
2498         cleanup || error "cleanup failed with $?"
2499 }
2500 run_test 33b "Drop cancel during umount"
2501
2502 test_34a() {
2503         setup
2504         do_facet client "sh runmultiop_bg_pause $DIR/file O_c"
2505         manual_umount_client
2506         rc=$?
2507         do_facet client killall -USR1 multiop
2508         if [ $rc -eq 0 ]; then
2509                 error "umount not fail!"
2510         fi
2511         sleep 1
2512         cleanup || error "cleanup failed with rc $?"
2513 }
2514 run_test 34a "umount with opened file should be fail"
2515
2516 test_34b() {
2517         setup
2518         touch $DIR/$tfile || error "touch $DIR/$tfile failed"
2519         stop_mds || error "Unable to stop MDS"
2520
2521         manual_umount_client --force || error "mtab after failed umount with $?"
2522
2523         cleanup || error "cleanup failed with $?"
2524 }
2525 run_test 34b "force umount with failed mds should be normal"
2526
2527 test_34c() {
2528         setup
2529         touch $DIR/$tfile || error "touch $DIR/$tfile failed"
2530         stop_ost || error "Unable to stop OST1"
2531
2532         manual_umount_client --force || error "mtab after failed umount with $?"
2533
2534         cleanup || error "cleanup failed with $?"
2535 }
2536 run_test 34c "force umount with failed ost should be normal"
2537
2538 test_35a() { # bug 12459
2539         setup
2540
2541         DBG_SAVE="`$LCTL get_param -n debug`"
2542         $LCTL set_param debug="ha"
2543
2544         log "Set up a fake failnode for the MDS"
2545         FAKENID="127.0.0.2"
2546         local device=$(do_facet $SINGLEMDS "$LCTL get_param -n devices" |
2547                 awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }' | head -1)
2548         do_facet mgs "$LCTL conf_param \
2549                       ${device}.failover.node=$(h2nettype $FAKENID)" ||
2550                 error "Setting ${device}.failover.node=\
2551                        $(h2nettype $FAKENID) failed."
2552
2553         log "Wait for RECONNECT_INTERVAL seconds (10s)"
2554         sleep 10
2555
2556         MSG="conf-sanity.sh test_35a `date +%F%kh%Mm%Ss`"
2557         $LCTL clear
2558         log "$MSG"
2559         log "Stopping the MDT: $device"
2560         stop_mdt 1 || error "MDT0 stop fail"
2561
2562         df $MOUNT > /dev/null 2>&1 &
2563         DFPID=$!
2564         log "Restarting the MDT: $device"
2565         start_mdt 1 || error "MDT0 start fail"
2566         log "Wait for df ($DFPID) ... "
2567         wait $DFPID
2568         log "done"
2569         $LCTL set_param debug="$DBG_SAVE"
2570
2571         # retrieve from the log the first server that the client tried to
2572         # contact after the connection loss
2573         $LCTL dk $TMP/lustre-log-$TESTNAME.log
2574         NEXTCONN=`awk "/${MSG}/ {start = 1;}
2575                        /import_select_connection.*$device-mdc.* using connection/ {
2576                                 if (start) {
2577                                         if (\\\$NF ~ /$FAKENID/)
2578                                                 print \\\$NF;
2579                                         else
2580                                                 print 0;
2581                                         exit;
2582                                 }
2583                        }" $TMP/lustre-log-$TESTNAME.log`
2584         [ "$NEXTCONN" != "0" ] &&
2585                 error "Tried to connect to ${NEXTCONN} not last active server"
2586         cleanup || error "cleanup failed with $?"
2587         # remove nid settings
2588         writeconf_or_reformat
2589 }
2590 run_test 35a "Reconnect to the last active server first"
2591
2592 test_35b() { # bug 18674
2593         remote_mds || { skip "local MDS" && return 0; }
2594         setup
2595
2596         debugsave
2597         $LCTL set_param debug="ha"
2598         $LCTL clear
2599         MSG="conf-sanity.sh test_35b `date +%F%kh%Mm%Ss`"
2600         log "$MSG"
2601
2602         log "Set up a fake failnode for the MDS"
2603         FAKENID="127.0.0.2"
2604         local device=$(do_facet $SINGLEMDS "$LCTL get_param -n devices" |
2605                 awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }' | head -1)
2606         do_facet mgs "$LCTL conf_param \
2607                       ${device}.failover.node=$(h2nettype $FAKENID)" ||
2608                 error "Set ${device}.failover.node=\
2609                        $(h2nettype $FAKENID) failed"
2610
2611         local at_max_saved=0
2612         # adaptive timeouts may prevent seeing the issue
2613         if at_is_enabled; then
2614                 at_max_saved=$(at_max_get mds)
2615                 at_max_set 0 mds client
2616         fi
2617
2618         mkdir $MOUNT/$tdir || error "mkdir $MOUNT/$tdir failed"
2619
2620         log "Injecting EBUSY on MDS"
2621         # Setting OBD_FAIL_MDS_RESEND=0x136
2622         do_facet $SINGLEMDS "$LCTL set_param fail_loc=0x80000136" ||
2623                 error "unable to set param fail_loc=0x80000136"
2624
2625         $LCTL set_param mdc.${FSNAME}*.stats=clear
2626
2627         log "Creating a test file and stat it"
2628         touch $MOUNT/$tdir/$tfile || error "touch $MOUNT/$tdir/$tfile failed"
2629         stat $MOUNT/$tdir/$tfile
2630
2631         log "Stop injecting EBUSY on MDS"
2632         do_facet $SINGLEMDS "$LCTL set_param fail_loc=0" ||
2633                 error "unable to set param fail_loc=0"
2634         rm -f $MOUNT/$tdir/$tfile || error "remove $MOUNT/$tdir/$tfile failed"
2635
2636         log "done"
2637         # restore adaptive timeout
2638         [ $at_max_saved -ne 0 ] && at_max_set $at_max_saved mds client
2639
2640         $LCTL dk $TMP/lustre-log-$TESTNAME.log
2641
2642         CONNCNT=$($LCTL get_param mdc.${FSNAME}*.stats |
2643                   awk '/mds_connect/{print $2}')
2644
2645         # retrieve from the log if the client has ever tried to
2646         # contact the fake server after the loss of connection
2647         FAILCONN=`awk "BEGIN {ret = 0;}
2648                        /import_select_connection.*${FSNAME}-MDT0000-mdc.* using connection/ {
2649                                 ret = 1;
2650                                 if (\\\$NF ~ /$FAKENID/) {
2651                                         ret = 2;
2652                                         exit;
2653                                 }
2654                        }
2655                        END {print ret}" $TMP/lustre-log-$TESTNAME.log`
2656
2657         [ "$FAILCONN" == "0" ] &&
2658                 error "The client reconnection has not been triggered"
2659         [ "$FAILCONN" == "2" ] &&
2660                 error "Primary server busy, client reconnect to failover failed"
2661
2662         # LU-290
2663         # When OBD_FAIL_MDS_RESEND is hit, we sleep for 2 * obd_timeout
2664         # Reconnects are supposed to be rate limited to one every 5s
2665         [ $CONNCNT -gt $((2 * $TIMEOUT / 5 + 1)) ] &&
2666                 error "Too many reconnects $CONNCNT"
2667
2668         cleanup || error "cleanup failed with $?"
2669         # remove nid settings
2670         writeconf_or_reformat
2671 }
2672 run_test 35b "Continue reconnection retries, if the active server is busy"
2673
2674 test_36() { # 12743
2675         [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs" && return
2676
2677         [ "$ost_HOST" = "`hostname`" -o "$ost1_HOST" = "`hostname`" ] ||
2678                 { skip "remote OST" && return 0; }
2679
2680         local rc=0
2681         local FSNAME2=test1234
2682         local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
2683
2684         [ -n "$ost1_HOST" ] && fs2ost_HOST=$ost1_HOST && fs3ost_HOST=$ost1_HOST
2685
2686         if [ -z "$fs2ost_DEV" -o -z "$fs2mds_DEV" -o -z "$fs3ost_DEV" ]; then
2687                 is_blkdev $SINGLEMDS $MDSDEV &&
2688                 skip_env "mixed loopback and real device not working" && return
2689         fi
2690
2691         local fs2mdsdev=$(mdsdevname 1_2)
2692         local fs2ostdev=$(ostdevname 1_2)
2693         local fs3ostdev=$(ostdevname 2_2)
2694         local fs2mdsvdev=$(mdsvdevname 1_2)
2695         local fs2ostvdev=$(ostvdevname 1_2)
2696         local fs3ostvdev=$(ostvdevname 2_2)
2697
2698         add fs2mds $(mkfs_opts mds1 ${fs2mdsdev}) --mgs --fsname=${FSNAME2} \
2699                 --reformat $fs2mdsdev $fs2mdsvdev || exit 10
2700         # XXX after we support non 4K disk blocksize in ldiskfs, specify a
2701         #     different one than the default value here.
2702         add fs2ost $(mkfs_opts ost1 ${fs2ostdev}) --mgsnode=$MGSNID \
2703                 --fsname=${FSNAME2} --reformat $fs2ostdev $fs2ostvdev || exit 10
2704         add fs3ost $(mkfs_opts ost2 ${fs3ostdev}) --mgsnode=$MGSNID \
2705                 --fsname=${FSNAME2} --reformat $fs3ostdev $fs3ostvdev || exit 10
2706
2707         start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS
2708         start fs2ost $fs2ostdev $OST_MOUNT_OPTS
2709         start fs3ost $fs3ostdev $OST_MOUNT_OPTS
2710         mkdir -p $MOUNT2 || error "mkdir $MOUNT2 failed"
2711         $MOUNT_CMD $MGSNID:/${FSNAME2} $MOUNT2 || error "$MOUNT_CMD failed"
2712
2713         sleep 5 # until 11778 fixed
2714
2715         dd if=/dev/zero of=$MOUNT2/$tfile bs=1M count=7 || error "dd failed"
2716
2717         BKTOTAL=$($LCTL get_param -n obdfilter.*.kbytestotal |
2718                   awk 'BEGIN{total=0}; {total+=$1}; END{print total}')
2719         BKFREE=$($LCTL get_param -n obdfilter.*.kbytesfree |
2720                  awk 'BEGIN{free=0}; {free+=$1}; END{print free}')
2721         BKAVAIL=$($LCTL get_param -n obdfilter.*.kbytesavail |
2722                   awk 'BEGIN{avail=0}; {avail+=$1}; END{print avail}')
2723         STRING=$(df -P $MOUNT2 | tail -n 1 | awk '{print $2","$3","$4}')
2724         DFTOTAL=$(echo $STRING | cut -d, -f1)
2725         DFUSED=$(echo $STRING  | cut -d, -f2)
2726         DFAVAIL=$(echo $STRING | cut -d, -f3)
2727         DFFREE=$(($DFTOTAL - $DFUSED))
2728
2729         ALLOWANCE=$((64 * $OSTCOUNT))
2730
2731         if [ $DFTOTAL -lt $(($BKTOTAL - $ALLOWANCE)) ] ||
2732            [ $DFTOTAL -gt $(($BKTOTAL + $ALLOWANCE)) ] ; then
2733                 echo "**** FAIL: df total($DFTOTAL) mismatch OST total($BKTOTAL)"
2734                 rc=1
2735         fi
2736         if [ $DFFREE -lt $(($BKFREE - $ALLOWANCE)) ] ||
2737            [ $DFFREE -gt $(($BKFREE + $ALLOWANCE)) ] ; then
2738                 echo "**** FAIL: df free($DFFREE) mismatch OST free($BKFREE)"
2739                 rc=2
2740         fi
2741         if [ $DFAVAIL -lt $(($BKAVAIL - $ALLOWANCE)) ] ||
2742            [ $DFAVAIL -gt $(($BKAVAIL + $ALLOWANCE)) ] ; then
2743                 echo "**** FAIL: df avail($DFAVAIL) mismatch OST avail($BKAVAIL)"
2744                 rc=3
2745        fi
2746
2747         $UMOUNT $MOUNT2
2748         stop fs3ost -f || error "unable to stop OST3"
2749         stop fs2ost -f || error "unable to stop OST2"
2750         stop fs2mds -f || error "unable to stop second MDS"
2751         unload_modules_conf || error "unable unload modules"
2752         return $rc
2753 }
2754 run_test 36 "df report consistency on OSTs with different block size"
2755
2756 test_37() {
2757         local mntpt=$(facet_mntpt $SINGLEMDS)
2758         local mdsdev=$(mdsdevname ${SINGLEMDS//mds/})
2759         local mdsdev_sym="$TMP/sym_mdt.img"
2760         local opts=$MDS_MOUNT_OPTS
2761         local rc=0
2762
2763         if [ $(facet_fstype $SINGLEMDS) != ldiskfs ]; then
2764                 skip "ldiskfs only test"
2765                 return
2766         fi
2767
2768         echo "MDS :     $mdsdev"
2769         echo "SYMLINK : $mdsdev_sym"
2770         do_facet $SINGLEMDS rm -f $mdsdev_sym
2771
2772         do_facet $SINGLEMDS ln -s $mdsdev $mdsdev_sym
2773
2774         echo "mount symlink device - $mdsdev_sym"
2775
2776         if ! do_facet $SINGLEMDS test -b $mdsdev; then
2777                 opts=$(csa_add "$opts" -o loop)
2778         fi
2779         mount_op=$(do_facet $SINGLEMDS mount -v -t lustre $opts \
2780                 $mdsdev_sym $mntpt 2>&1)
2781         rc=${PIPESTATUS[0]}
2782
2783         echo mount_op=$mount_op
2784
2785         do_facet $SINGLEMDS "$UMOUNT $mntpt && rm -f $mdsdev_sym"
2786
2787         if $(echo $mount_op | grep -q "unable to set tunable"); then
2788                 error "set tunables failed for symlink device"
2789         fi
2790
2791         [ $rc -eq 0 ] || error "mount symlink $mdsdev_sym failed! rc=$rc"
2792 }
2793 run_test 37 "verify set tunables works for symlink device"
2794
2795 test_38() { # bug 14222
2796         local fstype=$(facet_fstype $SINGLEMDS)
2797         local mntpt=$(facet_mntpt $SINGLEMDS)
2798
2799         setup
2800         # like runtests
2801         local COUNT=10
2802         local SRC="/etc /bin"
2803         local FILES=$(find $SRC -type f -mtime +1 | head -n $COUNT)
2804         log "copying $(echo $FILES | wc -w) files to $DIR/$tdir"
2805         mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed"
2806         tar cf - $FILES | tar xf - -C $DIR/$tdir ||
2807                 error "copying $SRC to $DIR/$tdir"
2808         sync
2809         umount_client $MOUNT || error "umount_client $MOUNT failed"
2810         do_facet $SINGLEMDS "$LCTL get_param osp.*.prealloc_next_id"
2811         stop_mds || error "Unable to stop MDS"
2812         log "delete lov_objid file on MDS"
2813
2814         mount_fstype $SINGLEMDS || error "mount MDS failed (1)"
2815
2816         do_facet $SINGLEMDS "od -Ax -td8 $mntpt/lov_objid; rm $mntpt/lov_objid"
2817
2818         unmount_fstype $SINGLEMDS || error "umount failed (1)"
2819
2820         # check create in mds_lov_connect
2821         start_mds || error "unable to start MDS"
2822         mount_client $MOUNT || error "mount_client $MOUNT failed"
2823         for f in $FILES; do
2824                 [ $V ] && log "verifying $DIR/$tdir/$f"
2825                 diff -q $f $DIR/$tdir/$f || ERROR=y
2826         done
2827         do_facet $SINGLEMDS "$LCTL get_param osp.*.prealloc_next_id"
2828         if [ "$ERROR" = "y" ]; then
2829                 # check it's updates in sync
2830                 umount_client $MOUNT
2831                 stop_mds
2832                 mount_fstype $SIGNLEMDS
2833                 do_facet $SINGLEMDS "od -Ax -td8 $mntpt/lov_objid"
2834                 unmount_fstype $SINGLEMDS
2835                 error "old and new files are different after connect" || true
2836         fi
2837         touch $DIR/$tdir/f2 || error "f2 file create failed"
2838
2839         # check it's updates in sync
2840         umount_client $MOUNT || error "second umount_client $MOUNT failed"
2841         stop_mds
2842
2843         mount_fstype $SINGLEMDS || error "mount MDS failed (3)"
2844
2845         do_facet $SINGLEMDS "od -Ax -td8 $mntpt/lov_objid"
2846         do_facet $SINGLEMDS dd if=/dev/zero of=$mntpt/lov_objid.clear count=8
2847
2848         unmount_fstype $SINGLEMDS || error "umount failed (3)"
2849
2850         start_mds || error "unable to start MDS"
2851         mount_client $MOUNT || error "mount_client $MOUNT failed"
2852         for f in $FILES; do
2853                 [ $V ] && log "verifying $DIR/$tdir/$f"
2854                 diff -q $f $DIR/$tdir/$f || ERROR=y
2855         done
2856         touch $DIR/$tdir/f3 || error "f3 file create failed"
2857         do_facet $SINGLEMDS "$LCTL get_param osp.*.prealloc_next_id"
2858         umount_client $MOUNT || error "third umount_client $MOUNT failed"
2859         stop_mds
2860         mount_fstype $SINGLEMDS || error "mount MDS failed (4)"
2861         do_facet $SINGLEMDS "od -Ax -td8 $mntpt/lov_objid"
2862         unmount_fstype $SINGLEMDS || error "umount failed (4)"
2863
2864         [ "$ERROR" = "y" ] &&
2865                 error "old and new files are different after sync" || true
2866
2867         log "files compared the same"
2868         cleanup || error "cleanup failed with $?"
2869 }
2870 run_test 38 "MDS recreates missing lov_objid file from OST data"
2871
2872 test_39() {
2873         PTLDEBUG=+malloc
2874         setup
2875         cleanup || error "cleanup failed with $?"
2876         perl $SRCDIR/leak_finder.pl $TMP/debug 2>&1 | egrep '*** Leak:' &&
2877                 error "memory leak detected" || true
2878 }
2879 run_test 39 "leak_finder recognizes both LUSTRE and LNET malloc messages"
2880
2881 test_40() { # bug 15759
2882         start_ost || error "Unable to start OST1"
2883         #define OBD_FAIL_TGT_TOOMANY_THREADS     0x706
2884         do_facet $SINGLEMDS "$LCTL set_param fail_loc=0x80000706"
2885         start_mds
2886         cleanup || error "cleanup failed with rc $?"
2887 }
2888 run_test 40 "race during service thread startup"
2889
2890 test_41a() { #bug 14134
2891         if [ $(facet_fstype $SINGLEMDS) == ldiskfs ] &&
2892            ! do_facet $SINGLEMDS test -b $(mdsdevname 1); then
2893                 skip "Loop devices does not work with nosvc option"
2894                 return
2895         fi
2896
2897         combined_mgs_mds ||
2898                 { skip "needs combined MGT and MDT device" && return 0; }
2899
2900         start_mdt 1 -o nosvc -n
2901         if [ $MDSCOUNT -ge 2 ]; then
2902                 for num in $(seq 2 $MDSCOUNT); do
2903                         start_mdt $num || return
2904                 done
2905         fi
2906         start ost1 $(ostdevname 1) $OST_MOUNT_OPTS
2907         start_mdt 1 -o nomgs,force
2908         mount_client $MOUNT || error "mount_client $MOUNT failed"
2909         sleep 5
2910
2911         echo "blah blah" > $MOUNT/$tfile
2912         cat $MOUNT/$tfile
2913
2914         umount_client $MOUNT || error "umount_client $MOUNT failed"
2915         stop ost1 -f || error "unable to stop OST1"
2916         stop_mds || error "Unable to stop MDS"
2917         stop_mds || error "Unable to stop MDS on second try"
2918 }
2919 run_test 41a "mount mds with --nosvc and --nomgs"
2920
2921 test_41b() {
2922         if [ $(facet_fstype $SINGLEMDS) == ldiskfs ] &&
2923            ! do_facet $SINGLEMDS test -b $(mdsdevname 1); then
2924                 skip "Loop devices does not work with nosvc option"
2925                 return
2926         fi
2927
2928         ! combined_mgs_mds && skip "needs combined mgs device" && return 0
2929
2930         stopall
2931         reformat
2932         local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
2933
2934         start_mdt 1 -o nosvc -n
2935         if [ $MDSCOUNT -ge 2 ]; then
2936                 for num in $(seq 2 $MDSCOUNT); do
2937                         start_mdt $num || return
2938                 done
2939         fi
2940         start_ost || error "Unable to start OST1"
2941         start_mdt 1 -o nomgs,force
2942         mount_client $MOUNT || error "mount_client $MOUNT failed"
2943         sleep 5
2944
2945         echo "blah blah" > $MOUNT/$tfile
2946         cat $MOUNT/$tfile || error "cat $MOUNT/$tfile failed"
2947
2948         umount_client $MOUNT -f || error "umount_client $MOUNT failed"
2949         stop_ost || error "Unable to stop OST1"
2950         stop_mds || error "Unable to stop MDS"
2951         stop_mds || error "Unable to stop MDS on second try"
2952 }
2953 run_test 41b "mount mds with --nosvc and --nomgs on first mount"
2954
2955 test_41c() {
2956         local server_version=$(lustre_version_code $SINGLEMDS)
2957         local oss_list=$(comma_list $(osts_nodes))
2958
2959         [[ $server_version -ge $(version_code 2.6.52) ]] ||
2960         [[ $server_version -ge $(version_code 2.5.26) &&
2961            $server_version -lt $(version_code 2.5.50) ]] ||
2962         [[ $server_version -ge $(version_code 2.5.4) &&
2963            $server_version -lt $(version_code 2.5.11) ]] ||
2964                 { skip "Need MDS version 2.5.4+ or 2.5.26+ or 2.6.52+"; return; }
2965
2966         # ensure mds1 ost1 have been created even if running sub-test standalone
2967         cleanup
2968         setup
2969         cleanup || error "cleanup failed"
2970
2971         # using directly mount command instead of start() function to avoid
2972         # any side effect of // with others/externals tools/features
2973         # ("zpool import", ...)
2974
2975         # MDT concurrent start
2976
2977         LOAD_MODULES_REMOTE=true load_modules
2978         do_facet $SINGLEMDS "lsmod | grep -q libcfs" ||
2979                 error "MDT concurrent start: libcfs module not loaded"
2980
2981         local mds1dev=$(mdsdevname 1)
2982         local mds1mnt=$(facet_mntpt mds1)
2983         local mds1fstype=$(facet_fstype mds1)
2984         local mds1opts=$MDS_MOUNT_OPTS
2985
2986         if [ $mds1fstype == ldiskfs ] &&
2987            ! do_facet mds1 test -b $mds1dev; then
2988                 mds1opts=$(csa_add "$mds1opts" -o loop)
2989         fi
2990         if [[ $mds1fstype == zfs ]]; then
2991                 import_zpool mds1 || return ${PIPESTATUS[0]}
2992         fi
2993
2994         #define OBD_FAIL_TGT_MOUNT_RACE 0x716
2995         do_facet mds1 "$LCTL set_param fail_loc=0x80000716"
2996
2997         do_facet mds1 mount -t lustre $mds1dev $mds1mnt $mds1opts &
2998         local pid=$!
2999
3000         do_facet mds1 mount -t lustre $mds1dev $mds1mnt $mds1opts
3001         local rc2=$?
3002         wait $pid
3003         local rc=$?
3004         do_facet mds1 "$LCTL set_param fail_loc=0x0"
3005         if [ $rc -eq 0 ] && [ $rc2 -ne 0 ]; then
3006                 echo "1st MDT start succeed"
3007                 echo "2nd MDT start failed with $rc2"
3008         elif [ $rc2 -eq 0 ] && [ $rc -ne 0 ]; then
3009                 echo "1st MDT start failed with $rc"
3010                 echo "2nd MDT start succeed"
3011         else
3012                 stop mds1 -f
3013                 error "unexpected concurrent MDT mounts result, rc=$rc rc2=$rc2"
3014         fi
3015
3016         if [ $MDSCOUNT -ge 2 ]; then
3017                 for num in $(seq 2 $MDSCOUNT); do
3018                         start_mdt $num || return
3019                 done
3020         fi
3021
3022         # OST concurrent start
3023
3024         do_rpc_nodes $oss_list "lsmod | grep -q libcfs" ||
3025                 error "OST concurrent start: libcfs module not loaded"
3026
3027         local ost1dev=$(ostdevname 1)
3028         local ost1mnt=$(facet_mntpt ost1)
3029         local ost1fstype=$(facet_fstype ost1)
3030         local ost1opts=$OST_MOUNT_OPTS
3031
3032         if [ $ost1fstype == ldiskfs ] &&
3033            ! do_facet ost1 test -b $ost1dev; then
3034                 ost1opts=$(csa_add "$ost1opts" -o loop)
3035         fi
3036         if [[ $ost1fstype == zfs ]]; then
3037                 import_zpool ost1 || return ${PIPESTATUS[0]}
3038         fi
3039
3040         #define OBD_FAIL_TGT_MOUNT_RACE 0x716
3041         do_facet ost1 "$LCTL set_param fail_loc=0x80000716"
3042
3043         do_facet ost1 mount -t lustre $ost1dev $ost1mnt $ost1opts &
3044         pid=$!
3045
3046         do_facet ost1 mount -t lustre $ost1dev $ost1mnt $ost1opts
3047         rc2=$?
3048         wait $pid
3049         rc=$?
3050         do_facet ost1 "$LCTL set_param fail_loc=0x0"
3051         if [ $rc -eq 0 ] && [ $rc2 -ne 0 ]; then
3052                 echo "1st OST start succeed"
3053                 echo "2nd OST start failed with $rc2"
3054         elif [ $rc2 -eq 0 ] && [ $rc -ne 0 ]; then
3055                 echo "1st OST start failed with $rc"
3056                 echo "2nd OST start succeed"
3057         else
3058                 stop_mds -f
3059                 stop ost1 -f
3060                 error "unexpected concurrent OST mounts result, rc=$rc rc2=$rc2"
3061         fi
3062         # cleanup
3063         stop_mds
3064         stop ost1 -f
3065
3066         # verify everything ok
3067         start_mds
3068         if [ $? != 0 ]
3069         then
3070                 stop_mds
3071                 error "MDT(s) start failed"
3072         fi
3073
3074         start_ost
3075         if [ $? != 0 ]
3076         then
3077                 stop_mds
3078                 stop ost1 -f
3079                 error "OST(s) start failed"
3080         fi
3081
3082         mount_client $MOUNT
3083         if [ $? != 0 ]
3084         then
3085                 stop_mds
3086                 stop ost1 -f
3087                 error "client start failed"
3088         fi
3089         check_mount
3090         if [ $? != 0 ]
3091         then
3092                 stop_mds
3093                 stop ost1 -f
3094                 error "client mount failed"
3095         fi
3096         cleanup
3097 }
3098 run_test 41c "concurrent mounts of MDT/OST should all fail but one"
3099
3100 test_42() { #bug 14693
3101         setup
3102         check_mount || error "client was not mounted"
3103
3104         do_facet mgs $LCTL conf_param $FSNAME.llite.some_wrong_param=10
3105         umount_client $MOUNT ||
3106                 error "unmounting client failed with invalid llite param"
3107         mount_client $MOUNT ||
3108                 error "mounting client failed with invalid llite param"
3109
3110         do_facet mgs $LCTL conf_param $FSNAME.sys.some_wrong_param=20
3111         cleanup || error "stopping $FSNAME failed with invalid sys param"
3112         setup
3113         check_mount || error "client was not mounted with invalid sys param"
3114         cleanup || error "stopping $FSNAME failed with invalid sys param"
3115 }
3116 run_test 42 "allow client/server mount/unmount with invalid config param"
3117
3118 test_43a() {
3119         [[ $(lustre_version_code mgs) -ge $(version_code 2.5.58) ]] ||
3120                 { skip "Need MDS version at least 2.5.58" && return 0; }
3121         [ $UID -ne 0 -o $RUNAS_ID -eq 0 ] && skip_env "run as root"
3122
3123         ID1=${ID1:-501}
3124         USER1=$(getent passwd | grep :$ID1:$ID1: | cut -d: -f1)
3125         [ -z "$USER1" ] && skip_env "missing user with uid=$ID1 gid=$ID1" &&
3126                 return
3127
3128         setup
3129         chmod ugo+x $DIR || error "chmod 0 failed"
3130         set_conf_param_and_check mds1                                   \
3131                 "$LCTL get_param -n mdt.$FSNAME-MDT0000.root_squash"    \
3132                 "$FSNAME.mdt.root_squash"                               \
3133                 "0:0"
3134         wait_update $HOSTNAME                                           \
3135                 "$LCTL get_param -n llite.${FSNAME}*.root_squash"       \
3136                 "0:0" ||
3137                 error "check llite root_squash failed!"
3138         set_conf_param_and_check mds1                                   \
3139                 "$LCTL get_param -n mdt.$FSNAME-MDT0000.nosquash_nids"  \
3140                 "$FSNAME.mdt.nosquash_nids"                             \
3141                 "NONE"
3142         wait_update $HOSTNAME                                           \
3143                 "$LCTL get_param -n llite.${FSNAME}*.nosquash_nids"     \
3144                 "NONE" ||
3145                 error "check llite nosquash_nids failed!"
3146
3147     #
3148     # create set of test files
3149     #
3150     echo "111" > $DIR/$tfile-userfile || error "write 1 failed"
3151     chmod go-rw $DIR/$tfile-userfile  || error "chmod 1 failed"
3152     chown $RUNAS_ID.$RUNAS_ID $DIR/$tfile-userfile || error "chown failed"
3153
3154     echo "222" > $DIR/$tfile-rootfile || error "write 2 failed"
3155     chmod go-rw $DIR/$tfile-rootfile  || error "chmod 2 faield"
3156
3157         mkdir $DIR/$tdir-rootdir || error "mkdir failed"
3158         chmod go-rwx $DIR/$tdir-rootdir || error "chmod 3 failed"
3159         touch $DIR/$tdir-rootdir/tfile-1 || error "touch failed"
3160
3161         echo "777" > $DIR/$tfile-user1file || error "write 7 failed"
3162         chmod go-rw $DIR/$tfile-user1file || error "chmod 7 failed"
3163         chown $ID1.$ID1 $DIR/$tfile-user1file || error "chown failed"
3164
3165         #
3166         # check root_squash:
3167         #   set root squash UID:GID to RUNAS_ID
3168         #   root should be able to access only files owned by RUNAS_ID
3169         #
3170         set_conf_param_and_check mds1                                   \
3171                 "$LCTL get_param -n mdt.$FSNAME-MDT0000.root_squash"    \
3172                 "$FSNAME.mdt.root_squash"                               \
3173                 "$RUNAS_ID:$RUNAS_ID"
3174         wait_update $HOSTNAME                                           \
3175                 "$LCTL get_param -n llite.${FSNAME}*.root_squash"      &nbs