[Ocfs2-tools-commits] jlbec commits r1380 - in branches/cman-based: . vendor/common

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Tue Aug 14 16:21:15 PDT 2007


Author: jlbec
Date: 2007-08-14 16:21:13 -0700 (Tue, 14 Aug 2007)
New Revision: 1380

Added:
   branches/cman-based/vendor/common/o2cb.init.in
Removed:
   branches/cman-based/vendor/common/o2cb.init
Modified:
   branches/cman-based/configure.in
Log:

o2cb.init now knows how to configure the backing cluster stack.  It can
start the drivers regardless of whether o2cb, heartbeat2, or cman is the
backend.

Move o2cb.init to o2cb.init.in.  This allows us to propagate
BUILD_CMAN_SUPPORT to the init script.



Modified: branches/cman-based/configure.in
===================================================================
--- branches/cman-based/configure.in	2007-08-14 22:28:39 UTC (rev 1379)
+++ branches/cman-based/configure.in	2007-08-14 23:21:13 UTC (rev 1380)
@@ -258,6 +258,7 @@
 ocfs2console/ocfs2console.8
 tunefs.ocfs2/tunefs.ocfs2.8
 vendor/common/ocfs2-tools.spec-generic
+vendor/common/o2cb.init
 ])
 
 AC_OUTPUT

