OpenSolaris_b135/cmd/lvm/util/svc-metasync

#!/bin/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 2006 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
# ident	"%Z%%M%	%I%	%E% SMI"
#
# Start mirror resync threads.

DEVFSADM=/usr/sbin/devfsadm
METADEVADM=/usr/sbin/metadevadm
METASYNC=/usr/sbin/metasync
METADEV=/dev/md/admin
METASET=/usr/sbin/metaset
TMPFILE=/var/run/metaset.$$

. /lib/svc/share/smf_include.sh

print_verbose()
{
	echo "Unable to resolve unnamed devices for volume management."
	echo "Please refer to the Solaris Volume Manager documentation,"
	echo "Troubleshooting section, at http://docs.sun.com or from"
	echo "your local copy."
}

resolve_auto_take_sets()
{
	if [ -x $METASET ]; then
		# Fixing up of the ctd names for devices in auto take
		# sets relies heavily on the output of the metaset
		# command. Any change to the output of the metaset command
		# should modify this script as well in order ensure nothing
		# breaks
		#
		# The following command saves all of the auto-take set names
		# into the TMPFILE
		name_str=`gettext "Set name"`
		mn_str=`gettext "Multi-owner"` 
		$METASET | /bin/nawk -F ' |\t|,' -v snm="$name_str" \
		    -v mstr="$mn_str" '$0 ~ snm { \
		    if (index($0, mstr) == 0) print $4 \
		}' > $TMPFILE 2>&1

		if [ -s "$TMPFILE" ]; then
			localised_string=`gettext "Yes (auto)"`
			for i in `cat $TMPFILE`; do
				$METASET -s $i | grep "$localised_string" \
				    > /dev/null 2>&1
				if [ $? -eq 0 ]; then
					$METADEVADM -l -r -s $i
					error=$?    
					case $error in
					0|2)	;;
					3) 	print_verbose
				    		;;
					*)	echo "$METADEVADM \
						-r failure $error."
						;;
					esac
				fi
			done
		fi
		if [ -f "$TMPFILE" ]; then
			/usr/bin/rm -f $TMPFILE
		fi
	fi
}

if [ ! -s /kernel/drv/md.conf ]; then
	echo "/kernel/drv/md.conf is missing."
	exit 0
fi

if grep '^mddb_bootlist' /kernel/drv/md.conf >/dev/null 2>&1; then :; else
	echo "No 'mddb_bootlist' entry in /kernel/drv/md.conf."
	exit 0
fi

if [ ! -x $METADEVADM ]; then
	echo "$METADEVADM is missing or not executable."
	exit $SMF_EXIT_ERR_CONFIG
fi

if [ ! -x $METASYNC ]; then
	echo "$METASYNC is missing or not executable."
	exit $SMF_EXIT_ERR_CONFIG
fi

if [ ! -c $METADEV ]; then
	echo "$METADEV is missing or not a character device."
	exit 0
fi

$METADEVADM -l -r
error=$?
case $error in
0|2)	;;

3)	echo "Executing devfsadm"
	$DEVFSADM
	devfsadmerror=$?
	if [ $devfsadmerror = 0 ]; then
		echo "Executing metadevadm -r"
		$METADEVADM -l -r
		error=$?
	fi
	if [ $devfsadmerror != 0 -o $error = 3 ]; then
		print_verbose
	elif [ $error != 0 -a $error != 2 ]; then
		echo "$METADEVADM -r failure $error."
	fi	
	;;

*)	echo "$METADEVADM -r failure $error."
	exit 1
	;;
esac

resolve_auto_take_sets

$METASYNC -r
error=$?
case $error in
0)	;;

*)	echo "Unknown $METASYNC -r failure $error."
	exit 1
	;;
esac