[ -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
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() {
# 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"
$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
}
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
for CFG in "$@" ; do
case $CFG in
*.cfg) [ -r "$CFG" ] && . $CFG && SETUP=y ;;
+ *) echo "unknown option '$CFG'" 1>&2
esac
done
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
}
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
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
;;
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
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
}
}
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
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
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
}