Deleted: branches/cman-based/vendor/common/o2cb.init
===================================================================
--- branches/cman-based/vendor/common/o2cb.init	2007-08-14 22:28:39 UTC (rev 1379)
+++ branches/cman-based/vendor/common/o2cb.init	2007-08-14 23:21:13 UTC (rev 1380)
@@ -1,1043 +0,0 @@
-#!/bin/bash
-# init fragment for O2CB.
-#
-# chkconfig: 2345 24 20
-# description: Load O2CB cluster services at system boot.
-#
-### BEGIN INIT INFO
-# Provides: o2cb
-# Required-Start: $network
-# Should-Start:
-# Required-Stop:
-# Default-Start: 2 3 5
-# Default-Stop:
-# Description: Load O2CB cluster services at system boot.
-### END INIT INFO
-
-# Force LC_ALL=C
-export LC_ALL=C
-
-CLUSTERCONF=/etc/ocfs2/cluster.conf
-
-if [ -f /etc/sysconfig/o2cb ]
-then
-    # Red Hat and Novell
-    CONFIGURATION=/etc/sysconfig/o2cb
-elif [ -f /etc/default/o2cb ]
-then
-    # Debian
-    CONFIGURATION=/etc/default/o2cb
-elif [ -d /etc/sysconfig ]
-then
-    CONFIGURATION=/etc/sysconfig/o2cb
-else
-    CONFIGURATION=/etc/default/o2cb
-fi
-
-# The default values should always be in sync with the kernel
-DEF_HEARTBEAT_THRESHOLD=31
-DEF_IDLE_TIMEOUT_MS=30000
-DEF_KEEPALIVE_DELAY_MS=2000
-DEF_RECONNECT_DELAY_MS=2000
-
-# Minimum timeout values
-MIN_HEARTBEAT_THRESHOLD=7
-MIN_IDLE_TIMEOUT_MS=5000
-MIN_KEEPALIVE_DELAY_MS=1000
-MIN_RECONNECT_DELAY_MS=2000
-
-# Source configuration, 
-[ -f "${CONFIGURATION}" ] && . "${CONFIGURATION}"
-
-configfs_path()
-{
-    # Note that this is only valid *after* configfs is loaded
-    if [ -d /sys/kernel/config ]
-    then
-        echo /sys/kernel/config
-    else
-        echo /config
-    fi
-}
-
-# 
-# This is a tricky bit of eval work.  There are many steps involved in
-# O2CB startup/shutdown, so we collect them here.  Each line is a line
-# of shell code that needs to be run.  The code is run via eval as
-# follows:
-#
-# start/load:
-#    Eval of the exact lines, in order.  So, the first call is
-#    "eval load_module configfs".
-#
-# status:
-#    Eval of the lines with "check_" prepended, in order.  So the first
-#    call is "eval check_load_module configfs".
-#
-# stop/unload:
-#    Eval of the lines with "un" prepened, in reverse order.  So the
-#    *last* call is "eval unload_module configfs".
-# 
-# To provide an action, create a set of shell functions or commands
-# "foo", "check_foo", and "unfoo".  Then add "foo arguments" to the
-# appropriate place.  Be careful, eval requires quoting to be right.
-#
-LOAD_ACTIONS=("load_module configfs"
-		"mount_fs configfs "'$(configfs_path)'
-		"load_module ocfs2_nodemanager"
-		"load_module ocfs2_dlm"
-		"load_module ocfs2_dlmfs"
-		"mount_fs ocfs2_dlmfs /dlm")
-
-
-#
-# if_fail()
-#
-# Evaluates return codes.  If 0, prints "OK", if 1, prints "Failed"
-# and exits.  If 2, status is "already done" and nothing is printed.
-# The rest of the functions in here all honor this convention.
-#
-if_fail()
-{
-    RC="$1"
-    REASON="$2"
-    if [ "$RC" = "0" ]
-    then
-        echo "OK"
-        return
-    elif [ "$RC" = "2" ]
-    then
-        return
-    fi
-    echo "Failed"
-    if [ -n "${REASON}" ]
-    then
-        echo "${REASON}" >&2
-    fi
-    exit 1
-}
-
-
-#
-# write_sysconfig()
-#
-# Writes the system configuration out
-#
-write_sysconfig()
-{
-    echo -n "Writing O2CB configuration: "
-    cat >"${CONFIGURATION}" <<EOF
-#
-# This is a configuration file for automatic startup of the O2CB
-# driver.  It is generated by running /etc/init.d/o2cb configure.
-# Please use that method to modify this file
-#
-
-# O2CB_ENABELED: 'true' means to load the driver on boot.
-O2CB_ENABLED=${O2CB_ENABLED:-false}
-
-# O2CB_BOOTCLUSTER: If not empty, the name of a cluster to start.
-O2CB_BOOTCLUSTER=${O2CB_BOOTCLUSTER}
-
-# O2CB_HEARTBEAT_THRESHOLD: Iterations before a node is considered dead.
-O2CB_HEARTBEAT_THRESHOLD=${O2CB_HEARTBEAT_THRESHOLD}
-
-# O2CB_IDLE_TIMEOUT_MS: Time in ms before a network connection is considered dead.
-O2CB_IDLE_TIMEOUT_MS=${O2CB_IDLE_TIMEOUT_MS}
-
-# O2CB_KEEPALIVE_DELAY_MS: Max time in ms before a keepalive packet is sent
-O2CB_KEEPALIVE_DELAY_MS=${O2CB_KEEPALIVE_DELAY_MS}
-
-# O2CB_RECONNECT_DELAY_MS: Min time in ms between connection attempts
-O2CB_RECONNECT_DELAY_MS=${O2CB_RECONNECT_DELAY_MS}
-
-EOF
-
-    if [ $? != 0 ]
-    then
-        return 1
-    fi
-    return 0
-}
-
-#
-# read_timeout()
-#   Returns timeout value provided by user to caller in RET_VAL
-#
-read_timeout()
-{
-    if [ "$#" -lt "4" ]; then
-        echo "read_timeout(): Requires more arguments" >&2
-        exit 1
-    fi
-
-    ATTRIB_NAME=$1
-    ATTRIB_VAL=$2
-    MIN_ATTRIB_VAL=$3
-    DEF_ATTRIB_VAL=$4
-    RET_VAL=0
-
-    while :
-    do
-        if [ -z $ATTRIB_VAL ]; then
-            CUR=$DEF_ATTRIB_VAL
-        else
-            CUR=$ATTRIB_VAL
-        fi
-        echo -n "Specify ${ATTRIB_NAME} (>=$MIN_ATTRIB_VAL) [$CUR]: "
-        read LINE
-        case "$LINE" in
-        "")
-            RET_VAL="$ATTRIB_VAL"
-            break
-            ;;
-
-        *[^0-9]*)
-            echo "Invalid ${ATTRIB_NAME} value: $LINE" >&2
-            ;;
-        *)
-            if [ $LINE -lt $MIN_ATTRIB_VAL ]; then
-                echo "${ATTRIB_NAME} cannot be less than $MIN_ATTRIB_VAL" >&2
-            else
-                RET_VAL="$LINE"
-                break
-            fi
-            ;;
-        esac
-    done
-}
-
-set_timeouts()
-{
-    O2CB_HEARTBEAT_THRESHOLD_FILE_OLD=/proc/fs/ocfs2_nodemanager/hb_dead_threshold
-    O2CB_HEARTBEAT_THRESHOLD_FILE=$(configfs_path)/cluster/${CLUSTER}/heartbeat/dead_threshold
-    if [ -n "$O2CB_HEARTBEAT_THRESHOLD" ]; then
-        if [ -f "$O2CB_HEARTBEAT_THRESHOLD_FILE" ]; then
-            echo "$O2CB_HEARTBEAT_THRESHOLD" > "$O2CB_HEARTBEAT_THRESHOLD_FILE"
-        elif [ -f "$O2CB_HEARTBEAT_THRESHOLD_FILE_OLD" ]; then 
-            echo "$O2CB_HEARTBEAT_THRESHOLD" > "$O2CB_HEARTBEAT_THRESHOLD_FILE_OLD"
-        fi
-    fi
-
-    O2CB_IDLE_TIMEOUT_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/idle_timeout_ms
-    if [ -n "$O2CB_IDLE_TIMEOUT_MS" ]; then
-        if [ -f "$O2CB_IDLE_TIMEOUT_MS_FILE" ]; then
-            echo "$O2CB_IDLE_TIMEOUT_MS" > "$O2CB_IDLE_TIMEOUT_MS_FILE"
-        fi
-    fi
-
-    O2CB_KEEPALIVE_DELAY_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/keepalive_delay_ms
-    if [ -n "$O2CB_KEEPALIVE_DELAY_MS" ]; then
-        if [ -f "$O2CB_KEEPALIVE_DELAY_MS_FILE" ]; then
-            echo "$O2CB_KEEPALIVE_DELAY_MS" > "$O2CB_KEEPALIVE_DELAY_MS_FILE"
-        fi
-    fi
-
-    O2CB_RECONNECT_DELAY_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/reconnect_delay_ms
-    if [ -n "$O2CB_RECONNECT_DELAY_MS" ]; then
-        if [ -f "$O2CB_RECONNECT_DELAY_MS_FILE" ]; then
-            echo "$O2CB_RECONNECT_DELAY_MS" > "$O2CB_RECONNECT_DELAY_MS_FILE"
-        fi
-    fi
-}
-
-show_timeouts()
-{
-
-    O2CB_HEARTBEAT_THRESHOLD_FILE_OLD=/proc/fs/ocfs2_nodemanager/hb_dead_threshold
-    O2CB_HEARTBEAT_THRESHOLD_FILE=$(configfs_path)/cluster/${CLUSTER}/heartbeat/dead_threshold
-    if [ -f "$O2CB_HEARTBEAT_THRESHOLD_FILE" ]; then
-        VAL=`cat "$O2CB_HEARTBEAT_THRESHOLD_FILE"`
-        echo "Heartbeat dead threshold = ${VAL}"
-    elif [ -f "$O2CB_HEARTBEAT_THRESHOLD_FILE_OLD" ]; then
-        VAL=`cat "$O2CB_HEARTBEAT_THRESHOLD_FILE_OLD"`
-        echo "  Heartbeat dead threshold: ${VAL}"
-    fi
-
-    O2CB_IDLE_TIMEOUT_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/idle_timeout_ms
-    if [ -f "$O2CB_IDLE_TIMEOUT_MS_FILE" ]; then
-        VAL=`cat "$O2CB_IDLE_TIMEOUT_MS_FILE"`
-        echo "  Network idle timeout: ${VAL}"
-    fi
-
-    O2CB_KEEPALIVE_DELAY_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/keepalive_delay_ms
-    if [ -f "$O2CB_KEEPALIVE_DELAY_MS_FILE" ]; then
-        VAL=`cat "$O2CB_KEEPALIVE_DELAY_MS_FILE"`
-        echo "  Network keepalive delay: ${VAL}"
-    fi
-
-    O2CB_RECONNECT_DELAY_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/reconnect_delay_ms
-    if [ -f "$O2CB_RECONNECT_DELAY_MS_FILE" ]; then
-        VAL=`cat "$O2CB_RECONNECT_DELAY_MS_FILE"`
-        echo "  Network reconnect delay: ${VAL}"
-    fi
-}
-
-#
-# configure_ask()
-#
-# Ask configuration questions, setting the shell vars.
-#
-configure_ask()
-{
-    cat <<EOF
-Configuring the O2CB driver.
-
-This will configure the on-boot properties of the O2CB driver.
-The following questions will determine whether the driver is loaded on
-boot.  The current values will be shown in brackets ('[]').  Hitting
-<ENTER> without typing an answer will keep that current value.  Ctrl-C
-will abort.
-
-EOF
-
-    while :
-    do
-        if [ "$O2CB_ENABLED" = "true" ]
-        then
-            CUR=y
-        else
-            CUR=n
-        fi
-        echo -n "Load O2CB driver on boot (y/n) [$CUR]: "
-        read LINE
-        case "$LINE" in
-        "")
-            break
-            ;;
-        y|Y)
-            O2CB_ENABLED=true
-            break
-            ;;
-        n|N)
-            O2CB_ENABLED=false
-            break
-            ;;
-        *)
-            echo "Invalid answer: $LINE" >&2
-            ;;
-        esac
-    done
-
-    while :
-    do
-        echo -n "Cluster to start on boot (Enter \"none\" to clear) [$O2CB_BOOTCLUSTER]: "
-        read LINE
-        case "$LINE" in
-        "")
-            break
-            ;;
-        none)
-            O2CB_BOOTCLUSTER=
-            break
-            ;;
-
-        *[^a-zA-Z0-9]*)
-            echo "Invalid cluster name: $LINE" >&2
-            ;;
-        *)
-            O2CB_BOOTCLUSTER="$LINE"
-            break
-            ;;
-        esac
-    done
-
-    read_timeout "heartbeat dead threshold" "$O2CB_HEARTBEAT_THRESHOLD" "$MIN_HEARTBEAT_THRESHOLD" "$DEF_HEARTBEAT_THRESHOLD"
-    O2CB_HEARTBEAT_THRESHOLD="$RET_VAL"
-
-    read_timeout "network idle timeout in ms" "$O2CB_IDLE_TIMEOUT_MS" "$MIN_IDLE_TIMEOUT_MS" "$DEF_IDLE_TIMEOUT_MS"
-    O2CB_IDLE_TIMEOUT_MS="$RET_VAL"
-
-    read_timeout "network keepalive delay in ms" "$O2CB_KEEPALIVE_DELAY_MS" "$MIN_KEEPALIVE_DELAY_MS" "$DEF_KEEPALIVE_DELAY_MS"
-    O2CB_KEEPALIVE_DELAY_MS="$RET_VAL"
-
-    read_timeout "network reconnect delay in ms" "$O2CB_RECONNECT_DELAY_MS" "$MIN_RECONNECT_DELAY_MS" "$DEF_RECONNECT_DELAY_MS"
-    O2CB_RECONNECT_DELAY_MS="$RET_VAL"
-
-    # XXX ask about mount point base
-}
-
-
-#
-# make_dir()
-#
-# Create $1
-# Returns 0 on success, 1 on error, 2 if it already exists.
-#
-make_dir()
-{
-    if [ "$#" -lt "1" -o -z "$1" ]
-    then
-        echo "make_dir(): Requires an argument" >&2
-        return 1
-    fi
-    DIR="$1"
-    if [ -e "$DIR" ]
-    then
-        if [ -d "$DIR" ]
-        then
-            return 2
-        fi
-        echo "make_dir(): File $DIR is not a directory" >&2
-        return 1
-    fi
-
-    echo -n "Creating directory '$DIR': "
-    mkdir -p "$DIR" 2>/dev/null
-    if [ $? != 0 ]
-    then
-        echo "Unable to create directory '$DIR'" >&2
-        return 1
-    fi
-    return 0
-}
-
-
-#
-# load_module()
-# Load a module
-#
-# 0 is success, 1 is error, 2 is already loaded
-# 
-load_module()
-{
-    if [ "$#" -lt "1" -o -z "$1" ]
-    then
-        echo "load_module(): Requires an argument" >&2
-        return 1
-    fi
-    MODNAME="$1"
-
-    MODOUT="`awk '$1 ~ /^'$MODNAME'$/{print $1;exit}' < /proc/modules 2>/dev/null`"
-    if [ -n "$MODOUT" ]
-    then
-        return 2
-    fi
-
-    echo -n "Loading module \"$MODNAME\": "
-    modprobe -s "$MODNAME"
-    if [ "$?" != 0 ]
-    then
-        echo "Unable to load module \"$MODNAME\"" >&2
-        return 1
-    fi
-
-    return 0
-}
-
-#
-# check_heartbeat()
-#
-# 0 is hb not active, 1 is error, 2 is hb active
-#
-check_heartbeat()
-{
-    if [ "$#" -lt "1" -o -z "$1" ]
-    then
-        echo "check_heartbeat(): Requires an argument" >&2
-        return 1
-    fi
-    CLUSTER="$1"
-
-    RC=0
-    if [ -d "$(configfs_path)/cluster/${CLUSTER}/heartbeat/" ]
-    then
-        ls -1 "$(configfs_path)/cluster/${CLUSTER}/heartbeat/" | while read HBUUID
-        do
-            if [ -d "$(configfs_path)/cluster/${CLUSTER}/heartbeat/${HBUUID}" ]
-            then
-                return 2;
-            fi
-        done
-        if [ $? = 2 ]
-        then
-            RC=2
-        fi
-    fi
-
-    return $RC
-}
-
-#
-# clean_heartbeat()
-# Removes the inactive heartbeat regions
-# 
-clean_heartbeat()
-{
-    if [ "$#" -lt "1" -o -z "$1" ]
-    then
-        echo "clean_heartbeat(): Requires an argument" >&2
-        return 1
-    fi
-    CLUSTER="$1"
-
-    if [ ! -f "$(configfs_path)/cluster/${CLUSTER}/heartbeat/*" ]
-    then
-        return
-    fi
-
-    echo -n "Cleaning heartbeat on ${CLUSTER}: "
-
-    ls -1 "$(configfs_path)/cluster/${CLUSTER}/heartbeat/" | while read HBUUID
-    do
-        if [ ! -d "$(configfs_path)/cluster/${CLUSTER}/heartbeat/${HBUUID}" ]
-        then
-            continue
-        fi
-
-        OUTPUT="`ocfs2_hb_ctl -I -u ${HBUUID} 2>&1`"
-        if [ $? != 0 ]
-        then
-            echo "Failed"
-            echo "${OUTPUT}" >&2
-            exit 1
-        fi
-
-        REF="`echo ${OUTPUT} | awk '/refs/ {print $2; exit;}' 2>&1`"
-        if [ $REF != 0 ]
-        then
-           echo "Failed"
-           echo "At least one heartbeat region still active" >&2
-           exit 1
-        else
-           OUTPUT="`ocfs2_hb_ctl -K -u ${HBUUID} 2>&1`"
-        fi
-    done
-    if [ $? = 1 ]
-    then
-        exit 1
-    fi
-    echo "OK"
-}
-
-#
-# clean_cluster()
-# Force cleans configured cluster
-#
-# 0 is clean, 1 is error, 2 is not clean
-#
-clean_cluster()
-{
-    if [ "$#" -lt "1" -o -z "$1" ]
-    then
-        echo "clean_cluster(): Requires an argument" >&2
-        return 1
-    fi
-    CLUSTER="$1"
-
-    if [ -d "$(configfs_path)/cluster/${CLUSTER}/node/" ]
-    then
-        ls -1 "$(configfs_path)/cluster/${CLUSTER}/node/" | while read NODE
-        do
-            rmdir "$(configfs_path)/cluster/${CLUSTER}/node/${NODE}" >/dev/null 2>&1
-        done
-    fi
-
-    if [ -d "$(configfs_path)/cluster/${CLUSTER}" ]
-    then
-        rmdir "$(configfs_path)/cluster/${CLUSTER}" >/dev/null 2>&1
-    fi
-
-    if [ -d "$(configfs_path)/cluster/${CLUSTER}" ]
-    then
-        return 2
-    fi
-
-    return 0
-}
-
-#
-# unload_module()
-# Unload a module
-#
-# 0 is success, 1 is error, 2 is not loaded
-# 
-unload_module()
-{
-    if [ "$#" -lt "1" -o -z "$1" ]
-    then
-        echo "unload_module(): Requires an argument" >&2
-        return 1
-    fi
-    MODNAME="$1"
-
-    MODOUT="`awk '$1 ~ /^'$MODNAME'$/{print $1,$3;exit}' < /proc/modules 2>/dev/null`"
-    if [ -z "$MODOUT" ]
-    then
-        return 2
-    fi
-    case "$MODOUT" in
-    $MODNAME\ 0)
-        ;;
-    $MODNAME\ *)
-        return 2
-        ;;
-    *)
-        echo -n "Invalid module parsing! "
-        return 1
-        ;;
-    esac
-
-    echo -n "Unloading module \"$MODNAME\": "
-    modprobe -rs "$MODNAME"
-    if [ "$?" != 0 ]
-    then
-        echo "Unable to unload module \"$MODNAME\"" >&2
-        return 1
-    fi
-
-    return 0
-}
-
-#
-# check_load_module()
-#
-# 0 is not loaded, 1 is error, 2 is already loaded
-#
-check_load_module()
-{
-    if [ "$#" -lt "1" -o -z "$1" ]
-    then
-        echo "check_load_module(): Requires an argument" >&2
-        return 1
-    fi
-    MODNAME="$1"
-
-    echo -n "Module \"$MODNAME\": "
-    MODOUT="`awk '$1 ~ /^'$MODNAME'$/{print $1,$3;exit}' < /proc/modules 2>/dev/null`"
-    if [ -z "$MODOUT" ]
-    then
-        echo "Not loaded"
-        return 0
-    fi
-    echo "Loaded"
-    return 2
-}
-
-
-#
-# mount_fs()
-# Mount a filesystem.
-#
-# 0 is success, 1 is error, 2 is already mounted
-#
-mount_fs()
-{
-    TYPE="$1"
-    FULL_MOUNT="$2"
-    FULL_MOUNTSEARCH="`echo "$FULL_MOUNT" | sed -e 's/\//\\\\\//g'`"
-    MOUNTOUT="`awk '$2 ~ /^'$FULL_MOUNTSEARCH'$/{print $2; exit}' < /proc/mounts 2>/dev/null`"
-
-    if [ -n "$MOUNTOUT" ]
-    then
-        return 2
-    fi
-
-    # XXX some policy?
-    if [ ! -e "$FULL_MOUNT" ]; then
-        make_dir $FULL_MOUNT
-        if_fail "$?"
-    fi
-
-    echo -n "Mounting ${TYPE} filesystem at $FULL_MOUNT: "
-    mount -t ${TYPE} ${TYPE} $FULL_MOUNT
-    if [ $? != 0 ]
-    then
-        echo "Unable to mount ${TYPE} filesystem" >&2
-        return 1
-    fi
-
-    return 0
-}
-
-#
-# check_mount_fs()
-#
-# 0 is not mounted, 1 is error, 2 is already mounted
-#
-check_mount_fs()
-{
-    TYPE="$1"
-    FULL_MOUNT="$2"
-    FULL_MOUNTSEARCH="`echo "$FULL_MOUNT" | sed -e 's/\//\\\\\//g'`"
-    MOUNTOUT="`awk '$2 ~ /^'$FULL_MOUNTSEARCH'$/{print $2; exit}' < /proc/mounts 2>/dev/null`"
-
-    echo -n "Filesystem \"$TYPE\": "
-    if [ -n "$MOUNTOUT" ]
-    then
-        echo "Mounted"
-        return 2
-    fi
-    echo "Not mounted"
-    return 0
-}
-
-#
-# unmount_fs()
-# Unmount a filesystem
-#
-# 0 is success, 1 is error, 2 is not mounted
-#
-unmount_fs()
-{
-    TYPE="$1"
-    FULL_MOUNT="$2"
-    FULL_MOUNTSEARCH="`echo "$FULL_MOUNT" | sed -e 's/\//\\\\\//g'`"
-    MOUNTOUT="`awk '$2 ~ /^'$FULL_MOUNTSEARCH'$/{print $2; exit}' < /proc/mounts 2>/dev/null`"
-
-    if [ -z "$MOUNTOUT" ]
-    then
-        return 2
-    fi
-
-    echo -n "Unmounting ${TYPE} filesystem: "
-    umount $FULL_MOUNT
-    if [ $? != 0 ]
-    then
-        echo "Unable to unmount ${TYPE} filesystem" >&2
-        return 1
-    fi
-
-    return 0
-}
-
-load()
-{
-    for i in $(seq 0 $((${#LOAD_ACTIONS[*]} - 1)) ); do
-        eval ${LOAD_ACTIONS[i]}
-        if_fail "$?"
-    done
-}
-
-load_status()
-{
-    for i in $(seq 0 $((${#LOAD_ACTIONS[*]} - 1)) ); do
-        eval "check_${LOAD_ACTIONS[i]}"
-    done
-    return "$?"
-}
-
-online()
-{
-    CLUSTER="${1:-${O2CB_BOOTCLUSTER}}"
-    if [ -z "$CLUSTER" ]
-    then
-        echo "O2CB cluster not known"
-        return
-    fi
-
-    check_online $CLUSTER
-    if [ $? = 2 ]
-    then
-        echo "O2CB cluster ${CLUSTER} already online"
-        return
-    fi
-
-    if ! [ -f ${CLUSTERCONF} ]
-    then
-        echo -n "Checking O2CB cluster configuration : "
-        if_fail 1
-    fi
-
-    echo -n "Starting O2CB cluster ${CLUSTER}: "
-    OUTPUT="`o2cb_ctl -H -n "${CLUSTER}" -t cluster -a online=yes 2>&1`"
-    if [ $? = 0 ]
-    then
-        set_timeouts
-        echo "OK"
-        return
-    else
-        echo "Failed"
-        echo "$OUTPUT"
-    fi
-
-    echo -n "Stopping O2CB cluster ${CLUSTER}: "
-    OUTPUT="`o2cb_ctl -H -n "${CLUSTER}" -t cluster -a online=no 2>&1`"
-    if_fail "$?" "$OUTPUT"
-}
-
-#
-# check_online()
-#
-# 0 is not online, 1 is error, 2 is online
-#
-check_online()
-{
-    if [ "$#" -lt "1" -o -z "$1" ]
-    then
-        echo "check_online(): Requires an argument" >&2
-        return 1
-    fi
-    CLUSTER="$1"
-
-    RC=0
-    if [ -d "$(configfs_path)/cluster/${CLUSTER}/node/" ]
-    then
-        ls -1 "$(configfs_path)/cluster/${CLUSTER}/node/" | while read NODE
-        do
-            LOCAL="`cat \"$(configfs_path)/cluster/${CLUSTER}/node/${NODE}/local\"`"
-            if [ $LOCAL = 1 ]
-            then
-                return 2
-            fi
-        done
-        if [ $? = 2 ]
-        then
-            RC=2
-        fi
-    fi
-    return $RC
-}
-
-offline()
-{
-    CLUSTER="${1:-${O2CB_BOOTCLUSTER}}"
-    if [ -z "$CLUSTER" ]
-    then
-        return
-    fi
-
-    if [ $# -gt 1 ]
-    then
-        FORCE=$2
-    else
-        FORCE=0
-    fi
-
-    if [ ! -e "$(configfs_path)/cluster/${CLUSTER}" ]
-    then
-        return
-    fi
-
-    clean_heartbeat $CLUSTER
-
-    echo -n "Stopping O2CB cluster ${CLUSTER}: "
-    check_heartbeat $CLUSTER
-    if [ $? != 0 ]
-    then
-        echo "Failed"
-        echo "Unable to stop cluster as heartbeat region still active" >&2
-        exit 1
-    fi
-
-    if [ $FORCE -eq 1 ]
-    then
-        clean_cluster $CLUSTER
-        if_fail "$?" "Unable to force-offline cluster $CLUSTER" >&2
-    else
-        OUTPUT="`o2cb_ctl -H -n "${CLUSTER}" -t cluster -a online=no 2>&1`"
-        if_fail "$?" "$OUTPUT - Try to force-offline the O2CB cluster"
-    fi
-
-    unload_module ocfs2
-    if_fail "$?"
-}
-
-start()
-{
-    if [ "$O2CB_ENABLED" != "true" ]
-    then
-        exit 0
-    fi
-
-    load
-    online "$1"
-}
-
-unload()
-{
-    if [ -d "$(configfs_path)/cluster/" ]
-    then
-        ls -1 $(configfs_path)/cluster/ | while read CLUSTER
-        do
-            if [ ! -L "$(configfs_path)/cluster/${CLUSTER}" -a \
-                 -d "$(configfs_path)/cluster/${CLUSTER}" ]
-            then
-                echo "Unable to unload modules as O2CB cluster ${CLUSTER} is still online" >&2
-                exit 1
-            fi
-        done
-        if [ $? = 1 ]
-        then
-            exit 1
-        fi
-    fi
-
-    for i in $(seq $((${#LOAD_ACTIONS[*]} - 1)) -1 0); do
-        eval "un${LOAD_ACTIONS[i]}"
-        if_fail "$?"
-    done
-}
-
-stop()
-{
-    offline "$1"
-    unload
-}
-
-configure()
-{
-    configure_ask
-    write_sysconfig
-    if_fail "$?" "Unable to write the driver configuration"
-}
-
-status()
-{
-    load_status
-    if [ $? != 2 ]
-    then
-        return 0;
-    fi
-
-    CLUSTER="${1:-${O2CB_BOOTCLUSTER}}"
-    if [ -z "$CLUSTER" ]
-    then
-        return 1;
-    fi
-
-    echo -n "Checking O2CB cluster $CLUSTER: "
-    check_online $CLUSTER
-    if [ $? = 2 ]
-    then
-       echo "Online"
-    else
-       echo "Offline"
-       return 0;
-    fi
-
-    show_timeouts
-
-    echo -n "Checking O2CB heartbeat: "
-    check_heartbeat $CLUSTER
-    if [ $? = 2 ]
-    then
-        echo "Active"
-    else
-        echo "Not active"
-        return 0;
-    fi
-
-    return
-
-    echo -n "Checking if O2CB is loaded: "
-    RC=0
-    for MODSPEC in $MODULE_LIST
-    do
-        MODULE_NAME="`echo $MODSPEC | cut -d: -f1`"
-        FSTYPE="`echo $MODSPEC | cut -d: -f2`"
-        MOUNT_POINT="`echo $MODSPEC | cut -d: -f3`"
-
-        if grep "^${MODULE_NAME} " /proc/modules >/dev/null 2>&1
-        then
-            echo -n "${MODULE_NAME} "
-        else
-            RC=1
-            break
-        fi
-    done
-    if_fail "$RC"
-
-    echo -n "Checking O2CB mount points: "
-    for MODSPEC in $MODULE_LIST
-    do
-        MODULE_NAME="`echo $MODSPEC | cut -d: -f1`"
-        FSTYPE="`echo $MODSPEC | cut -d: -f2`"
-        MOUNT_POINT="`echo $MODSPEC | cut -d: -f3`"
-
-        if [ -z "$FSTYPE" -o -z "$MOUNT_POINT" ]
-        then
-            continue
-        fi
-
-        FULL_MOUNT="${O2CB_MANAGER}/${MOUNT_POINT}"
-        FULL_MOUNTSEARCH="`echo "$FULL_MOUNT" | sed -e 's/\//\\\\\//g'`"
-        if grep "^${FSTYPE} ${FULL_MOUNTSEARCH} ${FSTYPE}" /proc/mounts >/dev/null 2>&1
-        then
-            echo -n "${MOUNT_POINT} "
-        else
-            RC=1
-            break
-        fi
-    done
-    if_fail "$RC"
-}
-
-
-
-case "$1" in
-    start)
-        start "$2"
-        ;;
-
-    status)
-        status "$2"
-        ;;
-
-    stop)
-        stop "$2"
-        ;;
-
-    restart)
-        stop "$2"
-        start "$2"
-        ;;
-
-    force-reload)
-        stop "$2"
-        start "$2"
-        ;;
-
-    load)
-        load
-        ;;
-
-    online)
-        load
-        online "$2"
-        ;;
-
-    offline)
-        offline "$2"
-        ;;
-
-    force-offline)
-        offline "$2" 1
-        ;;
-
-    unload)
-        offline "$2"
-        unload
-        ;;
-
-    configure)
-        configure
-        if [ "$O2CB_ENABLED" = "true" ]
-        then
-            start
-        else
-            stop
-        fi
-        ;;
-
-    enable)
-        O2CB_ENABLED=true
-        write_sysconfig
-        if_fail "$?" "Unable to write the driver configuration"
-        start
-        ;;
-
-    disable)
-        O2CB_ENABLED=false
-        write_sysconfig
-        if_fail "$?" "Unable to write the driver configuration"
-        stop
-        ;;
-
-    *)
-        echo "Usage: $0 {start|stop|restart|force-reload|enable|disable|configure|load|unload|online|offline|force-offline|status}"
-        exit 1
-        ;;
-esac
-
-exit 0

