I tested a couple of more things. First off, there was a bug in my
umountcifs script from my original bug report. I have attached an
updated version that does work. In order for this to work it has to run
in /etc/rc0.d/ as K19 or earlier. There is a bunch of stuff that gets
shut down at K20 that cifs needs to unmount filesystems.

So therein lies the real bug. Cifs shares are now unmounted by
umountnfs.sh at S31 but they need things that are only running up to
K20. Sadly I don't have enough cifs knowledge to know *what* if needs,
nor do I have the time right now to test everything that is stopped at
K20 (there's quite a bunch that run at K20). If I had to take a wild
guess I'd say portmap, since a similar issue exist(ed) with NSF.

-- 
Sander Marechal
#! /bin/sh
### BEGIN INIT INFO
# Provides:          umountcifs
# Required-Start:
# Required-Stop:     umountcifs
# Should-Stop:
# Default-Start:
# Default-Stop:      0 6
# Short-Description: Unmount all cifs filesystems and terminate all processes 
using them
# Description:       
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin
KERNEL="$(uname -s)"
RELEASE="$(uname -r)"
. /lib/init/vars.sh

. /lib/lsb/init-functions

case "${KERNEL}:${RELEASE}" in
  Linux:[01].*|Linux:2.[01].*)
        FLAGS=""
        ;;
  Linux:2.[23].*|Linux:2.4.?|Linux:2.4.?-*|Linux:2.4.10|Linux:2.4.10-*)
        FLAGS="-f"
        ;;
  *)
        FLAGS="-f -l"
        ;;
esac

do_stop () {
        #
        # Make list of points to unmount in reverse order of their creation
        #

        exec 9<&0 </etc/mtab

        DIRS=""
        while read DEV MTPT FSTYPE OPTS REST
        do
                case "$MTPT" in
                  /|/proc|/dev|/dev/pts|/dev/shm|/proc/*|/sys|/lib/init/rw)
                        continue
                        ;;
                  /var/run)
                        if [ yes = "$RAMRUN" ] ; then
                                continue
                        fi
                        ;;
                  /var/lock)
                        if [ yes = "$RAMLOCK" ] ; then
                                continue
                        fi
                        ;;
                esac
                case "$FSTYPE" in
                  cifs)
                        DIRS="$MTPT $DIRS"
                        ;;
                esac
        done

        exec 0<&9 9<&-

        if [ "$DIRS" ]
        then
                # Kill all processes using the cifs volumes
                PROCESSES=""
                for DIR in $DIRS; do
                        PROCESS=`fuser -m $DIR`
                        if [ "$PROCESS" ]; then
                                PROCESSES="$PROCESS $PROCESSES"
                        fi
                done

                if [ "$PROCESSES" ]
                then
                        log_action_begin_msg "Asking all processes using cifs 
filesystems to terminate"
                        echo "kill -15 $PROCESSES"
                        log_action_end_msg 0

                        for seq in 1 2 3 4 5 ; do
                                # use SIGCONT/signal 18 to check if there are
                                # processes left.  No need to check the exit 
code
                                # value, because either killall5 work and it 
make
                                # sense to wait for processes to die, or it 
fail and
                                # there is nothing to wait for.
                                echo "kill -18 $PROCESSES > /dev/null 2>&1" || 
break

                                sleep 1
                        done
                        log_action_begin_msg "Killing all remaining processes 
using cifs filesystems"
                        echo "kill -9 $PROCESSES > /dev/null 2>&1" # SIGKILL
                        log_action_end_msg 0
                fi
                # Unmount all cifs filesystems
                [ "$VERBOSE" = no ] || log_action_begin_msg "Unmounting remote 
and non-toplevel cifs filesystems"
                umount $FLAGS $DIRS
                ES=$?
                [ "$VERBOSE" = no ] || log_action_end_msg $ES
        fi
}

case "$1" in
  start)
        # No-op
        ;;
  restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
  stop|"")
        do_stop
        ;;
  *)
        echo "Usage: umountcifs [start|stop]" >&2
        exit 3
        ;;
esac

:

Reply via email to