set -e
ONLY=${ONLY:-"$*"}
-ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-""}
+ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-"1b 1c"}
[ "$ALWAYS_EXCEPT$EXCEPT" ] && echo "Skipping tests: $ALWAYS_EXCEPT $EXCEPT"
SRCDIR=`dirname $0`
export PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH
+export SECURITY=${SECURITY:-"null"}
TMP=${TMP:-/tmp}
FSTYPE=${FSTYPE:-ext3}
IOPENTEST2=${IOPENTEST2:-iopentest2}
PTLDEBUG=${PTLDEBUG:-0}
-if [ $UID -ne 0 ]; then
- RUNAS_ID="$UID"
- RUNAS=""
-else
- RUNAS_ID=${RUNAS_ID:-500}
- RUNAS=${RUNAS:-"runas -u $RUNAS_ID"}
-fi
+. krb5_env.sh
export NAME=${NAME:-local}
}
run_one() {
- if ! mount | grep -q $DIR; then
+ if ! cat /proc/mounts | grep -q $DIR; then
$START
fi
echo $PTLDEBUG >/proc/sys/portals/debug
build_test_filter
echo preparing for tests involving mounts
-EXT2_DEV=${EXT2_DEV:-/tmp/SANITY.LOOP}
+EXT2_DEV=${EXT2_DEV:-$TMP/SANITY.LOOP}
touch $EXT2_DEV
mke2fs -j -F $EXT2_DEV 8000 >/dev/null 2>&1
-find_free_loop() {
- local LOOP_DEV=""
+find_loop() {
test -b /dev/loop0 &&
base="/dev/loop" || base="/dev/loop/"
test -b $base$i || continue
losetup $base$i >/dev/null 2>&1 || {
- LOOP_DEV="$base$i"
+ echo "$base$i"
break
}
done
- echo $LOOP_DEV
}
cleanup_loop() {
local LOOP_DEV=$1
local LOOP_FILE=$2
- local LOOP_MNTPT=$3
- chmod u-s $LOOP_MNTPT >/dev/null 2>&1
- umount $LOOP_MNTPT >/dev/null 2>&1
losetup -d $LOOP_DEV >/dev/null 2>&1
rm -fr $LOOP_FILE >/dev/null 2>&1
- rm -fr $LOOP_MNTPT >/dev/null 2>&1
}
setup_loop() {
- local LOOP_DEV=$1
- local LOOP_FILE=$2
+ local LOOP_DEV=$(find_loop)
+ local LOOP_FILE=$1
- dd if=/dev/zero of=$LOOP_FILE bs=1M count=10 2>/dev/null || return $?
+ dd if=/dev/zero of=$LOOP_FILE bs=1M count=10 2>/dev/null ||
+ return $?
losetup $LOOP_DEV $LOOP_FILE || {
rc=$?
- cleanup_mount $LOOP_DEV $LOOP_FILE $DIR/gns_test_1a
+ cleanup_loop $LOOP_DEV $LOOP_FILE
return $rc
}
mke2fs -F $LOOP_DEV >/dev/null 2>&1 || {
rc=$?
- cleanup_mount $LOOP_DEV $LOOP_FILE $DIR/gns_test_1a
- echo "cannot create test ext2 fs on $LOOP_DEV"
- return $?
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ return rc
}
+
+ echo $LOOP_DEV
return 0
}
-prep_upcall() {
+setup_upcall() {
local INJECTION=""
local UPCALL=$1
local MODE=$2
local LOG=$3
+ local BG=$4
+
+ echo "generating upcall $UPCALL" >&2
+ test "x$BG" = "xBG" &&
+ BG="&" || BG=""
+
test "x$MODE" = "xDEADLOCK" &&
- INJECTION="touch \$MNTPATH/file"
+ INJECTION="touch \$MNTPATH/file"
cat > $UPCALL <<- EOF
#!/bin/sh
exit 1
$INJECTION
-\$MOUNT \$OPTIONS \$MNTPATH > $LOG 2>&1
+\$MOUNT \$OPTIONS \$MNTPATH > $LOG 2>&1 $BG
exit \$?
EOF
chmod +x $UPCALL
- return $?
+
+ echo "$UPCALL" > /proc/fs/lustre/llite/fs0/gns_upcall || return $?
+ echo "upcall: $(cat /proc/fs/lustre/llite/fs0/gns_upcall)"
+
+ echo "======================== upcall script ===========================" >&2
+ cat $UPCALL >&2
+ echo "==================================================================" >&2
+
+ return 0
}
-check_gns() {
- local LOG="/tmp/gns-log"
- local UPCALL_PATH=""
-
+cleanup_upcall() {
local UPCALL=$1
- local OBJECT=$2
+ rm -fr $UPCALL
+}
+
+show_log() {
+ local LOG=$1
+
+ test -f $LOG && {
+ echo "======================== upcall log ===========================" >&2
+ cat $LOG >&2
+ echo "===============================================================" >&2
+ }
+}
+
+sleep_on()
+{
+ local TIMOUT=$1
+ local TICK=$2
+
+ local sleep_time=$TIMOUT
+ let sleep_time+=$TICK*2
+ sleep $sleep_time
+}
+
+check_mnt()
+{
+ local OBJECT=$1
+ local MODE=$2
local TIMOUT=$3
local TICK=$4
- rm -fr $LOG >/dev/null 2>&1
- UPCALL_PATH="/tmp/gns-upcall-$UPCALL.sh"
+ local res=0
+ local mnt=""
+ local p=""
+ local op
- echo "generating upcall $UPCALL_PATH"
- prep_upcall $UPCALL_PATH $UPCALL $LOG || return $rc
- echo "======================== upcall script ==========================="
- cat $UPCALL_PATH 2>/dev/null || return $?
- echo "=================================================================="
-
- echo "$UPCALL_PATH" > /proc/fs/lustre/llite/fs0/gns_upcall || return $?
- echo "upcall: $(cat /proc/fs/lustre/llite/fs0/gns_upcall)"
+ test $MODE -eq 1 && op="mount" || op="umount"
+ echo -n "checking for $op $OBJECT: " >&2
- echo -n "mount on open $OBJECT/test_file1: "
- echo -n "test data" > $OBJECT/test_file1 >/dev/null 2>&1 || return $?
+ test $MODE -eq 0 && sleep_on $TIMOUT $TICK
- local ENTRY="`basename $OBJECT`"
+ OBJECT="`echo $OBJECT | sed 's/\/*$//'`"
+ mnt="`cat /proc/mounts | grep $OBJECT | awk '{print \$2}'`"
+ test -z "$mnt" && {
+ res=0
+ } || {
+ for p in $mnt; do
+ test "x$p" = "x$OBJECT" && {
+ res=1
+ break
+ }
+ done
+ }
- cat /proc/mounts | grep -q "$ENTRY" || {
- echo "fail"
- test -f $LOG && {
- echo "======================== upcall log ==========================="
- cat $LOG
- echo "==============================================================="
- } || {
- echo "upcall log file $LOG is not found"
+ if test $MODE -eq 0; then
+ test $res -eq 1 && {
+ echo "failed" >&2
+ return 1
}
- return 1
- }
- echo "success"
+ else
+ test $res -eq 0 && {
+ echo "failed" >&2
+ return 1
+ }
+ fi
- local sleep_time=$TIMOUT
- let sleep_time+=$TICK*2
- echo -n "waiting for umount ${sleep_time}s (timeout + tick*2): "
- sleep $sleep_time
+ echo "success" >&2
+ return 0
+}
+
+check_gns() {
+ local OBJECT1=$1
+ local OBJECT2=$2
+ local TIMOUT=$3
+ local TICK=$4
+ local MODE=$5
+ local OP=$6
+ local CHECK=$7
+
+ local OLD_PWD=$(pwd)
+ echo "testing mount on $OP against $OBJECT1 in $MODE mode" >&2
+
+ case "$MODE" in
+ GENERIC)
+ case "$OP" in
+ OPEN)
+ echo -n "test data" > $OBJECT1/test_file1 >/dev/null 2>&1
+ ;;
+ LIST)
+ ls -la $OBJECT1/
+ ;;
+ CHDIR)
+ cd $OBJECT1 || return $?
+ ;;
+ *)
+ echo "invalid testing operation $OP" >&2
+ return 1
+ esac
+ ;;
+ CONCUR1)
+ local i=1
+ local nr=20
+
+ for ((;i<=$nr;i++)); do
+ case "$OP" in
+ OPEN)
+ echo -n "test data" > $OBJECT1/test_file$i >/dev/null 2>&1 &
+ ;;
+ LIST)
+ ls -la $OBJECT1/
+ ;;
+ CHDIR)
+ cd $OBJECT1 >/dev/null 2>&1 &
+ ;;
+ *)
+ echo "invalid testing operation $OP" >&2
+ return 1
+ esac
+ done
+
+ wait
+
+ local RETVAL=$?
+
+ [ $RETVAL -eq 0 ] ||
+ return $RETVAL
+ ;;
+ CONCUR2)
+ test "x$OBJECT2" = "x" && {
+ echo "not defined object2 for concurrent2 testing" >&2
+ return 1
+ }
+ case "$OP" in
+ OPEN)
+ echo -n "test data" > $OBJECT1/test_file1 >/dev/null 2>&1 &
+ echo -n "test data" > $OBJECT2/test_file1 >/dev/null 2>&1 &
+ ;;
+ LIST)
+ ls -la $OBJECT1/
+ ls -la $OBJECT2/
+ ;;
+ CHDIR)
+ cd $OBJECT1 >/dev/null 2>&1 &
+ cd $OBJECT2 >/dev/null 2>&1 &
+ ;;
+ *)
+ echo "invalid testing operation $OP" >&2
+ return 1
+ esac
+
+ wait
+
+ local RETVAL=$?
+
+ [ $RETVAL -eq 0 ] ||
+ return $RETVAL
+ ;;
+ CONCUR3)
+ local i=1
+ local nr=20
+
+ for ((;i<$nr;i++)); do
+ case "$OP" in
+ OPEN)
+ touch $OBJECT1/file$i &
+ echo -n "test data" > $OBJECT1/test_file$i >/dev/null 2>&1 &
+ mkdir $OBJECT1/dir$i &
+ ;;
+ LIST)
+ touch $OBJECT1/file &
+ ls -la $OBJECT1/ &
+ mkdir $OBJECT1/dir$i &
+ ;;
+ CHDIR)
+ touch $OBJECT1/file$i &
+ cd $OBJECT1 >/dev/null 2>&1 &
+ mkdir $OBJECT1/dir$i &
+ ;;
+ *)
+ echo "invalid testing operation $OP" >&2
+ return 1
+ esac
+ done
+
+ wait
+
+ local RETVAL=$?
+
+ [ $RETVAL -eq 0 ] ||
+ return $RETVAL
+ ;;
+ *)
+ echo "invalid testing mode $MODE" >&2
+ return 1
+ esac
- cat /proc/mounts | grep -q "$ENTRY" && {
- echo "failed"
- return 2
+ test "x$OP" = "xCHDIR" && cd $OLD_PWD
+
+ test $CHECK -eq 1 && {
+ # check if mount is here
+ check_mnt $OBJECT1 1 0 0 || return 1
+ if test "x$MODE" = "xCONCUR2"; then
+ check_mnt $OBJECT2 1 0 0 || return 1
+ fi
+
+ # wait for $TIMEOUT and check for mount, it should go
+ check_mnt $OBJECT1 0 $TIMOUT $TICK || return 2
+ if test "x$MODE" = "xCONCUR2"; then
+ check_mnt $OBJECT2 0 $TIMOUT $TICK || return 2
+ fi
}
- echo "success"
+
return 0
}
-test_1a() {
- local LOOP_DEV=$(find_free_loop 2>/dev/null)
- local UPCALL="/tmp/gns-upcall.sh"
- local LOOP_FILE="/tmp/gns_loop"
- local OBJECT=".mntinfo"
- local TIMOUT=5
- local TICK=1
+setup_object() {
+ local OBJPATH=$1
+ local OBJECT=$2
+ local CONTENT=$3
+
+ echo "preparing mount object at $OBJPATH..." >&2
+
+ mkdir -p $OBJPATH || return $?
+ echo -n $CONTENT > $OBJPATH/$OBJECT || return $?
+
+ echo "======================== mount object ===========================" >&2
+ cat $OBJPATH/$OBJECT >&2
+ echo "" >&2
+ echo "=================================================================" >&2
+
+ chmod u+s $OBJPATH
+ return $?
+}
+
+cleanup_object() {
+ local OBJPATH=$1
- test "x$LOOP_DEV" != "x" && test -b $LOOP_DEV ||
- error "can't find free loop device"
+ chmod u-s $OBJPATH
+ umount $OBJPATH >/dev/null 2>&1
+ rm -fr $OBJPATH >/dev/null 2>&1
+}
- echo "preparing loop device $LOOP_DEV <-> $LOOP_FILE..."
- cleanup_loop $LOOP_DEV $LOOP_FILE $DIR/gns_test_1a
- setup_loop $LOOP_DEV $LOOP_FILE || error
+setup_gns() {
+ local OBJECT=$1
+ local TIMOUT=$2
+ local TICK=$3
+
+ echo "setting up GNS timeouts and mount object..." >&2
- echo "setting up GNS timeouts and mount object..."
echo "$OBJECT" > /proc/fs/lustre/llite/fs0/gns_object_name || error
echo "$TIMOUT" > /proc/fs/lustre/llite/fs0/gns_timeout || error
echo "$TICK" > /proc/fs/lustre/llite/fs0/gns_tick || error
echo "tick: $(cat /proc/fs/lustre/llite/fs0/gns_tick)s"
echo ""
- echo "preparing mount object at $DIR/gns_test_1a/$OBJECT..."
- mkdir -p $DIR/gns_test_1a || error
- echo -n "-t ext2 $LOOP_DEV" > $DIR/gns_test_1a/$OBJECT
- echo "======================== mount object ==========================="
- cat $DIR/gns_test_1a/$OBJECT
- echo ""
- echo "================================================================="
- chmod u+s $DIR/gns_test_1a || error
+}
- echo ""
- echo "testing GNS with GENERIC upcall 2 times on the row"
- for ((i=0;i<2;i++)); do
- check_gns GENERIC $DIR/gns_test_1a $TIMOUT $TICK || {
- cleanup_loop $LOOP_DEV $LOOP_FILE $DIR/gns_test_1a
+enable_gns()
+{
+ echo "1" > /proc/fs/lustre/llite/fs0/gns_enabled
+ test "x$(cat /proc/fs/lustre/llite/fs0/gns_enabled)" = "x1" ||
+ error "cannot enable GNS"
+}
+
+disable_gns()
+{
+ echo "0" > /proc/fs/lustre/llite/fs0/gns_enabled
+ test "x$(cat /proc/fs/lustre/llite/fs0/gns_enabled)" = "x0" ||
+ error "cannot disable GNS"
+}
+
+test_1a() {
+ local UPCALL="$TMP/gns-upcall-1a.sh"
+ local LOOP_FILE="$TMP/gns_loop_1a"
+ local LOG="$TMP/gns-log"
+ local OBJECT=".mntinfo"
+ local LOOP_DEV=""
+ local TIMOUT=5
+ local TICK=1
+
+ disable_gns
+
+ LOOP_DEV=$(setup_loop $LOOP_FILE)
+ test "x$LOOP_DEV" = "x" &&
+ error "can't find valid (free) loop device"
+
+ setup_upcall $UPCALL GENERIC $LOG FG || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_gns $OBJECT $TIMOUT $TICK || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_object $DIR/gns_test_1a $OBJECT "-t ext2 $LOOP_DEV" || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ enable_gns
+
+ for ((i=0;i<3;i++)); do
+ check_gns $DIR/gns_test_1a $DIR/gns_test_1a $TIMOUT $TICK GENERIC OPEN 1 || {
+ disable_gns
+ show_log $LOG
+ cleanup_object $DIR/gns_test_1a
+ cleanup_loop $LOOP_DEV $LOOP_FILE
error
}
done
- echo ""
- echo "testing GNS with DEADLOCK upcall 2 times on the row"
- for ((i=0;i<2;i++)); do
- check_gns DEADLOCK $DIR/gns_test_1a $TIMOUT $TICK || {
- cleanup_loop $LOOP_DEV $LOOP_FILE $DIR/gns_test_1a
+ for ((i=0;i<3;i++)); do
+ check_gns $DIR/gns_test_1a $DIR/gns_test_1a $TIMOUT $TICK GENERIC CHDIR 1 || {
+ disable_gns
+ show_log $LOG
+ cleanup_object $DIR/gns_test_1a
+ cleanup_loop $LOOP_DEV $LOOP_FILE
error
}
done
- cleanup_loop $LOOP_DEV $LOOP_FILE $DIR/gns_test_1a
+ disable_gns
+ cleanup_object $DIR/gns_test_1a
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+
+ return 0
+}
+
+run_test 1a " general GNS test - mount/umount (GENERIC) ================"
+
+test_1b() {
+ local UPCALL="$TMP/gns-upcall-1b.sh"
+ local LOOP_FILE="$TMP/gns_loop_1b"
+ local LOG="$TMP/gns-log"
+ local OBJECT=".mntinfo"
+ local LOOP_DEV=""
+ local TIMOUT=5
+ local TICK=1
+
+ disable_gns
+
+ LOOP_DEV=$(setup_loop $LOOP_FILE)
+ test "x$LOOP_DEV" = "x" &&
+ error "can't find valid (free) loop device"
+
+ setup_upcall $UPCALL DEADLOCK $LOG FG || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_gns $OBJECT $TIMOUT $TICK || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_object $DIR/gns_test_1b $OBJECT "-t ext2 $LOOP_DEV" || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ enable_gns
+
+ for ((i=0;i<3;i++)); do
+ check_gns $DIR/gns_test_1b $DIR/gns_test_1b $TIMOUT $TICK GENERIC OPEN 1
+ done
+
+ disable_gns
+ cleanup_object $DIR/gns_test_1b
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+
+ return 0
+}
+
+run_test 1b " general GNS test - mount/umount (DEADLOCK) ==============="
+
+test_1c() {
+ local UPCALL="$TMP/gns-upcall-1c.sh"
+ local LOOP_FILE="$TMP/gns_loop_1c"
+ local LOG="$TMP/gns-log"
+ local OBJECT=".mntinfo"
+ local LOOP_DEV=""
+ local TIMOUT=5
+ local TICK=1
+
+ disable_gns
+
+ LOOP_DEV=$(setup_loop $LOOP_FILE)
+ test "x$LOOP_DEV" = "x" &&
+ error "can't find valid (free) loop device"
+
+ setup_gns $OBJECT $TIMOUT $TICK || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_object $DIR/gns_test_1c $OBJECT "-t ext2 $LOOP_DEV" || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ enable_gns
+
+ local i=0
+
+ for ((;i<4;i++)); do
+ local UPCALL_MODE
+
+ test $(($i%2)) -eq 1 && UPCALL_MODE="DEADLOCK" ||
+ UPCALL_MODE="GENERIC"
+
+ setup_upcall $UPCALL $UPCALL_MODE $LOG FG || {
+ disable_gns
+ show_log $LOG
+ cleanup_object $DIR/gns_test_1c
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ check_gns $DIR/gns_test_1c $DIR/gns_test_1c $TIMOUT $TICK GENERIC OPEN 1 || {
+ disable_gns
+ show_log $LOG
+ cleanup_object $DIR/gns_test_1c
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+ done
+
+ disable_gns
+ cleanup_object $DIR/gns_test_1c
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+
+ return 0
+}
+
+run_test 1c " general GNS test - mount/umount (GENERIC/DEADLOCK) ========"
+
+test_1d() {
+ local UPCALL="$TMP/gns-upcall-1d.sh"
+ local LOOP_FILE="$TMP/gns_loop_1d"
+ local LOG="$TMP/gns-log"
+ local OBJECT=".mntinfo"
+ local LOOP_DEV=""
+ local TIMOUT=5
+ local TICK=1
+
+ disable_gns
+
+ LOOP_DEV=$(setup_loop $LOOP_FILE)
+ test "x$LOOP_DEV" = "x" &&
+ error "can't find valid (free) loop device"
+
+ setup_upcall $UPCALL GENERIC $LOG FG || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_gns $OBJECT $TIMOUT $TICK || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_object $DIR/gns_test_1d $OBJECT "-t ext2 $LOOP_DEV" || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ enable_gns
+
+ local i=0
+
+ for ((;i<4;i++)); do
+ check_gns $DIR/gns_test_1d $DIR/gns_test_1d $TIMOUT $TICK CONCUR1 OPEN 1 || {
+ disable_gns
+ show_log $LOG
+ cleanup_object $DIR/gns_test_1d
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+ done
+
+ disable_gns
+ cleanup_object $DIR/gns_test_1d
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+
+ return 0
+}
+
+run_test 1d " general GNS test - concurrent mount ======================="
+
+test_1e() {
+ local UPCALL="$TMP/gns-upcall-1e.sh"
+ local LOOP_FILE="$TMP/gns_loop_1e"
+ local LOG="$TMP/gns-log"
+ local OBJECT=".mntinfo"
+ local LOOP_DEV=""
+ local TIMOUT=5
+ local TICK=1
+
+ disable_gns
+
+ LOOP_DEV=$(setup_loop $LOOP_FILE)
+ test "x$LOOP_DEV" = "x" &&
+ error "can't find valid (free) loop device"
+
+ setup_upcall $UPCALL GENERIC $LOG FG || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_gns $OBJECT $TIMOUT $TICK || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_object $DIR/gns_test_1e1 $OBJECT "-t ext2 $LOOP_DEV" || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_object $DIR/gns_test_1e2 $OBJECT "-t ext2 $LOOP_DEV" || {
+ cleanup_object $DIR/gns_test_1e1
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ enable_gns
+
+ check_gns $DIR/gns_test_1e1 $DIR/gns_test_1e2 $TIMOUT $TICK CONCUR2 OPEN 1 || {
+ disable_gns
+ show_log $LOG
+ cleanup_object $DIR/gns_test_1e1
+ cleanup_object $DIR/gns_test_1e2
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ disable_gns
+ cleanup_object $DIR/gns_test_1e1
+ cleanup_object $DIR/gns_test_1e2
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+
+ return 0
+}
+
+run_test 1e " general GNS test - concurrent mount of 2 GNS mounts ======="
+
+test_2a() {
+ local UPCALL="$TMP/gns-upcall-2a.sh"
+ local LOG="$TMP/gns-log"
+ local OBJECT=".mntinfo"
+ local TIMOUT=5
+ local TICK=1
+
+ disable_gns
+
+ setup_gns $OBJECT $TIMOUT $TICK ||
+ error
+
+ setup_upcall $UPCALL GENERIC $LOG FG ||
+ error
+
+ mkdir -p $DIR/gns_test_2a
+ ln -s $DIR/gns_test_2a $DIR/gns_test_2a/$OBJECT
+ chmod u+s $DIR/gns_test_2a
+
+ enable_gns
+
+ check_gns $DIR/gns_test_2a $DIR/gns_test_2a $TIMOUT $TICK GENERIC OPEN 1
+
+ disable_gns
+ chmod u-s $DIR/gns_test_2a
+ rm -fr $DIR/gns_test_2a
+
+ return 0
+}
+
+run_test 2a " odd conditions (mount object is symlink) ============="
+
+test_2b() {
+ local UPCALL="$TMP/gns-upcall-2b.sh"
+ local LOG="$TMP/gns-log"
+ local OBJECT=".mntinfo"
+ local TIMOUT=5
+ local TICK=1
+
+ disable_gns
+
+ setup_gns $OBJECT $TIMOUT $TICK ||
+ error
+
+ setup_upcall $UPCALL GENERIC $LOG FG ||
+ error
+
+ mkdir -p $DIR/gns_test_2b/$OBJECT
+ chmod u+s $DIR/gns_test_2b
+
+ enable_gns
+
+ echo ""
+ echo "testing GNS with GENERIC upcall"
+
+ check_gns $DIR/gns_test_2b $DIR/gns_test_2b $TIMOUT $TICK GENERIC OPEN 1
+
+ disable_gns
+ chmod u-s $DIR/gns_test_2b
+ rm -fr $DIR/gns_test_2b
+
+ return 0
+}
+
+run_test 2b " odd conditions (mount object is directory) ==========="
+
+test_2c() {
+ local UPCALL="$TMP/gns-upcall-2c.sh"
+ local LOG="$TMP/gns-log"
+ local OBJECT=".mntinfo"
+ local TIMOUT=5
+ local TICK=1
+
+ disable_gns
+
+ setup_gns $OBJECT $TIMOUT $TICK ||
+ error
+
+ setup_upcall $UPCALL GENERIC $LOG FG ||
+ error
+
+ mkdir -p $DIR/gns_test_2c/$OBJECT/$OBJECT/$OBJECT/$OBJECT
+ chmod u+s -R $DIR/gns_test_2c
+
+ enable_gns
+
+ check_gns $DIR/gns_test_2c $DIR/gns_test_2c $TIMOUT $TICK GENERIC OPEN 1
+
+ disable_gns
+ chmod u-s -R $DIR/gns_test_2c
+ rm -fr $DIR/gns_test_2c
+
+ return 0
+}
+
+run_test 2c " odd conditions (mount object is recursive dir) ======="
+
+test_2d() {
+ local UPCALL="$TMP/gns-upcall-2d.sh"
+ local LOG="$TMP/gns-log"
+ local OBJECT=".mntinfo"
+ local TIMOUT=5
+ local TICK=1
+
+ disable_gns
+
+ setup_gns $OBJECT $TIMOUT $TICK ||
+ error
+
+ setup_upcall $UPCALL GENERIC $LOG FG ||
+ error
+
+ mkdir -p $DIR/gns_test_2d
+ chmod u+s $DIR/gns_test_2d
+
+ enable_gns
+
+ check_gns $DIR/gns_test_2d $DIR/gns_test_2d $TIMOUT $TICK GENERIC OPEN 1
+
+ disable_gns
+ chmod u-s $DIR/gns_test_2d
+ rm -fr $DIR/gns_test_2d
+
+ return 0
+}
+
+run_test 2d " odd conditions (mount object is absent) =============="
+
+test_2d1() {
+ local UPCALL="$TMP/gns-upcall-2d1.sh"
+ local LOG="$TMP/gns-log"
+ local OBJECT=".mntinfo"
+ local TIMOUT=5
+ local TICK=1
+
+ disable_gns
+
+ setup_gns $OBJECT $TIMOUT $TICK ||
+ error
+
+ setup_upcall $UPCALL GENERIC $LOG FG ||
+ error
+
+ mkdir -p $DIR/gns_test_2d1
+ cp /etc/termcap $DIR/gns_test_2d1/$OBJECT
+ size=`ls -la $DIR/gns_test_2d1/$OBJECT | awk '{print $5}'`
+ echo "mount object $DIR/gns_test_2d1/$OBJECT size: ${size} bytes"
+ chmod u+s $DIR/gns_test_2d1
+
+ enable_gns
+
+ check_gns $DIR/gns_test_2d1 $DIR/gns_test_2d1 $TIMOUT $TICK GENERIC OPEN 1
+
+ disable_gns
+ chmod u-s $DIR/gns_test_2d1
+ rm -fr $DIR/gns_test_2d1
+
+ return 0
+}
+
+run_test 2d1 " odd conditions (mount object is too big) ============"
+
+test_2e() {
+ local OBJECT=".mntinfo"
+ local TIMOUT=5
+ local TICK=1
+
+ echo "." > /proc/fs/lustre/llite/fs0/gns_object_name
+ test "x$(cat /proc/fs/lustre/llite/fs0/gns_object_name)" = "x." &&
+ error "'.' is set as mount object name"
+
+ echo ".." > /proc/fs/lustre/llite/fs0/gns_object_name
+ test "x$(cat /proc/fs/lustre/llite/fs0/gns_object_name)" = "x.." &&
+ error "'..' is set as mount object name"
+
+ echo ".a" > /proc/fs/lustre/llite/fs0/gns_object_name
+ test "x$(cat /proc/fs/lustre/llite/fs0/gns_object_name)" = "x.a" ||
+ error "'.a' is not set as mount object name"
+
+ echo "..a" > /proc/fs/lustre/llite/fs0/gns_object_name
+ test "x$(cat /proc/fs/lustre/llite/fs0/gns_object_name)" = "x..a" ||
+ error "'..a' is not set as mount object name"
+
+ return 0
+}
+
+run_test 2e " odd conditions ('.' and '..' as mount object) ============="
+
+test_2f() {
+ local UPCALL="$TMP/gns-upcall-2f.sh"
+ local LOOP_FILE="$TMP/gns_loop_2f"
+ local LOG="$TMP/gns-log"
+ local OBJECT=".mntinfo"
+ local LOOP_DEV=""
+ local TIMOUT=5
+ local TICK=1
+
+ disable_gns
+
+ LOOP_DEV=$(setup_loop $LOOP_FILE)
+ test "x$LOOP_DEV" = "x" &&
+ error "can't find valid (free) loop device"
+
+ setup_upcall $UPCALL GENERIC $LOG FG || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_gns $OBJECT $TIMOUT $TICK || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_object $DIR/gns_test_2f $OBJECT "-t ext2 $LOOP_DEV" || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ enable_gns
+
+ check_gns $DIR/gns_test_2f $DIR/gns_test_2f $TIMOUT $TICK CONCUR3 OPEN 1 || {
+ disable_gns
+ show_log $LOG
+ cleanup_object $DIR/gns_test_2f
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ disable_gns
+ cleanup_object $DIR/gns_test_2f
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+
+ return 0
+}
+
+run_test 2f " odd conditions (mount point is modifying during mount) ===="
+
+test_2g() {
+ local UPCALL="$TMP/gns-upcall-2g.sh"
+ local LOOP_FILE="$TMP/gns_loop_2g"
+ local LOG="$TMP/gns-log"
+ local OBJECT=".mntinfo"
+ local LOOP_DEV=""
+ local TIMOUT=5
+ local TICK=1
+
+ disable_gns
+
+ LOOP_DEV=$(setup_loop $LOOP_FILE)
+ test "x$LOOP_DEV" = "x" &&
+ error "can't find valid (free) loop device"
+
+ setup_upcall $UPCALL GENERIC $LOG FG || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_gns $OBJECT $TIMOUT $TICK || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_object $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT $OBJECT "-t ext2 $LOOP_DEV" || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+ chmod u+s $DIR/gns_test_2g -R
+
+ enable_gns
+
+ check_gns $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT \
+$DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT $TIMOUT $TICK GENERIC OPEN 1 || {
+ disable_gns
+ show_log $LOG
+ cleanup_object $DIR/gns_test_2g
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error "recursive mount point does not work"
+ }
+
+ disable_gns
+
+ echo ""
+ echo "turning SUID on $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT off"
+ chmod u-s $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT
+
+ enable_gns
+
+ check_gns $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT \
+$DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT $TIMOUT $TICK GENERIC OPEN 1 && {
+ disable_gns
+ show_log $LOG
+ cleanup_object $DIR/gns_test_2g
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error "GNS works whereas mount point is not SUID marked dir"
+ }
+
+ disable_gns
+ cleanup_object $DIR/gns_test_2g
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+
+ return 0
+}
+
+run_test 2g " odd conditions (mount point is recursive marked SUID dir) ="
+
+test_2h() {
+ local UPCALL="$TMP/gns-upcall-2h.sh"
+ local LOOP_FILE="$TMP/gns_loop_2h"
+ local LOG="$TMP/gns-log"
+ local OBJECT=".mntinfo"
+ local LOOP_DEV=""
+ local TIMOUT=5
+ local TICK=1
+
+ disable_gns
+
+ LOOP_DEV=$(setup_loop $LOOP_FILE)
+ test "x$LOOP_DEV" = "x" &&
+ error "can't find valid (free) loop device"
+
+ setup_upcall $UPCALL GENERIC $LOG BG || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_gns $OBJECT $TIMOUT $TICK || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_object $DIR/gns_test_2h $OBJECT "-t ext2 $LOOP_DEV" || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ enable_gns
+
+ check_gns $DIR/gns_test_2h $DIR/gns_test_2h $TIMOUT $TICK GENERIC OPEN 1 || {
+ disable_gns
+ show_log $LOG
+ cleanup_object $DIR/gns_test_2h
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ disable_gns
+ cleanup_object $DIR/gns_test_2h
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+
+ return 0
+}
+
+run_test 2h " odd conditions (mounting in background) ==================="
+
+test_3a() {
+ local UPCALL="$TMP/gns-upcall-3a.sh"
+ local LOOP_FILE="$TMP/gns_loop_3a"
+ local LOG="$TMP/gns-log"
+ local OBJECT=".mntinfo"
+ local LOOP_DEV=""
+ local TIMOUT=5
+ local TICK=1
+
+ disable_gns
+
+ LOOP_DEV=$(setup_loop $LOOP_FILE)
+ test "x$LOOP_DEV" = "x" &&
+ error "can't find valid (free) loop device"
+
+ setup_upcall $UPCALL GENERIC $LOG FG || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_gns $OBJECT $TIMOUT $TICK || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_object $DIR/gns_test_3a $OBJECT "-t ext2 $LOOP_DEV" || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ enable_gns
+
+ check_gns $DIR/gns_test_3a $DIR/gns_test_3a $TIMOUT $TICK GENERIC OPEN 1 || {
+ disable_gns
+ show_log $LOG
+ cleanup_object $DIR/gns_test_3a
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ chmod u-s $DIR/gns_test_3a || {
+ disable_gns
+ cleanup_object $DIR/gns_test_3a
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error "can't chmod u-s $DIR/gns_test_3a"
+ }
+
+ check_mnt $DIR/gns_test_3a 0 0 0 || {
+ disable_gns
+ cleanup_object $DIR/gns_test_3a
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error "chmod u-s $DIR/gns_test_3a caused mounting?"
+ }
+
+ disable_gns
+ cleanup_object $DIR/gns_test_3a
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+
+ return 0
+}
+
+run_test 3a " removing mnt by chmod u-s ================================="
+
+test_3b() {
+ local LOOP_FILE="$TMP/gns_loop_3b"
+ local UPCALL="$TMP/gns-upcall-3b.sh"
+ local LOG="$TMP/gns-log"
+ local OBJECT=".mntinfo"
+ local LOOP_DEV=""
+ local TIMOUT=5
+ local TICK=1
+
+ disable_gns
+
+ LOOP_DEV=$(setup_loop $LOOP_FILE)
+ test "x$LOOP_DEV" = "x" &&
+ error "can't find valid (free) loop device"
+
+ setup_upcall $UPCALL GENERIC $LOG FG || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ setup_object $DIR/gns_test_3b1 $OBJECT "-t ext2 $LOOP_DEV" || {
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ mkdir -p $TMP/mnt || error
+ mount -t ext2 $LOOP_DEV $TMP/mnt || {
+ cleanup_object $DIR/gns_test_3b1
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error "cannot mount $LOOP_DEV"
+ }
+
+ mkdir $TMP/mnt/gns_test_3b2 || {
+ umount $TMP/mnt
+ cleanup_object $DIR/gns_test_3b1
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error "can't create $TMP/mnt/gns_test_3b2"
+ }
+
+ umount $TMP/mnt || {
+ cleanup_object $DIR/gns_test_3b1
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error "can't umount $TMP/mnt"
+ }
+
+ setup_gns $OBJECT $TIMOUT $TICK || {
+ cleanup_object $DIR/gns_test_3b1
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ enable_gns
+
+ check_gns $DIR/gns_test_3b1/gns_test_3b2 $DIR/gns_test_3b1/gns_test_3b2 \
+$TIMOUT $TICK GENERIC LIST 0 || {
+ disable_gns
+ show_log $LOG
+ cleanup_object $DIR/gns_test_3b1
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ check_mnt $DIR/gns_test_3b1 1 0 0 || {
+ disable_gns
+ show_log $LOG
+ cleanup_object $DIR/gns_test_3b1
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ check_mnt $DIR/gns_test_3b1 0 $TIMOUT $TICK || {
+ disable_gns
+ show_log $LOG
+ cleanup_object $DIR/gns_test_3b1
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+ error
+ }
+
+ disable_gns
+ cleanup_object $DIR/gns_test_3b1
+ cleanup_loop $LOOP_DEV $LOOP_FILE
+
+ return 0
}
-run_test 1a " general GNS test - mounting/umount ===================="
+run_test 3b " readdir through mount point ==============================="
TMPDIR=$OLDTMPDIR
TMP=$OLDTMP