# # 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 /* * 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