Whamcloud - gitweb
This has a kernel patch for handle validation. All that is missing
[fs/lustre-release.git] / lustre / tests / common.sh
index 4245861..8753e66 100644 (file)
@@ -3,11 +3,11 @@ export PATH=$PATH:/sbin:/usr/sbin
 
 [ -d /r ] && R=/r
 
-PORTALS=$SRCDIR/../../portals
-LUSTRE=$SRCDIR/../../obd
+PORTALS=$SRCDIR../../portals
+LUSTRE=$SRCDIR../../lustre
 
 PTLCTL=$PORTALS/linux/utils/ptlctl
-DEBCTL=$PORTALS/linux/utils/debugctl
+DBGCTL=$PORTALS/linux/utils/debugctl
 ACCEPTOR=$PORTALS/linux/utils/acceptor
 
 OBDCTL=$LUSTRE/utils/obdctl
@@ -21,6 +21,16 @@ else
        echo "Cannot find /dev/loop0 or /dev/loop/0" 1>&2 && exit -1
 fi
 
+do_insmod() {
+       MODULE=$1
+       BASE=`echo $MODULE | sed -e "s^.*/^^" -e "s/\.o$//"`
+
+       [ "$MODULE" ] || fail "usage: $0 <module>"
+       [ -f $MODULE ] || echo "$0: module '$MODULE' not found" 1>&2
+       lsmod | grep -q "\<$BASE\>" && return 0
+       insmod $MODULE
+}
+
 # Return the next unused loop device on stdout and in the $LOOPDEV
 # environment variable.
 next_loop_dev() {
@@ -40,16 +50,24 @@ next_loop_dev() {
 # filesystem on a device we use mkfs, because that only writes sparsely
 # to the device.  The empty filesystems are also highly compressed (1000:1)
 # so they don't take too much space.
+#
+new_fs_usage() {
+       echo "new_fs <fstype> {device | file} [size]" 1>&2
+       exit -1
+}
 new_fs () {
        EFILE="$1_$3.gz"
        MKFS="mkfs.$1"
        MKFSOPT="-b 4096"
 
        [ "$1" = "ext3" ] && MKFS="mkfs.ext2 -j"
+       if [ "$1" = "extN" ]; then
+               MKFS="mkfs.ext2 -j"
+               EFILE="ext3_$3.gz"
+       fi
 
        if [ -b "$2" ]; then
-               [ $# -lt 2 -o $# -gt 3 ] && \
-                       echo "usage: $0 <fstype> <file> [size]" 1>&2 && exit -1
+               [ $# -lt 2 -o $# -gt 3 ] && new_fs_usage
 
                PM="/proc/mounts"
                [ -r "$PM" ] || PM="/etc/mtab"
@@ -59,26 +77,28 @@ new_fs () {
                $MKFS $MKFSOPT $2 $3 || exit -1
                LOOPDEV=$2      # Not really a loop device
        else
-               [ $# -ne 3 ] && \
-                       echo "usage: $0 <fstype> <file> <size>" 1>&2 && exit -1
+               [ $# -ne 3 ] && new_fs_usage
 
                if [ -r "$EFILE" ]; then
-                       echo "using existing filesystem $EFILE for $2"
+                       echo "using prepared filesystem $EFILE for $2"
                        zcat "$EFILE" > $2 || exit -1
                        sync
                else
-                       echo "creating new filesystem on $2"
-                       dd if=/dev/zero of=$2 bs=1k count=$3 1>&2 || exit -1
+                       echo "creating new sparse filesystem on $2"
+                       dd if=/dev/zero of=$2 bs=1k seek=$3 count=1 1>&2 || exit -1
                        $MKFS $MKFSOPT -F $2 1>&2 || exit -1
                fi
                LOOPDEV=`next_loop_dev`
                losetup ${LOOPDEV} $2 1>&2 || exit -1
        fi
+
+       # Enable hash-indexed directories for extN filesystems
+       [ "$1" = "extN" ] && echo "feature FEATURE_C5" | debugfs -w $2
 }
 
 # Set up to use an existing filesystem.  We take the same parameters as
-# new_fs, even though we only use the <file> parameter, to make it easy
-# to convert between new_fs and old_fs in testing scripts.
+# new_fs, even though we only use the <fstype> and <file> parameters, to
+# make it easy to convert between new_fs and old_fs in testing scripts.
 old_fs () {
        [ -e $2 ] || exit -1
 
@@ -91,8 +111,9 @@ old_fs () {
 }
 
 list_mods() {
-       $DEBCTL modules > $R/tmp/ogdb
-       echo "The GDB module script is in /tmp/ogdb"
+       $DBGCTL modules > $R/tmp/ogdb
+       echo "The GDB module script is in $R/tmp/ogdb"
+       [ "$DEBUG_WAIT" = "yes" ] && echo -n "Press ENTER to continue" && read
 }
 
 # We need at least one setup file to be given.  It can be passed on
@@ -105,6 +126,7 @@ setup_opts() {
        for CFG in "$@" ; do
                case $CFG  in
                *.cfg) [ -r "$CFG" ] && . $CFG && SETUP=y ;;
+               *) echo "unknown option '$CFG'" 1>&2
                esac
        done
 
@@ -112,52 +134,59 @@ setup_opts() {
                echo "error: no config file on command-line and no $DEF" 1>&2
                exit -1
        fi
+       
+       [ -z "$MDS_RSH" ] && MDS_RSH="eval"
+       [ -z "$OST_RSH" ] && OST_RSH="eval"
+       [ -z "$OSC_RSH" ] && OSC_RSH="eval"
 }
 
 setup_portals() {
+       if grep -q portals /proc/modules; then
+               echo "$0: portals already appears to be set up, skipping"
+               return 0
+       fi
+
        if [ -z "$NETWORK" -o -z "$LOCALHOST" -o -z "$SERVER" ]; then
                echo "$0: NETWORK or LOCALHOST or SERVER is not set" 1>&2
                exit -1
        fi
 
-       if [ "$LOCALHOST" == "$SERVER" ]; then
-               DLM=localhost
-       else
-               DLM=$SERVER
+       [ -z "$OSTNODE" ] && OSTNODE=$SERVER
+       [ -z "$MDSNODE" ] && MDSNODE=$SERVER
+
+       if [ -z "$DLM" ]; then
+               if [ "$LOCALHOST" == "$SERVER" ]; then
+                       DLM=localhost
+               else
+                       DLM=$SERVER
+               fi
        fi
 
        [ -c /dev/portals ] || mknod /dev/portals c 10 240
 
-       insmod $PORTALS/linux/oslib/portals.o || exit -1
+       do_insmod $PORTALS/linux/oslib/portals.o || exit -1
 
        case $NETWORK in
-       elan)   if [ "$PORT" ]; then
-                       echo "$0: NETWORK is elan but PORT is set" 1>&2
-                       exit -1
-               fi
-               insmod $PORTALS/linux/qswnal/kqswnal.o
+       elan)   [ "$PORT" ] && fail "$0: NETWORK is elan but PORT is set"
+               do_insmod $PORTALS/linux/qswnal/kqswnal.o || exit -1
                ;;
-       tcp)    if [ -z "$PORT" ]; then
-                       echo "$0: NETWORK is tcp but PORT is not set" 1>&2
-                       exit -1
-               fi
-               insmod $PORTALS/linux/socknal/ksocknal.o || exit -1
+       tcp)    [ "$PORT" ] || fail "$0: NETWORK is tcp but PORT is not set"
+               do_insmod $PORTALS/linux/socknal/ksocknal.o || exit -1
                $ACCEPTOR $PORT
                ;;
-       *)      echo "$0: unknown NETWORK '$NETWORK'" 1>&2
-               exit -1
-               ;;
+       *)      fail "$0: unknown NETWORK '$NETWORK'" ;;
        esac
 
        $PTLCTL <<- EOF
        setup $NETWORK
        mynid $LOCALHOST
-       connect $SERVER $PORT
-       add_uuid self
-       add_uuid mds
-       add_uuid ost
+       connect $MDSNODE $PORT
+       add_uuid $MDSNODE
+       connect $OSTNODE $PORT
+       add_uuid $OSTNODE
        connect $DLM $PORT
-       add_uuid ldlm
+       add_uuid $DLM
+       add_uuid self
        quit
        EOF
 }
@@ -165,37 +194,64 @@ setup_portals() {
 setup_lustre() {
        [ -c /dev/obd ] || mknod /dev/obd c 10 241
 
-       insmod $LUSTRE/class/obdclass.o || exit -1
-       insmod $LUSTRE/rpc/ptlrpc.o || exit -1
-       insmod $LUSTRE/ldlm/ldlm.o || exit -1
-       insmod $LUSTRE/ext2obd/obdext2.o || exit -1
-       insmod $LUSTRE/filterobd/obdfilter.o || exit -1
-       insmod $LUSTRE/ost/ost.o || exit -1
-       insmod $LUSTRE/osc/osc.o || exit -1
-       insmod $LUSTRE/obdecho/obdecho.o || exit -1
-       insmod $LUSTRE/mds/mds.o || exit -1
-       insmod $LUSTRE/mdc/mdc.o || exit -1
-       insmod $LUSTRE/llight/llite.o || exit -1
-
+       do_insmod $LUSTRE/obdclass/obdclass.o || exit -1
+       do_insmod $LUSTRE/ptlrpc/ptlrpc.o || exit -1
+       do_insmod $LUSTRE/ldlm/ldlm.o || exit -1
+       do_insmod $LUSTRE/extN/extN.o || \
+               echo "info: can't load extN.o module, not fatal if using ext3"
+       do_insmod $LUSTRE/mds/mds.o || exit -1
+       #do_insmod $LUSTRE/mds/mds_ext2.o || exit -1
+       #do_insmod $LUSTRE/mds/mds_ext3.o || exit -1
+       do_insmod $LUSTRE/mds/mds_extN.o || \
+               echo "info: can't load mds_extN.o module, needs extN.o"
+       do_insmod $LUSTRE/obdecho/obdecho.o || exit -1
+       #do_insmod $LUSTRE/obdext2/obdext2.o || exit -1
+       do_insmod $LUSTRE/obdfilter/obdfilter.o || exit -1
+       do_insmod $LUSTRE/ost/ost.o || exit -1
+       do_insmod $LUSTRE/osc/osc.o || exit -1
+       do_insmod $LUSTRE/mdc/mdc.o || exit -1
+       do_insmod $LUSTRE/llite/llite.o || exit -1
+
+        echo "$R/tmp/lustre-log" > /proc/sys/portals/debug_path
        list_mods
 
+       if $OBDCTL name2dev RPCDEV > /dev/null 2>&1; then
+               echo "$0: RPCDEV is already configured, skipping"
+               return 0
+       fi
+
+       $OBDCTL <<- EOF || return $?
+       newdev
+       attach ptlrpc RPCDEV
+       setup
+       quit
+       EOF
+
        [ -d /mnt/lustre ] || mkdir /mnt/lustre
 }
 
 setup_ldlm() {
-       [ -c /dev/portals ] || mknod /dev/portals c 10 240
+       [ "$SETUP_LDLM" = "y" ] || return 0
 
-       insmod $PORTALS/linux/oslib/portals.o || exit -1
+       [ -c /dev/portals ] || mknod /dev/portals c 10 240
 
-       insmod $LUSTRE/class/obdclass.o || exit -1
-       insmod $LUSTRE/ldlm/ldlm.o || exit -1
+       $OBDCTL <<- EOF || return $?
+       newdev
+       attach ldlm LDLMDEV
+       setup
+       quit
+       EOF
 
-       list_mods
-        echo "Press Enter to continue"
-        read
 }
 
-DEVNO=0; export DEVNO
+find_devno() {
+       if [ -z "$1" ]; then
+               echo "usage: $0 <devname>" 1>&2
+               return -1
+       fi
+
+       $OBDCTL name2dev $1
+}
 
 setup_mds() {
        [ "$SETUP_MDS" = "y" ] || return 0
@@ -205,18 +261,22 @@ setup_mds() {
                return -1
        fi
 
-       if [ "$1" != "new_fs" -a "$1" != "old_fs" ]; then
+       [ "$1" ] && DO_FS=$1
+       if [ "$DO_FS" != "new_fs" -a "$DO_FS" != "old_fs" ]; then
                echo "usage: setup_mds {new_fs|old_fs}" 1>&2
                return -1
        fi
 
-       $1 ${MDSFS} ${MDSDEV} ${MDSSIZE}
+       if $OBDCTL name2dev MDSDEV > /dev/null 2>&1; then
+               echo "$0: MDSDEV is already configured"
+               return 0
+       fi
+
+       $DO_FS ${MDSFS} ${MDSDEV} ${MDSSIZE}
        MDS=${LOOPDEV}
 
-       MDS_DEVNO=$DEVNO; DEVNO=`expr $DEVNO + 1`
-       
-       $OBDCTL <<- EOF
-       device ${MDS_DEVNO}
+       $OBDCTL <<- EOF || return $?
+       newdev
        attach mds MDSDEV
        setup ${MDS} ${MDSFS}
        quit
@@ -247,6 +307,11 @@ setup_ost() {
                ;;
        esac
 
+       if $OBDCTL name2dev OBDDEV > /dev/null 2>&1; then
+               echo "$0: OBDDEV is already configured"
+               return 0
+       fi
+
        if [ "$NEED_FS" = "y" ]; then
                [ "$1" ] && DO_FS=$1
                if [ -z "$OSTFS" -o -z "$OSTDEV" ]; then
@@ -263,16 +328,16 @@ setup_ost() {
                OBD=${LOOPDEV}
        fi
 
-       OBD_DEVNO=$DEVNO; DEVNO=`expr $DEVNO + 1`
-       OST_DEVNO=$DEVNO; DEVNO=`expr $DEVNO + 1`
-
-       $OBDCTL <<- EOF
-       device ${OBD_DEVNO}
-       attach ${OSTTYPE} OSTDEV
+       $OBDCTL <<- EOF || return $?
+       newdev
+       attach ${OSTTYPE} OBDDEV
        setup ${OBD} ${OBDARG}
-       device ${OST_DEVNO}
+       quit
+       EOF
+       $OBDCTL <<- EOF || return $?
+       newdev
        attach ost OSTDEV
-       setup ${OBD_DEVNO}
+       setup \$OBDDEV
        quit
        EOF
 }
@@ -282,68 +347,105 @@ setup_server() {
 }
 
 setup_osc() {
+       set -vx
        [ "$SETUP_OSC" != "y" ] && return 0
+        [ "$OSC_NAMES" ] || OSC_NAMES=OSCDEV
+
+        for THEOSC in $OSC_NAMES ; do 
+            OSCDEVNO=`find_devno $THEOSC`
+           if $OBDCTL name2dev $THEOSC > /dev/null 2>&1; then
+               echo "$0: OSCDEV is already configured"
+               return 0
+           fi
 
-       OSC_DEVNO=$DEVNO; DEVNO=`expr $DEVNO + 1`
        $OBDCTL <<- EOF || return $rc
-       device ${OSC_DEVNO}
-       attach osc OSCDEV
-       setup -1
+       newdev
+       attach osc $THEOSC
+       setup OSTDEV $OSTNODE
+       quit
+       EOF
+        done
+}
+
+setup_mdc() {
+       set -vx
+       [ "$SETUP_MDC" != "y" ] && return 0
+        [ "$MDC_NAMES" ] || MDC_NAMES=MDCDEV
+
+        for THEMDC in $MDC_NAMES ; do 
+            MDCDEVNO=`find_devno $THEMDC`
+       if $OBDCTL name2dev $THEMDC > /dev/null 2>&1; then
+               echo "$0: MDCDEV is already configured"
+               return 0
+       fi
+
+       $OBDCTL <<- EOF || return $?
+       newdev
+       attach mdc $THEMDC
+       setup MDSDEV $MDSNODE
        quit
        EOF
+        done
 }
 
+
 setup_mount() {
+       set -vx
        [ "$SETUP_MOUNT" != "y" ] && return 0
+        [ "$MDC_NAMES" ] || MDC_NAMES=MDCDEV
+        [ "$OSC_NAMES" ] || OSC_NAMES=OSCDEV
+       [ -z "$MOUNT_LIST" -a "$OSCMT" ] && MOUNT_LIST="MT" && MT="$OSCMT OSCDEV MDCDEV"
 
-       if [ -z "$OSCMT" ]; then
-               echo "error: setup_mount: OSCMT unset" 1>&2
-               return -1
-       fi
+       [ "$MOUNT_LIST" ] || fail "error: $0: MOUNT_LIST unset"
 
-       [ ! -d $OSCMT ] && mkdir $OSCMT
-       mount -t lustre_lite -o device=$OSC_DEVNO none $OSCMT
+       for THEMOUNT in $MOUNT_LIST; do
+           eval "echo \$$THEMOUNT" | while read MTPT THEOSC THEMDC; do
+               if mount | grep -q $MTPT; then
+                   echo "$0: $MTPT is already mounted"
+                   return 0
+               fi
+
+               [ ! -d $MTPT ] && mkdir $MTPT
+               echo mount -t lustre_lite -o ost=`find_devno $THEOSC`,mds=`find_devno $THEMDC` none $MTPT
+               mount -t lustre_lite -o ost=`find_devno $THEOSC`,mds=`find_devno $THEMDC` none $MTPT
+           done
+       done
 }
 
 setup_client() {
-       setup_osc && setup_mount
+       setup_osc && setup_mdc && setup_mount
 }
 
 DEBUG_ON="echo 0xffffffff > /proc/sys/portals/debug"
 DEBUG_OFF="echo 0 > /proc/sys/portals/debug"
 
 debug_server_off() {
-       if [ "$SERVER" != "$LOCALHOST" ]; then
-               $RSH $SERVER "$DEBUG_OFF"
-       else
-               $DEBUG_OFF
-       fi
+       [ "$MDS_RSH" ] && echo "Turn OFF debug on MDS" && $MDS_RSH "$DEBUG_OFF"
+       [ "$OST_RSH" ] && echo "Turn OFF debug on OST" && $OST_RSH "$DEBUG_OFF"
 }
 
 debug_server_on() {
-       if [ "$SERVER" != "$LOCALHOST" ]; then
-               $RSH $SERVER "$DEBUG_ON"
-       else
-               $DEBUG_ON
-       fi
+       [ "$MDS_RSH" ] && echo "Turn ON debug on MDS" && $MDS_RSH "$DEBUG_ON"
+       [ "$OST_RSH" ] && echo "Turn ON debug on OST" && $OST_RSH "$DEBUG_ON"
 }
 
 debug_client_off() {
-       $DEBUG_OFF
+       echo "Turning OFF debug on client" && $OSC_RSH "$DEBUG_OFF"
 }
 
 debug_client_on() {
-       $DEBUG_ON
+       echo "Turning ON debug on client" && $OSC_RSH "$DEBUG_ON"
 }
 
 cleanup_portals() {
+       [ -z "$NETWORK" ] && NETWORK=tcp
        $PTLCTL <<- EOF
-       setup tcp
+       setup $NETWORK
        disconnect
        del_uuid self
-       del_uuid mds
-       del_uuid ost
-       del_uuid ldlm
+       del_uuid $MDSNODE
+       del_uuid $OSTNODE
+       del_uuid $DLM
        quit
        EOF
 
@@ -355,23 +457,6 @@ cleanup_portals() {
 cleanup_lustre() {
        killall acceptor
 
-       $OBDCTL <<- EOF
-       device 3
-       cleanup
-       detach
-       device 2
-       cleanup
-       detach
-       device 1
-       cleanup
-       detach
-       device 0
-       cleanup
-       detach
-       quit
-       EOF
-
-
        losetup -d ${LOOP}0
        losetup -d ${LOOP}1
        losetup -d ${LOOP}2
@@ -379,81 +464,141 @@ cleanup_lustre() {
        rmmod llite
        rmmod mdc
 
+       rmmod mds_extN
+       rmmod mds_ext3
+       rmmod mds_ext2
        rmmod mds
        rmmod ost
        rmmod osc
        rmmod obdecho
        rmmod obdfilter
        rmmod obdext2
+       rmmod extN
 
        rmmod ldlm
        rmmod ptlrpc
        rmmod obdclass
 }
 
+cleanup_ldlm() {
+       [ "$SETUP" -a -z "$SETUP_LDLM" ] && return 0
+
+       LDLMDEVNO=`find_devno LDLMDEV`
+       if [ "$LDLMDEVNO" ]; then
+               $OBDCTL <<- EOF
+               device $LDLMDEVNO
+               cleanup
+               detach
+               quit
+               EOF
+       fi
+}
+
 cleanup_mds() {
        [ "$SETUP" -a -z "$SETUP_MDS" ] && return 0
 
-       [ "$SETUP" ] || MDS_DEVNO=0
-
-       $OBDCTL <<- EOF
-       device ${MDS_DEVNO}
-       cleanup
-       detach
-       quit
-       EOF
+       MDSDEVNO=`find_devno MDSDEV`
+       if [ "$MDSDEVNO" ]; then
+               $OBDCTL <<- EOF
+               device $MDSDEVNO
+               cleanup
+               detach
+               quit
+               EOF
+       fi
 }
 
 cleanup_ost() {
        [ "$SETUP" -a -z "$SETUP_OST" ] && return 0
 
-       if [ -z "$SETUP" ]; then
-               OST_DEVNO=2
-               OBD_DEVNO=1
+       OSTDEVNO=`find_devno OSTDEV`
+       if [ "$OSTDEVNO" ]; then
+               $OBDCTL <<- EOF
+               device $OSTDEVNO
+               cleanup
+               detach
+               quit
+               EOF
        fi
 
-       $OBDCTL <<- EOF
-       device ${OST_DEVNO}
-       cleanup
-       detach
-       device ${OBD_DEVNO}
-       cleanup
-       detach
-       quit
-       EOF
+       OBDDEVNO=`find_devno OBDDEV`
+       if [ "$OBDDEVNO" ]; then
+               $OBDCTL <<- EOF
+               device $OBDDEVNO
+               cleanup
+               detach
+               quit
+               EOF
+       fi
 }
 
 cleanup_server() {
-       cleanup_mds && cleanup_ost
-       DEVNO=0
+       cleanup_ost && cleanup_mds
 }
 
 cleanup_mount() {
        [ "$SETUP" -a -z "$SETUP_MOUNT" ] && return 0
 
        [ "$OSCMT" ] || OSCMT=/mnt/lustre
-       umount $OSCMT
+       for THEMOUNT in $OSCMT; do
+           if [ "`mount | grep $THEMOUNT`" ]; then
+               umount $THEMOUNT || fail "unable to unmount $THEMOUNT"
+           fi
+       done
 }
 
 cleanup_osc() {
        [ "$SETUP" -a -z "$SETUP_OSC" ] && return 0
+        [ "$OSC_NAMES" ] || OSC_NAMES=OSCDEV
+
+        for THEOSC in $OSC_NAMES ; do 
+            OSCDEVNO=`find_devno $THEOSC`
+            if [ "$OSCDEVNO" ]; then
+               $OBDCTL <<- EOF
+               device $OSCDEVNO
+               cleanup
+               detach
+               quit
+               EOF
+            fi
+        done
+}
 
-       [ "$SETUP" ] || OSC_DEVNO=3
+cleanup_mdc() {
+       [ "$SETUP" -a -z "$SETUP_MDC" ] && return 0
+        [ "$MDC_NAMES" ] || MDC_NAMES=MDCDEV
+
+        for THEMDC in $MDC_NAMES ; do 
+            MDCDEVNO=`find_devno $THEMDC`
+            if [ "$MDCDEVNO" ]; then
+               $OBDCTL <<- EOF
+               device $MDCDEVNO
+               cleanup
+               detach
+               quit
+               EOF
+            fi
+        done
+}
 
-       $OBDCTL <<- EOF
-       device ${OSC_DEVNO}
-       cleanup
-       detach
-       quit
-       EOF
+cleanup_rpc() {
+       RPCDEVNO=`find_devno RPCDEV`
+       if [ "$RPCDEVNO" ]; then
+               $OBDCTL <<- EOF
+               device $RPCDEVNO
+               cleanup
+               detach
+               quit
+               EOF
+       fi
 }
 
 cleanup_client() {
-       cleanup_mount && cleanup_osc
-       DEVNO=0
+       cleanup_mount && cleanup_osc && cleanup_mdc && cleanup_rpc
 }
 
 fail() { 
-    echo $1
-    exit 1
+    echo "ERROR: $1" 1>&2
+    [ $2 ] && RC=$2 || RC=1
+    exit $RC
 }