Home | History | Annotate | Download | only in stmsboot
      1 #!/sbin/sh -p
      2 #
      3 # CDDL HEADER START
      4 #
      5 # The contents of this file are subject to the terms of the
      6 # Common Development and Distribution License (the "License").
      7 # You may not use this file except in compliance with the License.
      8 #
      9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10 # or http://www.opensolaris.org/os/licensing.
     11 # See the License for the specific language governing permissions
     12 # and limitations under the License.
     13 #
     14 # When distributing Covered Code, include this CDDL HEADER in each
     15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16 # If applicable, add the following below this CDDL HEADER, with the
     17 # fields enclosed by brackets "[]" replaced with your own identifying
     18 # information: Portions Copyright [yyyy] [name of copyright owner]
     19 #
     20 # CDDL HEADER END
     21 #
     22 #
     23 # Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     24 # Use is subject to license terms.
     25 #
     26 #
     27 PATH=/usr/bin:/usr/sbin:$PATH; export PATH
     28 STMSBOOTUTIL=/lib/mpxio/stmsboot_util
     29 STMSMETHODSCRIPT=/lib/svc/method/mpxio-upgrade
     30 KDRVCONF=
     31 DRVCONF=
     32 TMPDRVCONF=
     33 TMPDRVCONF_MPXIO_ENTRY=
     34 TMPDRVCONF_SATA_ENTRY=
     35 DRVLIST=
     36 GUID=
     37 VFSTAB=/etc/vfstab
     38 SAVEDIR=/etc/mpxio
     39 BOOTDEVICES=$SAVEDIR/boot-devices
     40 RECOVERFILE=$SAVEDIR/recover_instructions
     41 SVCCFG_RECOVERY=$SAVEDIR/svccfg_recover
     42 SUPPORTED_DRIVERS="fp|mpt|mpt_sas|pmcs"
     43 USAGE=`gettext "Usage: stmsboot [-D $SUPPORTED_DRIVERS] -e | -d | -u | -L | -l controller_number"`
     44 TEXTDOMAIN=SUNW_OST_OSCMD
     45 export TEXTDOMAIN
     46 STMSINSTANCE=svc:system/device/mpxio-upgrade:default
     47 STMSBOOT=/usr/sbin/stmsboot
     48 BOOTADM=/sbin/bootadm
     49 MOUNT=/usr/sbin/mount
     50 EEPROM=/usr/sbin/eeprom
     51 EGREP=/usr/bin/egrep
     52 GREP=/usr/bin/grep
     53 AWK=/usr/bin/awk
     54 CP=/usr/bin/cp
     55 DF=/usr/bin/df
     56 LS=/usr/bin/ls
     57 MV=/usr/bin/mv
     58 RM=/usr/bin/rm
     59 SORT=/usr/bin/sort
     60 UNIQ=/usr/bin/uniq
     61 EXPR=/usr/bin/expr
     62 MKDIR=/usr/bin/mkdir
     63 REBOOT=/usr/sbin/reboot
     64 SED=/usr/bin/sed
     65 SVCPROP=/usr/bin/svcprop
     66 SVCCFG=/usr/sbin/svccfg
     67 SVCS=/usr/bin/svcs
     68 SVCADM=/usr/sbin/svcadm
     69 
     70 NOW=`/usr/bin/date +%G%m%d_%H%M`
     71 MACH=`/usr/bin/uname -p`
     72 BOOTENV_FILE=bootenv.rc
     73 reboot_needed=0
     74 new_bootpath=""
     75 CLIENT_TYPE_PHCI=""
     76 CLIENT_TYPE_VHCI="/scsi_vhci"
     77 new_rootdev=""
     78 svm_md_device=""
     79 
     80 #
     81 # Copy all entries (including comments) from source driver.conf
     82 # to destination driver.conf except those entries which contain
     83 # the mpxio-disable property.
     84 # Take into consideration entries that spawn more than one line.
     85 #
     86 # $1	source driver.conf file
     87 # $2	destination driver.conf file
     88 #
     89 # Returns 0 on success, non zero on failure.
     90 #
     91 delete_mpxio_disable_entries()
     92 {
     93 	# be careful here, we've got embedded \t characters
     94 	# in sed's pattern space.
     95 	$SED '
     96 		/^[ 	]*#/{ p
     97 			      d
     98 			    }
     99 		s/[ 	]*$//
    100 		/^$/{ p
    101 		      d
    102 		    }
    103 		/mpxio-disable[ 	]*=.*;$/{ w '$3'
    104 						  d
    105 						}
    106 		/disable-sata-mpxio[ 	]*=.*;$/{ w '$4'
    107 						  d
    108 						}
    109 		/;$/{ p
    110 		      d
    111 		    }
    112 		:rdnext
    113 		N
    114 		s/[ 	]*$//
    115 		/[^;]$/b rdnext
    116 		/mpxio-disable[ 	]*=/{ s/\n/ /g
    117 					      w '$3'
    118 					      d
    119 					    }
    120 		' $1 > $2
    121 
    122 	return $?
    123 }
    124 
    125 #
    126 # backup the last saved copy of the specified files.
    127 # $*	files to backup
    128 #
    129 backup_lastsaved()
    130 {
    131 	for file in $*
    132 	do
    133 		newfile=`basename $file`
    134 		$CP $file $SAVEDIR/$newfile.$cmd.$NOW
    135 	done
    136 }
    137 
    138 #
    139 # build recover instructions
    140 #
    141 # $1	1 to include boot script in the instructions
    142 #	0 otherwise
    143 #
    144 build_recover()
    145 {
    146 	gettext "Instructions to recover your previous STMS configuration (if in case the system does not boot):\n\n" > $RECOVERFILE
    147 	echo "\tboot net \c"  >> $RECOVERFILE
    148 	gettext "(or from a cd/dvd/another disk)\n" >> $RECOVERFILE
    149 	echo "\tfsck <your-root-device>" >> $RECOVERFILE
    150 	echo "\tmount <your-root-device> /mnt" >> $RECOVERFILE
    151 
    152 	if [ "$cmd" = "update" ]; then
    153 		gettext "\tUndo the modifications you made to STMS configuration.\n\tFor example undo any changes you made to " >> $RECOVERFILE
    154 		echo "/mnt$KDRVCONF." >> $RECOVERFILE
    155 	else
    156 		echo "\tcp /mnt${SAVEDIR}/$DRVCONF.$cmd.$NOW /mnt$KDRVCONF" >> $RECOVERFILE
    157 	fi
    158 
    159 	if [ $1 -eq 1 ]; then
    160 		echo "\tcp /mnt${SAVEDIR}/vfstab.$cmd.$NOW /mnt$VFSTAB" >> $RECOVERFILE
    161 
    162 		echo "repository /mnt/etc/svc/repository.db" > $SVCCFG_RECOVERY
    163 		echo "select $STMSINSTANCE" >> $SVCCFG_RECOVERY
    164 		echo "setprop general/enabled=false" >> $SVCCFG_RECOVERY
    165 		echo "exit" >> $SVCCFG_RECOVERY
    166 
    167 		echo "\t$SVCCFG -f /mnt$SVCCFG_RECOVERY" >> $RECOVERFILE
    168 
    169 		if [ -n "$new_bootpath" -a "$MACH" = "i386" ]; then
    170 			echo "\tcp /mnt${SAVEDIR}/bootenv.rc.$cmd.$NOW /mnt/boot/solaris/$BOOTENV_FILE" >> $RECOVERFILE
    171 		fi
    172 	fi
    173 
    174 	rootdisk=`$MOUNT | $GREP "/ on " | cut -f 3 -d " "`
    175 	echo "\tumount /mnt\n\treboot\n\n${rootdisk} \c" >> $RECOVERFILE
    176 	gettext "was your root device,\nbut it could be named differently after you boot net.\n" >> $RECOVERFILE
    177 }
    178 
    179 
    180 #
    181 # Arrange for /etc/vfstab and dump configuration to be updated
    182 # during the next reboot. If the cmd is "enable" or "disable", copy
    183 # $TMPDRVCONF to $KDRVCONF.
    184 #
    185 # Returns 0 on success, 1 on failure.
    186 #
    187 update_sysfiles()
    188 {
    189 
    190 	gettext "WARNING: This operation will require a reboot.\n"
    191 	gettext "Do you want to continue ? [y/n] (default: y) "
    192 	read response
    193 
    194 	if [ -n "$response" -a "$response" != "y" -a \
    195 	    "$response" != "Y" ]; then
    196 		for d in $DRVLIST; do
    197 			TMPDRVCONF=/var/run/tmp.$d.conf.$$
    198 			$RM -f $TMPDRVCONF > /dev/null 2>&1
    199 		done;
    200 		return 0;
    201 	fi
    202 
    203 	# set need_bootscript to the number of drivers that
    204 	# we support.
    205 	need_bootscript=`echo $SUPPORTED_DRIVERS|$AWK -F"|" '{print NF}'`
    206 
    207 	if [ "$cmd" = "enable" -o "$cmd" = "disable" ]; then
    208 
    209 		for d in $DRVLIST; do
    210 			DRVCONF=$d.conf
    211 			KDRVCONF=/kernel/drv/$d.conf
    212 			TMPDRVCONF=/var/run/tmp.$d.conf.$$
    213 
    214 			$CP $KDRVCONF $SAVEDIR/`basename $KDRVCONF`.$cmd.$NOW
    215 			if [ -f $TMPDRVCONF ]; then
    216 				$CP $TMPDRVCONF $KDRVCONF
    217 				$RM -f $TMPDRVCONF
    218 			else
    219 				# if $TMPDRVCONF doesn't exist, then we
    220 				# haven't made any changes to it
    221 				continue;
    222 			fi
    223 
    224 			#
    225 			# there is no need to update the system files in the following
    226 			# cases:
    227 			# - we are enabling mpxio and the system has no configured
    228 			#   disks accessible by phci paths.
    229 			# - we are disabling mpxio and the system has no configured
    230 			#   disks accessible by vhci paths.
    231 			#
    232 
    233 			# Function to setup the CLIENT_TYPE_PHCI string based on
    234 			# the list of drivers that we're operating on. The variable
    235 			# depends upon the pathname of the parent node in the 
    236 			# device tree, which can be different on x86/x64 and sparc.
    237 
    238 			CLIENT_TYPE_PHCI=`$STMSBOOTUTIL -D $d -N`;
    239 
    240 			if [ -z "$CLIENT_TYPE_PHCI" ]; then
    241 				continue;
    242 			fi
    243 
    244 			if [ "$cmd" = "enable" ]; then
    245 				$LS -l /dev/dsk/*s2 2> /dev/null | \
    246 				    $EGREP -s "$CLIENT_TYPE_PHCI"
    247 			else
    248 				$LS -l /dev/dsk/*s2 2> /dev/null | \
    249 				    $EGREP -s "$CLIENT_TYPE_VHCI"
    250 			fi
    251 
    252 			if [ $? -ne 0 ]; then
    253 				need_bootscript=`$EXPR $need_bootscript - 1`
    254 			fi
    255 		done
    256 	fi
    257 
    258 	if [ $need_bootscript -gt 0 ]; then
    259 		need_bootscript=1
    260 		if [  -n "$new_bootpath" -a "$MACH" = "i386" ]; then
    261 			#only update bootpath for x86.
    262 			$CP /boot/solaris/$BOOTENV_FILE $SAVEDIR/$BOOTENV_FILE.$cmd.$NOW
    263 			$EEPROM bootpath="$new_bootpath"
    264 		fi
    265 
    266 		if [ "$svm_md_device" != "NOT_MAPPED" ]; then
    267 			# Enable the mpxio-upgrade service for the reboot
    268 			$SVCADM disable -t $STMSINSTANCE
    269 			$SVCCFG -s $STMSINSTANCE "setprop general/enabled=true"
    270 		fi
    271 	else
    272 		need_bootscript=0
    273 	fi
    274 
    275 	build_recover $need_bootscript
    276 
    277 	if [ "$MACH" = "i386" ]; then
    278 		$BOOTADM update-archive
    279 	fi
    280 
    281 	gettext "The changes will come into effect after rebooting the system.\nReboot the system now ? [y/n] (default: y) "
    282 	read response
    283 
    284 	if [ -z "$response" -o "$response" = "y" -o \
    285 	    "$response" = "Y" ]; then
    286 		$REBOOT
    287 	fi
    288 
    289 	return 0
    290 }
    291 
    292 
    293 #
    294 # Enable or disable mpxio as specified by the cmd.
    295 # Returns 0 on success, 1 on failure.
    296 #
    297 # Args: $cmd = {enable | disable}
    298 #	$d = {fp | mpt | mpt_sas | pmcs}
    299 #
    300 # the global variable $DRVLIST is used
    301 #
    302 configure_mpxio()
    303 {
    304 	# be careful here, we've got embedded \t characters
    305 	# in sed's pattern space.
    306 	mpxiodisableno='mpxio-disable[ 	]*=[ 	]*"no"[ 	]*;'
    307 	mpxiodisableyes='mpxio-disable[ 	]*=[ 	]*"yes"[ 	]*;'
    308 	satadisableno='disable-sata-mpxio[ 	]*=[ 	]*"no"[ 	]*;'
    309 	satadisableyes='disable-sata-mpxio[ 	]*=[ 	]*"yes"[ 	]*;'
    310 
    311 	if [ "$cmd" = "enable" ]; then
    312 		mpxiodisable_cur_entry=$mpxiodisableyes
    313 		satadisable_cur_entry=$satadisableyes
    314 		propval=no
    315 		msg=`gettext "STMS already enabled"`
    316 	else
    317 		mpxiodisable_cur_entry=$mpxiodisableno
    318 		satadisable_cur_entry=$satadisableno
    319 		propval=yes
    320 		msg=`gettext "STMS already disabled"`
    321 	fi
    322 
    323 	DRVCONF=$d.conf
    324 	KDRVCONF=/kernel/drv/$d.conf
    325 	TMPDRVCONF=/var/run/tmp.$d.conf.$$
    326 	TMPDRVCONF_MPXIO_ENTRY=/var/run/tmp.$d.conf.mpxioentry.$$;
    327 	TMPDRVCONF_SATA_ENTRY=/var/run/tmp.$d.conf.sataentry.$$;
    328 
    329 	if delete_mpxio_disable_entries $KDRVCONF $TMPDRVCONF $TMPDRVCONF_MPXIO_ENTRY $TMPDRVCONF_SATA_ENTRY; then
    330 
    331 		if [ -s $TMPDRVCONF_MPXIO_ENTRY ]; then
    332 			# $DRVCONF does have mpxiodisable entries
    333 			$EGREP -s "$mpxiodisable_cur_entry" $TMPDRVCONF_MPXIO_ENTRY
    334 			if [ $? -eq 0 ]; then
    335 				reboot_needed=`$EXPR $reboot_needed + 1`
    336 			else
    337 				# if all mpxiodisable entries are no/yes for
    338 				# enable/disable mpxio, notify the user
    339 				$EGREP -s "$satadisable_cur_entry" $TMPDRVCONF_SATA_ENTRY
    340 				if [ $? -eq 0 -a "$d" = "mpt" ]; then
    341 					reboot_needed=`$EXPR $reboot_needed + 1`
    342 				else
    343 					$RM -f $TMPDRVCONF $TMPDRVCONF_MPXIO_ENTRY $TMPDRVCONF_SATA_ENTRY > /dev/null 2>&1
    344 					return 0;
    345 				fi
    346 			fi
    347 
    348 			# If mpxiodisable entries do not exist, always continue update
    349 		fi
    350 	else
    351 		$RM -f $TMPDRVCONF $TMPDRVCONF_MPXIO_ENTRY $TMPDRVCONF_SATA_ENTRY > /dev/null 2>&1
    352 		gettext "failed to update " 1>&2
    353 		echo "$KDRVCONF." 1>&2 
    354 		gettext "No changes were made to your STMS configuration.\n" 1>&2
    355 		return 1
    356 	fi
    357 
    358 	rm $TMPDRVCONF_MPXIO_ENTRY $TMPDRVCONF_SATA_ENTRY > /dev/null 2>&1
    359 	echo "mpxio-disable=\"${propval}\";" >> $TMPDRVCONF
    360 	if [ "$d" = "mpt" ]; then
    361 		echo "disable-sata-mpxio=\"${propval}\";" >> $TMPDRVCONF
    362 	fi
    363 
    364 }
    365 
    366 setcmd()
    367 {
    368 	if [ "$cmd" = "none" ]; then
    369 		cmd=$1
    370 	else
    371 		echo "$USAGE" 1>&2
    372 		exit 2
    373 	fi
    374 }
    375 
    376 #
    377 # Need to update bootpath on x86 if boot system from FC disk
    378 # Only update bootpath here when mpxio is enabled
    379 # If mpxio is currently disabled, then we'll update bootpath in the
    380 # mpxio-upgrade service method on reboot.
    381 #
    382 
    383 get_newbootpath_for_stmsdev() {
    384 	if [ "$cmd" = "enable" ]; then
    385 		return 0
    386 	fi
    387 
    388 	cur_bootpath=`$STMSBOOTUTIL -b`
    389 	if [ $? != 0 ]; then
    390 		return 1
    391 	fi
    392 
    393 	# Since on x64 platforms the eeprom command doesn't update the
    394 	# kernel, the file /boot/solaris/bootenv.rc and the kernel's
    395 	# bootpath variable have a good chance of differing. We do some
    396 	# extra handwaving to get the correct bootpath variable setting. 
    397 
    398 	ONDISKVER=`$AWK '/bootpath/ {print $3}' /boot/solaris/bootenv.rc|\
    399 		$SED -e"s,',,g"`
    400 	if [ "$ONDISKVER" != "$cur_bootpath" ]; then
    401 		cur_bootpath="$ONDISKVER"
    402 	fi
    403 
    404 	NEWBOOTPATH=""
    405 	for path in $cur_bootpath; do
    406 		mapped=`$STMSBOOTUTIL -p $path`
    407 		if [ "$mapped" != "NOT_MAPPED" ]; then
    408 			if [ "$mapped" != "$path" ]; then
    409 				NEWBOOTPATH=`echo "$path " | \
    410 				   $SED -e"s|$path|$mapped|"`" $NEWBOOTPATH"
    411 			else
    412 				NEWBOOTPATH="$NEWBOOTPATH $path"
    413 			fi
    414 		fi
    415 	done
    416 	# now strip off leading and trailing space chars
    417 	new_bootpath=`echo $NEWBOOTPATH`
    418 	return 0
    419 }
    420 
    421 #
    422 # Emit a warning message to the user that by default we
    423 # operate on all multipath-capable controllers that are
    424 # attached to the system, and that if they want to operate
    425 # on only a specific controller type (fp|mpt|mpt_sas|pmcs|....) then 
    426 # they need to re-invoke stmsboot with "-D $driver" in
    427 # their argument list
    428 #
    429 
    430 emit_driver_warning_msg() {
    431 
    432 	# for each driver that we support, grab the list
    433 	# of controllers attached to the system.
    434 
    435 	echo ""
    436 	gettext "WARNING: stmsboot operates on each supported multipath-capable controller\n"
    437 	gettext "         detected in a host. In your system, these controllers are\n\n"
    438 
    439 	for WARNDRV in `echo $SUPPORTED_DRIVERS| $SED -e"s,|, ,g"`; do
    440 		$STMSBOOTUTIL -D $WARNDRV -n
    441 	done;
    442 	
    443 	echo ""
    444 	gettext "If you do NOT wish to operate on these controllers, please quit stmsboot\n"
    445 	gettext "and re-invoke with -D { fp | mpt | mpt_sas | pmcs} to specify which controllers you wish\n"
    446 	gettext "to modify your multipathing configuration for.\n"
    447 
    448 	echo ""
    449 	gettext "Do you wish to continue? [y/n] (default: y) " 
    450 	read response
    451 
    452 	if [ -n "$response" -a "$response" != "Y" -a \
    453 	    "$response" != "y" ]; then
    454 		exit
    455 	fi
    456 }
    457 
    458 
    459 #
    460 #
    461 # main starts here
    462 #
    463 
    464 cmd=none
    465 # process options
    466 while getopts D:geduLl: c
    467 do
    468 	case $c in
    469 	e)	setcmd enable;;
    470 	d)	setcmd disable;;
    471 	u)	setcmd update;;
    472 	L)	setcmd listall;;
    473 	l)	setcmd list
    474 		controller=$OPTARG;;
    475 	D)	DRV=$OPTARG;;
    476 	g)	GUID="-g";;
    477 	\?)	echo "$USAGE" 1>&2
    478 		exit 2;;
    479 	esac
    480 done
    481 
    482 if [ "$cmd" = "none" ]; then
    483 	echo "$USAGE" 1>&2
    484 	exit 2
    485 fi
    486 
    487 if [ -z "$DRV" ]; then
    488 	DRVLIST="fp mpt mpt_sas pmcs"
    489 else
    490 	DRVLIST=$DRV
    491 fi
    492 
    493 USERID=`id | $EGREP "uid=0"`
    494 if [ -z "$USERID" ]; then
    495 	gettext "You must be super-user to run this script.\n" 1>&2
    496 	exit 1
    497 fi
    498 
    499 # just a sanity check
    500 if [ ! -f $STMSBOOTUTIL -o ! -f $STMSMETHODSCRIPT ]; then
    501 	fmt=`gettext "Can't find %s and/or %s"`
    502 	printf "$fmt\n" "$STMSBOOTUTIL" "$STMSMETHODSCRIPT" 1>&2
    503 	exit 1
    504 fi
    505 
    506 # If the old sun4u-specific SMF method is found, remove it
    507 $SVCCFG -s "platform/sun4u/mpxio-upgrade:default" < /dev/null > /dev/null 2>&1
    508 if [ $? -eq 0 ]; then
    509 	$SVCCFG delete "platform/sun4u/mpxio-upgrade:default" > /dev/null 2>&1
    510 fi
    511 
    512 # now import the new service, if necessary
    513 $SVCPROP -q $STMSINSTANCE < /dev/null > /dev/null 2>&1
    514 if [ $? -ne 0 ]; then
    515 	if [ -f /var/svc/manifest/system/device/mpxio-upgrade.xml ]; then
    516 		$SVCCFG import /var/svc/manifest/system/device/mpxio-upgrade.xml
    517 		if [ $? -ne 0 ]; then
    518 
    519 			fmt=`gettext "Unable to import the %s service"`
    520 			printf "$fmt\n" "$STMSINSTANCE" 1>&2
    521 			exit 1
    522 		else
    523 			fmt=`gettext "Service %s imported successfully, continuing"`
    524 			printf "$fmt\n" "$STMSINSTANCE" 1>&2
    525 		fi
    526 	else
    527 		fmt=`gettext "Service %s does not exist on this host"`
    528  		printf "$fmt\n" "$STMSINSTANCE" 1>&2
    529 		exit 1
    530 	fi
    531 fi
    532 
    533 
    534 # make sure we can stash our data somewhere private
    535 if [ ! -d $SAVEDIR ]; then
    536 	$MKDIR -p $SAVEDIR
    537 fi
    538 # prime the cache
    539 $STMSBOOTUTIL -i
    540 
    541 
    542 if [ "$cmd" = "enable" -o "$cmd" = "disable" -o "$cmd" = "update" ]; then
    543 	#
    544 	# The bootup script doesn't work on cache-only-clients as the script
    545 	# is executed before the plumbing for cachefs mounting of root is done.
    546 	#
    547 	if $MOUNT -v | $EGREP -s " on / type (nfs|cachefs) "; then
    548 		gettext "This command option is not supported on systems with an nfs or cachefs mounted root filesystem.\n" 1>&2
    549 		exit 1
    550 	fi
    551 
    552 	# if the user has left the system with the mpxio-upgrade service
    553 	# in a temporarily disabled state (ie, service is armed for the next
    554 	# reboot), then let them know. We need to ensure that the system is
    555 	# is in a sane state before allowing any further invocations, so 
    556 	# try to get the system admin to do so
    557 
    558 	ISARMED=`$SVCS -l $STMSINSTANCE|$GREP "enabled.*false.*temporary"`
    559 	if [ ! $? ]; then
    560 		echo ""
    561 		gettext "You need to reboot the system in order to complete\n"
    562 		gettext "the previous invocation of stmsboot.\n"
    563 		echo ""
    564 		gettext "Do you wish to reboot the system now? (y/n, default y) "
    565 		read response
    566 
    567 		if [ -z "$response" -o "x$response" = "Y" -o \
    568 		    "$response" = "y" ]; then
    569 			$REBOOT
    570 		else
    571 			echo ""
    572 			gettext "Please reboot this system before continuing\n"
    573 			echo ""
    574 			exit 1
    575 		fi
    576 	fi
    577 
    578 	#
    579 	# keep a copy of the last saved files, useful for manual
    580 	# recovery in case of a problem.
    581 	#
    582 	for d in $DRVLIST; do
    583 		DRVCONF=$d.conf
    584 		KDRVCONF=/kernel/drv/$d.conf
    585 		TMPDRVCONF=/var/run/tmp.$d.conf.$$
    586 		TMPDRVCONF_MPXIO_ENTRY=/var/run/tmp.$d.conf.mpxioentry.$$;
    587 		if [ "$MACH" = "sparc" ]; then
    588 			backup_lastsaved $KDRVCONF $VFSTAB
    589 		else
    590 			backup_lastsaved $KDRVCONF $VFSTAB /boot/solaris/$BOOTENV_FILE
    591 		fi
    592 	done
    593 fi
    594 
    595 if [ "$cmd" = "enable" -o "$cmd" = "disable" ]; then
    596 
    597 	msgneeded=`echo "$DRVLIST" |grep " "`
    598 	if [ -n "$msgneeded" ]; then
    599 		emit_driver_warning_msg
    600 	fi
    601 	for d in $DRVLIST; do
    602 		configure_mpxio $cmd $d
    603 	done
    604 
    605 	if [ $reboot_needed -ne 0 ]; then
    606 		# Need to update bootpath on x86 if our boot device is
    607 		# now accessed through mpxio.
    608 		# Only update bootpath before reboot when mpxio is enabled
    609 		# If mpxio is currently disabled, we will update bootpath
    610 		# on reboot in the mpxio-upgrade service
    611 		
    612 		if [ "$cmd" = "disable" ]; then
    613 			if [ "$MACH" = "i386" ]; then
    614 				get_newbootpath_for_stmsdev
    615 				if [ $? -ne 0 ]; then
    616 					$RM -f $TMPDRVCONF > /dev/null 2>&1
    617 					gettext "failed to update bootpath.\n" 1>&2
    618 					gettext "No changes were made to your STMS configuration.\n" 1>&2
    619 					return 1
    620 				fi
    621 			fi
    622 			# If we're not using ZFS root then we need
    623 			# to keep track of what / maps to in case
    624 			# it's an active-active device and we boot from
    625 			# the other path
    626 			ROOTSCSIVHCI=`$DF /|$AWK -F":" '{print $1}' | \
    627 			    $AWK -F"(" '{print $2}'| \
    628 			    $SED -e"s,dsk,rdsk," -e"s,s.[ ]*),,"`
    629 			$STMSBOOTUTIL -L | $GREP $ROOTSCSIVHCI | \
    630 			    $AWK '{print $1}' | $SED -e"s,rdsk,dsk,g" \
    631 			    >$BOOTDEVICES
    632 		fi
    633 		new_rootdev=`$DF /|$AWK -F":" '{print $1}' | \
    634 			$AWK -F"(" '{print $2}'| \
    635 			$SED -e"s,dsk,rdsk," -e"s,[ ]*),,"`
    636 		svm_md_device=`$STMSBOOTUTIL -m $new_rootdev`
    637 		update_sysfiles
    638 	else
    639 		echo "STMS is already ${cmd}d. No changes or reboots needed"
    640 	fi
    641 
    642 
    643 elif [ "$cmd" = "update" ]; then
    644 	if [ "$MACH" = "i386" ]; then
    645 	# In this case we always change the bootpath to phci-based
    646 	# path first. bootpath will later be modified in mpxio-upgrade
    647 	# to the vhci-based path if mpxio is enabled on root.
    648 		get_newbootpath_for_stmsdev
    649 		if [ $? -ne 0 ]; then
    650 			gettext "failed to update bootpath.\n" 1>&2
    651 			return 1
    652 		fi
    653 	fi
    654 	update_sysfiles
    655 
    656 elif [ "$cmd" = "list" ]; then
    657 		$STMSBOOTUTIL $GUID -l $controller
    658 else
    659 		$STMSBOOTUTIL $GUID -L
    660 fi
    661 
    662 exit $?
    663