Added: branches/cman-based/vendor/common/o2cb.init.in
===================================================================
--- branches/cman-based/vendor/common/o2cb.init.in	2007-08-14 22:28:39 UTC (rev 1379)
+++ branches/cman-based/vendor/common/o2cb.init.in	2007-08-14 23:21:13 UTC (rev 1380)
@@ -0,0 +1,1333 @@
+#!/bin/bash
+# init fragment for O2CB.
+#
+# chkconfig: 2345 24 20
+# description: Load O2CB cluster services at system boot.
+#
+### BEGIN INIT INFO
+# Provides: o2cb
+# Required-Start: $network
+# Should-Start:
+# Required-Stop:
+# Default-Start: 2 3 5
+# Default-Stop:
+# Description: Load O2CB cluster services at system boot.
+### END INIT INFO
+
+# Force LC_ALL=C
+export LC_ALL=C
+
+CLUSTERCONF=/etc/ocfs2/cluster.conf
+
+if [ -f /etc/sysconfig/o2cb ]
+then
+    # Red Hat and Novell
+    CONFIGURATION=/etc/sysconfig/o2cb
+elif [ -f /etc/default/o2cb ]
+then
+    # Debian
+    CONFIGURATION=/etc/default/o2cb
+elif [ -d /etc/sysconfig ]
+then
+    CONFIGURATION=/etc/sysconfig/o2cb
+else
+    CONFIGURATION=/etc/default/o2cb
+fi
+
+# The default values should always be in sync with the kernel
+DEF_HEARTBEAT_THRESHOLD=31
+DEF_IDLE_TIMEOUT_MS=30000
+DEF_KEEPALIVE_DELAY_MS=2000
+DEF_RECONNECT_DELAY_MS=2000
+
+# Minimum timeout values
+MIN_HEARTBEAT_THRESHOLD=7
+MIN_IDLE_TIMEOUT_MS=5000
+MIN_KEEPALIVE_DELAY_MS=1000
+MIN_RECONNECT_DELAY_MS=2000
+
+CMAN_SUPPORTED=@BUILD_CMAN_SUPPORT@
+[ "$CMAN_SUPPORTED" != "yes" ] && CMAN_SUPPORTED=
+
+# Source configuration, 
+[ -f "${CONFIGURATION}" ] && . "${CONFIGURATION}"
+# Need this default
+[ -z "$O2CB_STACK" ] && O2CB_STACK=o2cb
+
+configfs_path()
+{
+    # Note that this is only valid *after* configfs is loaded
+    if [ -d /sys/kernel/config ]
+    then
+        echo /sys/kernel/config
+    else
+        echo /config
+    fi
+}
+
+
+#
+# if_fail()
+#
+# Evaluates return codes.  If 0, prints "OK", if 1, prints "Failed"
+# and exits.  If 2, status is "already done" and nothing is printed.
+# The rest of the functions in here all honor this convention.
+#
+if_fail()
+{
+    RC="$1"
+    REASON="$2"
+    if [ "$RC" = "0" ]
+    then
+        echo "OK"
+        return
+    elif [ "$RC" = "2" ]
+    then
+        return
+    fi
+    echo "Failed"
+    if [ -n "${REASON}" ]
+    then
+        echo "${REASON}" >&2
+    fi
+    exit 1
+}
+
+
+#
+# write_sysconfig()
+#
+# Writes the system configuration out
+#
+write_sysconfig()
+{
+    echo -n "Writing O2CB configuration: "
+    cat >"${CONFIGURATION}" <<EOF
+#
+# This is a configuration file for automatic startup of the O2CB
+# driver.  It is generated by running /etc/init.d/o2cb configure.
+# Please use that method to modify this file
+#
+
+# O2CB_ENABELED: 'true' means to load the driver on boot.
+O2CB_ENABLED=${O2CB_ENABLED:-false}
+
+# O2CB_STACK: The name of the cluster stack backing O2CB.
+O2CB_STACK=${O2CB_STACK}
+
+# O2CB_BOOTCLUSTER: If not empty, the name of a cluster to start.
+O2CB_BOOTCLUSTER=${O2CB_BOOTCLUSTER}
+
+# O2CB_HEARTBEAT_THRESHOLD: Iterations before a node is considered dead.
+O2CB_HEARTBEAT_THRESHOLD=${O2CB_HEARTBEAT_THRESHOLD}
+
+# O2CB_IDLE_TIMEOUT_MS: Time in ms before a network connection is considered dead.
+O2CB_IDLE_TIMEOUT_MS=${O2CB_IDLE_TIMEOUT_MS}
+
+# O2CB_KEEPALIVE_DELAY_MS: Max time in ms before a keepalive packet is sent
+O2CB_KEEPALIVE_DELAY_MS=${O2CB_KEEPALIVE_DELAY_MS}
+
+# O2CB_RECONNECT_DELAY_MS: Min time in ms between connection attempts
+O2CB_RECONNECT_DELAY_MS=${O2CB_RECONNECT_DELAY_MS}
+
+EOF
+
+    if [ $? != 0 ]
+    then
+        return 1
+    fi
+    return 0
+}
+
+#
+# read_timeout()
+#   Returns timeout value provided by user to caller in RET_VAL
+#
+read_timeout()
+{
+    if [ "$#" -lt "4" ]; then
+        echo "read_timeout(): Requires more arguments" >&2
+        exit 1
+    fi
+
+    ATTRIB_NAME=$1
+    ATTRIB_VAL=$2
+    MIN_ATTRIB_VAL=$3
+    DEF_ATTRIB_VAL=$4
+    RET_VAL=0
+
+    while :
+    do
+        if [ -z $ATTRIB_VAL ]; then
+            CUR=$DEF_ATTRIB_VAL
+        else
+            CUR=$ATTRIB_VAL
+        fi
+        echo -n "Specify ${ATTRIB_NAME} (>=$MIN_ATTRIB_VAL) [$CUR]: "
+        read LINE
+        case "$LINE" in
+        "")
+            RET_VAL="$ATTRIB_VAL"
+            break
+            ;;
+
+        *[^0-9]*)
+            echo "Invalid ${ATTRIB_NAME} value: $LINE" >&2
+            ;;
+        *)
+            if [ $LINE -lt $MIN_ATTRIB_VAL ]; then
+                echo "${ATTRIB_NAME} cannot be less than $MIN_ATTRIB_VAL" >&2
+            else
+                RET_VAL="$LINE"
+                break
+            fi
+            ;;
+        esac
+    done
+}
+
+set_timeouts()
+{
+    O2CB_HEARTBEAT_THRESHOLD_FILE_OLD=/proc/fs/ocfs2_nodemanager/hb_dead_threshold
+    O2CB_HEARTBEAT_THRESHOLD_FILE=$(configfs_path)/cluster/${CLUSTER}/heartbeat/dead_threshold
+    if [ -n "$O2CB_HEARTBEAT_THRESHOLD" ]; then
+        if [ -f "$O2CB_HEARTBEAT_THRESHOLD_FILE" ]; then
+            echo "$O2CB_HEARTBEAT_THRESHOLD" > "$O2CB_HEARTBEAT_THRESHOLD_FILE"
+        elif [ -f "$O2CB_HEARTBEAT_THRESHOLD_FILE_OLD" ]; then 
+            echo "$O2CB_HEARTBEAT_THRESHOLD" > "$O2CB_HEARTBEAT_THRESHOLD_FILE_OLD"
+        fi
+    fi
+
+    O2CB_IDLE_TIMEOUT_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/idle_timeout_ms
+    if [ -n "$O2CB_IDLE_TIMEOUT_MS" ]; then
+        if [ -f "$O2CB_IDLE_TIMEOUT_MS_FILE" ]; then
+            echo "$O2CB_IDLE_TIMEOUT_MS" > "$O2CB_IDLE_TIMEOUT_MS_FILE"
+        fi
+    fi
+
+    O2CB_KEEPALIVE_DELAY_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/keepalive_delay_ms
+    if [ -n "$O2CB_KEEPALIVE_DELAY_MS" ]; then
+        if [ -f "$O2CB_KEEPALIVE_DELAY_MS_FILE" ]; then
+            echo "$O2CB_KEEPALIVE_DELAY_MS" > "$O2CB_KEEPALIVE_DELAY_MS_FILE"
+        fi
+    fi
+
+    O2CB_RECONNECT_DELAY_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/reconnect_delay_ms
+    if [ -n "$O2CB_RECONNECT_DELAY_MS" ]; then
+        if [ -f "$O2CB_RECONNECT_DELAY_MS_FILE" ]; then
+            echo "$O2CB_RECONNECT_DELAY_MS" > "$O2CB_RECONNECT_DELAY_MS_FILE"
+        fi
+    fi
+}
+
+show_timeouts()
+{
+
+    O2CB_HEARTBEAT_THRESHOLD_FILE_OLD=/proc/fs/ocfs2_nodemanager/hb_dead_threshold
+    O2CB_HEARTBEAT_THRESHOLD_FILE=$(configfs_path)/cluster/${CLUSTER}/heartbeat/dead_threshold
+    if [ -f "$O2CB_HEARTBEAT_THRESHOLD_FILE" ]; then
+        VAL=`cat "$O2CB_HEARTBEAT_THRESHOLD_FILE"`
+        echo "Heartbeat dead threshold = ${VAL}"
+    elif [ -f "$O2CB_HEARTBEAT_THRESHOLD_FILE_OLD" ]; then
+        VAL=`cat "$O2CB_HEARTBEAT_THRESHOLD_FILE_OLD"`
+        echo "  Heartbeat dead threshold: ${VAL}"
+    fi
+
+    O2CB_IDLE_TIMEOUT_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/idle_timeout_ms
+    if [ -f "$O2CB_IDLE_TIMEOUT_MS_FILE" ]; then
+        VAL=`cat "$O2CB_IDLE_TIMEOUT_MS_FILE"`
+        echo "  Network idle timeout: ${VAL}"
+    fi
+
+    O2CB_KEEPALIVE_DELAY_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/keepalive_delay_ms
+    if [ -f "$O2CB_KEEPALIVE_DELAY_MS_FILE" ]; then
+        VAL=`cat "$O2CB_KEEPALIVE_DELAY_MS_FILE"`
+        echo "  Network keepalive delay: ${VAL}"
+    fi
+
+    O2CB_RECONNECT_DELAY_MS_FILE=$(configfs_path)/cluster/${CLUSTER}/reconnect_delay_ms
+    if [ -f "$O2CB_RECONNECT_DELAY_MS_FILE" ]; then
+        VAL=`cat "$O2CB_RECONNECT_DELAY_MS_FILE"`
+        echo "  Network reconnect delay: ${VAL}"
+    fi
+}
+
+#
+# configure_ask()
+#
+# Ask configuration questions, setting the shell vars.
+#
+configure_ask()
+{
+    cat <<EOF
+Configuring the O2CB driver.
+
+This will configure the on-boot properties of the O2CB driver.
+The following questions will determine whether the driver is loaded on
+boot.  The current values will be shown in brackets ('[]').  Hitting
+<ENTER> without typing an answer will keep that current value.  Ctrl-C
+will abort.
+
+EOF
+
+    while :
+    do
+        if [ "$O2CB_ENABLED" = "true" ]
+        then
+            CUR=y
+        else
+            CUR=n
+        fi
+        echo -n "Load O2CB driver on boot (y/n) [$CUR]: "
+        read LINE
+        case "$LINE" in
+        "")
+            break
+            ;;
+        y|Y)
+            O2CB_ENABLED=true
+            break
+            ;;
+        n|N)
+            O2CB_ENABLED=false
+            break
+            ;;
+        *)
+            echo "Invalid answer: $LINE" >&2
+            ;;
+        esac
+    done
+
+    while :
+    do
+        echo -n "Cluster stack backing O2CB [$O2CB_STACK]: "
+        read LINE
+        case "$LINE" in
+        "")
+            break
+            ;;
+        o2cb|heartbeat2)
+            O2CB_STACK="$LINE"
+            break
+        cman)
+            if [ "$CMAN_SUPPORTED" = "yes" ]
+            then
+                O2CB_STACK="$LINE"
+                break
+            fi
+            echo "Cluster stack \"$LINE\" not supported" >&2
+            ;;
+        *)
+            echo "Invalid answer: $LINE" >&2
+            ;;
+        esac
+    done
+
+    while :
+    do
+        echo -n "Cluster to start on boot (Enter \"none\" to clear) [$O2CB_BOOTCLUSTER]: "
+        read LINE
+        case "$LINE" in
+        "")
+            break
+            ;;
+        none)
+            O2CB_BOOTCLUSTER=
+            break
+            ;;
+
+        *[^a-zA-Z0-9]*)
+            echo "Invalid cluster name: $LINE" >&2
+            ;;
+        *)
+            O2CB_BOOTCLUSTER="$LINE"
+            break
+            ;;
+        esac
+    done
+
+    read_timeout "heartbeat dead threshold" "$O2CB_HEARTBEAT_THRESHOLD" "$MIN_HEARTBEAT_THRESHOLD" "$DEF_HEARTBEAT_THRESHOLD"
+    O2CB_HEARTBEAT_THRESHOLD="$RET_VAL"
+
+    read_timeout "network idle timeout in ms" "$O2CB_IDLE_TIMEOUT_MS" "$MIN_IDLE_TIMEOUT_MS" "$DEF_IDLE_TIMEOUT_MS"
+    O2CB_IDLE_TIMEOUT_MS="$RET_VAL"
+
+    read_timeout "network keepalive delay in ms" "$O2CB_KEEPALIVE_DELAY_MS" "$MIN_KEEPALIVE_DELAY_MS" "$DEF_KEEPALIVE_DELAY_MS"
+    O2CB_KEEPALIVE_DELAY_MS="$RET_VAL"
+
+    read_timeout "network reconnect delay in ms" "$O2CB_RECONNECT_DELAY_MS" "$MIN_RECONNECT_DELAY_MS" "$DEF_RECONNECT_DELAY_MS"
+    O2CB_RECONNECT_DELAY_MS="$RET_VAL"
+
+    # XXX ask about mount point base
+}
+
+
+#
+# make_dir()
+#
+# Create $1
+# Returns 0 on success, 1 on error, 2 if it already exists.
+#
+make_dir()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "make_dir(): Requires an argument" >&2
+        return 1
+    fi
+    DIR="$1"
+    if [ -e "$DIR" ]
+    then
+        if [ -d "$DIR" ]
+        then
+            return 2
+        fi
+        echo "make_dir(): File $DIR is not a directory" >&2
+        return 1
+    fi
+
+    echo -n "Creating directory '$DIR': "
+    mkdir -p "$DIR" 2>/dev/null
+    if [ $? != 0 ]
+    then
+        echo "Unable to create directory '$DIR'" >&2
+        return 1
+    fi
+    return 0
+}
+
+
+#
+# driver_filesystem()
+# Check to see if a filesystem driver is loaded.
+#
+# 0 is loaded, 1 is not.
+#
+driver_filesystem()
+{
+    if [ "$#" != "1" -o -z "$1" ]
+    then
+        echo "driver_filesystem(): Missing an argument" >&2
+        exit 1
+    fi
+    FSNAME="$1"
+
+    FSOUT="`awk '$2 ~ /^'$FSNAME'$/{print $1;exit}' < /proc/filesystems 2>/dev/null`"
+    test -n "$FSOUT"
+    return $?
+}
+
+
+#
+# load_filesystem()
+# Load a filesystem driver.
+#
+# 0 is success, 1 is error, 2 is already loaded.
+#
+load_filesystem()
+{
+    if [ "$#" != "1" -o -z "$1" ]
+    then
+        echo "load_filesystem(): Missing an argument" >&2
+        return 1
+    fi
+    FSNAME="$1"
+
+    driver_filesystem "$FSNAME" && return 2
+
+    echo -n "Loading filesystem \"$FSNAME\": "
+    modprobe -s "$FSNAME"
+    if [ "$?" != 0 ]
+    then
+        echo "Unable to load filesystem \"$FSNAME\"" >&2
+        return 1
+    fi
+
+    return 0
+}
+
+#
+# unload_filesystem()
+# Unload a filesystem driver.  Be careful to notice if the driver is
+# built-in and do nothing.
+#
+# 0 is success, 1 is error, 2 is already loaded.
+#
+unload_filesystem()
+{
+    if [ "$#" != "1" -o -z "$1" ]
+    then
+        echo "unload_filesystem(): Missing an argument" >&2
+        return 1
+    fi
+    FSNAME="$1"
+
+    driver_filesystem "$FSNAME" || return 2
+
+    MODOUT="`awk '$1 ~ /^'$FSNAME'$/{print $1,$3;exit}' < /proc/modules 2>/dev/null`"
+    if [ -z "$MODOUT" ]
+    then
+        # The driver is built in, we can't unload it.
+        return 2
+    fi
+
+    case "$MODOUT" in
+    $FSNAME\ 0)
+        ;;
+    $FSNAME\ *)
+        # The driver is busy, leave it alone
+        return 2
+        ;;
+    *)
+        echo -n "Invalid module parsing! "
+        return 1
+        ;;
+    esac
+
+    echo -n "Unloading module \"$FSNAME\": "
+    modprobe -rs "$FSNAME"
+    if [ "$?" != 0 ]
+    then
+        echo "Unable to unload module \"$FSNAME\"" >&2
+        return 1
+    fi
+
+    return 0
+}
+
+#
+# check_filesystem()
+# Check to see if a filesystem of type $1 is mounted at $2.
+#
+# 0 is mounted, 1 is not.
+#
+check_filesystem()
+{
+    if [ "$#" != "2" -o -z "$1" -o -z "$2" ]
+    then
+        echo "check_filesystem(): Missing arguments" >&2
+        exit 1
+    fi
+    FSNAME="$1"
+    MOUNTPOINT="$2"
+
+    FULL_MOUNTSEARCH="`echo "$MOUNTPOINT" | sed -e 's/\//\\\\\//g'`"
+    MOUNTOUT="`awk '$2 ~ /^'$FULL_MOUNTSEARCH'$/ && $3 ~ /^'$FSNAME'$/{print $2; exit}' < /proc/mounts 2>/dev/null`"
+    test -n "$MOUNTOUT"
+    return $?
+}
+
+#
+# mount_filesystem()
+# Mounts a pseudo-filesystem of type $1 on mountpoint $2.  It will
+# load the drivers for $1 and create $2 if needed.
+#
+# 0 is success, 1 is error, 2 is already mounted.
+# 
+mount_filesystem()
+{
+    if [ "$#" != "2" -o -z "$1" -o -z "$2" ]
+    then
+        echo "mount_filesystem(): Missing arguments" >&2
+        return 1
+    fi
+    FSNAME="$1"
+    MOUNTPOINT="$2"
+
+    check_filesystem "$FSNAME" "$MOUNTPOINT" && return 2
+
+    load_filesystem "$FSNAME"
+    if_fail $?
+
+    # XXX some policy?
+    if [ ! -e "$MOUNTPOINT" ]; then
+        make_dir $MOUNTPOINT
+        if_fail "$?"
+    fi
+
+    echo -n "Mounting ${FSNAME} filesystem at ${MOUNTPOINT}: "
+    mount -t ${FSNAME} ${FSNAME} ${MOUNTPOINT}
+    if [ $? != 0 ]
+    then
+        echo "Unable to mount ${FSNAME} filesystem" >&2
+        return 1
+    fi
+
+    return 0
+}
+
+#
+# unmount_filesystem()
+# Unmount a pseudo-filesystem of type $1 from mountpoint $2.  It will
+# remove the driver for $1 if it can.
+#
+# 0 is success, 1 is error, 2 is not mounted
+#
+unmount_filesystem()
+{
+    if [ "$#" != "2" -o -z "$1" -o -z "$2" ]
+    then
+        echo "unmount_filesystem(): Missing arguments" >&2
+        return 1
+    fi
+    FSNAME="$1"
+    MOUNTPOINT="$2"
+
+    if check_filesystem "$FSNAME" "$MOUNTPOINT"
+    then
+        echo -n "Unmounting ${FSNAME} filesystem: "
+        umount $MOUNTPOINT
+        RC=$?
+        if [ $RC != 0 ]
+        then
+            echo "Unable to unmount ${FSNAME} filesystem" >&2
+            return 1
+        fi
+        if_fail $RC  # For the success string
+    fi
+
+    unload_filesystem "$FSNAME"
+    return $?
+}
+
+#
+# status_filesystem()
+# Report the status of a filesystem, whether it is mounted or not
+#
+# 0 is not mounted, 1 is error, 2 is already mounted
+#
+status_filesystem()
+{
+    if [ "$#" != "2" -o -z "$1" -o -z "$2" ]
+    then
+        echo "status_filesystem(): Missing arguments" >&2
+        return 1
+    fi
+    FSNAME="$1"
+    MOUNTPOINT="$2"
+
+    echo -n "Driver for \"$FSNAME\": "
+    if driver_filesystem "$FSNAME"
+    then
+        echo "Loaded"
+    else
+        echo "Not loaded"
+        return 0
+    fi
+
+    echo -n "Filesystem \"$FSNAME\": "
+    if check_filesystem "$FSNAME" "$MOUNTPOINT"
+    then
+        echo "Mounted"
+        return 2
+    fi
+    echo "Not mounted"
+    return 0
+} 
+
+#
+# check_heartbeat()
+#
+# 0 is hb not active, 1 is error, 2 is hb active
+#
+check_heartbeat()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "check_heartbeat(): Requires an argument" >&2
+        return 1
+    fi
+    CLUSTER="$1"
+
+    RC=0
+    if [ -d "$(configfs_path)/cluster/${CLUSTER}/heartbeat/" ]
+    then
+        ls -1 "$(configfs_path)/cluster/${CLUSTER}/heartbeat/" | while read HBUUID
+        do
+            if [ -d "$(configfs_path)/cluster/${CLUSTER}/heartbeat/${HBUUID}" ]
+            then
+                return 2;
+            fi
+        done
+        if [ $? = 2 ]
+        then
+            RC=2
+        fi
+    fi
+
+    return $RC
+}
+
+#
+# clean_heartbeat()
+# Removes the inactive heartbeat regions
+# 
+clean_heartbeat()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "clean_heartbeat(): Requires an argument" >&2
+        return 1
+    fi
+    CLUSTER="$1"
+
+    if [ ! -f "$(configfs_path)/cluster/${CLUSTER}/heartbeat/*" ]
+    then
+        return
+    fi
+
+    echo -n "Cleaning heartbeat on ${CLUSTER}: "
+
+    ls -1 "$(configfs_path)/cluster/${CLUSTER}/heartbeat/" | while read HBUUID
+    do
+        if [ ! -d "$(configfs_path)/cluster/${CLUSTER}/heartbeat/${HBUUID}" ]
+        then
+            continue
+        fi
+
+        OUTPUT="`ocfs2_hb_ctl -I -u ${HBUUID} 2>&1`"
+        if [ $? != 0 ]
+        then
+            echo "Failed"
+            echo "${OUTPUT}" >&2
+            exit 1
+        fi
+
+        REF="`echo ${OUTPUT} | awk '/refs/ {print $2; exit;}' 2>&1`"
+        if [ $REF != 0 ]
+        then
+           echo "Failed"
+           echo "At least one heartbeat region still active" >&2
+           exit 1
+        else
+           OUTPUT="`ocfs2_hb_ctl -K -u ${HBUUID} 2>&1`"
+        fi
+    done
+    if [ $? = 1 ]
+    then
+        exit 1
+    fi
+    echo "OK"
+}
+
+#
+# clean_cluster()
+# Force cleans configured cluster
+#
+# 0 is clean, 1 is error, 2 is not clean
+#
+clean_cluster()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "clean_cluster(): Requires an argument" >&2
+        return 1
+    fi
+    CLUSTER="$1"
+
+    if [ -d "$(configfs_path)/cluster/${CLUSTER}/node/" ]
+    then
+        ls -1 "$(configfs_path)/cluster/${CLUSTER}/node/" | while read NODE
+        do
+            rmdir "$(configfs_path)/cluster/${CLUSTER}/node/${NODE}" >/dev/null 2>&1
+        done
+    fi
+
+    if [ -d "$(configfs_path)/cluster/${CLUSTER}" ]
+    then
+        rmdir "$(configfs_path)/cluster/${CLUSTER}" >/dev/null 2>&1
+    fi
+
+    if [ -d "$(configfs_path)/cluster/${CLUSTER}" ]
+    then
+        return 2
+    fi
+
+    return 0
+}
+
+#
+# load_heartbeat()
+# Load a given heartbeat method and set it to be the active mode.
+#
+# 0 is success, 1 is error, and 2 is already active.
+#
+load_heartbeat()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "load_heartbeat(): Requires an argument" >&2
+        exit 1 
+    fi
+    HB_METHOD="$1"
+    HB_MODULE="ocfs2_${HB_METHOD}_heartbeat"
+
+    #
+    # Older drivers don't have heartbeat_modes.  They're disk
+    # heartbeat only.  It's loaded with ocfs2_nodemanager, which is pulled
+    # in by loading ocfs2_dlmfs.
+    #
+    # For a newer driver, if ocfs2_nodemanager is loaded, we'll see
+    # heartbeat_mode.  Thus, we can check for the loaded
+    # ocfs2_<method>_heartbeat driver below.
+    #
+    if [ ! -e "$(configfs_path)/cluster/heartbeat_mode" ]
+    then
+        [ "$HB_METHOD" = "disk" ] && return 2
+        echo "Checking for available heartbeat method: "
+        echo "Unsupported heartbeat method: $HB_METHOD" >&2
+        if_fail 1 "Unsupported heartbeat method: $HB_METHOD"
+    fi
+    
+    CUR_METHOD="$(cat "$(configfs_path)/cluster/heartbeat_mode")"
+    [ "$CUR_METHOD" = "$HB_METHOD" ] && return 2
+
+    HBOUT="$(awk '/^'$HB_METHOD'$/{print;exit}' "$(configfs_path)/cluster/heartbeat_available_modes" 2>/dev/null)"
+    if [ -z "$HBOUT" ]
+    then
+        echo -n "Loading module \"${HB_MODULE}\": "
+        modprobe -s "$HB_MODULE"
+        if [ "$?" != 0 ]
+        then
+            echo "Unable to load module \"$HB_MODULE\"" >&2
+            if_fail 1 "Unable to load module \"$HB_MODULE\""
+        fi
+        if_fail 0
+    fi
+
+    echo -n "Setting heartbeat mode \"$HB_METHOD\": "
+    echo "$HB_METHOD" >"$(configfs_path)/cluster/heartbeat_mode" 2>/dev/null
+    if_fail $? "Unable to set heartbeat mode \"$HB_METHOD\""
+}
+
+#
+# unload_heartbeat()
+# Unload a given heartbeat method.
+#
+# 0 is success, 1 is error, and 2 is not loaded.
+#
+unload_heartbeat()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "unload_heartbeat(): Requires an argument" >&2
+        exit 1 
+    fi
+    HB_METHOD="$1"
+    HB_MODULE="ocfs2_${HB_METHOD}_heartbeat"
+
+    #
+    # Older drivers don't have heartbeat drivers.  If we can't find
+    # the driver module, it might as well be unloaded :-)
+    #
+    MODOUT="`awk '$1 ~ /^'$HB_MODULE'$/{print $1,$3;exit}' < /proc/modules 2>/dev/null`"
+    if [ -z "$MODOUT" ]
+    then
+        # Either it's not loaded or the driver is built in
+        return 2
+    fi
+
+    case "$MODOUT" in
+    $HB_MODULE\ 0)
+        ;;
+    $HB_MODULE\ *)
+        # The driver is busy, leave it alone
+        return 2
+        ;;
+    *)
+        echo -n "Invalid module parsing! "
+        exit 1
+        ;;
+    esac
+
+    echo -n "Unloading module \"$HB_MODULE\": "
+    modprobe -rs "$HB_MODULE"
+    if [ "$?" != 0 ]
+    then
+        echo "Unable to unload module \"$HB_MODULE\"" >&2
+        if_fail 1 "$Unable to unload module \"$HB_MODULE\""
+    fi
+
+    if_fail 0
+}
+
+#
+# unload_module()
+# Unload a module
+#
+# 0 is success, 1 is error, 2 is not loaded
+# 
+unload_module()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "unload_module(): Requires an argument" >&2
+        return 1
+    fi
+    MODNAME="$1"
+
+    MODOUT="`awk '$1 ~ /^'$MODNAME'$/{print $1,$3;exit}' < /proc/modules 2>/dev/null`"
+    if [ -z "$MODOUT" ]
+    then
+        return 2
+    fi
+    case "$MODOUT" in
+    $MODNAME\ 0)
+        ;;
+    $MODNAME\ *)
+        return 2
+        ;;
+    *)
+        echo -n "Invalid module parsing! "
+        return 1
+        ;;
+    esac
+
+    echo -n "Unloading module \"$MODNAME\": "
+    modprobe -rs "$MODNAME"
+    if [ "$?" != 0 ]
+    then
+        echo "Unable to unload module \"$MODNAME\"" >&2
+        return 1
+    fi
+
+    return 0
+}
+
+#
+# check_load_module()
+#
+# 0 is not loaded, 1 is error, 2 is already loaded
+#
+check_load_module()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "check_load_module(): Requires an argument" >&2
+        return 1
+    fi
+    MODNAME="$1"
+
+    echo -n "Module \"$MODNAME\": "
+    MODOUT="`awk '$1 ~ /^'$MODNAME'$/{print $1,$3;exit}' < /proc/modules 2>/dev/null`"
+    if [ -z "$MODOUT" ]
+    then
+        echo "Not loaded"
+        return 0
+    fi
+    echo "Loaded"
+    return 2
+}
+
+load()
+{
+    # XXX: SPECIAL CASE!  We must load configfs for configfs_path() to work
+    load_filesystem "configfs"
+    if_fail $?
+
+    mount_filesystem "configfs" "$(configfs_path)"
+    if_fail $?
+
+    mount_filesystem "ocfs2_dlmfs" "/dlm"
+    if_fail $?
+
+    case "$O2CB_STACK" in
+        o2cb) load_heartbeat "disk" ;;
+        heartbeat2) load_heartbeat "user" ;;
+        cman)
+            if [ "$CMAN_SUPPORTED" = "yes" ]
+            then
+                load_heartbeat "user"
+            else
+                echo "Cluster stack \"${O2CB_STACK}\" not supported" >&2
+                exit 1
+            fi
+            ;;
+        *)
+            echo "Invalid O2CB_STACK: $O2CB_STACK" >&2
+            exit 1
+        ;;
+    esac
+
+    return 0
+}
+
+load_status()
+{
+    status_filesystem "configfs" "$(configfs_path)"
+    status_filesystem "ocfs2_dlmfs" "/dlm"
+
+    # TODO
+    # Check the status of the appropriate heartbeat driver based on our
+    # cluster type.
+
+    return 0
+}
+
+online_o2cb()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "online_o2cb(): Requires an argument" >&2
+        return 1
+    fi
+    CLUSTER="$1"
+
+    if ! [ -f ${CLUSTERCONF} ]
+    then
+        echo -n "Checking O2CB cluster configuration : "
+        if_fail 1
+    fi
+
+    echo -n "Starting O2CB cluster ${CLUSTER}: "
+    OUTPUT="`o2cb_ctl -H -n "${CLUSTER}" -t cluster -a online=yes 2>&1`"
+    if [ $? = 0 ]
+    then
+        set_timeouts
+        echo "OK"
+        return
+    else
+        echo "Failed"
+        echo "$OUTPUT"
+    fi
+
+    echo -n "Stopping O2CB cluster ${CLUSTER}: "
+    OUTPUT="`o2cb_ctl -H -n "${CLUSTER}" -t cluster -a online=no 2>&1`"
+    if_fail "$?" "$OUTPUT"
+}
+
+online_cman()
+{
+    echo "online_cman isn't working yet"
+}
+
+online()
+{
+    CLUSTER="${1:-${O2CB_BOOTCLUSTER}}"
+    if [ -z "$CLUSTER" ]
+    then
+        echo "O2CB cluster not known"
+        return
+    fi
+
+    check_online $CLUSTER
+    if [ $? = 2 ]
+    then
+        echo "O2CB cluster ${CLUSTER} already online"
+        return
+    fi
+
+    case "$O2CB_STACK" in
+        o2cb|heartbeat2) online_o2cb "$CLUSTER" ;;
+        cman)
+            if [ "$CMAN_SUPPORTED" = "yes" ]
+            then
+                online_cman "$CLUSTER"
+            else
+                echo "Cluster stack \"$O2CB_STACK\" not supported" >&2
+                exit 1
+            fi
+            ;;
+        *)
+            echo "Invalid O2CB_STACK: $O2CB_STACK" >&2
+            exit 1
+            ;;
+    esac
+
+}
+
+#
+# check_online()
+#
+# 0 is not online, 1 is error, 2 is online
+#
+check_online()
+{
+    if [ "$#" -lt "1" -o -z "$1" ]
+    then
+        echo "check_online(): Requires an argument" >&2
+        return 1
+    fi
+    CLUSTER="$1"
+
+    RC=0
+    if [ -d "$(configfs_path)/cluster/${CLUSTER}/node/" ]
+    then
+        ls -1 "$(configfs_path)/cluster/${CLUSTER}/node/" | while read NODE
+        do
+            LOCAL="`cat \"$(configfs_path)/cluster/${CLUSTER}/node/${NODE}/local\"`"
+            if [ $LOCAL = 1 ]
+            then
+                return 2
+            fi
+        done
+        if [ $? = 2 ]
+        then
+            RC=2
+        fi
+    fi
+    return $RC
+}
+
+offline_o2cb()
+{
+    if [ "$#" -lt "2" -o -z "$1" -o -z "$2" ]
+    then
+        echo "offline_o2cb(): Missing arguments" >&2
+        return 1
+    fi
+    CLUSTER="$1"
+    FORCE="$2"
+
+    clean_heartbeat $CLUSTER
+
+    echo -n "Stopping O2CB cluster ${CLUSTER}: "
+    check_heartbeat $CLUSTER
+    if [ $? != 0 ]
+    then
+        echo "Failed"
+        echo "Unable to stop cluster as heartbeat region still active" >&2
+        exit 1
+    fi
+
+    if [ $FORCE -eq 1 ]
+    then
+        clean_cluster $CLUSTER
+        if_fail "$?" "Unable to force-offline cluster $CLUSTER" >&2
+    else
+        OUTPUT="`o2cb_ctl -H -n "${CLUSTER}" -t cluster -a online=no 2>&1`"
+        if_fail "$?" "$OUTPUT - Try to force-offline the O2CB cluster"
+    fi
+}
+
+offline_cman()
+{
+    echo "online_cman isn't working yet"
+}
+
+offline()
+{
+    CLUSTER="${1:-${O2CB_BOOTCLUSTER}}"
+    if [ -z "$CLUSTER" ]
+    then
+        return
+    fi
+
+    if [ $# -gt 1 ]
+    then
+        FORCE=$2
+    else
+        FORCE=0
+    fi
+
+    if [ ! -e "$(configfs_path)/cluster/${CLUSTER}" ]
+    then
+        return
+    fi
+
+    case "$O2CB_STACK" in
+        o2cb|heartbeat2) offline_o2cb "$CLUSTER" "$FORCE" ;;
+        cman)
+            if [ "$CMAN_SUPPORTED" = "yes" ]
+            then
+                offline_cman "$CLUSTER" "$FORCE"
+            else
+                echo "Cluster stack \"${O2CB_STACK}\" not supported" >&2
+                exit 1
+            fi
+            ;;
+        *)
+            echo "Invalid O2CB_STACK: $O2CB_STACK" >&2
+            exit 1
+            ;;
+    esac
+
+    unload_module ocfs2
+    if_fail "$?"
+}
+
+start()
+{
+    if [ "$O2CB_ENABLED" != "true" ]
+    then
+        exit 0
+    fi
+
+    load
+    online "$1"
+}
+
+unload()
+{
+    if [ -d "$(configfs_path)/cluster/" ]
+    then
+        ls -1 $(configfs_path)/cluster/ | while read CLUSTER
+        do
+            if [ ! -L "$(configfs_path)/cluster/${CLUSTER}" -a \
+                 -d "$(configfs_path)/cluster/${CLUSTER}" ]
+            then
+                echo "Unable to unload modules as O2CB cluster ${CLUSTER} is still online" >&2
+                exit 1
+            fi
+        done
+        if [ $? = 1 ]
+        then
+            exit 1
+        fi
+    fi
+
+    case "$O2CB_STACK" in
+        o2cb) unload_heartbeat "disk" ;;
+        heartbeat2) unload_heartbeat "user" ;;
+        cman)
+            if [ "$CMAN_SUPPORTED" = "yes" ]
+            then
+                unload_heartbeat "user"
+            else
+                echo "Cluster stack \"${O2CB_STACK}\" not supported" >&2
+                exit 1
+            fi 
+            ;;
+        *)
+            echo "Invalid O2CB_STACK: $O2CB_STACK" >&2
+            exit 1
+        ;;
+    esac
+
+    unmount_filesystem "ocfs2_dlmfs" "/dlm"
+    if_fail $?
+
+    # Only unmount configfs if there are no other users
+    if [ -z "$(ls -1 "$(configfs_path)")" ]
+    then
+        unmount_filesystem "configfs" "/sys/kernel/config"
+        if_fail $?
+    fi
+}
+
+stop()
+{
+    offline "$1"
+    unload
+}
+
+configure()
+{
+    configure_ask
+    write_sysconfig
+    if_fail "$?" "Unable to write the driver configuration"
+}
+
+status()
+{
+    load_status
+
+    CLUSTER="${1:-${O2CB_BOOTCLUSTER}}"
+    if [ -z "$CLUSTER" ]
+    then
+        return 1;
+    fi
+
+    echo -n "Checking O2CB cluster $CLUSTER: "
+    check_online $CLUSTER
+    if [ $? = 2 ]
+    then
+       echo "Online"
+    else
+       echo "Offline"
+       return 0;
+    fi
+
+    show_timeouts
+
+    echo -n "Checking O2CB heartbeat: "
+    check_heartbeat $CLUSTER
+    if [ $? = 2 ]
+    then
+        echo "Active"
+    else
+        echo "Not active"
+        return 0;
+    fi
+
+    return
+}
+
+
+
+case "$1" in
+    start)
+        start "$2"
+        ;;
+
+    status)
+        status "$2"
+        ;;
+
+    stop)
+        stop "$2"
+        ;;
+
+    restart)
+        stop "$2"
+        start "$2"
+        ;;
+
+    force-reload)
+        stop "$2"
+        start "$2"
+        ;;
+
+    load)
+        load
+        ;;
+
+    online)
+        load
+        online "$2"
+        ;;
+
+    offline)
+        offline "$2"
+        ;;
+
+    force-offline)
+        offline "$2" 1
+        ;;
+
+    unload)
+        offline "$2"
+        unload
+        ;;
+
+    configure)
+        configure
+        if [ "$O2CB_ENABLED" = "true" ]
+        then
+            start
+        else
+            stop
+        fi
+        ;;
+
+    enable)
+        O2CB_ENABLED=true
+        write_sysconfig
+        if_fail "$?" "Unable to write the driver configuration"
+        start
+        ;;
+
+    disable)
+        O2CB_ENABLED=false
+        write_sysconfig
+        if_fail "$?" "Unable to write the driver configuration"
+        stop
+        ;;
+
+    *)
+        echo "Usage: $0 {start|stop|restart|force-reload|enable|disable|configure|load|unload|online|offline|force-offline|status}"
+        exit 1
+        ;;
+esac
+
+exit 0


Property changes on: branches/cman-based/vendor/common/o2cb.init.in
___________________________________________________________________
Name: svn:executable
   + *




More information about the Ocfs2-tools-commits mailing list