1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * CDDL HEADER START
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * The contents of this file are subject to the terms of the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Common Development and Distribution License (the "License").
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * You may not use this file except in compliance with the License.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * or http://www.opensolaris.org/os/licensing.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * See the License for the specific language governing permissions
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * and limitations under the License.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * When distributing Covered Code, include this CDDL HEADER in each
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * If applicable, add the following below this CDDL HEADER, with the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * fields enclosed by brackets "[]" replaced with your own identifying
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * information: Portions Copyright [yyyy] [name of copyright owner]
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * CDDL HEADER END
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * This RCM module adds support to the RCM framework for IBPART links
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <stdio.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <stdlib.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <string.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <errno.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <sys/types.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <synch.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <assert.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <strings.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include "rcm_module.h"
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <libintl.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <libdllink.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <libdlib.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <libdlpi.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Definitions
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#ifndef lint
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#define _(x) gettext(x)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#else
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#define _(x) x
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#endif
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/* Some generic well-knowns and defaults used in this module */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#define RCM_LINK_PREFIX "SUNW_datalink" /* RCM datalink name prefix */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#define RCM_LINK_RESOURCE_MAX (13 + LINKID_STR_WIDTH)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/* IBPART link flags */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalatypedef enum {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala IBPART_OFFLINED = 0x1,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala IBPART_CONSUMER_OFFLINED = 0x2,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala IBPART_STALE = 0x4
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala} ibpart_flag_t;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/* link representation */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalatypedef struct dl_ibpart {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala struct dl_ibpart *dlib_next; /* next IBPART on this link */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala struct dl_ibpart *dlib_prev; /* prev IBPART on this link */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala datalink_id_t dlib_ibpart_id;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_flag_t dlib_flags; /* IBPART link flags */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala} dl_ibpart_t;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/* IBPART Cache state flags */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalatypedef enum {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala CACHE_NODE_STALE = 0x1, /* stale cached data */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala CACHE_NODE_NEW = 0x2, /* new cached nodes */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala CACHE_NODE_OFFLINED = 0x4 /* nodes offlined */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala} cache_node_state_t;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/* Network Cache lookup options */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#define CACHE_NO_REFRESH 0x1 /* cache refresh not needed */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#define CACHE_REFRESH 0x2 /* refresh cache */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/* Cache element */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalatypedef struct link_cache {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala struct link_cache *pc_next; /* next cached resource */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala struct link_cache *pc_prev; /* prev cached resource */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char *pc_resource; /* resource name */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala datalink_id_t pc_linkid; /* linkid */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dl_ibpart_t *pc_ibpart; /* IBPART list on this link */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala cache_node_state_t pc_state; /* cache state flags */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala} link_cache_t;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Global cache for network IBPARTs
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic link_cache_t cache_head;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic link_cache_t cache_tail;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic mutex_t cache_lock;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int events_registered = 0;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic dladm_handle_t dld_handle = NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * RCM module interface prototypes
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int ibpart_register(rcm_handle_t *);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int ibpart_unregister(rcm_handle_t *);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int ibpart_get_info(rcm_handle_t *, char *, id_t, uint_t,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char **, char **, nvlist_t *, rcm_info_t **);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int ibpart_suspend(rcm_handle_t *, char *, id_t,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala timespec_t *, uint_t, char **, rcm_info_t **);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int ibpart_resume(rcm_handle_t *, char *, id_t, uint_t,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char **, rcm_info_t **);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int ibpart_offline(rcm_handle_t *, char *, id_t, uint_t,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char **, rcm_info_t **);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int ibpart_undo_offline(rcm_handle_t *, char *, id_t,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala uint_t, char **, rcm_info_t **);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int ibpart_remove(rcm_handle_t *, char *, id_t, uint_t,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char **, rcm_info_t **);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int ibpart_notify_event(rcm_handle_t *, char *, id_t,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala uint_t, char **, nvlist_t *, rcm_info_t **);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int ibpart_configure(rcm_handle_t *, datalink_id_t);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/* Module private routines */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic void cache_free();
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int cache_update(rcm_handle_t *);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic void cache_remove(link_cache_t *);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic void node_free(link_cache_t *);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic void cache_insert(link_cache_t *);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic link_cache_t *cache_lookup(rcm_handle_t *, char *, char);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int ibpart_consumer_offline(rcm_handle_t *, link_cache_t *,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char **, uint_t, rcm_info_t **);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic void ibpart_consumer_online(rcm_handle_t *, link_cache_t *,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char **, uint_t, rcm_info_t **);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int ibpart_offline_ibpart(link_cache_t *, uint32_t,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala cache_node_state_t);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic void ibpart_online_ibpart(link_cache_t *);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic char *ibpart_usage(link_cache_t *);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic void ibpart_log_err(datalink_id_t, char **, char *);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int ibpart_consumer_notify(rcm_handle_t *, datalink_id_t,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char **, uint_t, rcm_info_t **);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/* Module-Private data */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic struct rcm_mod_ops ibpart_ops =
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala RCM_MOD_OPS_VERSION,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_register,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_unregister,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_get_info,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_suspend,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_resume,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_offline,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_undo_offline,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_remove,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala NULL,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala NULL,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_notify_event
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala};
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * rcm_mod_init() - Update registrations, and return the ops structure.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastruct rcm_mod_ops *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalarcm_mod_init(void)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char errmsg[DLADM_STRSIZE];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status_t status;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1, "IBPART: mod_init\n");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala cache_head.pc_next = &cache_tail;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala cache_head.pc_prev = NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala cache_tail.pc_prev = &cache_head;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala cache_tail.pc_next = NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_init(&cache_lock, 0, NULL);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((status = dladm_open(&dld_handle)) != DLADM_STATUS_OK) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_WARNING,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "IBPART: mod_init failed: cannot open datalink "
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "handle: %s\n", dladm_status2str(status, errmsg));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (NULL);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Return the ops vectors */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (&ibpart_ops);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * rcm_mod_info() - Return a string describing this module.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaconst char *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalarcm_mod_info(void)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1, "IBPART: mod_info\n");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return ("IBPART module");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * rcm_mod_fini() - Destroy the network IBPART cache.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaint
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalarcm_mod_fini(void)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1, "IBPART: mod_fini\n");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Note that ibpart_unregister() does not seem to be called anywhere,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * therefore we free the cache nodes here. In theory we should call
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * rcm_register_interest() for each node before we free it, the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * framework does not provide the rcm_handle to allow us to do so.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala cache_free();
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_destroy(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_close(dld_handle);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_SUCCESS);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_register() - Make sure the cache is properly sync'ed, and its
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * registrations are in order.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_register(rcm_handle_t *hd)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1, "IBPART: register\n");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (cache_update(hd) < 0)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_FAILURE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Need to register interest in all new resources
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * getting attached, so we get attach event notifications
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (!events_registered) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (rcm_register_event(hd, RCM_RESOURCE_LINK_NEW, 0, NULL)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala != RCM_SUCCESS) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_ERROR,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala _("IBPART: failed to register %s\n"),
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala RCM_RESOURCE_LINK_NEW);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_FAILURE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala } else {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_DEBUG, "IBPART: registered %s\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala RCM_RESOURCE_LINK_NEW);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala events_registered++;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_SUCCESS);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_unregister() - Walk the cache, unregistering all the networks.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_unregister(rcm_handle_t *hd)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala link_cache_t *node;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1, "IBPART: unregister\n");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Walk the cache, unregistering everything */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_lock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node = cache_head.pc_next;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala while (node != &cache_tail) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (rcm_unregister_interest(hd, node->pc_resource, 0)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala != RCM_SUCCESS) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_ERROR,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala _("IBPART: failed to unregister %s\n"),
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_resource);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_FAILURE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala cache_remove(node);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node_free(node);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node = cache_head.pc_next;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Unregister interest in all new resources
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (events_registered) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (rcm_unregister_event(hd, RCM_RESOURCE_LINK_NEW, 0)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala != RCM_SUCCESS) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_ERROR,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala _("IBPART: failed to unregister %s\n"),
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala RCM_RESOURCE_LINK_NEW);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_FAILURE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala } else {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_DEBUG, "IBPART: unregistered %s\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala RCM_RESOURCE_LINK_NEW);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala events_registered--;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_SUCCESS);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_offline() - Offline IBPARTs on a specific node.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_offline(rcm_handle_t *hd, char *rsrc, id_t id, uint_t flags,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char **errorp, rcm_info_t **info)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala link_cache_t *node;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1, "IBPART: offline(%s)\n", rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Lock the cache and lookup the resource */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_lock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node = cache_lookup(hd, rsrc, CACHE_REFRESH);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (node == NULL) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* should not happen because the resource is registered. */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_log_err(node->pc_linkid, errorp,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "unrecognized resource");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_SUCCESS);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Inform consumers (IP interfaces) of associated IBPARTs to be offlined
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibpart_consumer_offline(hd, node, errorp, flags, info) ==
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala RCM_SUCCESS) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_DEBUG,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "IBPART: consumers agreed on offline\n");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala } else {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_log_err(node->pc_linkid, errorp,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "consumers failed to offline");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_FAILURE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Check if it's a query */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (flags & RCM_QUERY) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "IBPART: offline query succeeded(%s)\n", rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_SUCCESS);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibpart_offline_ibpart(node, IBPART_OFFLINED, CACHE_NODE_OFFLINED) !=
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala RCM_SUCCESS) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_online_ibpart(node);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_log_err(node->pc_linkid, errorp, "offline failed");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_FAILURE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1, "IBPART: Offline succeeded(%s)\n", rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_SUCCESS);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_undo_offline() - Undo offline of a previously offlined node.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*ARGSUSED*/
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_undo_offline(rcm_handle_t *hd, char *rsrc, id_t id, uint_t flags,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char **errorp, rcm_info_t **info)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala link_cache_t *node;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1, "IBPART: online(%s)\n", rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_lock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node = cache_lookup(hd, rsrc, CACHE_NO_REFRESH);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (node == NULL) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_log_err(DATALINK_INVALID_LINKID, errorp, "no such link");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala errno = ENOENT;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_FAILURE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Check if no attempt should be made to online the link here */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (!(node->pc_state & CACHE_NODE_OFFLINED)) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_log_err(node->pc_linkid, errorp, "link not offlined");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala errno = ENOTSUP;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_SUCCESS);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_online_ibpart(node);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Inform IP interfaces on associated IBPARTs to be onlined
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_consumer_online(hd, node, errorp, flags, info);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_state &= ~CACHE_NODE_OFFLINED;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1, "IBPART: online succeeded(%s)\n", rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_SUCCESS);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic void
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_online_ibpart(link_cache_t *node)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dl_ibpart_t *ibpart;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status_t status;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char errmsg[DLADM_STRSIZE];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Try to bring on all offlined IBPARTs
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala for (ibpart = node->pc_ibpart; ibpart != NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart = ibpart->dlib_next) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (!(ibpart->dlib_flags & IBPART_OFFLINED))
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala continue;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1, "IBPART: online DLID %d\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_ibpart_id);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((status = dladm_part_up(dld_handle,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_ibpart_id, 0)) != DLADM_STATUS_OK) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Print a warning message and continue to online
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * other IBPARTs.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_WARNING,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala _("IBPART: IBPART online failed (%u): %s\n"),
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_ibpart_id,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status2str(status, errmsg));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala } else {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_flags &= ~IBPART_OFFLINED;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_offline_ibpart(link_cache_t *node, uint32_t flags,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala cache_node_state_t state)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dl_ibpart_t *ibpart;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status_t status;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char errmsg[DLADM_STRSIZE];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: ibpart_offline_ibpart "
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "(%s %u %u)\n", node->pc_resource, flags, state);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Try to delete all explicit created IBPART
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala for (ibpart = node->pc_ibpart; ibpart != NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart = ibpart->dlib_next) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1, "IBPART: offline DLID %d\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_ibpart_id);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((status = dladm_part_delete(dld_handle,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_ibpart_id, DLADM_OPT_ACTIVE)) !=
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DLADM_STATUS_OK) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_WARNING,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala _("IBPART: IBPART offline failed (%u): %s\n"),
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_ibpart_id,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status2str(status, errmsg));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_FAILURE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala } else {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "IBPART: IBPART offline succeeded(%u)\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_ibpart_id);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_flags |= flags;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_state |= state;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_SUCCESS);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_get_info() - Gather usage information for this resource.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*ARGSUSED*/
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaint
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_get_info(rcm_handle_t *hd, char *rsrc, id_t id, uint_t flags,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char **usagep, char **errorp, nvlist_t *props, rcm_info_t **info)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala link_cache_t *node;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1, "IBPART: get_info(%s)\n", rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_lock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node = cache_lookup(hd, rsrc, CACHE_REFRESH);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (node == NULL) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_INFO,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala _("IBPART: get_info(%s) unrecognized resource\n"), rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala errno = ENOENT;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_FAILURE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *usagep = ibpart_usage(node);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (*usagep == NULL) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* most likely malloc failure */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_ERROR,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala _("IBPART: get_info(%s) malloc failure\n"), rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala errno = ENOMEM;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_FAILURE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Set client/role properties */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) nvlist_add_string(props, RCM_CLIENT_NAME, "IBPART");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1, "IBPART: get_info(%s) info = %s\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rsrc, *usagep);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_SUCCESS);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_suspend() - Nothing to do, always okay
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*ARGSUSED*/
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_suspend(rcm_handle_t *hd, char *rsrc, id_t id, timespec_t *interval,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala uint_t flags, char **errorp, rcm_info_t **info)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1, "IBPART: suspend(%s)\n", rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_SUCCESS);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_resume() - Nothing to do, always okay
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*ARGSUSED*/
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_resume(rcm_handle_t *hd, char *rsrc, id_t id, uint_t flags,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char **errorp, rcm_info_t **info)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1, "IBPART: resume(%s)\n", rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_SUCCESS);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_consumer_remove()
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Notify IBPART consumers to remove cache.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_consumer_remove(rcm_handle_t *hd, link_cache_t *node, uint_t flags,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_info_t **info)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dl_ibpart_t *ibpart = NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char rsrc[RCM_LINK_RESOURCE_MAX];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int ret = RCM_SUCCESS;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: ibpart_consumer_remove (%s)\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_resource);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala for (ibpart = node->pc_ibpart; ibpart != NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart = ibpart->dlib_next) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * This will only be called when the offline operation
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * succeeds, so the IBPART consumers must have been offlined
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * at this point.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala assert(ibpart->dlib_flags & IBPART_CONSUMER_OFFLINED);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) snprintf(rsrc, RCM_LINK_RESOURCE_MAX, "%s/%u",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala RCM_LINK_PREFIX, ibpart->dlib_ibpart_id);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ret = rcm_notify_remove(hd, rsrc, flags, info);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ret != RCM_SUCCESS) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_WARNING,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala _("IBPART: notify remove failed (%s)\n"), rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala break;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: ibpart_consumer_remove done\n");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (ret);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_remove() - remove a resource from cache
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*ARGSUSED*/
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_remove(rcm_handle_t *hd, char *rsrc, id_t id, uint_t flags,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char **errorp, rcm_info_t **info)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala link_cache_t *node;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int rv;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1, "IBPART: remove(%s)\n", rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_lock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node = cache_lookup(hd, rsrc, CACHE_NO_REFRESH);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (node == NULL) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_INFO,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala _("IBPART: remove(%s) unrecognized resource\n"), rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala errno = ENOENT;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_FAILURE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* remove the cached entry for the resource */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala cache_remove(node);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rv = ibpart_consumer_remove(hd, node, flags, info);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node_free(node);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (rv);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_notify_event - Project private implementation to receive new resource
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * events. It intercepts all new resource events. If the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * new resource is a network resource, pass up a notify
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * for it too. The new resource need not be cached, since
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * it is done at register again.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*ARGSUSED*/
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_notify_event(rcm_handle_t *hd, char *rsrc, id_t id, uint_t flags,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char **errorp, nvlist_t *nvl, rcm_info_t **info)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala nvpair_t *nvp = NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala datalink_id_t linkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala uint64_t id64;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int rv = RCM_SUCCESS;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1, "IBPART: notify_event(%s)\n", rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (strcmp(rsrc, RCM_RESOURCE_LINK_NEW) != 0) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_log_err(DATALINK_INVALID_LINKID, errorp,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "unrecognized event");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala errno = EINVAL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_FAILURE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Update cache to reflect latest IBPARTs */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (cache_update(hd) < 0) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_log_err(DATALINK_INVALID_LINKID, errorp,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "private Cache update failed");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (RCM_FAILURE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Try best to recover all configuration.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_DEBUG, "IBPART: process_nvlist\n");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (strcmp(nvpair_name(nvp), RCM_NV_LINKID) != 0)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala continue;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (nvpair_value_uint64(nvp, &id64) != 0) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_log_err(DATALINK_INVALID_LINKID, errorp,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "cannot get linkid");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rv = RCM_FAILURE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala continue;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala linkid = (datalink_id_t)id64;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibpart_configure(hd, linkid) != 0) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_log_err(linkid, errorp, "configuring failed");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rv = RCM_FAILURE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala continue;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Notify all IBPART consumers */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibpart_consumer_notify(hd, linkid, errorp, flags,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala info) != 0) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_log_err(linkid, errorp,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "consumer notify failed");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rv = RCM_FAILURE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "IBPART: notify_event: link configuration complete\n");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (rv);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_usage - Determine the usage of a link.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * The returned buffer is owned by caller, and the caller
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * must free it up when done.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic char *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_usage(link_cache_t *node)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dl_ibpart_t *ibpart;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int nibpart;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char *buf;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala const char *fmt;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char *sep;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char errmsg[DLADM_STRSIZE];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char name[MAXLINKNAMELEN];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status_t status;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala size_t bufsz;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: usage(%s)\n", node->pc_resource);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala assert(MUTEX_HELD(&cache_lock));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((status = dladm_datalink_id2info(dld_handle, node->pc_linkid, NULL,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala NULL, NULL, name, sizeof (name))) != DLADM_STATUS_OK) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_ERROR,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala _("IBPART: usage(%s) get link name failure(%s)\n"),
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_resource, dladm_status2str(status, errmsg));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (NULL);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (node->pc_state & CACHE_NODE_OFFLINED)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala fmt = _("%1$s offlined");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala else
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala fmt = _("%1$s IBPART: ");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* TRANSLATION_NOTE: separator used between IBPART linkids */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala sep = _(", ");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala nibpart = 0;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala for (ibpart = node->pc_ibpart; ibpart != NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart = ibpart->dlib_next)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala nibpart++;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* space for IBPARTs and separators, plus message */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala bufsz = nibpart * (MAXLINKNAMELEN + strlen(sep)) +
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala strlen(fmt) + MAXLINKNAMELEN + 1;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((buf = malloc(bufsz)) == NULL) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_ERROR,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala _("IBPART: usage(%s) malloc failure(%s)\n"),
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_resource, strerror(errno));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (NULL);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) snprintf(buf, bufsz, fmt, name);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (node->pc_state & CACHE_NODE_OFFLINED) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Nothing else to do */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: usage (%s) info = %s\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_resource, buf);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (buf);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala for (ibpart = node->pc_ibpart; ibpart != NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart = ibpart->dlib_next) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_DEBUG, "IBPART:= %u\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_ibpart_id);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((status = dladm_datalink_id2info(dld_handle,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_ibpart_id, NULL, NULL, NULL, name,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala sizeof (name))) != DLADM_STATUS_OK) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_ERROR,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala _("IBPART: usage(%s) get ibpart %u name "
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "failure(%s)\n"), node->pc_resource,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_ibpart_id,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status2str(status, errmsg));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala free(buf);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (NULL);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) strlcat(buf, name, bufsz);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibpart->dlib_next != NULL)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) strlcat(buf, sep, bufsz);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: usage (%s) info = %s\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_resource, buf);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (buf);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Cache management routines, all cache management functions should be
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * be called with cache_lock held.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * cache_lookup() - Get a cache node for a resource.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Call with cache lock held.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * This ensures that the cache is consistent with the system state and
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * returns a pointer to the cache element corresponding to the resource.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic link_cache_t *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalacache_lookup(rcm_handle_t *hd, char *rsrc, char options)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala link_cache_t *node;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: cache lookup(%s)\n", rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala assert(MUTEX_HELD(&cache_lock));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (options & CACHE_REFRESH) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* drop lock since update locks cache again */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) cache_update(hd);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_lock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node = cache_head.pc_next;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala for (; node != &cache_tail; node = node->pc_next) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (strcmp(rsrc, node->pc_resource) == 0) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "IBPART: cache lookup succeeded(%s)\n", rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (node);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (NULL);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * node_free - Free a node from the cache
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic void
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalanode_free(link_cache_t *node)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dl_ibpart_t *ibpart, *next;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (node != NULL) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala free(node->pc_resource);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* free the IBPART list */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala for (ibpart = node->pc_ibpart; ibpart != NULL; ibpart = next) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala next = ibpart->dlib_next;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala free(ibpart);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala free(node);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * cache_insert - Insert a resource node in cache
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic void
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalacache_insert(link_cache_t *node)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala assert(MUTEX_HELD(&cache_lock));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* insert at the head for best performance */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_next = cache_head.pc_next;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_prev = &cache_head;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_next->pc_prev = node;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_prev->pc_next = node;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * cache_remove() - Remove a resource node from cache.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic void
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalacache_remove(link_cache_t *node)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala assert(MUTEX_HELD(&cache_lock));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_next->pc_prev = node->pc_prev;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_prev->pc_next = node->pc_next;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_next = NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_prev = NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalatypedef struct ibpart_update_arg_s {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_handle_t *hd;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int retval;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala} ibpart_update_arg_t;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_update() - Update physical interface properties
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_update(dladm_handle_t handle, datalink_id_t ibpartid, void *arg)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_update_arg_t *ibpart_update_argp = arg;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_handle_t *hd = ibpart_update_argp->hd;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala link_cache_t *node;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dl_ibpart_t *ibpart;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char *rsrc;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_ib_attr_t ibpart_attr;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status_t status;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char errmsg[DLADM_STRSIZE];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala boolean_t newnode = B_FALSE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int ret = -1;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: ibpart_update(%u)\n", ibpartid);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala assert(MUTEX_HELD(&cache_lock));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = dladm_part_info(handle, ibpartid, &ibpart_attr,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DLADM_OPT_ACTIVE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "IBPART: ibpart_update() cannot get ibpart information for "
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "%u(%s)\n", ibpartid, dladm_status2str(status, errmsg));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_WALK_CONTINUE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibpart_attr.dia_physlinkid == DATALINK_INVALID_LINKID) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Skip the IB port nodes.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "IBPART: ibpart_update(): skip the PORT nodes %u\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpartid);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_WALK_CONTINUE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rsrc = malloc(RCM_LINK_RESOURCE_MAX);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (rsrc == NULL) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_ERROR, _("IBPART: malloc error(%s): %u\n"),
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala strerror(errno), ibpartid);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) snprintf(rsrc, RCM_LINK_RESOURCE_MAX, "%s/%u",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala RCM_LINK_PREFIX, ibpart_attr.dia_physlinkid);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node = cache_lookup(hd, rsrc, CACHE_NO_REFRESH);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (node != NULL) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_DEBUG,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "IBPART: %s already registered (ibpartid:%d)\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rsrc, ibpart_attr.dia_partlinkid);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala free(rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala } else {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_DEBUG,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "IBPART: %s is a new resource (ibpartid:%d)\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rsrc, ibpart_attr.dia_partlinkid);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((node = calloc(1, sizeof (link_cache_t))) == NULL) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala free(rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_ERROR, _("IBPART: calloc: %s\n"),
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala strerror(errno));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_resource = rsrc;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_ibpart = NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_linkid = ibpart_attr.dia_physlinkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_state |= CACHE_NODE_NEW;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala newnode = B_TRUE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala for (ibpart = node->pc_ibpart; ibpart != NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart = ibpart->dlib_next) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibpart->dlib_ibpart_id == ibpartid) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_flags &= ~IBPART_STALE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala break;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibpart == NULL) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((ibpart = calloc(1, sizeof (dl_ibpart_t))) == NULL) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_ERROR, _("IBPART: malloc: %s\n"),
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala strerror(errno));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (newnode) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala free(rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala free(node);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_ibpart_id = ibpartid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_next = node->pc_ibpart;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_prev = NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (node->pc_ibpart != NULL)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_ibpart->dlib_prev = ibpart;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_ibpart = ibpart;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_state &= ~CACHE_NODE_STALE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (newnode)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala cache_insert(node);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE3, "IBPART: ibpart_update: succeeded(%u)\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpartid);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ret = 0;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladone:
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_update_argp->retval = ret;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (ret == 0 ? DLADM_WALK_CONTINUE : DLADM_WALK_TERMINATE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_update_all() - Determine all IBPART links in the system
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_update_all(rcm_handle_t *hd)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_update_arg_t arg = {NULL, 0};
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: ibpart_update_all\n");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala assert(MUTEX_HELD(&cache_lock));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala arg.hd = hd;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) dladm_walk_datalink_id(ibpart_update, dld_handle, &arg,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DATALINK_CLASS_PART, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (arg.retval);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * cache_update() - Update cache with latest interface info
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalacache_update(rcm_handle_t *hd)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala link_cache_t *node, *nnode;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dl_ibpart_t *ibpart;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int rv;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: cache_update\n");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_lock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* first we walk the entire cache, marking each entry stale */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node = cache_head.pc_next;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala for (; node != &cache_tail; node = node->pc_next) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_state |= CACHE_NODE_STALE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala for (ibpart = node->pc_ibpart; ibpart != NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart = ibpart->dlib_next)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_flags |= IBPART_STALE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rv = ibpart_update_all(hd);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Continue to delete all stale nodes from the cache even
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_update_all() failed. Unregister link that are not offlined
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * and still in cache
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala for (node = cache_head.pc_next; node != &cache_tail; node = nnode) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dl_ibpart_t *ibpart, *next;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala for (ibpart = node->pc_ibpart; ibpart != NULL; ibpart = next) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala next = ibpart->dlib_next;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* clear stale IBPARTs */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibpart->dlib_flags & IBPART_STALE) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibpart->dlib_prev != NULL)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_prev->dlib_next = next;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala else
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_ibpart = next;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (next != NULL)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala next->dlib_prev = ibpart->dlib_prev;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala free(ibpart);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala nnode = node->pc_next;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (node->pc_state & CACHE_NODE_STALE) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) rcm_unregister_interest(hd, node->pc_resource,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala 0);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_DEBUG, "IBPART: unregistered %s\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_resource);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala assert(node->pc_ibpart == NULL);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala cache_remove(node);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node_free(node);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala continue;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (!(node->pc_state & CACHE_NODE_NEW))
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala continue;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (rcm_register_interest(hd, node->pc_resource, 0, NULL) !=
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala RCM_SUCCESS) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_ERROR,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala _("IBPART: failed to register %s\n"),
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_resource);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rv = -1;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala } else {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_DEBUG, "IBPART: registered %s\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_resource);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_state &= ~CACHE_NODE_NEW;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (rv);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * cache_free() - Empty the cache
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic void
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalacache_free()
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala link_cache_t *node;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: cache_free\n");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_lock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node = cache_head.pc_next;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala while (node != &cache_tail) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala cache_remove(node);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node_free(node);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node = cache_head.pc_next;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_log_err() - RCM error log wrapper
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic void
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_log_err(datalink_id_t linkid, char **errorp, char *errmsg)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char link[MAXLINKNAMELEN];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char errstr[DLADM_STRSIZE];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status_t status;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int len;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala const char *errfmt;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char *error;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala link[0] = '\0';
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (linkid != DATALINK_INVALID_LINKID) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char rsrc[RCM_LINK_RESOURCE_MAX];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) snprintf(rsrc, sizeof (rsrc), "%s/%u",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala RCM_LINK_PREFIX, linkid);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_ERROR, _("IBPART: %s(%s)\n"), errmsg, rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((status = dladm_datalink_id2info(dld_handle, linkid, NULL,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala NULL, NULL, link, sizeof (link))) != DLADM_STATUS_OK) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_WARNING,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala _("IBPART: cannot get link name for (%s) %s\n"),
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rsrc, dladm_status2str(status, errstr));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala } else {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_ERROR, _("IBPART: %s\n"), errmsg);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala errfmt = strlen(link) > 0 ? _("IBPART: %s(%s)") : _("IBPART: %s");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala len = strlen(errfmt) + strlen(errmsg) + MAXLINKNAMELEN + 1;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((error = malloc(len)) != NULL) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (strlen(link) > 0)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) snprintf(error, len, errfmt, errmsg, link);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala else
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) snprintf(error, len, errfmt, errmsg);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (errorp != NULL)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *errorp = error;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_consumer_online()
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Notify online to IBPART consumers.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/* ARGSUSED */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic void
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_consumer_online(rcm_handle_t *hd, link_cache_t *node, char **errorp,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala uint_t flags, rcm_info_t **info)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dl_ibpart_t *ibpart;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char rsrc[RCM_LINK_RESOURCE_MAX];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: ibpart_consumer_online (%s)\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_resource);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala for (ibpart = node->pc_ibpart; ibpart != NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart = ibpart->dlib_next) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (!(ibpart->dlib_flags & IBPART_CONSUMER_OFFLINED))
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala continue;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) snprintf(rsrc, RCM_LINK_RESOURCE_MAX, "%s/%u",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala RCM_LINK_PREFIX, ibpart->dlib_ibpart_id);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (rcm_notify_online(hd, rsrc, flags, info) == RCM_SUCCESS)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_flags &= ~IBPART_CONSUMER_OFFLINED;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: ibpart_consumer_online done\n");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_consumer_offline()
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Offline IBPART consumers.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_consumer_offline(rcm_handle_t *hd, link_cache_t *node, char **errorp,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala uint_t flags, rcm_info_t **info)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dl_ibpart_t *ibpart;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char rsrc[RCM_LINK_RESOURCE_MAX];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int ret = RCM_SUCCESS;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: ibpart_consumer_offline (%s)\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala node->pc_resource);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala for (ibpart = node->pc_ibpart; ibpart != NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart = ibpart->dlib_next) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) snprintf(rsrc, RCM_LINK_RESOURCE_MAX, "%s/%u",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala RCM_LINK_PREFIX, ibpart->dlib_ibpart_id);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ret = rcm_request_offline(hd, rsrc, flags, info);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ret != RCM_SUCCESS)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala break;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart->dlib_flags |= IBPART_CONSUMER_OFFLINED;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibpart != NULL)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_consumer_online(hd, node, errorp, flags, info);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: ibpart_consumer_offline done\n");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (ret);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Send RCM_RESOURCE_LINK_NEW events to other modules about new IBPARTs.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Return 0 on success, -1 on failure.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_notify_new_ibpart(rcm_handle_t *hd, char *rsrc)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala link_cache_t *node;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dl_ibpart_t *ibpart;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala nvlist_t *nvl = NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala uint64_t id;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int ret = -1;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: ibpart_notify_new_ibpart (%s)\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_lock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((node = cache_lookup(hd, rsrc, CACHE_REFRESH)) == NULL) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (0);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (nvlist_alloc(&nvl, 0, 0) != 0) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_WARNING,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala _("IBPART: failed to allocate nvlist\n"));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala for (ibpart = node->pc_ibpart; ibpart != NULL;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart = ibpart->dlib_next) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: ibpart_notify_new_ibpart "
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "add (%u)\n", ibpart->dlib_ibpart_id);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala id = ibpart->dlib_ibpart_id;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (nvlist_add_uint64(nvl, RCM_NV_LINKID, id) != 0) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_ERROR,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala _("IBPART: failed to construct nvlist\n"));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (rcm_notify_event(hd, RCM_RESOURCE_LINK_NEW, 0, nvl, NULL) !=
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala RCM_SUCCESS) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_ERROR,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala _("IBPART: failed to notify %s event for %s\n"),
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala RCM_RESOURCE_LINK_NEW, node->pc_resource);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ret = 0;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladone:
aab83bb83be7342f6cfccaed8d5fe0b2f404855dJosef 'Jeff' Sipek nvlist_free(nvl);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (ret);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_consumer_notify() - Notify consumers of IBPARTs coming back online.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_consumer_notify(rcm_handle_t *hd, datalink_id_t linkid, char **errorp,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala uint_t flags, rcm_info_t **info)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char rsrc[RCM_LINK_RESOURCE_MAX];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala link_cache_t *node;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Check for the interface in the cache */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) snprintf(rsrc, RCM_LINK_RESOURCE_MAX, "%s/%u", RCM_LINK_PREFIX,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala linkid);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: ibpart_consumer_notify(%s)\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Inform IP consumers of the new link.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibpart_notify_new_ibpart(hd, rsrc) != 0) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_lock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((node = cache_lookup(hd, rsrc, CACHE_NO_REFRESH)) != NULL) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) ibpart_offline_ibpart(node, IBPART_STALE,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala CACHE_NODE_STALE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "IBPART: ibpart_notify_new_ibpart failed(%s)\n", rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (-1);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: ibpart_consumer_notify "
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "succeeded\n");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (0);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalatypedef struct ibpart_up_arg_s {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala datalink_id_t linkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int retval;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala} ibpart_up_arg_t;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_up(dladm_handle_t handle, datalink_id_t ibpartid, void *arg)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_up_arg_t *ibpart_up_argp = arg;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status_t status;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_ib_attr_t ibpart_attr;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char errmsg[DLADM_STRSIZE];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = dladm_part_info(handle, ibpartid, &ibpart_attr,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DLADM_OPT_PERSIST);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE1,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "IBPART: ibpart_up(): cannot get information for IBPART %u "
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "(%s)\n", ibpartid, dladm_status2str(status, errmsg));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_WALK_CONTINUE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibpart_attr.dia_physlinkid != ibpart_up_argp->linkid)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_WALK_CONTINUE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE3, "IBPART: ibpart_up(%u)\n", ibpartid);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((status = dladm_part_up(handle, ibpartid, 0)) == DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_WALK_CONTINUE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Prompt the warning message and continue to UP other IBPARTs.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_WARNING,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala _("IBPART: IBPART up failed (%u): %s\n"),
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpartid, dladm_status2str(status, errmsg));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_up_argp->retval = -1;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_WALK_CONTINUE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ibpart_configure() - Configure IBPARTs over a physical link after it attaches
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaibpart_configure(rcm_handle_t *hd, datalink_id_t linkid)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char rsrc[RCM_LINK_RESOURCE_MAX];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala link_cache_t *node;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_up_arg_t arg = {DATALINK_INVALID_LINKID, 0};
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Check for the IBPARTs in the cache */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) snprintf(rsrc, sizeof (rsrc), "%s/%u", RCM_LINK_PREFIX, linkid);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2, "IBPART: ibpart_configure(%s)\n", rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Check if the link is new or was previously offlined */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_lock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (((node = cache_lookup(hd, rsrc, CACHE_REFRESH)) != NULL) &&
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (!(node->pc_state & CACHE_NODE_OFFLINED))) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "IBPART: Skipping configured interface(%s)\n", rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (0);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) mutex_unlock(&cache_lock);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala arg.linkid = linkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) dladm_walk_datalink_id(ibpart_up, dld_handle, &arg,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DATALINK_CLASS_PART, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (arg.retval == 0) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala rcm_log_message(RCM_TRACE2,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "IBPART: ibpart_configure succeeded(%s)\n", rsrc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (arg.retval);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}