a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * CDDL HEADER START
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * The contents of this file are subject to the terms of the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Common Development and Distribution License (the "License").
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * You may not use this file except in compliance with the License.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * or http://www.opensolaris.org/os/licensing.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * See the License for the specific language governing permissions
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * and limitations under the License.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * When distributing Covered Code, include this CDDL HEADER in each
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If applicable, add the following below this CDDL HEADER, with the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * fields enclosed by brackets "[]" replaced with your own identifying
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * information: Portions Copyright [yyyy] [name of copyright owner]
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * CDDL HEADER END
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
a481fa48e4b49ab092647a92bb0ea0edf9afc5ceRick McNeal * Copyright 2011, 2015 Nexenta Systems, Inc. All rights reserved.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/cpuvar.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/types.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/conf.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/file.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/ddi.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/sunddi.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/modctl.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/sysmacros.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/sdt.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/socket.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/strsubr.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/stmf.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/stmf_ioctl.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/portif.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/idm/idm.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define ISCSIT_TGT_SM_STRINGS
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan#include "iscsit.h"
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan#include "iscsit_isns.h"
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptypedef struct {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_node_t te_ctx_node;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_event_t te_ctx_event;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap} tgt_event_ctx_t;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_event_dispatch(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_created(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_onlining(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_online(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_stmf_online(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_deleting_need_offline(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_offlining(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_offline(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_stmf_offline(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_deleting_stmf_dereg(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_deleting_stmf_dereg_fail(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_deleting(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_dereg_retry(void *arg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_dereg_task(void *arg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_new_state(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_state_t new_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic iscsit_tgt_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_create(it_tgt_t *cfg_tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_unref(void *tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_async_wait_ref(iscsit_tgt_t *tgt, idm_refcnt_cb_t *cb_func);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_destroy(iscsit_tgt_t *tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic iscsit_tpgt_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_lookup_tpgt_locked(iscsit_tgt_t *tgt, uint16_t tag);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic iscsit_tpg_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_lookup_locked(char *tpg_name);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic iscsit_portal_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_portal_lookup_locked(iscsit_tpg_t *tpg,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap struct sockaddr_storage *sa);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic idm_status_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_online(iscsit_tgt_t *tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_offline(iscsit_tgt_t *tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic idm_status_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_modify(iscsit_tgt_t *tgt, it_tgt_t *cfg_tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic idm_status_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_merge_tpgt(iscsit_tgt_t *tgt, it_tgt_t *cfg_tgt,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_t *tpgt_del_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic iscsit_tpgt_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpgt_create(it_tpgt_t *cfg_tpgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic iscsit_tpgt_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpgt_create_default();
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpgt_destroy(iscsit_tpgt_t *tpgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic iscsit_tpg_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_create(it_tpg_t *tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_modify(iscsit_tpg_t *tpg, it_tpg_t *cfg_tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_destroy(iscsit_tpg_t *tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic iscsit_portal_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_portal_create(iscsit_tpg_t *tpg, struct sockaddr_storage *sa);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
d0a3a9981c0bb64387654107335322769fcf9c68Peter Cudhea - Sun Microsystems - Burlington, MA United Statesiscsit_portal_delete(iscsit_portal_t *portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic idm_status_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_portal_online(iscsit_portal_t *portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_portal_offline(iscsit_portal_t *portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Target state machine
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_sm_event(iscsit_tgt_t *tgt, iscsit_tgt_event_t event)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_enter(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_event_locked(tgt, event);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_exit(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_event_locked(iscsit_tgt_t *tgt, iscsit_tgt_event_t event)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_event_ctx_t *ctx;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_hold(tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ctx = kmem_zalloc(sizeof (*ctx), KM_SLEEP);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ctx->te_ctx_event = event;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_insert_tail(&tgt->target_events, ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap * Use the target_sm_busy flag to keep the state machine single
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap * threaded. This also serves as recursion avoidance since this
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap * flag will always be set if we call iscsit_tgt_sm_event from
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap * within the state machine code.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!tgt->target_sm_busy) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_sm_busy = B_TRUE;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (!list_is_empty(&tgt->target_events)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ctx = list_head(&tgt->target_events);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_remove(&tgt->target_events, ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_sm_audit_event(&tgt->target_state_audit,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap SAS_ISCSIT_TGT, (int)tgt->target_state,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (int)ctx->te_ctx_event, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_exit(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_event_dispatch(tgt, ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_enter(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_sm_busy = B_FALSE;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_rele(tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_event_dispatch(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap DTRACE_PROBE2(tgt__event, iscsit_tgt_t *, tgt,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_event_ctx_t *, ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap IDM_SM_LOG(CE_NOTE, "tgt_sm_event_dispatch: tgt %p event %s(%d)",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void *)tgt, iscsit_te_name[ctx->te_ctx_event], ctx->te_ctx_event);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* State independent actions */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (ctx->te_ctx_event) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_DELETE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_deleting = B_TRUE;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* State dependent actions */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (tgt->target_state) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_CREATED:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_created(tgt, ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_ONLINING:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_onlining(tgt, ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_ONLINE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_online(tgt, ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_STMF_ONLINE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_stmf_online(tgt, ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_DELETING_NEED_OFFLINE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_deleting_need_offline(tgt, ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_OFFLINING:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_offlining(tgt, ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_OFFLINE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_offline(tgt, ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_STMF_OFFLINE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_stmf_offline(tgt, ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_DELETING_STMF_DEREG:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_deleting_stmf_dereg(tgt, ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_DELETING_STMF_DEREG_FAIL:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_deleting_stmf_dereg_fail(tgt, ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_DELETING:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_deleting(tgt, ctx);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap kmem_free(ctx, sizeof (*ctx));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_created(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmf_change_status_t scs;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (ctx->te_ctx_event) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_new_state(tgt, ctx, TS_ONLINING);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_DELETE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_new_state(tgt, ctx, TS_DELETING_STMF_DEREG);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * We're already offline but update to an equivelant
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * state just to note that STMF talked to us.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_completion_status = STMF_SUCCESS;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_additional_info = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_new_state(tgt, ctx, TS_OFFLINE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) stmf_ctl(STMF_CMD_LPORT_OFFLINE_COMPLETE,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_stmf_lport, &scs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Ignore */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_onlining(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmf_change_status_t scs;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (ctx->te_ctx_event) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_ONLINE_SUCCESS:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_new_state(tgt, ctx, TS_ONLINE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_ONLINE_FAIL:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_new_state(tgt, ctx, TS_STMF_OFFLINE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_DELETE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* TE_DELETE is handled in tgt_sm_event_dispatch() */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * We can't complete STMF's request since we are busy going
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * online.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_completion_status = STMF_INVALID_ARG;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_additional_info = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) stmf_ctl((ctx->te_ctx_event == TE_STMF_ONLINE_REQ) ?
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap STMF_CMD_LPORT_ONLINE_COMPLETE :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap STMF_CMD_LPORT_OFFLINE_COMPLETE,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_stmf_lport, &scs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Ignore */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_online(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmf_change_status_t scs;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (ctx->te_ctx_event) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tgt->target_deleting) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_new_state(tgt, ctx, TS_DELETING_NEED_OFFLINE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_new_state(tgt, ctx, TS_STMF_ONLINE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_DELETE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* TE_DELETE is handled in tgt_sm_event_dispatch() */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * We can't complete STMF's request since we are busy going
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * online (waiting for acknowlegement from STMF)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_completion_status = STMF_INVALID_ARG;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_additional_info = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) stmf_ctl((ctx->te_ctx_event == TE_STMF_ONLINE_REQ) ?
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap STMF_CMD_LPORT_ONLINE_COMPLETE :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap STMF_CMD_LPORT_OFFLINE_COMPLETE,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_stmf_lport, &scs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Ignore */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_stmf_online(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmf_change_status_t scs;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Deregister target with iSNS whenever we leave this state */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (ctx->te_ctx_event) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_DELETE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) iscsit_isns_deregister(tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_new_state(tgt, ctx, TS_DELETING_NEED_OFFLINE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) iscsit_isns_deregister(tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_new_state(tgt, ctx, TS_OFFLINING);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Already online */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_completion_status = STMF_ALREADY;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_additional_info = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) stmf_ctl(STMF_CMD_LPORT_ONLINE_COMPLETE,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_stmf_lport, &scs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Ignore */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_deleting_need_offline(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmf_change_status_t scs;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (ctx->te_ctx_event) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_new_state(tgt, ctx, TS_OFFLINING);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_DELETE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* TE_DELETE is handled in tgt_sm_event_dispatch() */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * We can't complete STMF's request since we need to be offlined
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_completion_status = STMF_INVALID_ARG;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_additional_info = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) stmf_ctl(STMF_CMD_LPORT_ONLINE_COMPLETE,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_stmf_lport, &scs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Ignore */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_offlining(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmf_change_status_t scs;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (ctx->te_ctx_event) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_OFFLINE_COMPLETE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_new_state(tgt, ctx, TS_OFFLINE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_DELETE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* TE_DELETE is handled in tgt_sm_event_dispatch() */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * We can't complete STMF's request since we are busy going
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * offline.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_completion_status = STMF_INVALID_ARG;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_additional_info = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) stmf_ctl((ctx->te_ctx_event == TE_STMF_ONLINE_REQ) ?
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap STMF_CMD_LPORT_ONLINE_COMPLETE :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap STMF_CMD_LPORT_OFFLINE_COMPLETE,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_stmf_lport, &scs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Ignore */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_offline(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmf_change_status_t scs;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (ctx->te_ctx_event) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tgt->target_deleting) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_new_state(tgt, ctx, TS_DELETING_STMF_DEREG);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_new_state(tgt, ctx, TS_STMF_OFFLINE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_DELETE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* TE_DELETE is handled in tgt_sm_event_dispatch() */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * We can't complete STMF's request since we are busy going
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * offline.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_completion_status = STMF_INVALID_ARG;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_additional_info = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) stmf_ctl((ctx->te_ctx_event == TE_STMF_ONLINE_REQ) ?
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap STMF_CMD_LPORT_ONLINE_COMPLETE :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap STMF_CMD_LPORT_OFFLINE_COMPLETE,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_stmf_lport, &scs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Ignore */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_stmf_offline(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmf_change_status_t scs;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (ctx->te_ctx_event) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_new_state(tgt, ctx, TS_ONLINING);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_DELETE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_new_state(tgt, ctx, TS_DELETING_STMF_DEREG);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Already offline */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_completion_status = STMF_ALREADY;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_additional_info = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) stmf_ctl(STMF_CMD_LPORT_OFFLINE_COMPLETE,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_stmf_lport, &scs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Ignore */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_deleting_stmf_dereg(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmf_change_status_t scs;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Terminal state, no events */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (ctx->te_ctx_event) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * We can't complete STMF's request since we are being deleted
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_completion_status = STMF_INVALID_ARG;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_additional_info = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) stmf_ctl((ctx->te_ctx_event == TE_STMF_ONLINE_REQ) ?
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap STMF_CMD_LPORT_ONLINE_COMPLETE :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap STMF_CMD_LPORT_OFFLINE_COMPLETE,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_stmf_lport, &scs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Ignore */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_DEREG_SUCCESS:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_new_state(tgt, ctx, TS_DELETING);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_DEREG_FAIL:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_new_state(tgt, ctx, TS_DELETING_STMF_DEREG_FAIL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_deleting_stmf_dereg_fail(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmf_change_status_t scs;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Terminal state, no events */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (ctx->te_ctx_event) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * We can't complete STMF's request since we are being deleted
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_completion_status = STMF_INVALID_ARG;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_additional_info = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) stmf_ctl((ctx->te_ctx_event == TE_STMF_ONLINE_REQ) ?
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap STMF_CMD_LPORT_ONLINE_COMPLETE :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap STMF_CMD_LPORT_OFFLINE_COMPLETE,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_stmf_lport, &scs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Ignore */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_DEREG_RETRY:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt_sm_new_state(tgt, ctx, TS_DELETING_STMF_DEREG);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_deleting(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmf_change_status_t scs;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Terminal state, no events */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (ctx->te_ctx_event) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_REQ:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * We can't complete STMF's request since we are being deleted
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_completion_status = STMF_INVALID_ARG;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_additional_info = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) stmf_ctl((ctx->te_ctx_event == TE_STMF_ONLINE_REQ) ?
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap STMF_CMD_LPORT_ONLINE_COMPLETE :
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap STMF_CMD_LPORT_OFFLINE_COMPLETE,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_stmf_lport, &scs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_ONLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TE_STMF_OFFLINE_COMPLETE_ACK:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Ignore */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_dereg_retry(void *arg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_t *tgt = arg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Rather than guaranteeing the target state machine code will not
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * block for long periods of time (tying up this callout thread)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * we will queue a task on the taskq to send the retry event.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If it fails we'll setup another timeout and try again later.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (taskq_dispatch(iscsit_global.global_dispatch_taskq,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_dereg_task, tgt, DDI_NOSLEEP) == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Dispatch failed, try again later */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) timeout(iscsit_tgt_dereg_retry, tgt,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap drv_usectohz(TGT_DEREG_RETRY_SECONDS * 1000000));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_dereg_task(void *arg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_t *tgt = arg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_sm_event(tgt, TE_STMF_DEREG_RETRY);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_sm_new_state(iscsit_tgt_t *tgt, tgt_event_ctx_t *ctx,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_state_t new_state)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmf_local_port_t *lport = tgt->target_stmf_lport;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmf_change_status_t scs;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmf_state_change_info_t sci;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_status_t idmrc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmf_status_t stmfrc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_completion_status = STMF_SUCCESS;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_additional_info = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Validate new state
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(new_state != TS_UNDEFINED);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT3U(new_state, <, TS_MAX_STATE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap new_state = (new_state < TS_MAX_STATE) ?
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap new_state : TS_UNDEFINED;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap IDM_SM_LOG(CE_NOTE, "tgt_sm_new_state: tgt %p, %s(%d) --> %s(%d)\n",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void *) tgt, iscsit_ts_name[tgt->target_state], tgt->target_state,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_ts_name[new_state], new_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap DTRACE_PROBE3(target__state__change,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_t *, tgt, tgt_event_ctx_t *, ctx,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_state_t, new_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_enter(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_sm_audit_state_change(&tgt->target_state_audit, SAS_ISCSIT_TGT,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (int)tgt->target_state, (int)new_state);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_last_state = tgt->target_state;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_state = new_state;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_exit(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap switch (tgt->target_state) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_ONLINING:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idmrc = iscsit_tgt_online(tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idmrc != IDM_STATUS_SUCCESS) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_completion_status = STMF_TARGET_FAILURE;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_sm_event(tgt, TE_ONLINE_FAIL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_sm_event(tgt, TE_ONLINE_SUCCESS);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Let STMF know the how the online operation completed.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * STMF will respond with an acknowlege later
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) stmf_ctl(STMF_CMD_LPORT_ONLINE_COMPLETE, lport, &scs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_ONLINE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_STMF_ONLINE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) iscsit_isns_register(tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_DELETING_NEED_OFFLINE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sci.st_rflags = STMF_RFLAG_STAY_OFFLINED;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sci.st_additional_info = "Offline for delete";
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) stmf_ctl(STMF_CMD_LPORT_OFFLINE, lport, &sci);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_OFFLINING:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Async callback generates completion event */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_offline(tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_OFFLINE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_STMF_OFFLINE:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_DELETING_STMF_DEREG:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmfrc = stmf_deregister_local_port(tgt->target_stmf_lport);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (stmfrc == STMF_SUCCESS) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_sm_event(tgt, TE_STMF_DEREG_SUCCESS);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_sm_event(tgt, TE_STMF_DEREG_FAIL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_DELETING_STMF_DEREG_FAIL:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Retry dereg in 1 second */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) timeout(iscsit_tgt_dereg_retry, tgt,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap drv_usectohz(TGT_DEREG_RETRY_SECONDS * 1000000));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap case TS_DELETING:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_async_wait_ref(tgt, iscsit_tgt_unref);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap default:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Target, TPGT, TPG utility functions
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_cfg_status_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_config_merge_tgt(it_config_t *cfg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_t *cfg_tgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_t *tgt, *next_tgt;
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States it_cfg_status_t itrc = ITCFG_SUCCESS;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 1. >> Lock <<
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 2. Removing deleted objects
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 3. Add deleted targets to global delete list
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 4. "delete" event to target state machine
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 5. >> Unlock <<
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 6. Create new targets, update modified targets
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (tgt = avl_first(&iscsit_global.global_target_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt = next_tgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap next_tgt = AVL_NEXT(&iscsit_global.global_target_list, tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (it_tgt_lookup(cfg, tgt->target_name) == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_remove(&iscsit_global.global_target_list, tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_insert_tail(
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &iscsit_global.global_deleted_target_list, tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_sm_event(tgt, TE_DELETE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Now walk through the list of configured targets */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (cfg_tgt = cfg->config_tgt_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg_tgt != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg_tgt = cfg_tgt->tgt_next) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* See if we have an existing target */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt = iscsit_tgt_lookup_locked(cfg_tgt->tgt_name);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tgt == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt = iscsit_tgt_create(cfg_tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tgt == NULL)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ITCFG_TGT_CREATE_ERR);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_add(&iscsit_global.global_target_list, tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States if (iscsit_tgt_modify(tgt, cfg_tgt) !=
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States IDM_STATUS_SUCCESS)
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States itrc = ITCFG_MISC_ERR;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_rele(tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Targets on the iscsit_global.global_deleted_target_list will remove
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * and destroy themselves when their associated state machines reach
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the TS_DELETED state and all references are released.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States return (itrc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_lookup(char *target_name)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_t *result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ISCSIT_GLOBAL_LOCK(RW_READER);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result = iscsit_tgt_lookup_locked(target_name);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ISCSIT_GLOBAL_UNLOCK();
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_lookup_locked(char *target_name)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_t tmp_tgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_t *result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Use a dummy target for lookup, filling in all fields used in AVL
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * comparison.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tmp_tgt.target_name = target_name;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((result = avl_find(&iscsit_global.global_target_list,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &tmp_tgt, NULL)) != NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_hold(result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_create(it_tgt_t *cfg_tgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_t *result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmf_local_port_t *lport;
ca3b8945247d4cfb82a351e1a293910f66fbde81Yuri Pankov char *alias;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Each target is an STMF local port.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap lport = stmf_alloc(STMF_STRUCT_STMF_LOCAL_PORT,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (iscsit_tgt_t) + sizeof (scsi_devid_desc_t) +
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap strnlen(cfg_tgt->tgt_name, MAX_ISCSI_NODENAMELEN) + 1, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (lport == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result = lport->lport_port_private;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result->target_state = TS_CREATED;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result->target_stmf_lport_registered = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Use pointer arithmetic to find scsi_devid_desc_t */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result->target_devid = (scsi_devid_desc_t *)(result + 1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strcpy((char *)result->target_devid->ident, cfg_tgt->tgt_name);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result->target_devid->ident_length =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap strnlen(cfg_tgt->tgt_name, MAX_ISCSI_NODENAMELEN);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result->target_devid->protocol_id = PROTOCOL_iSCSI;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result->target_devid->piv = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result->target_devid->code_set = CODE_SET_ASCII;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result->target_devid->association = ID_IS_TARGET_PORT;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Store a shortcut to the target name */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result->target_name = (char *)result->target_devid->ident;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_sm_audit_init(&result->target_state_audit);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_init(&result->target_mutex, NULL, MUTEX_DEFAULT, NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_create(&result->target_sess_list, iscsit_sess_avl_compare,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (iscsit_sess_t), offsetof(iscsit_sess_t, ist_tgt_ln));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_create(&result->target_tpgt_list, iscsit_tpgt_avl_compare,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (iscsit_tpgt_t), offsetof(iscsit_tpgt_t, tpgt_tgt_ln));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_create(&result->target_events, sizeof (tgt_event_ctx_t),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap offsetof(tgt_event_ctx_t, te_ctx_node));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_init(&result->target_refcnt, result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_init(&result->target_sess_refcnt, result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
ca3b8945247d4cfb82a351e1a293910f66fbde81Yuri Pankov /* Set target alias */
ca3b8945247d4cfb82a351e1a293910f66fbde81Yuri Pankov if (nvlist_lookup_string(cfg_tgt->tgt_properties, "alias", &alias) == 0)
ca3b8945247d4cfb82a351e1a293910f66fbde81Yuri Pankov lport->lport_alias = strdup(alias);
ca3b8945247d4cfb82a351e1a293910f66fbde81Yuri Pankov
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Finish initializing local port */
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap /*
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap * Would like infinite timeout, but this is about as long as can
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap * be specified to stmf on a 32 bit kernel.
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap */
30e7468f8f41aa30ada067b2c1d5d284046514daPeter Dunlap lport->lport_abort_timeout = 2000; /* seconds */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap lport->lport_id = result->target_devid;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap lport->lport_pp = iscsit_global.global_pp;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap lport->lport_ds = iscsit_global.global_dbuf_store;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap lport->lport_xfer_data = &iscsit_xfer_scsi_data;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap lport->lport_send_status = &iscsit_send_scsi_status;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap lport->lport_task_free = &iscsit_lport_task_free;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap lport->lport_abort = &iscsit_abort;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap lport->lport_ctl = &iscsit_ctl;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result->target_stmf_lport = lport;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
07a2bfd1dc0b943009fd0adbf34cb344095e378fPeter Cudhea - Sun Microsystems - Burlington, MA United States /*
07a2bfd1dc0b943009fd0adbf34cb344095e378fPeter Cudhea - Sun Microsystems - Burlington, MA United States * We need a global hold until the STMF-ONLINE state machine
07a2bfd1dc0b943009fd0adbf34cb344095e378fPeter Cudhea - Sun Microsystems - Burlington, MA United States * completes. Acquire that hold now, in case we need to call
07a2bfd1dc0b943009fd0adbf34cb344095e378fPeter Cudhea - Sun Microsystems - Burlington, MA United States * iscsit_tgt_destroy, which will also release the hold.
07a2bfd1dc0b943009fd0adbf34cb344095e378fPeter Cudhea - Sun Microsystems - Burlington, MA United States */
07a2bfd1dc0b943009fd0adbf34cb344095e378fPeter Cudhea - Sun Microsystems - Burlington, MA United States iscsit_global_hold();
07a2bfd1dc0b943009fd0adbf34cb344095e378fPeter Cudhea - Sun Microsystems - Burlington, MA United States
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Additional target modifications from config
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (iscsit_tgt_modify(result, cfg_tgt) != IDM_STATUS_SUCCESS) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_destroy(result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Register the target with STMF but not until we have all the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * TPGT bindings and any other additional config setup. STMF
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * may immediately ask us to go online.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (stmf_register_local_port(lport) != STMF_SUCCESS) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_destroy(result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result->target_stmf_lport_registered = 1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic idm_status_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_modify(iscsit_tgt_t *tgt, it_tgt_t *cfg_tgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_status_t idmrc = IDM_STATUS_SUCCESS;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_t tpgt_del_list;
ca3b8945247d4cfb82a351e1a293910f66fbde81Yuri Pankov char *alias;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Merge TPGT */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_create(&tpgt_del_list, sizeof (iscsit_tpgt_t),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap offsetof(iscsit_tpgt_t, tpgt_delete_ln));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_enter(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tgt->target_props) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(tgt->target_props);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_props = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_dup(cfg_tgt->tgt_properties, &tgt->target_props,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap KM_SLEEP);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
ca3b8945247d4cfb82a351e1a293910f66fbde81Yuri Pankov /* Update alias */
ca3b8945247d4cfb82a351e1a293910f66fbde81Yuri Pankov if (tgt->target_stmf_lport->lport_alias) {
ca3b8945247d4cfb82a351e1a293910f66fbde81Yuri Pankov strfree(tgt->target_stmf_lport->lport_alias);
ca3b8945247d4cfb82a351e1a293910f66fbde81Yuri Pankov tgt->target_stmf_lport->lport_alias = NULL;
ca3b8945247d4cfb82a351e1a293910f66fbde81Yuri Pankov }
ca3b8945247d4cfb82a351e1a293910f66fbde81Yuri Pankov if (nvlist_lookup_string(tgt->target_props, "alias", &alias) == 0)
ca3b8945247d4cfb82a351e1a293910f66fbde81Yuri Pankov tgt->target_stmf_lport->lport_alias = strdup(alias);
ca3b8945247d4cfb82a351e1a293910f66fbde81Yuri Pankov
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((idmrc = iscsit_tgt_merge_tpgt(tgt, cfg_tgt, &tpgt_del_list)) !=
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap IDM_STATUS_SUCCESS) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* This should never happen */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cmn_err(CE_WARN, "Fail to configure TPGTs for "
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "target %s, the target modification could not be "
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "completed.", tgt->target_name);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_exit(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_config_destroy_tpgts(&tpgt_del_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If the target is truly modified (not newly created),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * inform iSNS to update the target registration.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((tgt->target_generation > 0) &&
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (cfg_tgt->tgt_generation > tgt->target_generation)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_isns_target_update(tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_generation = cfg_tgt->tgt_generation;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (idmrc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_config_destroy_tpgts(list_t *tpgt_del_list)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpgt_t *tpgt, *next_tpgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (tpgt = list_head(tpgt_del_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt = next_tpgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap next_tpgt = list_next(tpgt_del_list, tpgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_remove(tpgt_del_list, tpgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_wait_ref(&tpgt->tpgt_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpgt_destroy(tpgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_unref(void *tgt_void)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_t *tgt = tgt_void;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ISCSIT_GLOBAL_LOCK(RW_WRITER);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_remove(&iscsit_global.global_deleted_target_list, tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ISCSIT_GLOBAL_UNLOCK();
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_destroy(tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_async_wait_ref(iscsit_tgt_t *tgt, idm_refcnt_cb_t *cb_func)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_async_wait_ref(&tgt->target_refcnt, cb_func);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_destroy(iscsit_tgt_t *tgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpgt_t *tpgt, *next_tpgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
07a2bfd1dc0b943009fd0adbf34cb344095e378fPeter Cudhea - Sun Microsystems - Burlington, MA United States ASSERT(tgt->target_state == TS_DELETING ||
07a2bfd1dc0b943009fd0adbf34cb344095e378fPeter Cudhea - Sun Microsystems - Burlington, MA United States (tgt->target_state == TS_CREATED &&
07a2bfd1dc0b943009fd0adbf34cb344095e378fPeter Cudhea - Sun Microsystems - Burlington, MA United States tgt->target_stmf_lport_registered == 0));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Destroy all target portal group tags
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_enter(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (tpgt = avl_first(&tgt->target_tpgt_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt = next_tpgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap next_tpgt = AVL_NEXT(&tgt->target_tpgt_list, tpgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_remove(&tgt->target_tpgt_list, tpgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpgt_destroy(tpgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tgt->target_props) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(tgt->target_props);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_exit(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Destroy target
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_destroy(&tgt->target_sess_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_destroy(&tgt->target_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_destroy(&tgt->target_events);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_destroy(&tgt->target_tpgt_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_destroy(&tgt->target_sess_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_destroy(&tgt->target_mutex);
ca3b8945247d4cfb82a351e1a293910f66fbde81Yuri Pankov if (tgt->target_stmf_lport->lport_alias)
ca3b8945247d4cfb82a351e1a293910f66fbde81Yuri Pankov strfree(tgt->target_stmf_lport->lport_alias);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmf_free(tgt->target_stmf_lport); /* Also frees "tgt' */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_global_rele();
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_hold(iscsit_tgt_t *tgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_hold(&tgt->target_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_rele(iscsit_tgt_t *tgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_rele(&tgt->target_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_avl_compare(const void *void_tgt1, const void *void_tgt2)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const iscsit_tgt_t *tgt1 = void_tgt1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const iscsit_tgt_t *tgt2 = void_tgt2;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Sort by ISID first then TSIH
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result = strcmp(tgt1->target_name, tgt2->target_name);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (result < 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (-1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (result > 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpgt_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_lookup_tpgt(iscsit_tgt_t *tgt, uint16_t tag)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpgt_t *result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_enter(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result = iscsit_tgt_lookup_tpgt_locked(tgt, tag);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_exit(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic iscsit_tpgt_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_lookup_tpgt_locked(iscsit_tgt_t *tgt, uint16_t tag)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpgt_t tmp_tpgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpgt_t *result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Caller holds tgt->target_mutex */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tmp_tpgt.tpgt_tag = tag;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((result = avl_find(&tgt->target_tpgt_list, &tmp_tpgt, NULL)) !=
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpgt_hold(result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_portal_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_lookup_portal(iscsit_tgt_t *tgt, struct sockaddr_storage *sa,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpgt_t **output_tpgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpgt_t *tpgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_portal_t *portal;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Caller holds tgt->target_mutex */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(mutex_owned(&tgt->target_mutex));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (tpgt = avl_first(&tgt->target_tpgt_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt = AVL_NEXT(&tgt->target_tpgt_list, tpgt)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal = iscsit_tpg_portal_lookup(tpgt->tpgt_tpg, sa);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (portal) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpgt_hold(tpgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *output_tpgt = tpgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_bind_sess(iscsit_tgt_t *tgt, iscsit_sess_t *sess)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sess->ist_lport = tgt->target_stmf_lport;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_hold(tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_hold(&tgt->target_sess_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_enter(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_add(&tgt->target_sess_list, sess);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_exit(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Discovery session */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sess->ist_lport = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ISCSIT_GLOBAL_LOCK(RW_WRITER);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_add(&iscsit_global.global_discovery_sessions, sess);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ISCSIT_GLOBAL_UNLOCK();
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_unbind_sess(iscsit_tgt_t *tgt, iscsit_sess_t *sess)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_enter(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_remove(&tgt->target_sess_list, sess);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_exit(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sess->ist_tgt = (iscsit_tgt_t *)SESS_UNBOUND_FROM_TGT;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_rele(&tgt->target_sess_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_rele(tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Discovery session */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ISCSIT_GLOBAL_LOCK(RW_WRITER);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_remove(&iscsit_global.global_discovery_sessions, sess);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ISCSIT_GLOBAL_UNLOCK();
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define LOCK_FOR_SESS_LOOKUP(lookup_tgt) { \
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((lookup_tgt) == NULL) { \
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ISCSIT_GLOBAL_LOCK(RW_READER); \
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else { \
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_enter(&(lookup_tgt)->target_mutex); \
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } \
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define UNLOCK_FOR_SESS_LOOKUP(lookup_tgt) { \
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((lookup_tgt) == NULL) { \
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ISCSIT_GLOBAL_UNLOCK(); \
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else { \
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_exit(&(lookup_tgt)->target_mutex); \
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } \
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_sess_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_lookup_sess(iscsit_tgt_t *tgt, char *initiator_name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uint8_t *isid, uint16_t tsih, uint16_t tag)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_sess_t tmp_sess;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_tree_t *sess_avl;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_index_t where;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_sess_t *result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If tgt is NULL then we are looking for a discovery session
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tgt == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sess_avl = &iscsit_global.global_discovery_sessions;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sess_avl = &tgt->target_sess_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap LOCK_FOR_SESS_LOOKUP(tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (avl_numnodes(sess_avl) == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap UNLOCK_FOR_SESS_LOOKUP(tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * We'll try to find a session matching ISID + TSIH first. If we
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * can't find one then we will return the closest match. If the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * caller needs an exact match it must compare the TSIH after
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * the session is returned.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * The reason we do this "fuzzy matching" is to allow matching
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * sessions with different TSIH values on the same AVL list. This
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * makes session reinstatement much easier since the new session can
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * live on the list at the same time as the old session is cleaning up.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap bcopy(isid, tmp_sess.ist_isid, ISCSI_ISID_LEN);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tmp_sess.ist_initiator_name = initiator_name;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tmp_sess.ist_tsih = tsih;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tmp_sess.ist_tpgt_tag = tag;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result = avl_find(sess_avl, &tmp_sess, &where);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (result != NULL) {
47715e7fd18d93fbdad6de94604baaa63665f0fbPriya Krishnan goto found_result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * avl_find_nearest() may return a result with a different ISID so
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * we should only return a result if the name and ISID match
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result = avl_nearest(sess_avl, where, AVL_BEFORE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((result != NULL) &&
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (strcmp(result->ist_initiator_name, initiator_name) == 0) &&
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (memcmp(result->ist_isid, isid, ISCSI_ISID_LEN) == 0) &&
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (result->ist_tpgt_tag == tag)) {
47715e7fd18d93fbdad6de94604baaa63665f0fbPriya Krishnan goto found_result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result = avl_nearest(sess_avl, where, AVL_AFTER);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((result != NULL) &&
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (strcmp(result->ist_initiator_name, initiator_name) == 0) &&
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (memcmp(result->ist_isid, isid, ISCSI_ISID_LEN) == 0) &&
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (result->ist_tpgt_tag == tag)) {
47715e7fd18d93fbdad6de94604baaa63665f0fbPriya Krishnan goto found_result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
47715e7fd18d93fbdad6de94604baaa63665f0fbPriya Krishnan result = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
47715e7fd18d93fbdad6de94604baaa63665f0fbPriya Krishnanfound_result:
47715e7fd18d93fbdad6de94604baaa63665f0fbPriya Krishnan if ((result != NULL) &&
47715e7fd18d93fbdad6de94604baaa63665f0fbPriya Krishnan (iscsit_sess_check_hold(result) != IDM_STATUS_SUCCESS)) {
47715e7fd18d93fbdad6de94604baaa63665f0fbPriya Krishnan result = NULL;
47715e7fd18d93fbdad6de94604baaa63665f0fbPriya Krishnan }
47715e7fd18d93fbdad6de94604baaa63665f0fbPriya Krishnan UNLOCK_FOR_SESS_LOOKUP(tgt);
47715e7fd18d93fbdad6de94604baaa63665f0fbPriya Krishnan return (result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic idm_status_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_merge_tpgt(iscsit_tgt_t *tgt, it_tgt_t *cfg_tgt,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_t *tpgt_del_list)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpgt_t *tpgt, *next_tpgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpgt_t *cfg_tpgt;
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States idm_status_t status = IDM_STATUS_SUCCESS;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 1. >> Lock <<
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 2. Removing all objects and place on a temp list
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 3. Add new objects
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 4. >> Unlock <<
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 5. tpgt_del_list contains deleted objects
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(avl_is_empty(&tgt->target_tpgt_list) ||
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (tpgt_del_list != NULL));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tpgt_del_list) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (tpgt = avl_first(&tgt->target_tpgt_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt != NULL; tpgt = next_tpgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap next_tpgt = AVL_NEXT(&tgt->target_tpgt_list, tpgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_remove(&tgt->target_tpgt_list, tpgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tgt->target_state == TS_STMF_ONLINE) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt->tpgt_needs_tpg_offline = B_TRUE;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_insert_tail(tpgt_del_list, tpgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States if (cfg_tgt->tgt_tpgt_list != NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Add currently defined TPGTs */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (cfg_tpgt = cfg_tgt->tgt_tpgt_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg_tpgt != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg_tpgt = cfg_tpgt->tpgt_next) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt = iscsit_tpgt_create(cfg_tpgt);
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States if (tpgt == NULL) {
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States /*
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States * There is a problem in the configuration we
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States * received from the ioctl -- a missing tpg.
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States * All the unbind operations have already
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States * taken place. To leave the system in a
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States * non-panic'd state, use the default tpgt.
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States */
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States status = IDM_STATUS_FAIL;
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States continue;
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tgt->target_state == TS_STMF_ONLINE) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) iscsit_tpg_online(tpgt->tpgt_tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_add(&tgt->target_tpgt_list, tpgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States /* If no TPGTs defined, add the default TPGT */
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States if (avl_numnodes(&tgt->target_tpgt_list) == 0) {
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States tpgt = iscsit_tpgt_create_default();
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States if (tgt->target_state == TS_STMF_ONLINE) {
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States (void) iscsit_tpg_online(tpgt->tpgt_tpg);
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States }
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States avl_add(&tgt->target_tpgt_list, tpgt);
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
031f730c92edd32672189692ec7a76c1d6fbdcc3Peter Cudhea - Sun Microsystems - Burlington, MA United States return (status);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic iscsit_tpgt_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpgt_create(it_tpgt_t *cfg_tpgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_t *tpg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpgt_t *result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* This takes a reference on the TPG */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg = iscsit_tpg_lookup_locked(cfg_tpgt->tpgt_tpg_name);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tpg == NULL)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result = kmem_zalloc(sizeof (*result), KM_SLEEP);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result->tpgt_tpg = tpg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result->tpgt_tag = cfg_tpgt->tpgt_tag;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpgt_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpgt_create_default()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpgt_t *result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result = kmem_zalloc(sizeof (*result), KM_SLEEP);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result->tpgt_tpg = iscsit_global.global_default_tpg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_hold(result->tpgt_tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result->tpgt_tag = ISCSIT_DEFAULT_TPGT;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpgt_destroy(iscsit_tpgt_t *tpgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tpgt->tpgt_needs_tpg_offline) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_offline(tpgt->tpgt_tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_rele(tpgt->tpgt_tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap kmem_free(tpgt, sizeof (*tpgt));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpgt_hold(iscsit_tpgt_t *tpgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_hold(&tpgt->tpgt_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpgt_rele(iscsit_tpgt_t *tpgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_rele(&tpgt->tpgt_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpgt_avl_compare(const void *void_tpgt1, const void *void_tpgt2)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const iscsit_tpgt_t *tpgt1 = void_tpgt1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const iscsit_tpgt_t *tpgt2 = void_tpgt2;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tpgt1->tpgt_tag < tpgt2->tpgt_tag)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (-1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap else if (tpgt1->tpgt_tag > tpgt2->tpgt_tag)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic idm_status_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_online(iscsit_tgt_t *tgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpgt_t *tpgt, *tpgt_fail;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_status_t rc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_enter(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(tgt->target_sess_list.avl_numnodes == 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_reset(&tgt->target_sess_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (tpgt = avl_first(&tgt->target_tpgt_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt = AVL_NEXT(&tgt->target_tpgt_list, tpgt)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc = iscsit_tpg_online(tpgt->tpgt_tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (rc != IDM_STATUS_SUCCESS) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt_fail = tpgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap goto tgt_online_fail;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_exit(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (IDM_STATUS_SUCCESS);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptgt_online_fail:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Offline all the tpgs we successfully onlined up to the failure */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (tpgt = avl_first(&tgt->target_tpgt_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt != tpgt_fail;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt = AVL_NEXT(&tgt->target_tpgt_list, tpgt)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_offline(tpgt->tpgt_tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_exit(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (rc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_offline_cb(void *tgt_void)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_t *tgt = tgt_void;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap stmf_change_status_t scs;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tgt_sm_event(tgt, TE_OFFLINE_COMPLETE);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_completion_status = STMF_SUCCESS;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap scs.st_additional_info = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) stmf_ctl(STMF_CMD_LPORT_OFFLINE_COMPLETE,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->target_stmf_lport, &scs);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tgt_offline(iscsit_tgt_t *tgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpgt_t *tpgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_sess_t *ist;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_enter(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Offline target portal groups */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (tpgt = avl_first(&tgt->target_tpgt_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt = AVL_NEXT(&tgt->target_tpgt_list, tpgt)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_offline(tpgt->tpgt_tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Close any active sessions */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (ist = avl_first(&tgt->target_sess_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ist != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ist = AVL_NEXT(&tgt->target_sess_list, ist)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * This is not a synchronous operation but after all
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * sessions have been cleaned up there will be no
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * more session-related holds on the target.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_sess_close(ist);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_exit(&tgt->target_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Wait for all the sessions to quiesce.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_async_wait_ref(&tgt->target_sess_refcnt,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &iscsit_tgt_offline_cb);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_cfg_status_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_config_merge_tpg(it_config_t *cfg, list_t *tpg_del_list)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpg_t *cfg_tpg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_t *tpg, *next_tpg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 1. >> Lock <<
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 2. Removing deleted objects and place on a temp list
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 3. Add new objects
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 4. >> Unlock <<
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * 5. tpg_del_list contains objects to destroy
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (tpg = avl_first(&iscsit_global.global_tpg_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg = next_tpg) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap next_tpg = AVL_NEXT(&iscsit_global.global_tpg_list, tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (it_tpg_lookup(cfg, tpg->tpg_name) == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * The policy around when to allow a target portal
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * group to be deleted is implemented in libiscsit.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * By the time the request gets to the kernel module
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * we expect that it conforms to policy so we will
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * cleanup all references to TPG and destroy it if it
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * is possible to do so.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_remove(&iscsit_global.global_tpg_list, tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_insert_tail(tpg_del_list, tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Now walk through the list of configured target portal groups */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (cfg_tpg = cfg->config_tpg_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg_tpg != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg_tpg = cfg_tpg->tpg_next) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* See if we have an existing target portal group */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg = iscsit_tpg_lookup_locked(cfg_tpg->tpg_name);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tpg == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg = iscsit_tpg_create(cfg_tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(tpg != NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_add(&iscsit_global.global_tpg_list, tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_enter(&tpg->tpg_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_modify(tpg, cfg_tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_exit(&tpg->tpg_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_rele(tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ITCFG_SUCCESS);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_config_destroy_tpgs(list_t *tpg_del_list)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_t *tpg, *next_tpg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Now finish destroying the target portal groups */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (tpg = list_head(tpg_del_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg = next_tpg) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap next_tpg = list_next(tpg_del_list, tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap list_remove(tpg_del_list, tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_wait_ref(&tpg->tpg_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Kill it */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_destroy(tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_lookup(char *tpg_name)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_t *result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ISCSIT_GLOBAL_LOCK(RW_READER);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result = iscsit_tpg_lookup_locked(tpg_name);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ISCSIT_GLOBAL_UNLOCK();
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic iscsit_tpg_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_lookup_locked(char *tpg_name)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_t tmp_tpg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_t *result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strlcpy(tmp_tpg.tpg_name, tpg_name, MAX_ISCSI_NODENAMELEN);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((result = avl_find(&iscsit_global.global_tpg_list,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &tmp_tpg, NULL)) != NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_hold(result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_create(it_tpg_t *cfg_tpg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_t *tpg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg = kmem_zalloc(sizeof (*tpg), KM_SLEEP);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_init(&tpg->tpg_mutex, NULL, MUTEX_DEFAULT, NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strlcpy(tpg->tpg_name, cfg_tpg->tpg_name, MAX_TPG_NAMELEN);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_create(&tpg->tpg_portal_list, iscsit_portal_avl_compare,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (iscsit_portal_t), offsetof(iscsit_portal_t, portal_tpg_ln));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_init(&tpg->tpg_refcnt, tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_enter(&tpg->tpg_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_modify(tpg, cfg_tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_exit(&tpg->tpg_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_global_hold();
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic void
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_modify(iscsit_tpg_t *tpg, it_tpg_t *cfg_tpg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_portal_t *portal, *next_portal;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_portal_t *cfg_portal;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Update portals */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (portal = avl_first(&tpg->tpg_portal_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal = next_portal) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap next_portal = AVL_NEXT(&tpg->tpg_portal_list, portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (it_portal_lookup(cfg_tpg, &portal->portal_addr) == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_remove(&tpg->tpg_portal_list, portal);
d0a3a9981c0bb64387654107335322769fcf9c68Peter Cudhea - Sun Microsystems - Burlington, MA United States iscsit_portal_delete(portal);
4f1d4f276e2ad1b7fd52a4f41ee299f0ef3a3a3cPriya Krishnan /*
4f1d4f276e2ad1b7fd52a4f41ee299f0ef3a3a3cPriya Krishnan * If the last portal is deleted from the target
4f1d4f276e2ad1b7fd52a4f41ee299f0ef3a3a3cPriya Krishnan * portal group, then the tpg->tpg_online count
4f1d4f276e2ad1b7fd52a4f41ee299f0ef3a3a3cPriya Krishnan * must be decremented. The other two callers of
4f1d4f276e2ad1b7fd52a4f41ee299f0ef3a3a3cPriya Krishnan * iscsit_portal_delete() destroy the target portal
4f1d4f276e2ad1b7fd52a4f41ee299f0ef3a3a3cPriya Krishnan * after deleting the portal so it is not necessary
4f1d4f276e2ad1b7fd52a4f41ee299f0ef3a3a3cPriya Krishnan * to decrement the tpg->tpg_online count.
4f1d4f276e2ad1b7fd52a4f41ee299f0ef3a3a3cPriya Krishnan */
4f1d4f276e2ad1b7fd52a4f41ee299f0ef3a3a3cPriya Krishnan if (avl_is_empty(&tpg->tpg_portal_list)) {
4f1d4f276e2ad1b7fd52a4f41ee299f0ef3a3a3cPriya Krishnan tpg->tpg_online--;
4f1d4f276e2ad1b7fd52a4f41ee299f0ef3a3a3cPriya Krishnan }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (cfg_portal = cfg_tpg->tpg_portal_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg_portal != NULL;
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill cfg_portal = cfg_portal->portal_next) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((portal = iscsit_tpg_portal_lookup_locked(tpg,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &cfg_portal->portal_addr)) == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) iscsit_portal_create(tpg,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &cfg_portal->portal_addr);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_portal_rele(portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_destroy(iscsit_tpg_t *tpg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_portal_t *portal, *next_portal;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (portal = avl_first(&tpg->tpg_portal_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal = next_portal) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap next_portal = AVL_NEXT(&tpg->tpg_portal_list, portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_remove(&tpg->tpg_portal_list, portal);
d0a3a9981c0bb64387654107335322769fcf9c68Peter Cudhea - Sun Microsystems - Burlington, MA United States iscsit_portal_delete(portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_wait_ref(&tpg->tpg_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_destroy(&tpg->tpg_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_destroy(&tpg->tpg_portal_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_destroy(&tpg->tpg_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap kmem_free(tpg, sizeof (*tpg));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_global_rele();
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_hold(iscsit_tpg_t *tpg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_hold(&tpg->tpg_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_rele(iscsit_tpg_t *tpg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_rele(&tpg->tpg_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_createdefault()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_t *tpg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg = kmem_zalloc(sizeof (*tpg), KM_SLEEP);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_init(&tpg->tpg_mutex, NULL, MUTEX_DEFAULT, NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strlcpy(tpg->tpg_name, ISCSIT_DEFAULT_TPG, MAX_TPG_NAMELEN);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_create(&tpg->tpg_portal_list, iscsit_portal_avl_compare,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (iscsit_portal_t), offsetof(iscsit_portal_t, portal_tpg_ln));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_init(&tpg->tpg_refcnt, tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Now create default portal */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (iscsit_portal_create(tpg, NULL) == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_tpg_destroy(tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_destroydefault(iscsit_tpg_t *tpg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_portal_t *portal;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal = avl_first(&tpg->tpg_portal_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(portal != NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_remove(&tpg->tpg_portal_list, portal);
d0a3a9981c0bb64387654107335322769fcf9c68Peter Cudhea - Sun Microsystems - Burlington, MA United States iscsit_portal_delete(portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_wait_ref(&tpg->tpg_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_destroy(&tpg->tpg_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_destroy(&tpg->tpg_portal_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_destroy(&tpg->tpg_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap kmem_free(tpg, sizeof (*tpg));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_avl_compare(const void *void_tpg1, const void *void_tpg2)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const iscsit_tpg_t *tpg1 = void_tpg1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const iscsit_tpg_t *tpg2 = void_tpg2;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Sort by ISID first then TSIH
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result = strcmp(tpg1->tpg_name, tpg2->tpg_name);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (result < 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (-1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (result > 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapidm_status_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_online(iscsit_tpg_t *tpg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_portal_t *portal, *portal_fail;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_status_t rc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_enter(&tpg->tpg_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tpg->tpg_online == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (portal = avl_first(&tpg->tpg_portal_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal = AVL_NEXT(&tpg->tpg_portal_list, portal)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap rc = iscsit_portal_online(portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (rc != IDM_STATUS_SUCCESS) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal_fail = portal;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap goto tpg_online_fail;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg->tpg_online++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_exit(&tpg->tpg_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (IDM_STATUS_SUCCESS);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlaptpg_online_fail:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Offline all the portals we successfully onlined up to the failure */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (portal = avl_first(&tpg->tpg_portal_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal != portal_fail;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal = AVL_NEXT(&tpg->tpg_portal_list, portal)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_portal_offline(portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_exit(&tpg->tpg_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (rc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_offline(iscsit_tpg_t *tpg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_portal_t *portal;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_enter(&tpg->tpg_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg->tpg_online--;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tpg->tpg_online == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (portal = avl_first(&tpg->tpg_portal_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal = AVL_NEXT(&tpg->tpg_portal_list, portal)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_portal_offline(portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_exit(&tpg->tpg_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_portal_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_portal_lookup(iscsit_tpg_t *tpg, struct sockaddr_storage *sa)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_portal_t *result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_enter(&tpg->tpg_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result = iscsit_tpg_portal_lookup_locked(tpg, sa);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap mutex_exit(&tpg->tpg_mutex);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstatic iscsit_portal_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_tpg_portal_lookup_locked(iscsit_tpg_t *tpg,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap struct sockaddr_storage *sa)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_portal_t tmp_portal;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_portal_t *result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Caller holds tpg->tpg_mutex */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap bcopy(sa, &tmp_portal.portal_addr, sizeof (*sa));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((result = avl_find(&tpg->tpg_portal_list, &tmp_portal, NULL)) !=
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_portal_hold(result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_portal_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_portal_create(iscsit_tpg_t *tpg, struct sockaddr_storage *sa)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_portal_t *portal;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal = kmem_zalloc(sizeof (*portal), KM_SLEEP);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If (sa == NULL) then we are being asked to create the default
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * portal -- targets will use this portal when no portals are
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * explicitly configured.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
e42a0851889d583925aa3bd2d9bd139189031cb0peter dunlap if (sa == NULL) {
e42a0851889d583925aa3bd2d9bd139189031cb0peter dunlap portal->portal_default = B_TRUE;
e42a0851889d583925aa3bd2d9bd139189031cb0peter dunlap } else {
e42a0851889d583925aa3bd2d9bd139189031cb0peter dunlap portal->portal_default = B_FALSE;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap bcopy(sa, &portal->portal_addr, sizeof (*sa));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_init(&portal->portal_refcnt, portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Add this portal to the list
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_add(&tpg->tpg_portal_list, portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
d0a3a9981c0bb64387654107335322769fcf9c68Peter Cudhea - Sun Microsystems - Burlington, MA United Statesiscsit_portal_delete(iscsit_portal_t *portal)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
d0a3a9981c0bb64387654107335322769fcf9c68Peter Cudhea - Sun Microsystems - Burlington, MA United States if (portal->portal_online > 0) {
d0a3a9981c0bb64387654107335322769fcf9c68Peter Cudhea - Sun Microsystems - Burlington, MA United States iscsit_portal_offline(portal);
d0a3a9981c0bb64387654107335322769fcf9c68Peter Cudhea - Sun Microsystems - Burlington, MA United States }
d0a3a9981c0bb64387654107335322769fcf9c68Peter Cudhea - Sun Microsystems - Burlington, MA United States
d0a3a9981c0bb64387654107335322769fcf9c68Peter Cudhea - Sun Microsystems - Burlington, MA United States if (portal->portal_online == 0) {
d0a3a9981c0bb64387654107335322769fcf9c68Peter Cudhea - Sun Microsystems - Burlington, MA United States ASSERT(portal->portal_svc == NULL);
d0a3a9981c0bb64387654107335322769fcf9c68Peter Cudhea - Sun Microsystems - Burlington, MA United States idm_refcnt_destroy(&portal->portal_refcnt);
d0a3a9981c0bb64387654107335322769fcf9c68Peter Cudhea - Sun Microsystems - Burlington, MA United States kmem_free(portal, sizeof (*portal));
d0a3a9981c0bb64387654107335322769fcf9c68Peter Cudhea - Sun Microsystems - Burlington, MA United States }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_portal_hold(iscsit_portal_t *portal)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_hold(&portal->portal_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_portal_rele(iscsit_portal_t *portal)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_refcnt_rele(&portal->portal_refcnt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_portal_avl_compare(const void *void_portal1, const void *void_portal2)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const iscsit_portal_t *portal1 = void_portal1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const iscsit_portal_t *portal2 = void_portal2;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const struct sockaddr_storage *ss1, *ss2;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const struct in_addr *in1, *in2;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const struct in6_addr *in61, *in62;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int i;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Compare ports, then address family, then ip address
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ss1 = &portal1->portal_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ss2 = &portal2->portal_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (((struct sockaddr_in *)ss1)->sin_port !=
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ((struct sockaddr_in *)ss2)->sin_port) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (((struct sockaddr_in *)ss1)->sin_port >
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ((struct sockaddr_in *)ss2)->sin_port)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap else
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (-1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * ports are the same
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ss1->ss_family != ss2->ss_family) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ss1->ss_family == AF_INET)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap else
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (-1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * address families are the same
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ss1->ss_family == AF_INET) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap in1 = &((struct sockaddr_in *)ss1)->sin_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap in2 = &((struct sockaddr_in *)ss2)->sin_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (in1->s_addr > in2->s_addr)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap else if (in1->s_addr < in2->s_addr)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (-1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap else
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (ss1->ss_family == AF_INET6) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap in61 = &((struct sockaddr_in6 *)ss1)->sin6_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap in62 = &((struct sockaddr_in6 *)ss2)->sin6_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (i = 0; i < 4; i++) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (in61->s6_addr32[i] > in62->s6_addr32[i])
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap else if (in61->s6_addr32[i] < in62->s6_addr32[i])
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (-1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cmn_err(CE_WARN,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap "iscsit_portal_avl_compare: unknown ss_family %d",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ss1->ss_family);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapidm_status_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_portal_online(iscsit_portal_t *portal)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
07a2bfd1dc0b943009fd0adbf34cb344095e378fPeter Cudhea - Sun Microsystems - Burlington, MA United States idm_status_t rc = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_svc_t *svc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_svc_req_t sr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uint16_t port;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap struct sockaddr_in *sin;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Caller holds parent TPG mutex */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (portal->portal_online == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If there is no existing IDM service instance for this port,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * create one. If the service exists, then the lookup,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * creates a reference on the existing service.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sin = (struct sockaddr_in *)&portal->portal_addr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap port = ntohs(sin->sin_port);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (port == 0)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap port = ISCSI_LISTEN_PORT;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ASSERT(portal->portal_svc == NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((svc = idm_tgt_svc_lookup(port)) == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sr.sr_port = port;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sr.sr_li = iscsit_global.global_li;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sr.sr_conn_ops.icb_rx_scsi_cmd = &iscsit_op_scsi_cmd;
a481fa48e4b49ab092647a92bb0ea0edf9afc5ceRick McNeal sr.sr_conn_ops.icb_rx_scsi_rsp = &iscsit_rx_scsi_rsp;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sr.sr_conn_ops.icb_rx_misc = &iscsit_rx_pdu;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sr.sr_conn_ops.icb_rx_error = &iscsit_rx_pdu_error;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sr.sr_conn_ops.icb_task_aborted = &iscsit_task_aborted;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sr.sr_conn_ops.icb_client_notify =
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &iscsit_client_notify;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sr.sr_conn_ops.icb_build_hdr = &iscsit_build_hdr;
60220f10412f6a7c5b45f950f6f6aa364658a179Priya Krishnan sr.sr_conn_ops.icb_update_statsn =
60220f10412f6a7c5b45f950f6f6aa364658a179Priya Krishnan &iscsit_update_statsn;
72cf314316bed51cd2e5fd0cb021a9725316a6b0peter dunlap sr.sr_conn_ops.icb_keepalive = &iscsit_keepalive;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (idm_tgt_svc_create(&sr, &svc) !=
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap IDM_STATUS_SUCCESS) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (IDM_STATUS_FAIL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Get reference on the service we just created */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_tgt_svc_hold(svc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((rc = idm_tgt_svc_online(svc)) != IDM_STATUS_SUCCESS) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_tgt_svc_rele_and_destroy(svc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (IDM_STATUS_FAIL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal->portal_svc = svc;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Only call iSNS for first online
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_isns_portal_online(portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal->portal_online++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (rc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_portal_offline(iscsit_portal_t *portal)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal->portal_online--;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (portal->portal_online == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Only call iSNS for last offline
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_isns_portal_offline(portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_tgt_svc_offline(portal->portal_svc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* If service is unreferenced, destroy it too */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap idm_tgt_svc_rele_and_destroy(portal->portal_svc);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal->portal_svc = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_cfg_status_t
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_config_merge_ini(it_config_t *cfg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_ini_t *ini, *next_ini;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_ini_t *cfg_ini;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Initiator objects are so simple we will just destroy all the current
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * objects and build new ones. Nothing should ever reference an
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * initator object.. instead just lookup the initiator object and
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * grab the properties while holding the global config lock.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (ini = avl_first(&iscsit_global.global_ini_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ini != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ini = next_ini) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap next_ini = AVL_NEXT(&iscsit_global.global_ini_list, ini);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_remove(&iscsit_global.global_ini_list, ini);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(ini->ini_props);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap kmem_free(ini, sizeof (*ini));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_global_rele();
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (cfg_ini = cfg->config_ini_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg_ini != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg_ini = cfg_ini->ini_next) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ini = kmem_zalloc(sizeof (iscsit_ini_t), KM_SLEEP);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strlcpy(ini->ini_name, cfg_ini->ini_name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap MAX_ISCSI_NODENAMELEN);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) nvlist_dup(cfg_ini->ini_properties, &ini->ini_props,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap KM_SLEEP);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap avl_add(&iscsit_global.global_ini_list, ini);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_global_hold();
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ITCFG_SUCCESS);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_ini_avl_compare(const void *void_ini1, const void *void_ini2)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const iscsit_ini_t *ini1 = void_ini1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const iscsit_ini_t *ini2 = void_ini2;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Sort by ISID first then TSIH
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result = strcmp(ini1->ini_name, ini2->ini_name);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (result < 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (-1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (result > 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_ini_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_ini_lookup_locked(char *ini_name)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_ini_t tmp_ini;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_ini_t *result;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Use a dummy target for lookup, filling in all fields used in AVL
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * comparison.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strlcpy(tmp_ini.ini_name, ini_name, MAX_ISCSI_NODENAMELEN);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap result = avl_find(&iscsit_global.global_ini_list, &tmp_ini, NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (result);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}