Whamcloud - gitweb
LU-4416 tests: small fixes for conf_sanity
[fs/lustre-release.git] / lustre / tests / conf-sanity.sh
index af12da1..edaf102 100644 (file)
@@ -49,7 +49,6 @@ PTLDEBUG=${PTLDEBUG:--1}
 SAVE_PWD=$PWD
 LUSTRE=${LUSTRE:-`dirname $0`/..}
 RLUSTRE=${RLUSTRE:-$LUSTRE}
-LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi}
 export MULTIOP=${MULTIOP:-multiop}
 
 . $LUSTRE/tests/test-framework.sh
@@ -75,8 +74,8 @@ if [[ "$LDISKFS_MKFS_OPTS" != *lazy_itable_init* ]]; then
 fi
 
 [ $(facet_fstype $SINGLEMDS) = "zfs" ] &&
-# bug number for skipped test:        LU-2778 LU-2059
-       ALWAYS_EXCEPT="$ALWAYS_EXCEPT 57b     50h"
+# bug number for skipped test:        LU-2778 LU-4444
+       ALWAYS_EXCEPT="$ALWAYS_EXCEPT 57b     69"
 
 init_logging
 
@@ -204,7 +203,7 @@ mount_client() {
 }
 
 remount_client() {
-       local mountopt="-o remount,$1"
+       local mountopt="remount,$1"
        local MOUNTPATH=$2
        echo "remount '$1' lustre on ${MOUNTPATH}....."
        zconf_mount `hostname`  $MOUNTPATH "$mountopt"  || return 96
@@ -365,7 +364,7 @@ test_5a() { # was test_5
        wait $UMOUNT_PID
        if grep " $MOUNT " /proc/mounts; then
                echo "test 5: /proc/mounts after failed umount"
-               umount $MOUNT &
+               umount -f $MOUNT &
                UMOUNT_PID=$!
                sleep 2
                echo "killing umount"
@@ -450,9 +449,6 @@ test_5d() {
        grep " $MOUNT " /etc/mtab && \
                error false "unexpected entry in mtab before mount" && return 10
 
-       [ "$(facet_fstype ost1)" = "zfs" ] &&
-               skip "LU-2059: no local config for ZFS OSTs" && return
-
        local rc=0
        start_ost
        start_mds
@@ -699,9 +695,6 @@ test_19a() {
 run_test 19a "start/stop MDS without OSTs"
 
 test_19b() {
-       [ "$(facet_fstype ost1)" = "zfs" ] &&
-               skip "LU-2059: no local config for ZFS OSTs" && return
-
        start_ost || return 1
        stop_ost -f || return 2
 }
@@ -738,9 +731,6 @@ test_21a() {
 run_test 21a "start mds before ost, stop ost first"
 
 test_21b() {
-       [ "$(facet_fstype ost1)" = "zfs" ] &&
-               skip "LU-2059: no local config for ZFS OSTs" && return
-
         start_ost
        start_mds
         wait_osc_import_state mds ost FULL
@@ -932,7 +922,7 @@ test_24a() {
        start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && trap cleanup_fs2 EXIT INT
        start fs2ost $fs2ostdev $OST_MOUNT_OPTS
        mkdir -p $MOUNT2
-       mount -t lustre $MGSNID:/${FSNAME2} $MOUNT2 || return 1
+       $MOUNT_CMD $MGSNID:/${FSNAME2} $MOUNT2 || return 1
        # 1 still works
        check_mount || return 2
        # files written on 1 should not show up on 2
@@ -976,6 +966,7 @@ test_24b() {
                --reformat $fs2mdsdev $fs2mdsvdev || exit 10
        setup
        start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && return 2
+       stop fs2mds -f
        cleanup || return 6
 }
 run_test 24b "Multiple MGSs on a single node (should return err)"
@@ -1007,9 +998,6 @@ test_26() {
 run_test 26 "MDT startup failure cleans LOV (should return errs)"
 
 test_27a() {
-       [ "$(facet_fstype ost1)" = "zfs" ] &&
-               skip "LU-2059: no local config for ZFS OSTs" && return
-
        start_ost || return 1
        start_mds || return 2
        echo "Requeue thread should have started: "
@@ -1062,6 +1050,78 @@ test_28() {
 }
 run_test 28 "permanent parameter setting"
 
+test_28a() { # LU-4221
+       [[ $(lustre_version_code ost1) -ge $(version_code 2.5.52) ]] ||
+               { skip "Need OST version at least 2.5.52" && return 0; }
+       [ "$(facet_fstype ost1)" = "zfs" ] &&
+               skip "LU-4221: no such proc params for ZFS OSTs" && return
+
+       local name
+       local param
+       local cmd
+       local old
+       local new
+       local device="$FSNAME-OST0000"
+
+       setup
+
+       # In this test we will set three kinds of proc parameters with
+       # lctl conf_param:
+       # 1. the ones moved from the OFD to the OSD, and only their
+       #    symlinks kept in obdfilter
+       # 2. non-symlink ones in the OFD
+       # 3. non-symlink ones in the OSD
+
+       # Check 1.
+       # prepare a symlink parameter in the OFD
+       name="writethrough_cache_enable"
+       param="$device.ost.$name"
+       cmd="$LCTL get_param -n obdfilter.$device.$name"
+
+       # conf_param the symlink parameter in the OFD
+       old=$(do_facet ost1 $cmd)
+       new=$(((old + 1) % 2))
+       set_conf_param_and_check ost1 "$cmd" "$param" $new ||
+               error "lctl conf_param $device.ost.$param=$new failed"
+
+       # conf_param the target parameter in the OSD
+       param="$device.osd.$name"
+       cmd="$LCTL get_param -n osd-*.$device.$name"
+       set_conf_param_and_check ost1 "$cmd" "$param" $old ||
+               error "lctl conf_param $device.osd.$param=$old failed"
+
+       # Check 2.
+       # prepare a non-symlink parameter in the OFD
+       name="client_cache_seconds"
+       param="$device.ost.$name"
+       cmd="$LCTL get_param -n obdfilter.$device.$name"
+
+       # conf_param the parameter in the OFD
+       old=$(do_facet ost1 $cmd)
+       new=$((old * 2))
+       set_conf_param_and_check ost1 "$cmd" "$param" $new ||
+               error "lctl conf_param $device.ost.$param=$new failed"
+       set_conf_param_and_check ost1 "$cmd" "$param" $old ||
+               error "lctl conf_param $device.ost.$param=$old failed"
+
+       # Check 3.
+       # prepare a non-symlink parameter in the OSD
+       name="lma_self_repair"
+       param="$device.osd.$name"
+       cmd="$LCTL get_param -n osd-*.$device.$name"
+
+       # conf_param the parameter in the OSD
+       old=$(do_facet ost1 $cmd)
+       new=$(((old + 1) % 2))
+       set_conf_param_and_check ost1 "$cmd" "$param" $new ||
+               error "lctl conf_param $device.osd.$param=$new failed"
+       set_conf_param_and_check ost1 "$cmd" "$param" $old ||
+               error "lctl conf_param $device.osd.$param=$old failed"
+
+       cleanup
+}
+run_test 28a "set symlink parameters permanently with conf_param"
+
 test_29() {
        [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2, skipping" && return
         setup > /dev/null 2>&1
@@ -1174,22 +1234,30 @@ test_30b() {
        NEW=$(echo $OSTNID | sed "s/$ORIGVAL/$NEWVAL@/")
        echo "Using fake nid $NEW"
 
-       TEST="$LCTL get_param -n osc.$FSNAME-OST0000-osc-[^M]*.import | grep failover_nids | sed -n 's/.*\($NEW\).*/\1/p'"
+       TEST="$LCTL get_param -n osc.$FSNAME-OST0000-osc-[^M]*.import |
+               grep failover_nids | sed -n 's/.*\($NEW\).*/\1/p'"
        set_conf_param_and_check client "$TEST" \
                "$FSNAME-OST0000.failover.node" $NEW ||
                error "didn't add failover nid $NEW"
-       NIDS=$($LCTL get_param -n osc.$FSNAME-OST0000-osc-[^M]*.import | grep failover_nids)
+       NIDS=$($LCTL get_param -n osc.$FSNAME-OST0000-osc-[^M]*.import |
+               grep failover_nids)
        echo $NIDS
-       NIDCOUNT=$(($(echo "$NIDS" | wc -w) - 1))
+       # The NIDS value is the failover nid strings and "[" and "]". So
+       # we need to subtract the space taken by the delimiters. This has
+       # changed from earlier version of Lustre but this test is run only
+       # locally so this change will not break interop. See LU-3386
+       NIDCOUNT=$(($(echo "$NIDS" | wc -w) - 3))
        echo "should have 2 failover nids: $NIDCOUNT"
        [ $NIDCOUNT -eq 2 ] || error "Failover nid not added"
-       do_facet mgs "$LCTL conf_param -d $FSNAME-OST0000.failover.node" || error "conf_param delete failed"
+       do_facet mgs "$LCTL conf_param -d $FSNAME-OST0000.failover.node" ||
+               error "conf_param delete failed"
        umount_client $MOUNT
        mount_client $MOUNT || return 3
 
-       NIDS=$($LCTL get_param -n osc.$FSNAME-OST0000-osc-[^M]*.import | grep failover_nids)
+       NIDS=$($LCTL get_param -n osc.$FSNAME-OST0000-osc-[^M]*.import |
+               grep failover_nids)
        echo $NIDS
-       NIDCOUNT=$(($(echo "$NIDS" | wc -w) - 1))
+       NIDCOUNT=$(($(echo "$NIDS" | wc -w) - 3))
        echo "only 1 final nid should remain: $NIDCOUNT"
        [ $NIDCOUNT -eq 1 ] || error "Failover nids not removed"
 
@@ -1198,8 +1266,8 @@ test_30b() {
 run_test 30b "Remove failover nids"
 
 test_31() { # bug 10734
-        # ipaddr must not exist
-        mount -t lustre 4.3.2.1@tcp:/lustre $MOUNT || true
+       # ipaddr must not exist
+       $MOUNT_CMD 4.3.2.1@tcp:/lustre $MOUNT || true
        cleanup
 }
 run_test 31 "Connect to non-existent node (shouldn't crash)"
@@ -1243,7 +1311,9 @@ test_32newtarball() {
                count=$(($T32_BLIMIT / 1024 / 2))
        chown $T32_QID.$T32_QID $tmp/src/t32_qf_old
 
-       formatall
+       # format ost with comma-separated NIDs to verify LU-4460
+       local failnid="$(h2$NETTYPE 1.2.3.4),$(h2$NETTYPE 4.3.2.1)"
+       MGSNID="$MGSNID,$MGSNID" OSTOPT="--failnode=$failnid" formatall
 
        setupall
 
@@ -1335,6 +1405,7 @@ t32_check() {
 
 t32_test_cleanup() {
        local tmp=$TMP/t32
+       local fstype=$(facet_fstype $SINGLEMDS)
        local rc=$?
 
        if $shall_cleanup_lustre; then
@@ -1352,6 +1423,10 @@ t32_test_cleanup() {
 
        $r rm -rf $tmp
        rm -rf $tmp
+       if [ $fstype == "zfs" ]; then
+               $r $ZPOOL destroy t32fs-mdt1 || rc=$?
+               $r $ZPOOL destroy t32fs-ost1 || rc=$?
+       fi
        return $rc
 }
 
@@ -1391,16 +1466,20 @@ t32_reload_modules() {
 t32_wait_til_devices_gone() {
        local node=$1
        local devices
+       local loops
        local i=0
 
        echo wait for devices to go
        while ((i < 20)); do
                devices=$(do_rpc_nodes $node $LCTL device_list | wc -l)
-               ((devices == 0)) && return 0
+               loops=$(do_rpc_nodes $node losetup -a | grep -c t32)
+               ((devices == 0 && loops == 0)) && return 0
                sleep 5
                i=$((i + 1))
        done
-       echo "waiting for devices on $node: Given up"
+       echo "waiting for dev on $node: dev $devices loop $loops given up"
+       do_rpc_nodes $node "losetup -a"
+       do_rpc_nodes $node "$LCTL devices_list"
        return 1
 }
 
@@ -1510,6 +1589,8 @@ t32_test() {
        local nrpcs
        local list
        local fstype=$(facet_fstype $SINGLEMDS)
+       local mdt_dev=$tmp/mdt
+       local ost_dev=$tmp/ost
 
        trap 'trap - RETURN; t32_test_cleanup' RETURN
 
@@ -1530,18 +1611,34 @@ t32_test() {
        echo "    Arch: $img_arch"
 
        local version=$(version_code $img_commit)
-       [[ $version -gt $(version_code 2.4.0) ]] && ff_convert="no"
+       [[ $version -ge $(version_code 2.5.0) ]] && ff_convert="no"
+
+       if [ $fstype == "zfs" ]; then
+               # import pool first
+               $r $ZPOOL import -f -d $tmp t32fs-mdt1
+               $r $ZPOOL import -f -d $tmp t32fs-ost1
+               mdt_dev=t32fs-mdt1/mdt1
+               ost_dev=t32fs-ost1/ost1
+               wait_update_facet $SINGLEMDS "$ZPOOL list |
+                       awk '/^t32fs-mdt1/ { print \\\$1 }'" "t32fs-mdt1" || {
+                               error_noexit "import zfs pool failed"
+                               return 1
+                       }
+       fi
 
        $r $LCTL set_param debug="$PTLDEBUG"
 
-       $r $TUNEFS --dryrun $tmp/mdt || {
+       $r $TUNEFS --dryrun $mdt_dev || {
+               $r losetup -a
                error_noexit "tunefs.lustre before mounting the MDT"
                return 1
        }
        if [ "$writeconf" ]; then
-               mopts=loop,writeconf
+               mopts=writeconf
                if [ $fstype == "ldiskfs" ]; then
-                       $r $TUNEFS --quota $tmp/mdt || {
+                       mopts="loop,$mopts"
+                       $r $TUNEFS --quota $mdt_dev || {
+                               $r losetup -a
                                error_noexit "Enable mdt quota feature"
                                return 1
                        }
@@ -1555,18 +1652,26 @@ t32_test() {
                        local osthost=$(facet_active_host ost1)
                        local ostnid=$(do_node $osthost $LCTL list_nids | head -1)
 
-                       $r mount -t lustre -o loop,nosvc $tmp/mdt $tmp/mnt/mdt
+                       mopts=nosvc
+                       if [ $fstype == "ldiskfs" ]; then
+                               mopts="loop,$mopts"
+                       fi
+                       $r $MOUNT_CMD -o $mopts $mdt_dev $tmp/mnt/mdt
                        $r lctl replace_nids $fsname-OST0000 $ostnid
                        $r lctl replace_nids $fsname-MDT0000 $nid
                        $r umount -d $tmp/mnt/mdt
                fi
 
-               mopts=loop,exclude=$fsname-OST0000
+               mopts=exclude=$fsname-OST0000
+               if [ $fstype == "ldiskfs" ]; then
+                       mopts="loop,$mopts"
+               fi
        fi
 
        t32_wait_til_devices_gone $node
 
-       $r mount -t lustre -o $mopts $tmp/mdt $tmp/mnt/mdt || {
+       $r $MOUNT_CMD -o $mopts $mdt_dev $tmp/mnt/mdt || {
+               $r losetup -a
                error_noexit "Mounting the MDT"
                return 1
        }
@@ -1594,10 +1699,14 @@ t32_test() {
 
                echo "mount new MDT....$fs2mdsdev"
                $r mkdir -p $tmp/mnt/mdt1
-               $r mount -t lustre -o $mopts $fs2mdsdev $tmp/mnt/mdt1 || {
+               $r $MOUNT_CMD -o $mopts $fs2mdsdev $tmp/mnt/mdt1 || {
                        error_noexit "mount mdt1 failed"
                        return 1
                }
+
+               $r $LCTL set_param -n mdt.${fsname}*.enable_remote_dir=1 ||
+                       error_noexit "enable remote dir create failed"
+
                shall_cleanup_mdt1=true
        fi
 
@@ -1610,22 +1719,27 @@ t32_test() {
                return 1
        fi
 
-       $r $TUNEFS --dryrun $tmp/ost || {
+       $r $TUNEFS --dryrun $ost_dev || {
                error_noexit "tunefs.lustre before mounting the OST"
                return 1
        }
        if [ "$writeconf" ]; then
-               mopts=loop,mgsnode=$nid,$writeconf
+               mopts=mgsnode=$nid,$writeconf
                if [ $fstype == "ldiskfs" ]; then
-                       $r $TUNEFS --quota $tmp/ost || {
+                       mopts="loop,$mopts"
+                       $r $TUNEFS --quota $ost_dev || {
+                               $r losetup -a
                                error_noexit "Enable ost quota feature"
                                return 1
                        }
                fi
        else
-               mopts=loop,mgsnode=$nid
+               mopts=mgsnode=$nid
+               if [ $fstype == "ldiskfs" ]; then
+                       mopts="loop,$mopts"
+               fi
        fi
-       $r mount -t lustre -o $mopts $tmp/ost $tmp/mnt/ost || {
+       $r $MOUNT_CMD -o $mopts $ost_dev $tmp/mnt/ost || {
                error_noexit "Mounting the OST"
                return 1
        }
@@ -1707,7 +1821,7 @@ t32_test() {
        fi
 
        if [ "$writeconf" ]; then
-               mount -t lustre $nid:/$fsname $tmp/mnt/lustre || {
+               $MOUNT_CMD $nid:/$fsname $tmp/mnt/lustre || {
                        error_noexit "Mounting the client"
                        return 1
                }
@@ -1865,12 +1979,17 @@ t32_test() {
                }
 
                # mount a second time to make sure we didnt leave upgrade flag on
-               $r $TUNEFS --dryrun $tmp/mdt || {
+               $r $TUNEFS --dryrun $mdt_dev || {
+                       $r losetup -a
                        error_noexit "tunefs.lustre before remounting the MDT"
                        return 1
                }
-               $r mount -t lustre -o loop,exclude=$fsname-OST0000 $tmp/mdt \
-                                $tmp/mnt/mdt || {
+
+               mopts=exclude=$fsname-OST0000
+               if [ $fstype == "ldiskfs" ]; then
+                       mopts="loop,$mopts"
+               fi
+               $r $MOUNT_CMD -o $mopts $mdt_dev $tmp/mnt/mdt || {
                        error_noexit "Remounting the MDT"
                        return 1
                }
@@ -1965,7 +2084,7 @@ test_33a() { # bug 12333, was test_33
         start fs2ost $fs2ostdev $OST_MOUNT_OPTS
         do_facet $SINGLEMDS "$LCTL conf_param $FSNAME2.sys.timeout=200" || rc=1
         mkdir -p $MOUNT2
-        mount -t lustre $MGSNID:/${FSNAME2} $MOUNT2 || rc=2
+       $MOUNT_CMD $MGSNID:/${FSNAME2} $MOUNT2 || rc=2
         echo "ok."
 
         cp /etc/hosts $MOUNT2/ || rc=3
@@ -2201,14 +2320,14 @@ test_36() { # 12743
        #     different one than the default value here.
        add fs2ost $(mkfs_opts ost1 ${fs2ostdev}) --mgsnode=$MGSNID \
                --fsname=${FSNAME2} --reformat $fs2ostdev $fs2ostvdev || exit 10
-       add fs3ost $(mkfs_opts ost1 ${fs3ostdev}) --mgsnode=$MGSNID \
+       add fs3ost $(mkfs_opts ost2 ${fs3ostdev}) --mgsnode=$MGSNID \
                --fsname=${FSNAME2} --reformat $fs3ostdev $fs3ostvdev || exit 10
 
         start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS
         start fs2ost $fs2ostdev $OST_MOUNT_OPTS
         start fs3ost $fs3ostdev $OST_MOUNT_OPTS
         mkdir -p $MOUNT2
-        mount -t lustre $MGSNID:/${FSNAME2} $MOUNT2 || return 1
+       $MOUNT_CMD $MGSNID:/${FSNAME2} $MOUNT2 || return 1
 
         sleep 5 # until 11778 fixed
 
@@ -2292,31 +2411,30 @@ test_37() {
 run_test 37 "verify set tunables works for symlink device"
 
 test_38() { # bug 14222
-       if [ $(facet_fstype $SINGLEMDS) != ldiskfs ]; then
-               skip "Only applicable to ldiskfs-based MDTs"
-               return
-       fi
+       local fstype=$(facet_fstype $SINGLEMDS)
+       local mntpt=$(facet_mntpt $SINGLEMDS)
 
        setup
        # like runtests
-       COUNT=10
-       SRC="/etc /bin"
-       FILES=`find $SRC -type f -mtime +1 | head -n $COUNT`
+       local COUNT=10
+       local SRC="/etc /bin"
+       local FILES=$(find $SRC -type f -mtime +1 | head -n $COUNT)
        log "copying $(echo $FILES | wc -w) files to $DIR/$tdir"
        mkdir -p $DIR/$tdir
-       tar cf - $FILES | tar xf - -C $DIR/$tdir || \
+       tar cf - $FILES | tar xf - -C $DIR/$tdir ||
                error "copying $SRC to $DIR/$tdir"
        sync
        umount_client $MOUNT
+       do_facet $SINGLEMDS "$LCTL get_param osp.*.prealloc_next_id"
        stop_mds
-       log "rename lov_objid file on MDS"
-       rm -f $TMP/lov_objid.orig
+       log "delete lov_objid file on MDS"
 
-       local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
-       do_facet $SINGLEMDS "$DEBUGFS -c -R \\\"dump lov_objid $TMP/lov_objid.orig\\\" $MDSDEV"
-       do_facet $SINGLEMDS "$DEBUGFS -w -R \\\"rm lov_objid\\\" $MDSDEV"
+       mount_fstype $SINGLEMDS || error "mount MDS failed (1)"
+
+       do_facet $SINGLEMDS "od -Ax -td8 $mntpt/lov_objid; rm $mntpt/lov_objid"
+
+       unmount_fstype $SINGLEMDS || error "umount failed (1)"
 
-       do_facet $SINGLEMDS "od -Ax -td8 $TMP/lov_objid.orig"
        # check create in mds_lov_connect
        start_mds
        mount_client $MOUNT
@@ -2324,17 +2442,28 @@ test_38() { # bug 14222
                [ $V ] && log "verifying $DIR/$tdir/$f"
                diff -q $f $DIR/$tdir/$f || ERROR=y
        done
-       do_facet $SINGLEMDS "$DEBUGFS -c -R \\\"dump lov_objid $TMP/lov_objid.new\\\"  $MDSDEV"
-       do_facet $SINGLEMDS "od -Ax -td8 $TMP/lov_objid.new"
-       [ "$ERROR" = "y" ] && error "old and new files are different after connect" || true
+       do_facet $SINGLEMDS "$LCTL get_param osp.*.prealloc_next_id"
+       if [ "$ERROR" = "y" ]; then
+               # check it's updates in sync
+               umount_client $MOUNT
+               stop_mds
+               mount_fstype $SIGNLEMDS
+               do_facet $SINGLEMDS "od -Ax -td8 $mntpt/lov_objid"
+               unmount_fstype $SINGLEMDS
+               error "old and new files are different after connect" || true
+       fi
+       touch $DIR/$tdir/f2 || error "f2 file create failed"
 
        # check it's updates in sync
        umount_client $MOUNT
        stop_mds
 
-       do_facet $SINGLEMDS dd if=/dev/zero of=$TMP/lov_objid.clear bs=4096 count=1
-       do_facet $SINGLEMDS "$DEBUGFS -w -R \\\"rm lov_objid\\\" $MDSDEV"
-       do_facet $SINGLEMDS "$DEBUGFS -w -R \\\"write $TMP/lov_objid.clear lov_objid\\\" $MDSDEV "
+       mount_fstype $SINGLEMDS || error "mount MDS failed (3)"
+
+       do_facet $SINGLEMDS "od -Ax -td8 $mntpt/lov_objid"
+       do_facet $SINGLEMDS dd if=/dev/zero of=$mntpt/lov_objid.clear count=8
+
+       unmount_fstype $SINGLEMDS || error "umount failed (3)"
 
        start_mds
        mount_client $MOUNT
@@ -2342,11 +2471,16 @@ test_38() { # bug 14222
                [ $V ] && log "verifying $DIR/$tdir/$f"
                diff -q $f $DIR/$tdir/$f || ERROR=y
        done
-       do_facet $SINGLEMDS "$DEBUGFS -c -R \\\"dump lov_objid $TMP/lov_objid.new1\\\" $MDSDEV"
-       do_facet $SINGLEMDS "od -Ax -td8 $TMP/lov_objid.new1"
+       touch $DIR/$tdir/f3 || error "f3 file create failed"
+       do_facet $SINGLEMDS "$LCTL get_param osp.*.prealloc_next_id"
        umount_client $MOUNT
        stop_mds
-       [ "$ERROR" = "y" ] && error "old and new files are different after sync" || true
+       mount_fstype $SINGLEMDS || error "mount MDS failed (4)"
+       do_facet $SINGLEMDS "od -Ax -td8 $mntpt/lov_objid"
+       unmount_fstype $SINGLEMDS || error "umount failed (4)"
+
+       [ "$ERROR" = "y" ] &&
+               error "old and new files are different after sync" || true
 
        log "files compared the same"
        cleanup
@@ -2431,6 +2565,94 @@ test_41b() {
 }
 run_test 41b "mount mds with --nosvc and --nomgs on first mount"
 
+test_41c() {
+       cleanup
+       # MDT concurent start
+       #define OBD_FAIL_TGT_DELAY_CONNECT 0x703
+       do_facet $SINGLEMDS "lctl set_param fail_loc=0x703"
+       start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS &
+       local pid=$!
+       sleep 2
+       do_facet $SINGLEMDS "lctl set_param fail_loc=0x0"
+       start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS &
+       local pid2=$!
+       wait $pid2
+       local rc2=$?
+       wait $pid
+       local rc=$?
+       if [ $rc == 0 ] && [ $rc2 == 114 ]; then
+               echo "1st MDT start succeed"
+               echo "2nd MDT start failed with EALREADY"
+       elif [ $rc2 == 0 ] && [ $rc == 114 ]; then
+               echo "1st MDT start failed with EALREADY"
+               echo "2nd MDT start succeed"
+       else
+               stop mds1 -f
+               error "unexpected concurent MDT mounts result, rc=$rc rc2=$rc2"
+       fi
+
+       # OST concurent start
+       #define OBD_FAIL_TGT_DELAY_CONNECT 0x703
+       do_facet ost1 "lctl set_param fail_loc=0x703"
+       start ost1 $(ostdevname 1) $OST_MOUNT_OPTS &
+       pid=$!
+       sleep 2
+       do_facet ost1 "lctl set_param fail_loc=0x0"
+       start ost1 $(ostdevname 1) $OST_MOUNT_OPTS &
+       pid2=$!
+       wait $pid2
+       rc2=$?
+       wait $pid
+       rc=$?
+       if [ $rc == 0 ] && [ $rc2 == 114 ]; then
+               echo "1st OST start succeed"
+               echo "2nd OST start failed with EALREADY"
+       elif [ $rc2 == 0 ] && [ $rc == 114 ]; then
+               echo "1st OST start failed with EALREADY"
+               echo "2nd OST start succeed"
+       else
+               stop mds1 -f
+               stop ost1 -f
+               error "unexpected concurent OST mounts result, rc=$rc rc2=$rc2"
+       fi
+       # cleanup
+       stop mds1 -f
+       stop ost1 -f
+
+       # verify everything ok
+       start_mds
+       if [ $? != 0 ]
+       then
+               stop mds1 -f
+               error "MDT(s) start failed"
+       fi
+
+       start_ost
+       if [ $? != 0 ]
+       then
+               stop mds1 -f
+               stop ost1 -f
+               error "OST(s) start failed"
+       fi
+
+       mount_client $MOUNT
+       if [ $? != 0 ]
+       then
+               stop mds1 -f
+               stop ost1 -f
+               error "client start failed"
+       fi
+       check_mount
+       if [ $? != 0 ]
+       then
+               stop mds1 -f
+               stop ost1 -f
+               error "client mount failed"
+       fi
+       cleanup
+}
+run_test 41c "concurent mounts of MDT/OST should all fail but one"
+
 test_42() { #bug 14693
        setup
        check_mount || error "client was not mounted"
@@ -2452,17 +2674,33 @@ test_42() { #bug 14693
 run_test 42 "allow client/server mount/unmount with invalid config param"
 
 test_43() {
+       [[ $(lustre_version_code mgs) -ge $(version_code 2.5.58) ]] ||
+               { skip "Need MDS version at least 2.5.58" && return 0; }
        [ $UID -ne 0 -o $RUNAS_ID -eq 0 ] && skip_env "run as root"
+
+       ID1=${ID1:-501}
+       USER1=$(cat /etc/passwd | grep :$ID1:$ID1: | cut -d: -f1)
+       [ -z "$USER1" ] && skip_env "missing user with uid=$ID1 gid=$ID1" &&
+               return
+
        setup
        chmod ugo+x $DIR || error "chmod 0 failed"
        set_conf_param_and_check mds                                    \
                "lctl get_param -n mdt.$FSNAME-MDT0000.root_squash"     \
                "$FSNAME.mdt.root_squash"                               \
                "0:0"
+       wait_update $HOSTNAME                                           \
+               "lctl get_param -n llite.${FSNAME}*.root_squash"        \
+               "0:0" ||
+               error "check llite root_squash failed!"
        set_conf_param_and_check mds                                    \
                "lctl get_param -n mdt.$FSNAME-MDT0000.nosquash_nids"   \
                "$FSNAME.mdt.nosquash_nids"                             \
                "NONE"
+       wait_update $HOSTNAME                                           \
+               "lctl get_param -n llite.${FSNAME}*.nosquash_nids"      \
+               "NONE" ||
+               error "check llite nosquash_nids failed!"
 
     #
     # create set of test files
@@ -2478,6 +2716,10 @@ test_43() {
     chmod go-rwx $DIR/$tdir-rootdir   || error "chmod 3 failed"
     touch $DIR/$tdir-rootdir/tfile-1  || error "touch failed"
 
+       echo "777" > $DIR/$tfile-user1file || error "write 7 failed"
+       chmod go-rw $DIR/$tfile-user1file  || error "chmod 7 failed"
+       chown $ID1.$ID1 $DIR/$tfile-user1file || error "chown failed"
+
        #
        # check root_squash:
        #   set root squash UID:GID to RUNAS_ID
@@ -2487,6 +2729,10 @@ test_43() {
                "lctl get_param -n mdt.$FSNAME-MDT0000.root_squash"     \
                "$FSNAME.mdt.root_squash"                               \
                "$RUNAS_ID:$RUNAS_ID"
+       wait_update $HOSTNAME                                           \
+               "lctl get_param -n llite.${FSNAME}*.root_squash"        \
+               "$RUNAS_ID:$RUNAS_ID" ||
+               error "check llite root_squash failed!"
 
     ST=$(stat -c "%n: owner uid %u (%A)" $DIR/$tfile-userfile)
     dd if=$DIR/$tfile-userfile 1>/dev/null 2>/dev/null || \
@@ -2494,7 +2740,7 @@ test_43() {
     echo "$ST: root read permission is granted - ok"
 
     echo "444" | \
-    dd conv=notrunc if=$DIR/$tfile-userfile 1>/dev/null 2>/dev/null || \
+    dd conv=notrunc of=$DIR/$tfile-userfile 1>/dev/null 2>/dev/null || \
         error "$ST: root write permission is denied"
     echo "$ST: root write permission is granted - ok"
 
@@ -2517,6 +2763,31 @@ test_43() {
         error "$ST: root create permission is granted"
     echo "$ST: root create permission is denied - ok"
 
+
+       # LU-1778
+       # check root_squash is enforced independently
+       # of client cache content
+       #
+       # access file by USER1, keep access open
+       # root should be denied access to user file
+
+       runas -u $ID1 tail -f $DIR/$tfile-user1file 1>/dev/null 2>&1 &
+       pid=$!
+       sleep 1
+
+       ST=$(stat -c "%n: owner uid %u (%A)" $DIR/$tfile-user1file)
+       dd if=$DIR/$tfile-user1file 1>/dev/null 2>&1 &&
+           { kill $pid; error "$ST: root read permission is granted"; }
+       echo "$ST: root read permission is denied - ok"
+
+       echo "777" | \
+       dd conv=notrunc of=$DIR/$tfile-user1file 1>/dev/null 2>&1 &&
+           { kill $pid; error "$ST: root write permission is granted"; }
+       echo "$ST: root write permission is denied - ok"
+
+       kill $pid
+       wait $pid
+
        #
        # check nosquash_nids:
        #   put client's NID into nosquash_nids list,
@@ -2529,6 +2800,10 @@ test_43() {
                "lctl get_param -n mdt.$FSNAME-MDT0000.nosquash_nids"   \
                "$FSNAME-MDTall.mdt.nosquash_nids"                      \
                "$NIDLIST"
+       wait_update $HOSTNAME                                           \
+               "lctl get_param -n llite.${FSNAME}*.nosquash_nids"      \
+               "$NIDLIST" ||
+               error "check llite nosquash_nids failed!"
 
     ST=$(stat -c "%n: owner uid %u (%A)" $DIR/$tfile-rootfile)
     dd if=$DIR/$tfile-rootfile 1>/dev/null 2>/dev/null || \
@@ -2999,6 +3274,8 @@ run_test 50g "deactivated OST should not cause panic====================="
 test_50h() {
        # prepare MDT/OST, make OSC inactive for OST1
        [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2, skipping" && return
+
+       [ $(facet_fstype ost1) == zfs ] && import_zpool ost1
        do_facet ost1 "$TUNEFS --param osc.active=0 `ostdevname 1`" ||
                error "tunefs OST1 failed"
        start_mds  || error "Unable to start MDT"
@@ -3174,7 +3451,13 @@ test_52() {
        do_node $ost1node 'mv '$objects' '${ost1mnt}'/lost+found'
        [ $? -eq 0 ] || { error "Unable to move objects"; return 14; }
 
+       # recover objects dry-run
+       echo "ll_recover_lost_found_objs dry_run"
+       do_node $ost1node "ll_recover_lost_found_objs -n -d $ost1mnt/O"
+       [ $? -eq 0 ] || { error "ll_recover_lost_found_objs failed"; return 15; }
+
        # recover objects
+       echo "ll_recover_lost_found_objs fix run"
        do_node $ost1node "ll_recover_lost_found_objs -d $ost1mnt/lost+found"
        [ $? -eq 0 ] || { error "ll_recover_lost_found_objs failed"; return 15; }
 
@@ -3437,10 +3720,6 @@ count_osts() {
 }
 
 test_58() { # bug 22658
-       if [ $(facet_fstype mds) != ldiskfs ]; then
-               skip "Only applicable to ldiskfs-based MDTs"
-               return
-       fi
        setup_noconfig
        mkdir -p $DIR/$tdir
        createmany -o $DIR/$tdir/$tfile-%d 100
@@ -3452,15 +3731,13 @@ test_58() { # bug 22658
 
        local MNTDIR=$(facet_mntpt $SINGLEMDS)
        local devname=$(mdsdevname ${SINGLEMDS//mds/})
-       local opts=""
-       if ! do_facet $SINGLEMDS "test -b $devname"; then
-               opts="-o loop"
-       fi
 
        # remove all files from the OBJECTS dir
-       do_facet $SINGLEMDS "mount -t ldiskfs $opts $devname $MNTDIR"
+       mount_fstype $SINGLEMDS
+
        do_facet $SINGLEMDS "find $MNTDIR/O/1/d* -type f -delete"
-       do_facet $SINGLEMDS "umount -d $MNTDIR"
+
+       unmount_fstype $SINGLEMDS
        # restart MDS with missing llog files
        start_mds
        do_facet mds "lctl set_param fail_loc=0"
@@ -3898,7 +4175,8 @@ test_69() {
 
        mkdir -p $DIR/$tdir
        $LFS setstripe -i 0 $DIR/$tdir
-       createmany -o $DIR/$tdir/$tfile- $num_create
+       createmany -o $DIR/$tdir/$tfile- $num_create ||
+               error "createmany: failed to create $num_create files: $?"
        # delete all of the files with objects on OST0 so the
        # filesystem is not inconsistent later on
        $LFS find $MOUNT --ost 0 | xargs rm
@@ -4223,17 +4501,6 @@ test_73() { #LU-3006
 }
 run_test 73 "failnode to update from mountdata properly"
 
-test_74() { # LU-1606
-       for TESTPROG in $LUSTRE_TESTS_API_DIR/*.c; do
-               gcc -Wall -Werror $LUSTRE_TESTS_API_DIR/simple_test.c \
-                       -I$LUSTRE/include \
-                       -L$LUSTRE/utils -llustreapi ||
-                               error "client api broken"
-       done
-       cleanup || return $?
-}
-run_test 74 "Lustre client api program can compile and link"
-
 test_75() { # LU-2374
        [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.1) ]] &&
                        skip "Need MDS version at least 2.4.1" && return
@@ -4261,7 +4528,7 @@ test_75() { # LU-2374
 }
 run_test 75 "The order of --index should be irrelevant"
 
-test_76() {
+test_76a() {
        [[ $(lustre_version_code mgs) -ge $(version_code 2.4.52) ]] ||
                { skip "Need MDS version at least 2.4.52" && return 0; }
        setup
@@ -4318,7 +4585,18 @@ test_76() {
                error "client_cache_count is not saved after remount"
        stopall
 }
-run_test 76 "set permanent params set_param -P"
+run_test 76a "set permanent params set_param -P"
+
+test_76b() { # LU-4783
+       [[ $(lustre_version_code mgs) -ge $(version_code 2.5.57) ]] ||
+               { skip "Need MGS version at least 2.5.57" && return 0; }
+       stopall
+       setupall
+       do_facet mgs $LCTL get_param mgs.MGS.live.params ||
+               error "start params log failed"
+       stopall
+}
+run_test 76b "verify params log setup correctly"
 
 test_77() { # LU-3445
        local server_version=$(lustre_version_code $SINGLEMDS)
@@ -4355,7 +4633,7 @@ test_77() { # LU-3445
        start fs2ost $fs2ostdev $OST_MOUNT_OPTS || error "start fs2ost failed"
 
        mkdir -p $MOUNT2
-       mount -t lustre $mgsnid:/$fsname $MOUNT2 || error "mount $MOUNT2 failed"
+       $MOUNT_CMD $mgsnid:/$fsname $MOUNT2 || error "mount $MOUNT2 failed"
        DIR=$MOUNT2 MOUNT=$MOUNT2 check_mount || error "check $MOUNT2 failed"
        cleanup_fs2
 }
@@ -4503,6 +4781,68 @@ test_78() {
 }
 run_test 78 "run resize2fs on MDT and OST filesystems"
 
+test_79() { # LU-4227
+       [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.5.59) ]] ||
+               { skip "Need MDS version at least 2.5.59"; return 0; }
+
+       local mdsdev1=$(mdsdevname 1)
+       local mdsvdev1=$(mdsvdevname 1)
+       local mdsdev2=$(mdsdevname 2)
+       local mdsvdev2=$(mdsvdevname 2)
+       local ostdev1=$(ostdevname 1)
+       local ostvdev1=$(ostvdevname 1)
+       local opts_mds1="$(mkfs_opts mds1 $mdsdev1) --reformat"
+       local opts_mds2="$(mkfs_opts mds2 $mdsdev2) --reformat"
+       local opts_ost1="$(mkfs_opts ost1 $ostdev1) --reformat"
+       local mgsnode_opt
+
+       # remove --mgs/--mgsnode from mkfs.lustre options
+       opts_mds1=$(echo $opts_mds1 | sed -e "s/--mgs//")
+
+       mgsnode_opt=$(echo $opts_mds2 |
+               awk '{ for ( i = 1; i < NF; i++ )
+                       if ( $i ~ "--mgsnode" ) { print $i; break } }')
+       [ -n $mgsnode_opt ] &&
+               opts_mds2=$(echo $opts_mds2 | sed -e "s/$mgsnode_opt//")
+
+       mgsnode_opt=$(echo $opts_ost1 |
+               awk '{ for ( i = 1; i < NF; i++ )
+                       if ( $i ~ "--mgsnode" ) { print $i; break } }')
+       [ -n $mgsnode_opt ] &&
+               opts_ost1=$(echo $opts_ost1 | sed -e "s/$mgsnode_opt//")
+
+       # -MGS, format a mdt without --mgs option
+       add mds1 $opts_mds1 $mdsdev1 $mdsvdev1 &&
+               error "Must specify --mgs when formatting mdt combined with mgs"
+
+       # +MGS, format a mdt/ost without --mgsnode option
+       add mds1 $(mkfs_opts mds1 $mdsdev1) --reformat $mdsdev1 $mdsvdev1 \
+               > /dev/null || error "start mds1 failed"
+       add mds2 $opts_mds2 $mdsdev2 $mdsvdev2 &&
+               error "Must specify --mgsnode when formatting a mdt"
+       add ost1 $opts_ost1 $ostdev1 $ostvdev2 &&
+               error "Must specify --mgsnode when formatting an ost"
+
+       return 0
+}
+run_test 79 "format MDT/OST without mgs option (should return errors)"
+
+test_80() {
+       start_mds
+       start_ost
+       uuid=$(do_facet ost1 lctl get_param -n mgc.*.uuid)
+#define OBD_FAIL_MGS_PAUSE_TARGET_CON       0x906
+       do_facet ost1 "lctl set_param fail_val=10 fail_loc=0x906"
+       do_facet mgs "lctl set_param fail_val=10 fail_loc=0x906"
+       do_facet mgs "lctl set_param -n mgs/MGS/evict_client $uuid"
+       sleep 30
+       start_ost2
+
+       do_facet ost1 "lctl set_param fail_loc=0"
+       stopall
+}
+run_test 80 "mgc import reconnect race"
+
 if ! combined_mgs_mds ; then
        stop mgs
 fi