1a0261a43SJames C. McPherson#!/sbin/sh -p 27c478bd9Sstevel@tonic-gate# 37c478bd9Sstevel@tonic-gate# CDDL HEADER START 47c478bd9Sstevel@tonic-gate# 57c478bd9Sstevel@tonic-gate# The contents of this file are subject to the terms of the 66deb031bSsjelinek# Common Development and Distribution License (the "License"). 76deb031bSsjelinek# You may not use this file except in compliance with the License. 87c478bd9Sstevel@tonic-gate# 97c478bd9Sstevel@tonic-gate# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 107c478bd9Sstevel@tonic-gate# or http://www.opensolaris.org/os/licensing. 117c478bd9Sstevel@tonic-gate# See the License for the specific language governing permissions 127c478bd9Sstevel@tonic-gate# and limitations under the License. 137c478bd9Sstevel@tonic-gate# 147c478bd9Sstevel@tonic-gate# When distributing Covered Code, include this CDDL HEADER in each 157c478bd9Sstevel@tonic-gate# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 167c478bd9Sstevel@tonic-gate# If applicable, add the following below this CDDL HEADER, with the 177c478bd9Sstevel@tonic-gate# fields enclosed by brackets "[]" replaced with your own identifying 187c478bd9Sstevel@tonic-gate# information: Portions Copyright [yyyy] [name of copyright owner] 197c478bd9Sstevel@tonic-gate# 207c478bd9Sstevel@tonic-gate# CDDL HEADER END 217c478bd9Sstevel@tonic-gate# 227c478bd9Sstevel@tonic-gate# 23*7fc66be0Sjianfei wang - Sun Microsystems - Beijing China# Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. 247c478bd9Sstevel@tonic-gate# 25815dd917Sjmcp# 267c478bd9Sstevel@tonic-gatePATH=/usr/bin:/usr/sbin:$PATH; export PATH 277c478bd9Sstevel@tonic-gateSTMSBOOTUTIL=/lib/mpxio/stmsboot_util 287c478bd9Sstevel@tonic-gateSTMSMETHODSCRIPT=/lib/svc/method/mpxio-upgrade 2960fffc19Sjw149990KDRVCONF= 3060fffc19Sjw149990DRVCONF= 3160fffc19Sjw149990TMPDRVCONF= 3260fffc19Sjw149990TMPDRVCONF_MPXIO_ENTRY= 33cfc4930cSYong-Feng DuTMPDRVCONF_SATA_ENTRY= 3460fffc19Sjw149990DRVLIST= 3560fffc19Sjw149990GUID= 367c478bd9Sstevel@tonic-gateVFSTAB=/etc/vfstab 377c478bd9Sstevel@tonic-gateSAVEDIR=/etc/mpxio 38789c9c8fSJames C. McPhersonBOOTDEVICES=$SAVEDIR/boot-devices 397c478bd9Sstevel@tonic-gateRECOVERFILE=$SAVEDIR/recover_instructions 407c478bd9Sstevel@tonic-gateSVCCFG_RECOVERY=$SAVEDIR/svccfg_recover 414c06356bSdh142964SUPPORTED_DRIVERS="fp|mpt|mpt_sas|pmcs" 4260fffc19Sjw149990USAGE=`gettext "Usage: stmsboot [-D $SUPPORTED_DRIVERS] -e | -d | -u | -L | -l controller_number"` 43aca6e9ccSramatTEXTDOMAIN=SUNW_OST_OSCMD 44aca6e9ccSramatexport TEXTDOMAIN 45a0261a43SJames C. McPhersonSTMSINSTANCE=svc:system/device/mpxio-upgrade:default 4660fffc19Sjw149990STMSBOOT=/usr/sbin/stmsboot 4760fffc19Sjw149990BOOTADM=/sbin/bootadm 4860fffc19Sjw149990MOUNT=/usr/sbin/mount 49a0261a43SJames C. McPhersonEEPROM=/usr/sbin/eeprom 5060fffc19Sjw149990EGREP=/usr/bin/egrep 5160fffc19Sjw149990GREP=/usr/bin/grep 5260fffc19Sjw149990AWK=/usr/bin/awk 53a0261a43SJames C. McPhersonCP=/usr/bin/cp 54789c9c8fSJames C. McPhersonDF=/usr/bin/df 55a0261a43SJames C. McPhersonLS=/usr/bin/ls 56a0261a43SJames C. McPhersonMV=/usr/bin/mv 57a0261a43SJames C. McPhersonRM=/usr/bin/rm 5860fffc19Sjw149990SORT=/usr/bin/sort 5960fffc19Sjw149990UNIQ=/usr/bin/uniq 6060fffc19Sjw149990EXPR=/usr/bin/expr 61a0261a43SJames C. McPhersonMKDIR=/usr/bin/mkdir 62a0261a43SJames C. McPhersonREBOOT=/usr/sbin/reboot 63815dd917SjmcpSED=/usr/bin/sed 64815dd917SjmcpSVCPROP=/usr/bin/svcprop 65815dd917SjmcpSVCCFG=/usr/sbin/svccfg 66815dd917SjmcpSVCS=/usr/bin/svcs 67815dd917SjmcpSVCADM=/usr/sbin/svcadm 687c478bd9Sstevel@tonic-gate 69a0261a43SJames C. McPhersonNOW=`/usr/bin/date +%G%m%d_%H%M` 705a4c37c9Sqh201292MACH=`/usr/bin/uname -p` 71a0261a43SJames C. McPhersonBOOTENV_FILE=bootenv.rc 7260fffc19Sjw149990reboot_needed=0 73a0261a43SJames C. McPhersonnew_bootpath="" 74a0261a43SJames C. McPhersonCLIENT_TYPE_PHCI="" 75a0261a43SJames C. McPhersonCLIENT_TYPE_VHCI="/scsi_vhci" 7660fffc19Sjw149990 777c478bd9Sstevel@tonic-gate# 7860fffc19Sjw149990# Copy all entries (including comments) from source driver.conf 7960fffc19Sjw149990# to destination driver.conf except those entries which contain 8060fffc19Sjw149990# the mpxio-disable property. 817c478bd9Sstevel@tonic-gate# Take into consideration entries that spawn more than one line. 827c478bd9Sstevel@tonic-gate# 837c478bd9Sstevel@tonic-gate# $1 source driver.conf file 847c478bd9Sstevel@tonic-gate# $2 destination driver.conf file 857c478bd9Sstevel@tonic-gate# 867c478bd9Sstevel@tonic-gate# Returns 0 on success, non zero on failure. 877c478bd9Sstevel@tonic-gate# 887c478bd9Sstevel@tonic-gatedelete_mpxio_disable_entries() 897c478bd9Sstevel@tonic-gate{ 90a0261a43SJames C. McPherson # be careful here, we've got embedded \t characters 91a0261a43SJames C. McPherson # in sed's pattern space. 92a0261a43SJames C. McPherson $SED ' 937c478bd9Sstevel@tonic-gate /^[ ]*#/{ p 947c478bd9Sstevel@tonic-gate d 957c478bd9Sstevel@tonic-gate } 967c478bd9Sstevel@tonic-gate s/[ ]*$// 977c478bd9Sstevel@tonic-gate /^$/{ p 987c478bd9Sstevel@tonic-gate d 997c478bd9Sstevel@tonic-gate } 1005a4c37c9Sqh201292 /mpxio-disable[ ]*=.*;$/{ w '$3' 1015a4c37c9Sqh201292 d 1025a4c37c9Sqh201292 } 103cfc4930cSYong-Feng Du /disable-sata-mpxio[ ]*=.*;$/{ w '$4' 104cfc4930cSYong-Feng Du d 105cfc4930cSYong-Feng Du } 1067c478bd9Sstevel@tonic-gate /;$/{ p 1077c478bd9Sstevel@tonic-gate d 1087c478bd9Sstevel@tonic-gate } 1097c478bd9Sstevel@tonic-gate :rdnext 1107c478bd9Sstevel@tonic-gate N 1117c478bd9Sstevel@tonic-gate s/[ ]*$// 1127c478bd9Sstevel@tonic-gate /[^;]$/b rdnext 1135a4c37c9Sqh201292 /mpxio-disable[ ]*=/{ s/\n/ /g 1145a4c37c9Sqh201292 w '$3' 1155a4c37c9Sqh201292 d 1165a4c37c9Sqh201292 } 1175a4c37c9Sqh201292 ' $1 > $2 1187c478bd9Sstevel@tonic-gate 1197c478bd9Sstevel@tonic-gate return $? 1207c478bd9Sstevel@tonic-gate} 1217c478bd9Sstevel@tonic-gate 1227c478bd9Sstevel@tonic-gate# 1237c478bd9Sstevel@tonic-gate# backup the last saved copy of the specified files. 1247c478bd9Sstevel@tonic-gate# $* files to backup 1257c478bd9Sstevel@tonic-gate# 1267c478bd9Sstevel@tonic-gatebackup_lastsaved() 1277c478bd9Sstevel@tonic-gate{ 1287c478bd9Sstevel@tonic-gate for file in $* 1297c478bd9Sstevel@tonic-gate do 130a0261a43SJames C. McPherson newfile=`basename $file` 131a0261a43SJames C. McPherson $CP $file $SAVEDIR/$newfile.$cmd.$NOW 1327c478bd9Sstevel@tonic-gate done 1337c478bd9Sstevel@tonic-gate} 1347c478bd9Sstevel@tonic-gate 1357c478bd9Sstevel@tonic-gate# 1367c478bd9Sstevel@tonic-gate# build recover instructions 1377c478bd9Sstevel@tonic-gate# 1387c478bd9Sstevel@tonic-gate# $1 1 to include boot script in the instructions 1397c478bd9Sstevel@tonic-gate# 0 otherwise 1407c478bd9Sstevel@tonic-gate# 1417c478bd9Sstevel@tonic-gatebuild_recover() 1427c478bd9Sstevel@tonic-gate{ 1437c478bd9Sstevel@tonic-gate gettext "Instructions to recover your previous STMS configuration (if in case the system does not boot):\n\n" > $RECOVERFILE 1447c478bd9Sstevel@tonic-gate echo "\tboot net \c" >> $RECOVERFILE 1457c478bd9Sstevel@tonic-gate gettext "(or from a cd/dvd/another disk)\n" >> $RECOVERFILE 1467c478bd9Sstevel@tonic-gate echo "\tfsck <your-root-device>" >> $RECOVERFILE 1477c478bd9Sstevel@tonic-gate echo "\tmount <your-root-device> /mnt" >> $RECOVERFILE 1487c478bd9Sstevel@tonic-gate 149fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ "$cmd" = "update" ]; then 1507c478bd9Sstevel@tonic-gate gettext "\tUndo the modifications you made to STMS configuration.\n\tFor example undo any changes you made to " >> $RECOVERFILE 15160fffc19Sjw149990 echo "/mnt$KDRVCONF." >> $RECOVERFILE 1527c478bd9Sstevel@tonic-gate else 153a0261a43SJames C. McPherson echo "\tcp /mnt${SAVEDIR}/$DRVCONF.$cmd.$NOW /mnt$KDRVCONF" >> $RECOVERFILE 1547c478bd9Sstevel@tonic-gate fi 1557c478bd9Sstevel@tonic-gate 156815dd917Sjmcp if [ $1 -eq 1 ]; then 157a0261a43SJames C. McPherson echo "\tcp /mnt${SAVEDIR}/vfstab.$cmd.$NOW /mnt$VFSTAB" >> $RECOVERFILE 1587c478bd9Sstevel@tonic-gate 1597c478bd9Sstevel@tonic-gate echo "repository /mnt/etc/svc/repository.db" > $SVCCFG_RECOVERY 1607c478bd9Sstevel@tonic-gate echo "select $STMSINSTANCE" >> $SVCCFG_RECOVERY 1617c478bd9Sstevel@tonic-gate echo "setprop general/enabled=false" >> $SVCCFG_RECOVERY 1627c478bd9Sstevel@tonic-gate echo "exit" >> $SVCCFG_RECOVERY 1637c478bd9Sstevel@tonic-gate 164815dd917Sjmcp echo "\t$SVCCFG -f /mnt$SVCCFG_RECOVERY" >> $RECOVERFILE 1655a4c37c9Sqh201292 166fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ -n "$new_bootpath" -a "$MACH" = "i386" ]; then 167a0261a43SJames C. McPherson echo "\tcp /mnt${SAVEDIR}/bootenv.rc.$cmd.$NOW /mnt/boot/solaris/$BOOTENV_FILE" >> $RECOVERFILE 1685a4c37c9Sqh201292 fi 1697c478bd9Sstevel@tonic-gate fi 1707c478bd9Sstevel@tonic-gate 17160fffc19Sjw149990 rootdisk=`$MOUNT | $GREP "/ on " | cut -f 3 -d " "` 1727c478bd9Sstevel@tonic-gate echo "\tumount /mnt\n\treboot\n\n${rootdisk} \c" >> $RECOVERFILE 1737c478bd9Sstevel@tonic-gate gettext "was your root device,\nbut it could be named differently after you boot net.\n" >> $RECOVERFILE 1747c478bd9Sstevel@tonic-gate} 1757c478bd9Sstevel@tonic-gate 176a0261a43SJames C. McPherson 1777c478bd9Sstevel@tonic-gate# 1787c478bd9Sstevel@tonic-gate# Arrange for /etc/vfstab and dump configuration to be updated 1797c478bd9Sstevel@tonic-gate# during the next reboot. If the cmd is "enable" or "disable", copy 18060fffc19Sjw149990# $TMPDRVCONF to $KDRVCONF. 1817c478bd9Sstevel@tonic-gate# 1827c478bd9Sstevel@tonic-gate# Returns 0 on success, 1 on failure. 1837c478bd9Sstevel@tonic-gate# 1847c478bd9Sstevel@tonic-gateupdate_sysfiles() 1857c478bd9Sstevel@tonic-gate{ 18660fffc19Sjw149990 187a0261a43SJames C. McPherson gettext "WARNING: This operation will require a reboot.\n" 188a0261a43SJames C. McPherson gettext "Do you want to continue ? [y/n] (default: y) " 1897c478bd9Sstevel@tonic-gate read response 1907c478bd9Sstevel@tonic-gate 191fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ -n "$response" -a "$response" != "y" -a \ 192fa30e7bdSjianfei wang - Sun Microsystems - Beijing China "$response" != "Y" ]; then 19360fffc19Sjw149990 for d in $DRVLIST; do 19460fffc19Sjw149990 TMPDRVCONF=/var/run/tmp.$d.conf.$$ 195a0261a43SJames C. McPherson $RM -f $TMPDRVCONF > /dev/null 2>&1 19660fffc19Sjw149990 done; 19760fffc19Sjw149990 return 0; 1987c478bd9Sstevel@tonic-gate fi 1997c478bd9Sstevel@tonic-gate 200815dd917Sjmcp # set need_bootscript to the number of drivers that 201815dd917Sjmcp # we support. 202815dd917Sjmcp need_bootscript=`echo $SUPPORTED_DRIVERS|$AWK -F"|" '{print NF}'` 20360fffc19Sjw149990 204fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ "$cmd" = "enable" -o "$cmd" = "disable" ]; then 20560fffc19Sjw149990 20660fffc19Sjw149990 for d in $DRVLIST; do 20760fffc19Sjw149990 DRVCONF=$d.conf 20860fffc19Sjw149990 KDRVCONF=/kernel/drv/$d.conf 20960fffc19Sjw149990 TMPDRVCONF=/var/run/tmp.$d.conf.$$ 21060fffc19Sjw149990 211a0261a43SJames C. McPherson $CP $KDRVCONF $SAVEDIR/`basename $KDRVCONF`.$cmd.$NOW 212815dd917Sjmcp if [ -f $TMPDRVCONF ]; then 213a0261a43SJames C. McPherson $CP $TMPDRVCONF $KDRVCONF 214a0261a43SJames C. McPherson $RM -f $TMPDRVCONF 215815dd917Sjmcp else 216815dd917Sjmcp # if $TMPDRVCONF doesn't exist, then we 217815dd917Sjmcp # haven't made any changes to it 218815dd917Sjmcp continue; 219815dd917Sjmcp fi 2207c478bd9Sstevel@tonic-gate 2217c478bd9Sstevel@tonic-gate # 2227c478bd9Sstevel@tonic-gate # there is no need to update the system files in the following 2237c478bd9Sstevel@tonic-gate # cases: 2247c478bd9Sstevel@tonic-gate # - we are enabling mpxio and the system has no configured 2257c478bd9Sstevel@tonic-gate # disks accessible by phci paths. 2267c478bd9Sstevel@tonic-gate # - we are disabling mpxio and the system has no configured 2277c478bd9Sstevel@tonic-gate # disks accessible by vhci paths. 2287c478bd9Sstevel@tonic-gate # 22960fffc19Sjw149990 230815dd917Sjmcp # Function to setup the CLIENT_TYPE_PHCI string based on 231815dd917Sjmcp # the list of drivers that we're operating on. The variable 232815dd917Sjmcp # depends upon the pathname of the parent node in the 233815dd917Sjmcp # device tree, which can be different on x86/x64 and sparc. 234815dd917Sjmcp 235a0261a43SJames C. McPherson CLIENT_TYPE_PHCI=`$STMSBOOTUTIL -D $d -N`; 236815dd917Sjmcp 237fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ -z "$CLIENT_TYPE_PHCI" ]; then 23860fffc19Sjw149990 continue; 23960fffc19Sjw149990 fi 24060fffc19Sjw149990 241fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ "$cmd" = "enable" ]; then 242a0261a43SJames C. McPherson $LS -l /dev/dsk/*s2 2> /dev/null | \ 24360fffc19Sjw149990 $EGREP -s "$CLIENT_TYPE_PHCI" 2447c478bd9Sstevel@tonic-gate else 245a0261a43SJames C. McPherson $LS -l /dev/dsk/*s2 2> /dev/null | \ 24660fffc19Sjw149990 $EGREP -s "$CLIENT_TYPE_VHCI" 2477c478bd9Sstevel@tonic-gate fi 2487c478bd9Sstevel@tonic-gate 2497c478bd9Sstevel@tonic-gate if [ $? -ne 0 ]; then 250815dd917Sjmcp need_bootscript=`$EXPR $need_bootscript - 1` 25160fffc19Sjw149990 fi 25260fffc19Sjw149990 done 25360fffc19Sjw149990 fi 25460fffc19Sjw149990 255815dd917Sjmcp if [ $need_bootscript -gt 0 ]; then 256815dd917Sjmcp need_bootscript=1 257fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ -n "$new_bootpath" -a "$MACH" = "i386" ]; then 2585a4c37c9Sqh201292 #only update bootpath for x86. 259a0261a43SJames C. McPherson $CP /boot/solaris/$BOOTENV_FILE $SAVEDIR/$BOOTENV_FILE.$cmd.$NOW 260a0261a43SJames C. McPherson $EEPROM bootpath="$new_bootpath" 2615a4c37c9Sqh201292 fi 262a0261a43SJames C. McPherson # Enable the mpxio-upgrade service for the reboot 263815dd917Sjmcp $SVCADM disable -t $STMSINSTANCE 264a0261a43SJames C. McPherson $SVCCFG -s $STMSINSTANCE "setprop general/enabled=true" 265815dd917Sjmcp else 266815dd917Sjmcp need_bootscript=0 2677c478bd9Sstevel@tonic-gate fi 2687c478bd9Sstevel@tonic-gate 2697c478bd9Sstevel@tonic-gate build_recover $need_bootscript 2707c478bd9Sstevel@tonic-gate 271fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ "$MACH" = "i386" ]; then 27260fffc19Sjw149990 $BOOTADM update-archive 27360fffc19Sjw149990 fi 27460fffc19Sjw149990 2757c478bd9Sstevel@tonic-gate gettext "The changes will come into effect after rebooting the system.\nReboot the system now ? [y/n] (default: y) " 2767c478bd9Sstevel@tonic-gate read response 2777c478bd9Sstevel@tonic-gate 278fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ -z "$response" -o "$response" = "y" -o \ 279fa30e7bdSjianfei wang - Sun Microsystems - Beijing China "$response" = "Y" ]; then 280a0261a43SJames C. McPherson $REBOOT 2817c478bd9Sstevel@tonic-gate fi 2827c478bd9Sstevel@tonic-gate 2837c478bd9Sstevel@tonic-gate return 0 2847c478bd9Sstevel@tonic-gate} 2857c478bd9Sstevel@tonic-gate 286a0261a43SJames C. McPherson 2877c478bd9Sstevel@tonic-gate# 2887c478bd9Sstevel@tonic-gate# Enable or disable mpxio as specified by the cmd. 2897c478bd9Sstevel@tonic-gate# Returns 0 on success, 1 on failure. 2907c478bd9Sstevel@tonic-gate# 29160fffc19Sjw149990# Args: $cmd = {enable | disable} 2924c06356bSdh142964# $d = {fp | mpt | mpt_sas | pmcs} 29360fffc19Sjw149990# 29460fffc19Sjw149990# the global variable $DRVLIST is used 29560fffc19Sjw149990# 2967c478bd9Sstevel@tonic-gateconfigure_mpxio() 2977c478bd9Sstevel@tonic-gate{ 298a0261a43SJames C. McPherson # be careful here, we've got embedded \t characters 299a0261a43SJames C. McPherson # in sed's pattern space. 3005a4c37c9Sqh201292 mpxiodisableno='mpxio-disable[ ]*=[ ]*"no"[ ]*;' 3015a4c37c9Sqh201292 mpxiodisableyes='mpxio-disable[ ]*=[ ]*"yes"[ ]*;' 302cfc4930cSYong-Feng Du satadisableno='disable-sata-mpxio[ ]*=[ ]*"no"[ ]*;' 303cfc4930cSYong-Feng Du satadisableyes='disable-sata-mpxio[ ]*=[ ]*"yes"[ ]*;' 3045a4c37c9Sqh201292 305fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ "$cmd" = "enable" ]; then 3065a4c37c9Sqh201292 mpxiodisable_cur_entry=$mpxiodisableyes 307cfc4930cSYong-Feng Du satadisable_cur_entry=$satadisableyes 3087c478bd9Sstevel@tonic-gate propval=no 30960fffc19Sjw149990 msg=`gettext "STMS already enabled"` 3107c478bd9Sstevel@tonic-gate else 3115a4c37c9Sqh201292 mpxiodisable_cur_entry=$mpxiodisableno 312cfc4930cSYong-Feng Du satadisable_cur_entry=$satadisableno 3137c478bd9Sstevel@tonic-gate propval=yes 31460fffc19Sjw149990 msg=`gettext "STMS already disabled"` 3157c478bd9Sstevel@tonic-gate fi 3167c478bd9Sstevel@tonic-gate 31760fffc19Sjw149990 DRVCONF=$d.conf 31860fffc19Sjw149990 KDRVCONF=/kernel/drv/$d.conf 31960fffc19Sjw149990 TMPDRVCONF=/var/run/tmp.$d.conf.$$ 32060fffc19Sjw149990 TMPDRVCONF_MPXIO_ENTRY=/var/run/tmp.$d.conf.mpxioentry.$$; 321cfc4930cSYong-Feng Du TMPDRVCONF_SATA_ENTRY=/var/run/tmp.$d.conf.sataentry.$$; 32260fffc19Sjw149990 323cfc4930cSYong-Feng Du if delete_mpxio_disable_entries $KDRVCONF $TMPDRVCONF $TMPDRVCONF_MPXIO_ENTRY $TMPDRVCONF_SATA_ENTRY; then 32460fffc19Sjw149990 32560fffc19Sjw149990 if [ -s $TMPDRVCONF_MPXIO_ENTRY ]; then 32660fffc19Sjw149990 # $DRVCONF does have mpxiodisable entries 32760fffc19Sjw149990 $EGREP -s "$mpxiodisable_cur_entry" $TMPDRVCONF_MPXIO_ENTRY 328cfc4930cSYong-Feng Du if [ $? -eq 0 ]; then 329cfc4930cSYong-Feng Du reboot_needed=`$EXPR $reboot_needed + 1` 330cfc4930cSYong-Feng Du else 3315a4c37c9Sqh201292 # if all mpxiodisable entries are no/yes for 3325a4c37c9Sqh201292 # enable/disable mpxio, notify the user 333cfc4930cSYong-Feng Du $EGREP -s "$satadisable_cur_entry" $TMPDRVCONF_SATA_ENTRY 334fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ $? -eq 0 -a "$d" = "mpt" ]; then 33560fffc19Sjw149990 reboot_needed=`$EXPR $reboot_needed + 1` 336cfc4930cSYong-Feng Du else 337cfc4930cSYong-Feng Du $RM -f $TMPDRVCONF $TMPDRVCONF_MPXIO_ENTRY $TMPDRVCONF_SATA_ENTRY > /dev/null 2>&1 338ccb7005eSYong-Feng Du return 0; 339cfc4930cSYong-Feng Du fi 3407c478bd9Sstevel@tonic-gate fi 34160fffc19Sjw149990 34260fffc19Sjw149990 # If mpxiodisable entries do not exist, always continue update 3435a4c37c9Sqh201292 fi 3447c478bd9Sstevel@tonic-gate else 345cfc4930cSYong-Feng Du $RM -f $TMPDRVCONF $TMPDRVCONF_MPXIO_ENTRY $TMPDRVCONF_SATA_ENTRY > /dev/null 2>&1 3467c478bd9Sstevel@tonic-gate gettext "failed to update " 1>&2 34760fffc19Sjw149990 echo "$KDRVCONF." 1>&2 3487c478bd9Sstevel@tonic-gate gettext "No changes were made to your STMS configuration.\n" 1>&2 3497c478bd9Sstevel@tonic-gate return 1 3507c478bd9Sstevel@tonic-gate fi 3515a4c37c9Sqh201292 35235c62094Sjianfei wang - Sun Microsystems - Beijing China rm $TMPDRVCONF_MPXIO_ENTRY $TMPDRVCONF_SATA_ENTRY > /dev/null 2>&1 35360fffc19Sjw149990 echo "mpxio-disable=\"${propval}\";" >> $TMPDRVCONF 354fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ "$d" = "mpt" ]; then 355cfc4930cSYong-Feng Du echo "disable-sata-mpxio=\"${propval}\";" >> $TMPDRVCONF 35635c62094Sjianfei wang - Sun Microsystems - Beijing China fi 3575a4c37c9Sqh201292 3587c478bd9Sstevel@tonic-gate} 3597c478bd9Sstevel@tonic-gate 3607c478bd9Sstevel@tonic-gatesetcmd() 3617c478bd9Sstevel@tonic-gate{ 362fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ "$cmd" = "none" ]; then 3637c478bd9Sstevel@tonic-gate cmd=$1 3647c478bd9Sstevel@tonic-gate else 3657c478bd9Sstevel@tonic-gate echo "$USAGE" 1>&2 3667c478bd9Sstevel@tonic-gate exit 2 3677c478bd9Sstevel@tonic-gate fi 3687c478bd9Sstevel@tonic-gate} 3697c478bd9Sstevel@tonic-gate 37060fffc19Sjw149990# 3715a4c37c9Sqh201292# Need to update bootpath on x86 if boot system from FC disk 3725a4c37c9Sqh201292# Only update bootpath here when mpxio is enabled 373a0261a43SJames C. McPherson# If mpxio is currently disabled, then we'll update bootpath in the 374a0261a43SJames C. McPherson# mpxio-upgrade service method on reboot. 37560fffc19Sjw149990# 37660fffc19Sjw149990 3775a4c37c9Sqh201292get_newbootpath_for_stmsdev() { 378fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ "$cmd" = "enable" ]; then 3795a4c37c9Sqh201292 return 0 3805a4c37c9Sqh201292 fi 3815a4c37c9Sqh201292 382a0261a43SJames C. McPherson cur_bootpath=`$STMSBOOTUTIL -b` 383a0261a43SJames C. McPherson if [ $? != 0 ]; then 3845a4c37c9Sqh201292 return 1 3855a4c37c9Sqh201292 fi 3865a4c37c9Sqh201292 387a0261a43SJames C. McPherson # Since on x64 platforms the eeprom command doesn't update the 388a0261a43SJames C. McPherson # kernel, the file /boot/solaris/bootenv.rc and the kernel's 389a0261a43SJames C. McPherson # bootpath variable have a good chance of differing. We do some 390a0261a43SJames C. McPherson # extra handwaving to get the correct bootpath variable setting. 391a0261a43SJames C. McPherson 392a0261a43SJames C. McPherson ONDISKVER=`$AWK '/bootpath/ {print $3}' /boot/solaris/bootenv.rc|\ 393a0261a43SJames C. McPherson $SED -e"s,',,g"` 394fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ "$ONDISKVER" != "$cur_bootpath" ]; then 395a0261a43SJames C. McPherson cur_bootpath="$ONDISKVER" 396a0261a43SJames C. McPherson fi 397a0261a43SJames C. McPherson 398a0261a43SJames C. McPherson NEWBOOTPATH="" 399a0261a43SJames C. McPherson for path in $cur_bootpath; do 400a0261a43SJames C. McPherson mapped=`$STMSBOOTUTIL -p $path` 401a0261a43SJames C. McPherson if [ "$mapped" != "NOT_MAPPED" ]; then 402a0261a43SJames C. McPherson if [ "$mapped" != "$path" ]; then 403a0261a43SJames C. McPherson NEWBOOTPATH=`echo "$path " | \ 404a0261a43SJames C. McPherson $SED -e"s|$path|$mapped|"`" $NEWBOOTPATH" 405a0261a43SJames C. McPherson else 406a0261a43SJames C. McPherson NEWBOOTPATH="$NEWBOOTPATH $path" 407a0261a43SJames C. McPherson fi 408a0261a43SJames C. McPherson fi 409a0261a43SJames C. McPherson done 410a0261a43SJames C. McPherson # now strip off leading and trailing space chars 411a0261a43SJames C. McPherson new_bootpath=`echo $NEWBOOTPATH` 4125a4c37c9Sqh201292 return 0 41360fffc19Sjw149990} 41460fffc19Sjw149990 41560fffc19Sjw149990# 41660fffc19Sjw149990# Emit a warning message to the user that by default we 41760fffc19Sjw149990# operate on all multipath-capable controllers that are 41860fffc19Sjw149990# attached to the system, and that if they want to operate 4194c06356bSdh142964# on only a specific controller type (fp|mpt|mpt_sas|pmcs|....) then 42060fffc19Sjw149990# they need to re-invoke stmsboot with "-D $driver" in 42160fffc19Sjw149990# their argument list 42260fffc19Sjw149990# 42360fffc19Sjw149990 42460fffc19Sjw149990emit_driver_warning_msg() { 42560fffc19Sjw149990 42660fffc19Sjw149990 # for each driver that we support, grab the list 42760fffc19Sjw149990 # of controllers attached to the system. 42860fffc19Sjw149990 429815dd917Sjmcp echo "" 43053ed03b5Sjmcp gettext "WARNING: stmsboot operates on each supported multipath-capable controller\n" 43153ed03b5Sjmcp gettext " detected in a host. In your system, these controllers are\n\n" 43260fffc19Sjw149990 433815dd917Sjmcp for WARNDRV in `echo $SUPPORTED_DRIVERS| $SED -e"s,|, ,g"`; do 434a0261a43SJames C. McPherson $STMSBOOTUTIL -D $WARNDRV -n 43560fffc19Sjw149990 done; 43660fffc19Sjw149990 43760fffc19Sjw149990 echo "" 43853ed03b5Sjmcp gettext "If you do NOT wish to operate on these controllers, please quit stmsboot\n" 4394c06356bSdh142964 gettext "and re-invoke with -D { fp | mpt | mpt_sas | pmcs} to specify which controllers you wish\n" 44053ed03b5Sjmcp gettext "to modify your multipathing configuration for.\n" 44160fffc19Sjw149990 442815dd917Sjmcp echo "" 44353ed03b5Sjmcp gettext "Do you wish to continue? [y/n] (default: y) " 44460fffc19Sjw149990 read response 44560fffc19Sjw149990 446fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ -n "$response" -a "$response" != "Y" -a \ 447fa30e7bdSjianfei wang - Sun Microsystems - Beijing China "$response" != "y" ]; then 44860fffc19Sjw149990 exit 44960fffc19Sjw149990 fi 45060fffc19Sjw149990} 45160fffc19Sjw149990 4527c478bd9Sstevel@tonic-gate 453a0261a43SJames C. McPherson# 454a0261a43SJames C. McPherson# 455a0261a43SJames C. McPherson# main starts here 456a0261a43SJames C. McPherson# 457a0261a43SJames C. McPherson 458a0261a43SJames C. McPhersoncmd=none 4597c478bd9Sstevel@tonic-gate# process options 46060fffc19Sjw149990while getopts D:geduLl: c 4617c478bd9Sstevel@tonic-gatedo 4627c478bd9Sstevel@tonic-gate case $c in 4637c478bd9Sstevel@tonic-gate e) setcmd enable;; 4647c478bd9Sstevel@tonic-gate d) setcmd disable;; 4657c478bd9Sstevel@tonic-gate u) setcmd update;; 4667c478bd9Sstevel@tonic-gate L) setcmd listall;; 4677c478bd9Sstevel@tonic-gate l) setcmd list 4687c478bd9Sstevel@tonic-gate controller=$OPTARG;; 46960fffc19Sjw149990 D) DRV=$OPTARG;; 47060fffc19Sjw149990 g) GUID="-g";; 4717c478bd9Sstevel@tonic-gate \?) echo "$USAGE" 1>&2 4727c478bd9Sstevel@tonic-gate exit 2;; 4737c478bd9Sstevel@tonic-gate esac 4747c478bd9Sstevel@tonic-gatedone 4757c478bd9Sstevel@tonic-gate 476fa30e7bdSjianfei wang - Sun Microsystems - Beijing Chinaif [ "$cmd" = "none" ]; then 4777c478bd9Sstevel@tonic-gate echo "$USAGE" 1>&2 4787c478bd9Sstevel@tonic-gate exit 2 4797c478bd9Sstevel@tonic-gatefi 4807c478bd9Sstevel@tonic-gate 481fa30e7bdSjianfei wang - Sun Microsystems - Beijing Chinaif [ -z "$DRV" ]; then 4824c06356bSdh142964 DRVLIST="fp mpt mpt_sas pmcs" 48360fffc19Sjw149990else 48460fffc19Sjw149990 DRVLIST=$DRV 48560fffc19Sjw149990fi 48660fffc19Sjw149990 48734c94816SjmcpUSERID=`id | $EGREP "uid=0"` 48834c94816Sjmcpif [ -z "$USERID" ]; then 4897c478bd9Sstevel@tonic-gate gettext "You must be super-user to run this script.\n" 1>&2 4907c478bd9Sstevel@tonic-gate exit 1 4917c478bd9Sstevel@tonic-gatefi 4927c478bd9Sstevel@tonic-gate 4937c478bd9Sstevel@tonic-gate# just a sanity check 4947c478bd9Sstevel@tonic-gateif [ ! -f $STMSBOOTUTIL -o ! -f $STMSMETHODSCRIPT ]; then 4957c478bd9Sstevel@tonic-gate fmt=`gettext "Can't find %s and/or %s"` 4967c478bd9Sstevel@tonic-gate printf "$fmt\n" "$STMSBOOTUTIL" "$STMSMETHODSCRIPT" 1>&2 4977c478bd9Sstevel@tonic-gate exit 1 4987c478bd9Sstevel@tonic-gatefi 4997c478bd9Sstevel@tonic-gate 50060fffc19Sjw149990# If the old sun4u-specific SMF method is found, remove it 501815dd917Sjmcp$SVCCFG -s "platform/sun4u/mpxio-upgrade:default" < /dev/null > /dev/null 2>&1 502815dd917Sjmcpif [ $? -eq 0 ]; then 503815dd917Sjmcp $SVCCFG delete "platform/sun4u/mpxio-upgrade:default" > /dev/null 2>&1 50460fffc19Sjw149990fi 50560fffc19Sjw149990 50660fffc19Sjw149990# now import the new service, if necessary 507815dd917Sjmcp$SVCPROP -q $STMSINSTANCE < /dev/null > /dev/null 2>&1 50860fffc19Sjw149990if [ $? -ne 0 ]; then 5099444c26fSTom Whitten if [ -f /lib/svc/manifest/system/device/mpxio-upgrade.xml ]; then 5109444c26fSTom Whitten $SVCCFG import /lib/svc/manifest/system/device/mpxio-upgrade.xml 51160fffc19Sjw149990 if [ $? -ne 0 ]; then 512fa30e7bdSjianfei wang - Sun Microsystems - Beijing China 51353ed03b5Sjmcp fmt=`gettext "Unable to import the %s service"` 5147c478bd9Sstevel@tonic-gate printf "$fmt\n" "$STMSINSTANCE" 1>&2 5157c478bd9Sstevel@tonic-gate exit 1 51660fffc19Sjw149990 else 51760fffc19Sjw149990 fmt=`gettext "Service %s imported successfully, continuing"` 51860fffc19Sjw149990 printf "$fmt\n" "$STMSINSTANCE" 1>&2 51960fffc19Sjw149990 fi 52060fffc19Sjw149990 else 52160fffc19Sjw149990 fmt=`gettext "Service %s does not exist on this host"` 52260fffc19Sjw149990 printf "$fmt\n" "$STMSINSTANCE" 1>&2 52360fffc19Sjw149990 exit 1 52460fffc19Sjw149990 fi 5257c478bd9Sstevel@tonic-gatefi 5267c478bd9Sstevel@tonic-gate 527a0261a43SJames C. McPherson 528a0261a43SJames C. McPherson# make sure we can stash our data somewhere private 529a0261a43SJames C. McPhersonif [ ! -d $SAVEDIR ]; then 530a0261a43SJames C. McPherson $MKDIR -p $SAVEDIR 531a0261a43SJames C. McPhersonfi 532a0261a43SJames C. McPherson# prime the cache 533a0261a43SJames C. McPherson$STMSBOOTUTIL -i 534a0261a43SJames C. McPherson 535a0261a43SJames C. McPherson 536fa30e7bdSjianfei wang - Sun Microsystems - Beijing Chinaif [ "$cmd" = "enable" -o "$cmd" = "disable" -o "$cmd" = "update" ]; then 5377c478bd9Sstevel@tonic-gate # 5387c478bd9Sstevel@tonic-gate # The bootup script doesn't work on cache-only-clients as the script 5396deb031bSsjelinek # is executed before the plumbing for cachefs mounting of root is done. 5407c478bd9Sstevel@tonic-gate # 54160fffc19Sjw149990 if $MOUNT -v | $EGREP -s " on / type (nfs|cachefs) "; then 542a0261a43SJames C. McPherson gettext "This command option is not supported on systems with an nfs or cachefs mounted root filesystem.\n" 1>&2 5437c478bd9Sstevel@tonic-gate exit 1 5447c478bd9Sstevel@tonic-gate fi 5457c478bd9Sstevel@tonic-gate 546815dd917Sjmcp # if the user has left the system with the mpxio-upgrade service 547815dd917Sjmcp # in a temporarily disabled state (ie, service is armed for the next 548815dd917Sjmcp # reboot), then let them know. We need to ensure that the system is 549815dd917Sjmcp # is in a sane state before allowing any further invocations, so 550815dd917Sjmcp # try to get the system admin to do so 551815dd917Sjmcp 552a0261a43SJames C. McPherson ISARMED=`$SVCS -l $STMSINSTANCE|$GREP "enabled.*false.*temporary"` 553a0261a43SJames C. McPherson if [ ! $? ]; then 554815dd917Sjmcp echo "" 55553ed03b5Sjmcp gettext "You need to reboot the system in order to complete\n" 55653ed03b5Sjmcp gettext "the previous invocation of stmsboot.\n" 557815dd917Sjmcp echo "" 55853ed03b5Sjmcp gettext "Do you wish to reboot the system now? (y/n, default y) " 559815dd917Sjmcp read response 560815dd917Sjmcp 561fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ -z "$response" -o "x$response" = "Y" -o \ 562fa30e7bdSjianfei wang - Sun Microsystems - Beijing China "$response" = "y" ]; then 563a0261a43SJames C. McPherson $REBOOT 564815dd917Sjmcp else 56553ed03b5Sjmcp echo "" 56653ed03b5Sjmcp gettext "Please reboot this system before continuing\n" 56753ed03b5Sjmcp echo "" 568815dd917Sjmcp exit 1 569815dd917Sjmcp fi 570815dd917Sjmcp fi 571815dd917Sjmcp 5727c478bd9Sstevel@tonic-gate # 5737c478bd9Sstevel@tonic-gate # keep a copy of the last saved files, useful for manual 5747c478bd9Sstevel@tonic-gate # recovery in case of a problem. 5757c478bd9Sstevel@tonic-gate # 57660fffc19Sjw149990 for d in $DRVLIST; do 57760fffc19Sjw149990 DRVCONF=$d.conf 57860fffc19Sjw149990 KDRVCONF=/kernel/drv/$d.conf 57960fffc19Sjw149990 TMPDRVCONF=/var/run/tmp.$d.conf.$$ 58060fffc19Sjw149990 TMPDRVCONF_MPXIO_ENTRY=/var/run/tmp.$d.conf.mpxioentry.$$; 581fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ "$MACH" = "sparc" ]; then 58260fffc19Sjw149990 backup_lastsaved $KDRVCONF $VFSTAB 5837c478bd9Sstevel@tonic-gate else 584a0261a43SJames C. McPherson backup_lastsaved $KDRVCONF $VFSTAB /boot/solaris/$BOOTENV_FILE 5855a4c37c9Sqh201292 fi 58660fffc19Sjw149990 done 5877c478bd9Sstevel@tonic-gatefi 5887c478bd9Sstevel@tonic-gate 589fa30e7bdSjianfei wang - Sun Microsystems - Beijing Chinaif [ "$cmd" = "enable" -o "$cmd" = "disable" ]; then 59060fffc19Sjw149990 591*7fc66be0Sjianfei wang - Sun Microsystems - Beijing China msgneeded=`echo "$DRVLIST" |$GREP " "` 59260fffc19Sjw149990 if [ -n "$msgneeded" ]; then 59360fffc19Sjw149990 emit_driver_warning_msg 59460fffc19Sjw149990 fi 59560fffc19Sjw149990 for d in $DRVLIST; do 59660fffc19Sjw149990 configure_mpxio $cmd $d 59760fffc19Sjw149990 done 59860fffc19Sjw149990 59960fffc19Sjw149990 if [ $reboot_needed -ne 0 ]; then 60060fffc19Sjw149990 # Need to update bootpath on x86 if our boot device is 60160fffc19Sjw149990 # now accessed through mpxio. 60260fffc19Sjw149990 # Only update bootpath before reboot when mpxio is enabled 60360fffc19Sjw149990 # If mpxio is currently disabled, we will update bootpath 60460fffc19Sjw149990 # on reboot in the mpxio-upgrade service 60560fffc19Sjw149990 606fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ "$cmd" = "disable" ]; then 607fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ "$MACH" = "i386" ]; then 60860fffc19Sjw149990 get_newbootpath_for_stmsdev 60960fffc19Sjw149990 if [ $? -ne 0 ]; then 610a0261a43SJames C. McPherson $RM -f $TMPDRVCONF > /dev/null 2>&1 61160fffc19Sjw149990 gettext "failed to update bootpath.\n" 1>&2 61260fffc19Sjw149990 gettext "No changes were made to your STMS configuration.\n" 1>&2 61360fffc19Sjw149990 return 1 61460fffc19Sjw149990 fi 61560fffc19Sjw149990 fi 616789c9c8fSJames C. McPherson # If we're not using ZFS root then we need 617789c9c8fSJames C. McPherson # to keep track of what / maps to in case 618789c9c8fSJames C. McPherson # it's an active-active device and we boot from 619789c9c8fSJames C. McPherson # the other path 620*7fc66be0Sjianfei wang - Sun Microsystems - Beijing China HASZFSROOT=`$DF -g / |$GREP zfs` 621*7fc66be0Sjianfei wang - Sun Microsystems - Beijing China if [ -z "$HASZFSROOT" ]; then 622789c9c8fSJames C. McPherson ROOTSCSIVHCI=`$DF /|$AWK -F":" '{print $1}' | \ 623*7fc66be0Sjianfei wang - Sun Microsystems - Beijing China $AWK -F"(" '{print $2}'| $SED -e"s,),,"` 624*7fc66be0Sjianfei wang - Sun Microsystems - Beijing China TMPROOTDEV=`$LS -l $ROOTSCSIVHCI |$AWK -F">" '{print $2}' | \ 625*7fc66be0Sjianfei wang - Sun Microsystems - Beijing China $SED -e"s, ../../devices,,"` 626*7fc66be0Sjianfei wang - Sun Microsystems - Beijing China $STMSBOOTUTIL -q $TMPROOTDEV > $BOOTDEVICES 627*7fc66be0Sjianfei wang - Sun Microsystems - Beijing China fi 628789c9c8fSJames C. McPherson fi 62960fffc19Sjw149990 update_sysfiles 63060fffc19Sjw149990 else 63160fffc19Sjw149990 echo "STMS is already ${cmd}d. No changes or reboots needed" 63260fffc19Sjw149990 fi 63360fffc19Sjw149990 63460fffc19Sjw149990 635fa30e7bdSjianfei wang - Sun Microsystems - Beijing Chinaelif [ "$cmd" = "update" ]; then 636fa30e7bdSjianfei wang - Sun Microsystems - Beijing China if [ "$MACH" = "i386" ]; then 6375a4c37c9Sqh201292 # In this case we always change the bootpath to phci-based 6385a4c37c9Sqh201292 # path first. bootpath will later be modified in mpxio-upgrade 6395a4c37c9Sqh201292 # to the vhci-based path if mpxio is enabled on root. 6405a4c37c9Sqh201292 get_newbootpath_for_stmsdev 6415a4c37c9Sqh201292 if [ $? -ne 0 ]; then 6425a4c37c9Sqh201292 gettext "failed to update bootpath.\n" 1>&2 6435a4c37c9Sqh201292 return 1 6445a4c37c9Sqh201292 fi 6455a4c37c9Sqh201292 fi 6467c478bd9Sstevel@tonic-gate update_sysfiles 64760fffc19Sjw149990 648fa30e7bdSjianfei wang - Sun Microsystems - Beijing Chinaelif [ "$cmd" = "list" ]; then 64960fffc19Sjw149990 $STMSBOOTUTIL $GUID -l $controller 6507c478bd9Sstevel@tonic-gateelse 65160fffc19Sjw149990 $STMSBOOTUTIL $GUID -L 6527c478bd9Sstevel@tonic-gatefi 6537c478bd9Sstevel@tonic-gate 6547c478bd9Sstevel@tonic-gateexit $? 655