#!/sbin/sh # # CDDL HEADER START # # The contents of this file are subject to the terms of the # Common Development and Distribution License (the "License"). # You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. # See the License for the specific language governing permissions # and limitations under the License. # # When distributing Covered Code, include this CDDL HEADER in each # file and include the License file at usr/src/OPENSOLARIS.LICENSE. # If applicable, add the following below this CDDL HEADER, with the # fields enclosed by brackets "[]" replaced with your own identifying # information: Portions Copyright [yyyy] [name of copyright owner] # # CDDL HEADER END # # # Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. # # # Start/stop iscsi initiator service # . /lib/svc/share/smf_include.sh # checkmessage "fsck_device | mount_point" # # Simple auxilary routine to the shell function checkfs. Prints out # instructions for a manual file system check before entering the shell. # checkmessage() { echo "" > /dev/console if [ "$1" != "" ] ; then echo "WARNING - Unable to repair one or more \c" \ > /dev/console echo "of the following filesystem(s):" > /dev/console echo "\t$1" > /dev/console else echo "WARNING - Unable to repair one or more filesystems." \ > /dev/console fi echo "Run fsck manually (fsck filesystem...)." > /dev/console echo "" > /dev/console } # # checkfs raw_device fstype mountpoint # # Check the file system specified. The return codes from fsck have the # following meanings. # 0 - file system is unmounted and okay # 32 - file system is unmounted and needs checking (fsck -m only) # 33 - file system is already mounted # 34 - cannot stat device # 36 - uncorrectable errors detected - terminate normally (4.1 code 8) # 37 - a signal was caught during processing (4.1 exit 12) # 39 - uncorrectable errors detected - terminate rightaway (4.1 code 8) # 40 - for root, same as 0 (used by rcS to remount root) # checkfs() { /usr/sbin/fsck -F $2 -m $1 >/dev/null 2>&1 if [ $? -ne 0 ] then # Determine fsck options by file system type case "$2" in ufs) foptions="-o p" ;; *) foptions="-y" ;; esac echo "The "$3" file system ("$1") is being checked." /usr/sbin/fsck -F $2 ${foptions} $1 case $? in 0|40) # file system OK ;; *) # couldn't fix the file system echo "/usr/sbin/fsck failed with exit code "$?"." checkmessage "$1" ;; esac fi } mount_iscsi() { err=0 iscsilist="" exec < /etc/vfstab while read special fsckdev mountp fstype fsckpass automnt mntopts; do case $special in '#'* | '' ) # Ignore comments, empty lines. continue ;; '-') # Ignore "no-action" lines. continue ;; esac if [ "$automnt" != "iscsi" ]; then continue fi if [ "$fstype" = "-" ]; then echo "iscsi-initiator: FSType of iscsi LUN \c" 1>&2 echo "$special cannot be identified" 1>&2 continue fi # # Ignore entries already mounted # /usr/bin/grep " $mountp " /etc/mnttab >/dev/null \ 2>&1 && continue # # Can't fsck if no fsckdev is specified # if [ "$fsckdev" = "-" ]; then iscsilist="$iscsilist $mountp" continue fi # # fsck everything else: # # fsck -m simply returns true if the filesystem is # suitable for mounting. # /usr/sbin/fsck -m -F $fstype $fsckdev >/dev/null 2>&1 case $? in 0|40) iscsilist="$iscsilist $mountp" continue ;; 32) checkfs $fsckdev $fstype $mountp iscsilist="$iscsilist $mountp" continue ;; 33) # already mounted echo "$special already mounted" ;; 34) # bogus special device echo "Cannot stat $fsckdev - ignoring" err=1 ;; *) # uncorrectable errors echo "$fsckdev uncorrectable error" err=1 ;; esac done [ -z "$iscsilist" ] || /sbin/mount -a $iscsilist for iscsilun in $iscsilist do /usr/bin/grep " $iscsilun " /etc/mnttab >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "Fail to mount $iscsilun" err=1 fi done return $err } umount_iscsi () { # # Generate iscsi mountp list from /etc/vfstab exec < /etc/vfstab while read special fsckdev mountp fstype fsckpass automnt mntopts; do case $special in '#'* | '') continue;; # Ignore comments, # empty lines. '-') continue;; # Ignore "no-action lines. esac if [ "$automnt" != "iscsi" ]; then continue fi /usr/bin/grep " $mountp " /etc/mnttab >/dev/null 2>&1 if [ $? -ne 0 ]; then continue fi iscsilist="$iscsilist $mountp" done if [ -n "$iscsilist" ]; then umount -a $iscsilist 1>&2 rc=$? else rc=0; fi return $rc } case "$1" in 'start') /usr/bin/pgrep -P 1 -x iscsid if [ $? -ne 0 ]; then /lib/svc/method/iscsid fi if [ $? -eq 0 ]; then delay=60 while [ $delay -gt 0 ]; do delay=`expr $delay - 1` mount_iscsi if [ $? -eq 1 ]; then if [ $delay -gt 0 ]; then sleep 1 continue else echo "iscsi-initiator: mount iscsi \c" echo "lun in /etc/vfstab fail." umount_iscsi exit $SMF_EXIT_ERR_CONFIG fi else exit $SMF_EXIT_OK fi done else exit $? fi ;; 'stop') umount_iscsi /usr/bin/pkill -P 1 -x iscsid exit 0 ;; *) echo "Usage: $0 { start | stop }" exit 1 ;; esac exit $SMF_EXIT_OK