postinstall revision 8d483882aa3390058094b043f3d62187b5d1de03
#!/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 2007 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
# ident "%Z%%M% %I% %E% SMI"
ROOT=${PKG_INSTALL_ROOT:-/}
SYSTEM=${ROOT}/etc/system
BOOTENVRC=${ROOT}/boot/solaris/bootenv.rc
PATH_TO_INST=${ROOT}/etc/path_to_inst
POWER_CONF=${ROOT}/etc/power.conf
BAK=bak
TMP=/tmp
NV_SATA=nv_sata
NVSATA_TMP=$TMP/${NV_SATA}
SYSTEM_BAK=${NVSATA_TMP}/system.${BAK}
BOOTENVRC_BAK=${NVSATA_TMP}/bootenv.rc.${BAK}
POWER_CONF_BAK=${NVSATA_TMP}/power.conf.${BAK}
UPGRADE_LOG=${ROOT}/var/sadm/system/logs/upgrade_log
LIVEUPGRADE_TMP_LOG=$TMP/.luupgrade.pfinstall.log.*
DEVMAP_TABLE=${TMP}/devmap_table
DRIVER_ALIASES='"pci10de,37f" "pci10de,55" "pci10de,54"'
ETC_DEV_DIR=${ROOT}/etc/dev
ENUMERATE_RESERVED=${ETC_DEV_DIR}/reserved_devnames
DEVLINK_DB=${ETC_DEV_DIR}/.devlink_db
CP=/usr/bin/cp
MV=/usr/bin/mv
LN=/usr/bin/ln
LS=/usr/bin/ls
GREP=/usr/bin/grep
SED=/usr/bin/sed
CUT=/usr/bin/cut
CAT=/usr/bin/cat
NAWK=/usr/bin/nawk
RM=/usr/bin/rm
MKDIR=/usr/bin/mkdir
MOUNT=/usr/sbin/mount
MODINFO=/usr/sbin/modinfo
PRTCONF=/etc/prtconf
PRTCONF_OUT=${NVSATA_TMP}/prtconf_vp.out
DEV_PROPS=${NVSATA_TMP}/dev_props.out
#
# get_devinfo_prop(file, prop)
#
# <prtconf.out> file that has output from 'prtconf -vp' command
# <prop> name of the property OR "ALL" for all properties
#
# parse the output of prtconf command and print the value of
# of the specified property or all if <prop> is "ALL" in
# the format "<name>=<value>".
#
get_devinfo_prop()
{
/bin/cat $1 | ${NAWK} -v prop=$2 '
BEGIN {
if (match(prop,"ALL"))
check_all=1;
else
check_all=0;
}
{
if (!match($1, "name="))
next;
if (!check_all) {
pname = sprintf("name=\047%s\047", prop);
if (!match($1, pname))
next;
}
gsub("\047", "", $1);
name = substr($1, index($1,"=")+1);
if (match($2, "type=boolean")) {
value=1;
} else if (match($2, "type=int") || match($2, "type=byte")) {
getline;
value = ""
cnt = split(substr($0,index($0, "=")+1), words, ".");
for (i = 1; i <= cnt; i++) {
w = "0x" skipzeros(words[i]);
if (i > 1)
value = value " ";
value = value w;
}
} else {
getline;
value = substr($0,index($0, "=")+1);
}
if (!check_all) {
print value;
exit (0);
}
print name "=" value;
}
# skp the leading '0' characters in the string
function skipzeros (str, out, n, i)
{
n = length(str);
for (i = 1; i <= n; i++) {
if (!match(substr(str, i, 1), "0")) {
break;
}
}
if (i > n)
out=substr(str,n);
else
out=substr(str,i);
return (out);
}'
}
#
# Function get_properties() gets the following properties for the
# device (i.e /devices path without '/devices' prefix) passed as
# an argument:
#
# vendor-id
# device-id
# subsystem-vendor-id
# subsystem-id
#
# Note: it saves the pathname and the properties in ${DEV_PROPS} file
# to optimize subsequent mapping calls for the same path name.
#
# e.g: get_properties "/pci@0,0/pci-ide@1f,2"
#
get_properties()
{
if [ -f ${DEV_PROPS} ]
then
mapped_path=`${GREP} $1 ${DEV_PROPS}`
if [ $? -eq 0 ]
then
vendor_id=`echo ${mapped_path} | ${CUT} -d ' ' -f2`
device_id=`echo ${mapped_path} | ${CUT} -d ' ' -f3`
subsystem_vendor_id=`echo ${mapped_path} | ${CUT} -d ' ' -f4`
subsystem_id=`echo ${mapped_path} | ${CUT} -d ' ' -f5`
return;
fi
fi
path=`echo $1|${GREP} -v storage`
${PRTCONF} -vp "/devices"$path >${PRTCONF_OUT}
if [ $? -eq 0 ]
then
vendor_id=`get_devinfo_prop ${PRTCONF_OUT} "vendor-id" | ${SED} "s/^0x//"`
device_id=`get_devinfo_prop ${PRTCONF_OUT} "device-id" | ${SED} "s/^0x//"`
subsystem_vendor_id=`get_devinfo_prop ${PRTCONF_OUT} "subsystem-vendor-id" | ${SED} "s/^0x//"`
subsystem_id=`get_devinfo_prop ${PRTCONF_OUT} "subsystem-id" | ${SED} "s/^0x//"`
rm -f ${PRTCONF_OUT}
echo $1 "$vendor_id" "$device_id" "$subsystem_vendor_id" "$subsystem_id" >>${DEV_PROPS}
else
vendor_id=""
device_id=""
subsystem_vendor_id=""
subsystem_id=""
echo $1 "$vendor_id" >>${DEV_PROPS}
fi
}
#
# Function process_bootenvrc_for_install() converts bootpath in ata style
# to nv_sata style in the file /boot/solaris/bootenv.rc for normal upgrade.
#
process_bootenvrc_for_install() {
# Check to see if bootenv.rc file has ata disk entries.
${GREP} "cmdk@" ${BOOTENVRC} > /dev/null
if [ $? -eq 1 ]
then
# There is no ata disk entry. No mapping is needed.
return 0
fi
# Backup the bootenv.rc file.
$CP ${BOOTENVRC} ${BOOTENVRC_BAK}
if [ $? -ne 0 ]
then
# Can't backup bootenv.rc file.
rem_drv -b ${ROOT} nv_sata
${RM} -rf ${NVSATA_TMP}
exit 1
fi
${GREP} "cmdk@" ${BOOTENVRC} | while read bootpath_line
do
old_path=`echo ${bootpath_line} | ${CUT} -d' ' -f3`
devname=`echo ${old_path} | $CUT -d/ -f4- | $SED "{
s/ide@/disk@/
s/\/cmdk@.//
}"`
$LS -l /dev/dsk | $GREP ${devname} | while read line
do
new_path=`echo $line | $NAWK '{print $11}'`
arg="/`echo ${new_path} | ${CUT} -d/ -f4,5`"
get_properties ${arg}
for pair in ${DRIVER_ALIASES}
do
VENDOR_ID=`echo ${pair} | $SED "s/\"//g" \
| $CUT -d, -f1`
DEVICE_ID=`echo ${pair} | $SED "s/\"//g" \
| $CUT -d, -f2`
# Check to see if it is a nv_sata device.
if [ "pci${vendor_id}" = ${VENDOR_ID} -a \
${device_id} = ${DEVICE_ID} ]
then
if [ "X${subsystem_vendor_id}" = "X" ]
then
ids="pci${vendor_id},${device_id}"
else
ids="pci${subsystem_vendor_id},${subsystem_id}"
fi
mapped_path=`echo ${old_path} | ${SED} "{
s/pci-ide/${ids}/
s/ide/disk/
s/\/cmdk@.//
}"`
new_path="/`echo ${new_path} | $CUT -d/ -f4-`"
if [ ${new_path} = ${mapped_path} ]
then
if [ ! -f ${NVSATA_TMP}/bootenv.rc ]
then
$GREP -v "cmdk@" ${BOOTENVRC} > \
${NVSATA_TMP}/bootenv.rc
fi
echo "setprop bootpath ${new_path}" \
>> ${NVSATA_TMP}/bootenv.rc
break
fi
fi
done
done
done
# Commit the changes
if [ -f ${NVSATA_TMP}/bootenv.rc ]
then
${CP} ${NVSATA_TMP}/bootenv.rc ${BOOTENVRC}
if [ $? -ne 0 ]
then
# Failed to modify bootenv.rc file.
rem_drv -b ${ROOT} nv_sata
${RM} -rf ${NVSATA_TMP}
exit 1
fi
fi
}
#
# Function process_bootenvrc_for_lu() converts bootpath in ata style
# to nv_sata style in the file /boot/solaris/bootenv.rc for live upgrade.
#
process_bootenvrc_for_lu() {
# Check to see if bootenv.rc has ata disk entries.
${GREP} "cmdk@" ${BOOTENVRC} > /dev/null
if [ $? -eq 1 ]
then
# There is no ata disk. No mapping is needed.
return 0
fi
# Backup the bootenv.rc file.
$CP ${BOOTENVRC} ${BOOTENVRC_BAK}
if [ $? -ne 0 ]
then
# Can't backup bootenv.rc file.
rem_drv -b ${ROOT} nv_sata
${RM} -rf ${NVSATA_TMP}
exit 1
fi
${GREP} "cmdk@" ${BOOTENVRC} | while read bootpath_line
do
bootpath=`echo ${bootpath_line} | ${CUT} -d' ' -f3`
if [ "X${no_nvsata_in_CBE}" != "X0" ]
then
arg=`echo ${bootpath} | ${CUT} -d/ -f1-3`
get_properties ${arg}
# Check if boot device is a supported nv_sata device.
for pair in ${DRIVER_ALIASES}
do
dr_vendor_id=`echo $pair | $SED "s/\"//g" | $CUT -d, -f1`
dr_device_id=`echo $pair | $SED "s/\"//g" | $CUT -d, -f2`
if [ "pci${vendor_id}" = ${dr_vendor_id} -a ${device_id} = \
${dr_device_id} ]
then
if [ "X${subsystem_vendor_id}" = "X" ]
then
ids="pci${vendor_id},${device_id}"
else
ids="pci${subsystem_vendor_id},${subsystem_id}"
fi
if [ ! -f ${NVSATA_TMP}/bootenv.rc ]
then
$GREP -v "cmdk@" ${BOOTENVRC} > \
${NVSATA_TMP}/bootenv.rc
fi
mapped_bootpath_line=`echo ${bootpath_line} | ${SED} "{
s/pci-ide/${ids}/
s/ide/disk/
s/\/cmdk@.//
}"`
echo ${mapped_bootpath_line} >> ${NVSATA_TMP}/bootenv.rc
break
fi
done
else
is_mapped="no"
devname=`echo ${bootpath} | $CUT -d/ -f4- | $SED "{
s/ide@/disk@/
s/\/cmdk@.//
}"`
for new_path in `$LS -l "/dev/dsk" | $GREP ${devname} |$NAWK '{print $11}'`
do
arg2="/`echo ${new_path} | ${CUT} -d/ -f4,5`"
get_properties ${arg2}
for pair in ${DRIVER_ALIASES}
do
VENDOR_ID=`echo ${pair} | $SED "s/\"//g" \
| $CUT -d, -f1`
DEVICE_ID=`echo ${pair} | $SED "s/\"//g" \
| $CUT -d, -f2`
# Check to see if it is a nv_sata device.
if [ "pci${vendor_id}" = ${VENDOR_ID} -a \
${device_id} = ${DEVICE_ID} ]
then
if [ "X${subsystem_vendor_id}" = "X" ]
then
ids3="pci${vendor_id},${device_id}"
else
ids3="pci${subsystem_vendor_id},${subsystem_id}"
fi
mapped_bootpath_line=`echo ${bootpath_line} | ${SED} "{
s/pci-ide/${ids3}/
s/ide/disk/
s/\/cmdk@.//
}"`
mapped_bootpath=`echo ${mapped_bootpath_line} \
| ${CUT} -d' ' -f3`
$LS -l "/dev/dsk" | $GREP ${mapped_bootpath} >/dev/null
if [ $? -eq 0 ]
then
if [ ! -f ${NVSATA_TMP}/bootenv.rc ]
then
$GREP -v "cmdk@" ${BOOTENVRC} > \
${NVSATA_TMP}/bootenv.rc
fi
echo ${mapped_bootpath_line} >> \
${NVSATA_TMP}/bootenv.rc
is_mapped="yes"
break
fi
fi
done
if [ "${is_mapped}" = "yes" ]
then
break
fi
done
fi
done
# Commit the changes
if [ -f ${NVSATA_TMP}/bootenv.rc ]
then
${CP} ${NVSATA_TMP}/bootenv.rc ${BOOTENVRC}
if [ $? -ne 0 ]
then
# Failed to modify bootenv.rc file.
rem_drv -b ${ROOT} nv_sata
${RM} -rf ${NVSATA_TMP}
exit 1
fi
fi
}
#
# Function process_system_for_lu() converts rootdev in /etc/system from
# old ata fromat to new nv_sata format during live upgrade.
#
process_system_for_lu() {
# Check to see if system has ata disk as a root device.
rootdev_line=`${GREP} -v "*" $SYSTEM | ${GREP} "rootdev:/"| ${GREP} "cmdk@"`
if [ $? -eq 1 ]
then
# roodev entry does not exist, or root disk is not ata.
return 0
fi
${CP} ${SYSTEM} ${SYSTEM_BAK}
if [ $? -ne 0 ]
then
# Can't backup system file."
$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
rem_drv -b ${ROOT} nv_sata
${RM} -rf ${NVSATA_TMP}
exit 1
fi
rootdev=`echo ${rootdev_line} | ${CUT} -d: -f2-`
if [ "X${no_nvsata_in_CBE}" != "X0" ]
then
ar=`echo ${rootdev} | ${CUT} -d/ -f1-3`
get_properties ${ar}
# Check if boot device is a supported nv_sata device.
for pair in ${DRIVER_ALIASES}
do
dr_vendor_id=`echo $pair | $SED "s/\"//g" | $CUT -d, -f1`
dr_device_id=`echo $pair | $SED "s/\"//g" | $CUT -d, -f2`
if [ "pci${vendor_id}" = ${dr_vendor_id} -a \
${device_id} = ${dr_device_id} ]
then
if [ "X${subsystem_vendor_id}" = "X" ]
then
ids="pci${vendor_id},${device_id}"
else
ids="pci${subsystem_vendor_id},${subsystem_id}"
fi
$SED "{
s/pci-ide/$ids/
s/ide/disk/
s/\/cmdk@.//
}" ${SYSTEM} > "${NVSATA_TMP}/system"
break
fi
done
else
devname=`echo ${rootdev} | $CUT -d/ -f4- | $SED "{
s/ide@/disk@/
s/\/cmdk@.//
}"`
is_mapped="no"
for dev_path in `$LS -l "/dev/dsk" | $GREP ${devname} |$NAWK '{print $11}'`
do
ar="/`echo ${dev_path} | ${CUT} -d/ -f4,5`"
get_properties ${ar}
for pair in ${DRIVER_ALIASES}
do
VENDOR_ID=`echo ${pair} | $SED "s/\"//g" \
| $CUT -d, -f1`
DEVICE_ID=`echo ${pair} | $SED "s/\"//g" \
| $CUT -d, -f2`
# Check to see if it is a nv_sata device.
if [ "pci${vendor_id}" = ${VENDOR_ID} -a \
${device_id} = ${DEVICE_ID} ]
then
if [ "X${subsystem_vendor_id}" = "X" ]
then
ids="pci${vendor_id},${device_id}"
else
ids="pci${subsystem_vendor_id},${subsystem_id}"
fi
mapped_rootdev=`echo ${rootdev} | ${SED} "{
s/pci-ide/${ids}/
s/ide/disk/
s/\/cmdk@.//
}"`
$LS -l "/dev/dsk" | $GREP ${mapped_rootdev} >/dev/null
if [ $? -eq 0 ]
then
$SED "{
s/pci-ide/$ids/
s/ide/disk/
s/\/cmdk@.//
}" ${SYSTEM} > "${NVSATA_TMP}/system"
is_mapped="yes"
break
fi
fi
done
if [ "${is_mapped}" = "yes" ]
then
break
fi
done
fi
if [ -f ${NVSATA_TMP}/system ]
then
${CP} ${NVSATA_TMP}/system ${SYSTEM}
if [ $? -ne 0 ]
then
# Failed to modify system file.
$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
rem_drv -b ${ROOT} nv_sata
${RM} -rf ${NVSATA_TMP}
exit 1
fi
fi
}
#
# Function process_system_for_install() converts rootdev in /etc/system from
# old ata format to new nv_sata format during the upgrade installation.
#
process_system_for_install() {
# Check to see if system has ata disk as a root device.
rootdev_line=`${GREP} -v "*" $SYSTEM | ${GREP} "rootdev:/"| ${GREP} "cmdk@"`
if [ $? -eq 1 ]
then
# roodev entry does not exist, or root disk is not ata.
return 0
fi
${CP} ${SYSTEM} ${SYSTEM_BAK}
if [ $? -ne 0 ]
then
# Can't backup system file."
$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
rem_drv -b ${ROOT} nv_sata
${RM} -rf ${NVSATA_TMP}
exit 1
fi
rootdev=`echo ${rootdev_line} | ${CUT} -d: -f2-`
devname=`echo ${rootdev} | $CUT -d/ -f4- | $SED "{
s/ide@/disk@/
s/\/cmdk@.//
}"`
is_mapped="no"
for dev_path in `$LS -l "/dev/dsk" | $GREP ${devname} |$NAWK '{print $11}'`
do
arg="/`echo ${dev_path} | ${CUT} -d/ -f4,5`"
get_properties ${arg}
for pair in ${DRIVER_ALIASES}
do
VENDOR_ID=`echo ${pair} | $SED "s/\"//g" \
| $CUT -d, -f1`
DEVICE_ID=`echo ${pair} | $SED "s/\"//g" \
| $CUT -d, -f2`
# Check to see if it is a nv_sata device.
if [ "pci${vendor_id}" = ${VENDOR_ID} -a \
${device_id} = ${DEVICE_ID} ]
then
if [ "X${subsystem_vendor_id}" = "X" ]
then
ids="pci${vendor_id},${device_id}"
else
ids="pci${subsystem_vendor_id},${subsystem_id}"
fi
mapped_rootdev=`echo ${rootdev} | ${SED} "{
s/pci-ide/${ids}/
s/ide/disk/
s/\/cmdk@.//
}"`
$LS -l "/dev/dsk" | $GREP ${mapped_rootdev} >/dev/null
if [ $? -eq 0 ]
then
$SED "{
s/pci-ide/$ids/
s/ide/disk/
s/\/cmdk@.//
}" ${SYSTEM} > "${NVSATA_TMP}/system"
is_mapped="yes"
break
fi
fi
done
if [ "${is_mapped}" = "yes" ]
then
break
fi
done
if [ -f ${NVSATA_TMP}/system ]
then
${CP} ${NVSATA_TMP}/system ${SYSTEM}
if [ $? -ne 0 ]
then
# Failed to modify system file.
$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
rem_drv -b ${ROOT} nv_sata
${RM} -rf ${NVSATA_TMP}
exit 1
fi
fi
}
#
# Function process_power_conf_for_lu converts ata device path to nv_sata
# device path if any for live upgrade.
#
process_power_conf_for_lu() {
$GREP -v "#" ${POWER_CONF} | $GREP "cmdk@">/dev/null
if [ $? -ne 0 ]
then
# No ata device entry in power.conf. No conversion is needed.
return 0
fi
$CP ${POWER_CONF} ${POWER_CONF_BAK}
if [ $? -ne 0 ]
then
# Failed to back up the power.conf file
$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
$CP ${SYSTEM_BAK} ${SYSTEM}
rem_drv -b ${ROOT} nv_sata
$RM -rf ${NVSATA_TMP}
exit 1
fi
$GREP "#" ${POWER_CONF} > ${NVSATA_TMP}/power.conf
$GREP -v "#" ${POWER_CONF} | $GREP -v "cmdk@" \
>> ${NVSATA_TMP}/power.conf
if [ "X${no_nvsata_in_CBE}" != "X0" ]
then
$GREP -v "#" ${POWER_CONF} | $GREP "cmdk@" \
${POWER_CONF} | while read l
do
is_mapped="no"
new_entry=""
for i in $l
do
tp=$i
echo $i | $GREP "cmdk@" >/dev/dull
if [ $? -eq 0 ]
then
a="/`echo $i | ${CUT} -d/ -f2,3`"
get_properties $a
for pair in ${DRIVER_ALIASES}
do
dr_vendor_id=`echo $pair | $SED "s/\"//g" \
| $CUT -d, -f1`
dr_device_id=`echo $pair | $SED "s/\"//g" \
| $CUT -d, -f2`
if [ "pci${vendor_id}" = ${dr_vendor_id} -a \
${device_id} = ${dr_device_id} ]
then
if [ "X${subsystem_vendor_id}" = "X" ]
then
is="pci${vendor_id},${device_id}"
else
is="pci${subsystem_vendor_id},${subsystem_id}"
fi
tp=`echo $i | $SED "{
s/pci-ide/$is/
s/ide/disk/
s/\/cmdk@.//
}"`
if [ "${is_mapped}" = "no" ]
then
is_mapped="yes"
fi
break
fi
done
fi
new_entry="${new_entry}$tp "
done
if [ "${is_mapped}" = "yes" ]
then
echo ${new_entry} >> ${NVSATA_TMP}/mapped_power.conf
else
echo ${new_entry} >> ${NVSATA_TMP}/power.conf
fi
done
else
$GREP -v "#" ${POWER_CONF} | $GREP "cmdk@" ${POWER_CONF} \
| while read l
do
is_mapped="no"
new_entry=""
for i in $l
do
tp=$i
echo $i | $GREP "cmdk@" >/dev/dull
if [ $? -eq 0 ]
then
dn=`echo $i | $CUT -d/ -f4- | $SED "{
s/ide@/disk@/
s/\/cmdk@.//
}"`
for x in `$LS -l /dev/dsk | $GREP $dn \
| $NAWK '{print $11}'`
do
np=""
a="/`echo ${x} | ${CUT} -d/ -f4,5`"
get_properties $a
for pair in ${DRIVER_ALIASES}
do
VENDOR_ID=`echo ${pair} | $SED "s/\"//g" \
| $CUT -d, -f1`
DEVICE_ID=`echo ${pair} | $SED "s/\"//g" \
| $CUT -d, -f2`
if [ "pci${vendor_id}" = ${VENDOR_ID} -a \
${device_id} = ${DEVICE_ID} ]
then
if [ "X${subsystem_vendor_id}" = "X" ]
then
is="pci${vendor_id},${device_id}"
else
is="pci${subsystem_vendor_id},${subsystem_id}"
fi
mapped_path=`echo $i | ${SED} "{
s/pci-ide/${is}/
s/ide/disk/
s/\/cmdk@.//
}"`
np="/`echo ${x} | $CUT -d/ -f4- \
| $CUT -d: -f1`"
if [ ${np} = ${mapped_path} ]
then
tp=${mapped_path}
if [ "${is_mapped}" = "no" ]
then
is_mapped="yes"
fi
break
fi
fi
done
if [ "${is_mapped}" = "yes" ]
then
break
fi
done
fi
new_entry="${new_entry}$tp "
done
if [ "${is_mapped}" = "yes" ]
then
echo ${new_entry} >> ${NVSATA_TMP}/mapped_power.conf
else
echo ${new_entry} >> ${NVSATA_TMP}/power.conf
fi
done
fi
if [ -f ${NVSATA_TMP}/mapped_power.conf ]
then
$CAT ${NVSATA_TMP}/mapped_power.conf >> ${NVSATA_TMP}/power.conf
$CP ${NVSATA_TMP}/power.conf ${POWER_CONF}
if [ $? -ne 0 ]
then
$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
$CP ${SYSTEM_BAK} ${SYSTEM}
rem_drv -b ${ROOT} nv_sata
$RM -rf ${NVSATA_TMP}
exit 1
fi
fi
}
#
# Function process_power_conf_for_install converts ata device path to nv_sata
# device path if any for normal upgrade installation.
#
process_power_conf_for_install() {
$GREP -v "#" ${POWER_CONF} | $GREP "cmdk@" >/dev/null
if [ $? -ne 0 ]
then
# No ata device entry in power.conf. No conversion is needed.
return 0
fi
$CP ${POWER_CONF} ${POWER_CONF_BAK}
if [ $? -ne 0 ]
then
# Failed to back up the power.conf file.
$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
$CP ${SYSTEM_BAK} ${SYSTEM}
rem_drv -b ${ROOT} nv_sata
$RM -rf ${NVSATA_TMP}
exit 1
fi
$GREP "#" ${POWER_CONF} > ${NVSATA_TMP}/power.conf
$GREP -v "#" ${POWER_CONF} | $GREP -v "cmdk@" \
>> ${NVSATA_TMP}/power.conf
$GREP -v "#" ${POWER_CONF} | $GREP "cmdk@" ${POWER_CONF} | while read l
do
is_mapped="no"
new_entry=""
for i in $l
do
tp=$i
echo $i | $GREP "cmdk@" >/dev/dull
if [ $? -eq 0 ]
then
dn=`echo $i | $CUT -d/ -f4- | $SED "{
s/ide@/disk@/
s/\/cmdk@.//
}"`
for x in `$LS -l /dev/dsk | $GREP $dn \
| $NAWK '{print $11}'`
do
np=""
a="/`echo ${x} | ${CUT} -d/ -f4,5`"
get_properties $a
for pair in ${DRIVER_ALIASES}
do
VENDOR_ID=`echo ${pair} | $SED "s/\"//g" \
| $CUT -d, -f1`
DEVICE_ID=`echo ${pair} | $SED "s/\"//g" \
| $CUT -d, -f2`
if [ "pci${vendor_id}" = ${VENDOR_ID} -a \
${device_id} = ${DEVICE_ID} ]
then
if [ "X${subsystem_vendor_id}" = "X" ]
then
is="pci${vendor_id},${device_id}"
else
is="pci${subsystem_vendor_id},${subsystem_id}"
fi
mapped_path=`echo $i | ${SED} "{
s/pci-ide/${is}/
s/ide/disk/
s/\/cmdk@.//
}"`
np="/`echo ${x} | $CUT -d/ -f4- \
| $CUT -d: -f1`"
if [ ${np} = ${mapped_path} ]
then
tp=${mapped_path}
if [ "${is_mapped}" = "no" ]
then
is_mapped="yes"
fi
break
fi
fi
done
if [ "${is_mapped}" = "yes" ]
then
break
fi
done
fi
new_entry="${new_entry}$tp "
done
if [ "${is_mapped}" = "yes" ]
then
echo ${new_entry} >> ${NVSATA_TMP}/mapped_power.conf
else
echo ${new_entry} >> ${NVSATA_TMP}/power.conf
fi
done
if [ -f ${NVSATA_TMP}/mapped_power.conf ]
then
$CAT ${NVSATA_TMP}/mapped_power.conf >> ${NVSATA_TMP}/power.conf
$CP ${NVSATA_TMP}/power.conf ${POWER_CONF}
if [ $? -ne 0 ]
then
$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
$CP ${SYSTEM_BAK} ${SYSTEM}
rem_drv -b ${ROOT} nv_sata
$RM -rf ${NVSATA_TMP}
exit 1
fi
fi
}
#
# Function process_devlink_for_lu() links all old ata logical device names
# to new physical device paths on upgraded BE.
#
process_devlink_for_lu() {
$LS -l "${ROOT}/dev/dsk" | $GREP "cmdk@" | while read line1
do
logical_disk=`echo $line1 | $NAWK '{print $9}'`
old_path=`echo $line1 | $NAWK '{print $11}'`
mapped_new_path=""
if [ "X${no_nvsata_in_CBE}" != "X0" ]
then
arg2="/`echo ${old_path} | ${CUT} -d/ -f4,5`"
get_properties ${arg2}
for pair in ${DRIVER_ALIASES}
do
VENDOR_ID=`echo ${pair} | $SED "s/\"//g" \
| $CUT -d, -f1`
DEVICE_ID=`echo ${pair} | $SED "s/\"//g" \
| $CUT -d, -f2`
# Check to see if it is a nv_sata device.
if [ "pci${vendor_id}" = ${VENDOR_ID} -a \
${device_id} = ${DEVICE_ID} ]
then
if [ "X${subsystem_vendor_id}" = "X" ]
then
ids3="pci${vendor_id},${device_id}"
else
ids3="pci${subsystem_vendor_id},${subsystem_id}"
fi
mapped_new_path=`echo ${old_path} | ${SED} "{
s/pci-ide/${ids3}/
s/ide/disk/
s/\/cmdk@.//
}"`
break
fi
done
else
devname=`echo ${old_path} | $CUT -d/ -f6- | $SED "{
s/ide@/disk@/
s/\/cmdk@.//
}"`
is_mapped="no"
for new_path in `$LS -l "/dev/dsk" | $GREP ${devname} | $NAWK '{print $11}'`
do
arg2="/`echo ${new_path} | ${CUT} -d/ -f4,5`"
get_properties ${arg2}
for pair in ${DRIVER_ALIASES}
do
VENDOR_ID=`echo ${pair} | $SED "s/\"//g" \
| $CUT -d, -f1`
DEVICE_ID=`echo ${pair} | $SED "s/\"//g" \
| $CUT -d, -f2`
# Check to see if it is a nv_sata device.
if [ "pci${vendor_id}" = ${VENDOR_ID} -a \
${device_id} = ${DEVICE_ID} ]
then
if [ "X${subsystem_vendor_id}" = "X" ]
then
ids3="pci${vendor_id},${device_id}"
else
ids3="pci${subsystem_vendor_id},${subsystem_id}"
fi
mapped_new_path=`echo ${old_path} | ${SED} "{
s/pci-ide/${ids3}/
s/ide/disk/
s/\/cmdk@.//
}"`
if [ ${new_path} = ${mapped_new_path} ]
then
is_mapped="yes"
break
fi
fi
done
if [ "${is_mapped}" = "yes" ]
then
break
fi
done
fi
if [ "X${mapped_new_path}" != "X" ]
then
cd ${ROOT}/dev/dsk
${MV} ${logical_disk} ${logical_disk}.${BAK}
if [ $? -ne 0 ]
then
# Can't back up old link.
$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
$CP ${SYSTEM_BAK} ${SYSTEM}
$CP ${POWER_CONF_BAK} ${POWER_CONF}
rem_drv -b ${ROOT} nv_sata
${RM} -rf ${NVSATA_TMP}
exit 1
fi
${LN} -s ${mapped_new_path} ${logical_disk}
if [ $? -ne 0 ]
then
# Can't create symbolic link
${MV} ${logical_disk}.${BAK} ${logical_disk}
$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
$CP ${SYSTEM_BAK} ${SYSTEM}
$CP ${POWER_CONF_BAK} ${POWER_CONF}
rem_drv -b ${ROOT} nv_sata
${RM} -rf ${NVSATA_TMP}
exit 1
fi
c_number="dsk/`echo ${logical_disk} | $CUT -d'd' -f1`"
$GREP ${c_number} ${ENUMERATE_RESERVED} >/dev/null
if [ $? -ne 0 ]
then
echo ${c_number} >> ${ENUMERATE_RESERVED}
fi
cd ../rdsk
mapped_new_path="${mapped_new_path},raw"
${MV} ${logical_disk} ${logical_disk}.${BAK}
if [ $? -ne 0 ]
then
# Can't back up old link.
${RM} ../dsk/${logical_disk}
${MV} ../dsk/${logical_disk}.${BAK} \
../dsk/${logical_disk}
$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
$CP ${SYSTEM_BAK} ${SYSTEM}
$CP ${POWER_CONF_BAK} ${POWER_CONF}
rem_drv -b ${ROOT} nv_sata
${RM} -rf ${NVSATA_TMP}
exit 1
fi
${LN} -s ${mapped_new_path} ${logical_disk}
if [ $? -ne 0 ]
then
# Can't create symbolic link.
${MV} ${logical_disk}.${BAK} ${logical_disk}
${RM} ../dsk/${logical_disk}
${MV} ../dsk/${logical_disk}.${BAK} \
../dsk/${logical_disk}
$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
$CP ${SYSTEM_BAK} ${SYSTEM}
$CP ${POWER_CONF_BAK} ${POWER_CONF}
rem_drv -b ${ROOT} nv_sata
${RM} -rf ${NVSATA_TMP}
exit 1
fi
fi
done
$GREP "^dsk" ${ENUMERATE_RESERVED} >/dev/null
if [ $? -eq 0 ]
then
$RM ${DEVLINK_DB}
fi
}
#
# Function process_devlink_for_install() links all old ata logical device names
# to new physical device paths for normal upgrade installation.
#
process_devlink_for_install() {
$LS -l "${ROOT}/dev/dsk" | $GREP "cmdk@" | while read line1
do
logical_disk=`echo $line1 | $NAWK '{print $9}'`
old_path=`echo $line1 | $NAWK '{print $11}'`
devname=`echo ${old_path} | $CUT -d/ -f6- | $SED "{
s/ide@/disk@/
s/\/cmdk@.//
}"`
$LS -l "/dev/dsk" | $GREP ${devname} | while read line2
do
new_path=`echo $line2 | $NAWK '{print $11}'`
arg2="/`echo ${new_path} | ${CUT} -d/ -f4,5`"
get_properties ${arg2}
for pair in ${DRIVER_ALIASES}
do
VENDOR_ID=`echo ${pair} | $SED "s/\"//g"\
| $CUT -d, -f1`
DEVICE_ID=`echo ${pair} | $SED "s/\"//g" \
| $CUT -d, -f2`
# Check to see if it is a nv_sata device.
if [ "pci${vendor_id}" = ${VENDOR_ID} -a \
${device_id} = ${DEVICE_ID} ]
then
if [ "X${subsystem_vendor_id}" = "X" ]
then
ids3="pci${vendor_id},${device_id}"
else
ids3="pci${subsystem_vendor_id},${subsystem_id}"
fi
mapped_new_path=`echo ${old_path} | ${SED} "{
s/pci-ide/${ids3}/
s/ide/disk/
s/\/cmdk@.//
}"`
if [ ${new_path} = ${mapped_new_path} ]
then
# Found the match.
cd ${ROOT}/dev/dsk
${MV} ${logical_disk} ${logical_disk}.${BAK}
if [ $? -ne 0 ]
then
# Can't back up old link.
$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
$CP ${SYSTEM_BAK} ${SYSTEM}
$CP ${POWER_CONF_BAK} ${POWER_CONF}
rem_drv -b ${ROOT} nv_sata
${RM} -rf ${NVSATA_TMP}
exit 1
fi
${LN} -s ${mapped_new_path} ${logical_disk}
if [ $? -ne 0 ]
then
# Can't create symbolic link
${MV} ${logical_disk}.${BAK} ${logical_disk}
$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
$CP ${SYSTEM_BAK} ${SYSTEM}
$CP ${POWER_CONF_BAK} ${POWER_CONF}
rem_drv -b ${ROOT} nv_sata
${RM} -rf ${NVSATA_TMP}
exit 1
fi
c_number="dsk/`echo ${logical_disk} \
| $CUT -d'd' -f1`"
$GREP ${c_number} ${ENUMERATE_RESERVED} >/dev/null
if [ $? -ne 0 ]
then
echo ${c_number} >> ${ENUMERATE_RESERVED}
fi
cd ../rdsk
mapped_new_path="${mapped_new_path},raw"
${MV} ${logical_disk} ${logical_disk}.${BAK}
if [ $? -ne 0 ]
then
# Can't back up old link.
${RM} ../dsk/${logical_disk}
${MV} ../dsk/${logical_disk}.${BAK} \
../dsk/${logical_disk}
$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
$CP ${SYSTEM_BAK} ${SYSTEM}
$CP ${POWER_CONF_BAK} ${POWER_CONF}
rem_drv -b ${ROOT} nv_sata
${RM} -rf ${NVSATA_TMP}
exit 1
fi
${LN} -s ${mapped_new_path} ${logical_disk}
if [ $? -ne 0 ]
then
# Can't create symbolic link.
${MV} ${logical_disk}.${BAK} ${logical_disk}
${RM} ../dsk/${logical_disk}
${MV} ../dsk/${logical_disk}.${BAK} \
../dsk/${logical_disk}
$CP ${BOOTENVRC_BAK} ${BOOTENVRC}
$CP ${SYSTEM_BAK} ${SYSTEM}
$CP ${POWER_CONF_BAK} ${POWER_CONF}
rem_drv -b ${ROOT} nv_sata
${RM} -rf ${NVSATA_TMP}
exit 1
fi
fi
fi
done
done
done
$GREP "^dsk" ${ENUMERATE_RESERVED} >/dev/null
if [ $? -eq 0 ]
then
$RM ${DEVLINK_DB}
fi
}
clean_up() {
${RM} -rf ${NVSATA_TMP}
$LS -l "${ROOT}/dev/dsk" | $GREP "disk@" | while read line
do
logical_disk=`echo $line | $NAWK '{print $9}'`
cd ${ROOT}/dev/dsk
${RM} -f ${logical_disk}.${BAK}
cd ../rdsk
${RM} -f ${logical_disk}.${BAK}
done
}
# Function: check_add_drv()
#
# This function will check if the module has an entry in etc/name_to_major
# If not simply calls add_drv with the arguments given. If there is
# such an entry in name_to_major file, it adds entries in driver_aliases
# driver_classes and minor_perm if necessary.
# The syntax of this function is the same as add_drv.
check_add_drv()
{
if [ "$BASEDIR" = "" ]
then
BASEDIR=/
fi
alias=""
class=""
ADD_ALIAS=0
ADD_CLASS=0
ADD_MINOR=0
OPTIND=1
IS_NET_DRIVER=0
cmd="add_drv"
NO_CMD=
while getopts i:b:m:c:N opt
do
case $opt in
N ) NO_CMD=1;;
i ) ADD_ALIAS=1
alias=$OPTARG
cmd=$cmd" -i '$alias'"
;;
m ) ADD_MINOR=1
minor=$OPTARG
cmd=$cmd" -m '$minor'"
;;
c) ADD_CLASS=1
class=$OPTARG
cmd=$cmd" -c $class"
;;
b) BASEDIR=$OPTARG
cmd=$cmd" -b $BASEDIR"
;;
\?) echo "check_add_drv can not handle this option"
return
;;
esac
done
shift `/usr/bin/expr $OPTIND - 1`
drvname=$1
cmd=$cmd" "$drvname
drvname=`echo $drvname | /usr/bin/sed 's;.*/;;g'`
/usr/bin/grep "^$drvname[ ]" ${ROOT}/etc/name_to_major > /dev/null 2>&1
if [ "$NO_CMD" = "" -a $? -ne 0 ]
then
eval $cmd
else
# entry already in name_to_major, add alias, class, minorperm
# if necessary
if [ $ADD_ALIAS = 1 ]
then
for i in $alias
do
/usr/bin/egrep "^$drvname[ ]+$i" ${ROOT}/etc/driver_aliases>/dev/null 2>&1
if [ $? -ne 0 ]
then
echo "$drvname $i" >> ${ROOT}/etc/driver_aliases
fi
done
fi
if [ $ADD_CLASS = 1 ]
then
/usr/bin/egrep "^$drvname[ ]+$class( | |$)" ${ROOT}/etc/driver_classes > /dev/null 2>&1
if [ $? -ne 0 ]
then
echo "$drvname\t$class" >> ${ROOT}/etc/driver_classes
fi
fi
if [ $ADD_MINOR = 1 ]
then
/usr/bin/grep "^$drvname:" ${ROOT}/etc/minor_perm > /dev/null 2>&1
if [ $? -ne 0 ]
then
minorentry="$drvname:$minor"
echo $minorentry >> ${ROOT}/etc/minor_perm
fi
fi
fi
}
#
# Main program starts here.
#
check_add_drv -b ${ROOT} -i '"pci10de,37f" "pci10de,55" "pci10de,54"' -m '* 0644 root sys' nv_sata
#
# Create temporary directory for node migration
#
if [ ! -d ${NVSATA_TMP} ]
then
${MKDIR} ${NVSATA_TMP}
if [ $? -ne 0 ]
then
# Failed to create ${NVSATA_TMP} directory.
exit 1
fi
fi
#
# If it is an install, do nothing. If it is an upgrade, do the conversion.
#
line=`$MOUNT | $GREP "/ "`
first_field=`echo $line | $NAWK '{print $1}'`
third_field=`echo $line | $NAWK '{print $3}'`
if [ ${first_field} = "/" -a ${third_field} = "/ramdisk:a" ]
then
# It is either an install/upgrade.
if [ -f ${UPGRADE_LOG} ]
then
# It is an upgrade.
$GREP ${NV_SATA} ${PATH_TO_INST} > /dev/null
if [ $? -eq 0 ]
then
# The system was running nv_sata before the upgrade.
$RM -rf ${NVSATA_TMP}
exit 0
fi
process_bootenvrc_for_install
process_system_for_install
process_power_conf_for_install
process_devlink_for_install
clean_up
exit 0
fi
$RM -rf ${NVSATA_TMP}
exit 0
fi
#
# Liveupgrade.
#
if [ -f ${LIVEUPGRADE_TMP_LOG} ]
then
$GREP ${NV_SATA} /etc/driver_aliases >/dev/null
no_nvsata_in_CBE=$?
$GREP ${NV_SATA} ${PATH_TO_INST} > /dev/null
if [ $? -eq 0 ]
then
# Target BE was running nv_sata driver before the upgrade.
$RM -rf ${NVSATA_TMP}
exit 0
fi
process_bootenvrc_for_lu
process_system_for_lu
process_power_conf_for_lu
process_devlink_for_lu
clean_up
touch ${ROOT}/reconfigure
exit 0
fi
#
# Pkgadd.
#
$RM -rf ${NVSATA_TMP}
exit 0