#
# 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.
#
MANIFEST = ibd-post-upgrade.xml
SVCMETHOD = ibd-post-upgrade
include ../Makefile.cmd
SHFILES = ibd_upgrade
IBD_DELETE_LINK = ibd_delete_link
OBJS = $(IBD_DELETE_LINK).o
SRCS = $(OBJS:%.o=%.c)
CLOBBERFILES = $(SHFILES) $(IBD_DELETE_LINK) $(OBJS)
ROOTMANIFESTDIR = $(ROOTSVCNETWORK)
LDLIBS += -ldladm
.KEEP_STATE:
all: $(IBD_DELETE_LINK) $(SHFILES)
install: all \
$(ROOTSBIN)/$(IBD_DELETE_LINK) \
$(ROOTMANIFEST) \
$(ROOTSVCMETHOD) \
$(ROOTSBIN)/ibd_upgrade
check: $(CHKMANIFEST)
$(CSTYLE) -pP $(SRCS)
clean:
lint: lint_SRCS
include ../Makefile.targ
$(ROOTSBIN)/%: %
$(INS.file)
#!/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.
#
. /lib/svc/share/smf_include.sh
#
# Actual work of ibd upgrade is done in network/physical service.
# Here we mearly set the property to indicate that the ibd upgrade has been
# done. Setting of the property can not be done in network/physical service
# because the file system is read-only at that point.
#
if smf_is_globalzone; then
NETPHYS=svc:/network/physical:default
PROP=ibd/ibd_upgraded
upgrade_done=`/bin/svcprop -c -p $PROP $NETPHYS 2> /dev/null`
if [ "$upgrade_done" != "true" ]; then
/sbin/svccfg -s $NETPHYS addpg ibd system 2> /dev/null
/sbin/svccfg -s $NETPHYS setprop $PROP = boolean: true
fi
fi
/sbin/svcadm disable $SMF_FMRI
exit $SMF_EXIT_OK
ibd upgrade
/*
* 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.
*/
#include
#include
#include
#include
#include
#include
#include
#include
extern dladm_status_t dladm_door_fd(dladm_handle_t, int *);
static dladm_status_t
ibd_dladm_door_call(dladm_handle_t handle, void *arg, size_t asize, void *rbuf,
size_t rsize)
{
door_arg_t darg;
int door_fd;
dladm_status_t status = DLADM_STATUS_OK;
darg.data_ptr = arg;
darg.data_size = asize;
darg.desc_ptr = NULL;
darg.desc_num = 0;
darg.rbuf = rbuf;
darg.rsize = rsize;
/* The door descriptor is opened if it isn't already */
if ((status = dladm_door_fd(handle, &door_fd)) != DLADM_STATUS_OK)
return (status);
if (door_call(door_fd, &darg) == -1)
return (DLADM_STATUS_FAILED);
if (darg.rbuf != rbuf) {
/*
* The size of the input rbuf is not big enough so that
* the door allocate the rbuf itself. In this case, simply
* think something wrong with the door call.
*/
(void) munmap(darg.rbuf, darg.rsize);
return (DLADM_STATUS_TOOSMALL);
}
if (darg.rsize != rsize)
return (DLADM_STATUS_FAILED);
if ((((dlmgmt_retval_t *)rbuf)->lr_err) == 0)
return (DLADM_STATUS_OK);
else
return (DLADM_STATUS_FAILED);
}
static int
ibd_delete_link(dladm_handle_t dlh, char *link)
{
dlmgmt_door_getlinkid_t getlinkid;
dlmgmt_getlinkid_retval_t retval;
datalink_id_t linkid;
dladm_status_t status;
char errmsg[DLADM_STRSIZE];
getlinkid.ld_cmd = DLMGMT_CMD_GETLINKID;
(void) strlcpy(getlinkid.ld_link, link, MAXLINKNAMELEN);
if ((status = ibd_dladm_door_call(dlh, &getlinkid, sizeof (getlinkid),
&retval, sizeof (retval))) != DLADM_STATUS_OK) {
(void) fprintf(stderr,
"dladm_door_call failed: %s; linkname = %s\n",
dladm_status2str(status, errmsg), link);
return (status);
}
if (retval.lr_class != DATALINK_CLASS_PHYS) {
(void) fprintf(stderr,
"Not a physical link: linkname = %s, class = 0x%x\n",
link, (uint_t)retval.lr_class);
return (status);
}
linkid = retval.lr_linkid;
if ((status = dladm_remove_conf(dlh, linkid)) != DLADM_STATUS_OK) {
(void) fprintf(stderr, "dladm_remove_conf failed: %s\n",
dladm_status2str(status, errmsg));
return (status);
}
if ((status = dladm_destroy_datalink_id(dlh, linkid,
DLADM_OPT_ACTIVE | DLADM_OPT_PERSIST)) != DLADM_STATUS_OK) {
(void) fprintf(stderr, "dladm_destroy_datalink_id failed: %s\n",
dladm_status2str(status, errmsg));
}
return (status);
}
int
main(int argc, char *argv[])
{
dladm_handle_t dlh;
int i;
dladm_status_t status;
char errmsg[DLADM_STRSIZE];
if (argc < 2) {
(void) fprintf(stderr,
"Usage: ibd_delete_link linkname ...\n");
return (2);
}
if ((status = dladm_open(&dlh)) != DLADM_STATUS_OK) {
(void) fprintf(stderr, "Failed to open dladm handle: %s\n",
dladm_status2str(status, errmsg));
return (1);
}
for (i = 1; i < argc; i++) {
if (ibd_delete_link(dlh, argv[i]) != DLADM_STATUS_OK) {
dladm_close(dlh);
return (1);
}
}
dladm_close(dlh);
return (0);
}
#!/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