xref: /illumos-gate/usr/src/cmd/stmsboot/stmsboot.sh (revision aedf2b3bb56b025fcaf87b49ec6c8aeea07f16d7)
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#
27PATH=/usr/bin:/usr/sbin:$PATH; export PATH
28STMSBOOTUTIL=/lib/mpxio/stmsboot_util
29STMSMETHODSCRIPT=/lib/svc/method/mpxio-upgrade
30KDRVCONF=
31DRVCONF=
32TMPDRVCONF=
33TMPDRVCONF_MPXIO_ENTRY=
34TMPDRVCONF_SATA_ENTRY=
35DRVLIST=
36GUID=
37VFSTAB=/etc/vfstab
38SAVEDIR=/etc/mpxio
39BOOTDEVICES=$SAVEDIR/boot-devices
40RECOVERFILE=$SAVEDIR/recover_instructions
41SVCCFG_RECOVERY=$SAVEDIR/svccfg_recover
42SUPPORTED_DRIVERS="fp|mpt|mpt_sas|pmcs"
43USAGE=`gettext "Usage: stmsboot [-D $SUPPORTED_DRIVERS] -e | -d | -u | -L | -l controller_number"`
44TEXTDOMAIN=SUNW_OST_OSCMD
45export TEXTDOMAIN
46STMSINSTANCE=svc:system/device/mpxio-upgrade:default
47STMSBOOT=/usr/sbin/stmsboot
48BOOTADM=/sbin/bootadm
49MOUNT=/usr/sbin/mount
50EEPROM=/usr/sbin/eeprom
51EGREP=/usr/bin/egrep
52GREP=/usr/bin/grep
53AWK=/usr/bin/awk
54CP=/usr/bin/cp
55DF=/usr/bin/df
56LS=/usr/bin/ls
57MV=/usr/bin/mv
58RM=/usr/bin/rm
59SORT=/usr/bin/sort
60UNIQ=/usr/bin/uniq
61EXPR=/usr/bin/expr
62MKDIR=/usr/bin/mkdir
63REBOOT=/usr/sbin/reboot
64SED=/usr/bin/sed
65SVCPROP=/usr/bin/svcprop
66SVCCFG=/usr/sbin/svccfg
67SVCS=/usr/bin/svcs
68SVCADM=/usr/sbin/svcadm
69
70NOW=`/usr/bin/date +%G%m%d_%H%M`
71MACH=`/usr/bin/uname -p`
72BOOTENV_FILE=bootenv.rc
73reboot_needed=0
74new_bootpath=""
75CLIENT_TYPE_PHCI=""
76CLIENT_TYPE_VHCI="/scsi_vhci"
77new_rootdev=""
78svm_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#
91delete_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#
129backup_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#
144build_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#
187update_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#
302configure_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					continue;
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
366setcmd()
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
383get_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
430emit_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
464cmd=none
465# process options
466while getopts D:geduLl: c
467do
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
480done
481
482if [ "$cmd" = "none" ]; then
483	echo "$USAGE" 1>&2
484	exit 2
485fi
486
487if [ -z "$DRV" ]; then
488	DRVLIST="fp mpt mpt_sas pmcs"
489else
490	DRVLIST=$DRV
491fi
492
493USERID=`id | $EGREP "uid=0"`
494if [ -z "$USERID" ]; then
495	gettext "You must be super-user to run this script.\n" 1>&2
496	exit 1
497fi
498
499# just a sanity check
500if [ ! -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
504fi
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
508if [ $? -eq 0 ]; then
509	$SVCCFG delete "platform/sun4u/mpxio-upgrade:default" > /dev/null 2>&1
510fi
511
512# now import the new service, if necessary
513$SVCPROP -q $STMSINSTANCE < /dev/null > /dev/null 2>&1
514if [ $? -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
531fi
532
533
534# make sure we can stash our data somewhere private
535if [ ! -d $SAVEDIR ]; then
536	$MKDIR -p $SAVEDIR
537fi
538# prime the cache
539$STMSBOOTUTIL -i
540
541
542if [ "$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
593fi
594
595if [ "$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
643elif [ "$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
656elif [ "$cmd" = "list" ]; then
657		$STMSBOOTUTIL $GUID -l $controller
658else
659		$STMSBOOTUTIL $GUID -L
660fi
661
662exit $?
663