#!/sbin/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 (c) 2010, Oracle and/or its affiliates. All rights reserved. # # PATH=/sbin:/bin ORIGIFS="${IFS}" USAGE="Usage: ibd_upgrade [-v]" DRVCONF=/kernel/drv/ibp.conf.old # # split device path into path components # split_path_components() { hca_path= node_name= port= pkey= service= partition_name= hca_path="/dev/`dirname $device_path`" bname=`basename $device_path` IFS=":" set -- $bname node_at_addr=$1 partition_name=$2 IFS="@" set -- $node_at_addr node_name=$1 IFS="," set -- $2 port=$1 pkey=0x$2 service=$3 IFS="${ORIGIFS}" } do_cmd() { if [ $verbose -eq 1 ]; then echo "$1" fi $1 } process_rc_mode() { device=$1 # # Get the instance number of ibd # Device name format would be ibd#, # IFS="d" set -- ${device} IFS="${ORIGIFS}" if [ "$1" != "ib" ]; then return fi inst=$2 IFS="," set -- ${enable_rc} IFS="${ORIGIFS}" if [ ${inst} -lt $# ]; then (( inst = $inst + 1 )) eval "linkmode=\$${inst}" else linkmode=0 fi if [ "$linkmode" = "0" ]; then do_cmd "dladm set-linkprop -p linkmode=ud ${device}" fi } verbose=0 while getopts v c do case $c in v) verbose=1;; \?) echo "$USAGE" 1>&2 exit 2;; esac done enable_rc= if [ -f ${DRVCONF} ]; then enable_rc=`egrep "^[ ]*enable_rc[ ]*=" ${DRVCONF} | sed -e "s/[ ]*//g" -e "s/enable_rc=//" -e "s/;$//" 2>/dev/null` fi # # Loop through all ibd devices based on the old model (i.e., one ibd instance # per partition; consequently device names have non zero pkey) # and create data links with the same names as in the old model under the # new model. # ls -l /dev/ibd* 2> /dev/null \ | while read x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 device_path do split_path_components if [ "$node_name" != "ibport" -o "$service" != "ipib" \ -o "$pkey" = "0x0" -o "$pkey" = "0x" ]; then continue fi # verify that the hca path exists cd $hca_path 2> /dev/null if [ $? -ne 0 ]; then continue fi fn=`echo ibport@${port},0,ipib:ibp*[0-9]` if [ -c "$fn" ]; then IFS=":" set -- $fn IFS="${ORIGIFS}" do_cmd "dladm delete-phys $partition_name" 2>/dev/null if [ $? -ne 0 ]; then do_cmd "ibd_delete_link $partition_name" fi do_cmd "dladm create-part -f -l $2 -P $pkey $partition_name" if [ "$enable_rc" != "" ]; then process_rc_mode $partition_name fi fi done exit 0