usr/src/uts/common/io/idm/idm.c
author Peter Dunlap <Peter.Dunlap@Sun.COM>
Tue, 24 Mar 2009 17:50:49 -0600
changeset 9162 b011b0287065
parent 8209 c5db9bfe2b4b
child 9358 0fc8688a5b21
permissions -rw-r--r--
PSARC 2008/395 iSER: iSCSI Extensions for RDMA 6702590 iSCSI initiator needs to support iSER transport 6702591 COMSTAR iSCSI port provider needs to support iSER transport 6797024 COMSTAR iscsit asserted at iscsit_login.c line: 679 6776635 panic[cpu0]/thread=ffffff000f874c60,assertion failed: 0, file: ../../common/io/idm/idm.c, line: 1465 6802232 Bad kernel fault at addr=0x0 from idm_crc32c call
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
     1
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
     2
 * CDDL HEADER START
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
     3
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
     7
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    11
 * and limitations under the License.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    12
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    18
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    19
 * CDDL HEADER END
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    20
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    21
/*
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
    22
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    23
 * Use is subject to license terms.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    24
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    25
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    26
#include <sys/cpuvar.h>
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    27
#include <sys/conf.h>
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    28
#include <sys/file.h>
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    29
#include <sys/ddi.h>
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    30
#include <sys/sunddi.h>
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    31
#include <sys/modctl.h>
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    32
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    33
#include <sys/socket.h>
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    34
#include <sys/strsubr.h>
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    35
#include <sys/sysmacros.h>
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    36
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    37
#include <sys/socketvar.h>
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    38
#include <netinet/in.h>
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    39
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    40
#include <sys/idm/idm.h>
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    41
#include <sys/idm/idm_so.h>
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    42
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    43
#define	IDM_NAME_VERSION	"iSCSI Data Mover"
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    44
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    45
extern struct mod_ops mod_miscops;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    46
extern struct mod_ops mod_miscops;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    47
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    48
static struct modlmisc modlmisc = {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    49
	&mod_miscops,	/* Type of module */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    50
	IDM_NAME_VERSION
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    51
};
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    52
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    53
static struct modlinkage modlinkage = {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    54
	MODREV_1, (void *)&modlmisc, NULL
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    55
};
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    56
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    57
extern int idm_task_compare(const void *t1, const void *t2);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    58
extern void idm_wd_thread(void *arg);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    59
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    60
static int _idm_init(void);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    61
static int _idm_fini(void);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    62
static void idm_buf_bind_in_locked(idm_task_t *idt, idm_buf_t *buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    63
static void idm_buf_bind_out_locked(idm_task_t *idt, idm_buf_t *buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    64
static void idm_buf_unbind_in_locked(idm_task_t *idt, idm_buf_t *buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    65
static void idm_buf_unbind_out_locked(idm_task_t *idt, idm_buf_t *buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    66
static void idm_task_abort_one(idm_conn_t *ic, idm_task_t *idt,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    67
    idm_abort_type_t abort_type);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    68
static void idm_task_aborted(idm_task_t *idt, idm_status_t status);
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
    69
static idm_pdu_t *idm_pdu_alloc_common(uint_t hdrlen, uint_t datalen,
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
    70
    int sleepflag);
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    71
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    72
boolean_t idm_conn_logging = 0;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    73
boolean_t idm_svc_logging = 0;
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
    74
#ifdef DEBUG
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
    75
boolean_t idm_pattern_checking = 1;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
    76
#else
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
    77
boolean_t idm_pattern_checking = 0;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
    78
#endif
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    79
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    80
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    81
 * Potential tuneable for the maximum number of tasks.  Default to
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    82
 * IDM_TASKIDS_MAX
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    83
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    84
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    85
uint32_t	idm_max_taskids = IDM_TASKIDS_MAX;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    86
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    87
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    88
 * Global list of transport handles
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    89
 *   These are listed in preferential order, so we can simply take the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    90
 *   first "it_conn_is_capable" hit. Note also that the order maps to
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    91
 *   the order of the idm_transport_type_t list.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    92
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    93
idm_transport_t idm_transport_list[] = {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    94
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    95
	/* iSER on InfiniBand transport handle */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    96
	{IDM_TRANSPORT_TYPE_ISER,	/* type */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    97
	"/devices/ib/iser@0:iser",	/* device path */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    98
	NULL,				/* LDI handle */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
    99
	NULL,				/* transport ops */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   100
	NULL},				/* transport caps */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   101
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   102
	/* IDM native sockets transport handle */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   103
	{IDM_TRANSPORT_TYPE_SOCKETS,	/* type */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   104
	NULL,				/* device path */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   105
	NULL,				/* LDI handle */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   106
	NULL,				/* transport ops */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   107
	NULL}				/* transport caps */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   108
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   109
};
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   110
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   111
int
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   112
_init(void)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   113
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   114
	int rc;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   115
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   116
	if ((rc = _idm_init()) != 0) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   117
		return (rc);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   118
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   119
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   120
	return (mod_install(&modlinkage));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   121
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   122
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   123
int
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   124
_fini(void)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   125
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   126
	int rc;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   127
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   128
	if ((rc = _idm_fini()) != 0) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   129
		return (rc);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   130
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   131
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   132
	if ((rc = mod_remove(&modlinkage)) != 0) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   133
		return (rc);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   134
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   135
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   136
	return (rc);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   137
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   138
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   139
int
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   140
_info(struct modinfo *modinfop)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   141
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   142
	return (mod_info(&modlinkage, modinfop));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   143
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   144
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   145
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   146
 * idm_transport_register()
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   147
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   148
 * Provides a mechanism for an IDM transport driver to register its
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   149
 * transport ops and caps with the IDM kernel module. Invoked during
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   150
 * a transport driver's attach routine.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   151
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   152
idm_status_t
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   153
idm_transport_register(idm_transport_attr_t *attr)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   154
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   155
	ASSERT(attr->it_ops != NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   156
	ASSERT(attr->it_caps != NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   157
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   158
	switch (attr->type) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   159
	/* All known non-native transports here; for now, iSER */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   160
	case IDM_TRANSPORT_TYPE_ISER:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   161
		idm_transport_list[attr->type].it_ops	= attr->it_ops;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   162
		idm_transport_list[attr->type].it_caps	= attr->it_caps;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   163
		return (IDM_STATUS_SUCCESS);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   164
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   165
	default:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   166
		cmn_err(CE_NOTE, "idm: unknown transport type (0x%x) in "
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   167
		    "idm_transport_register", attr->type);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   168
		return (IDM_STATUS_SUCCESS);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   169
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   170
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   171
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   172
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   173
 * idm_ini_conn_create
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   174
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   175
 * This function is invoked by the iSCSI layer to create a connection context.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   176
 * This does not actually establish the socket connection.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   177
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   178
 * cr - Connection request parameters
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   179
 * new_con - Output parameter that contains the new request if successful
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   180
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   181
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   182
idm_status_t
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   183
idm_ini_conn_create(idm_conn_req_t *cr, idm_conn_t **new_con)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   184
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   185
	idm_transport_t		*it;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   186
	idm_conn_t		*ic;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   187
	int			rc;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   188
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   189
	it = idm_transport_lookup(cr);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   190
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   191
retry:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   192
	ic = idm_conn_create_common(CONN_TYPE_INI, it->it_type,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   193
	    &cr->icr_conn_ops);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   194
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   195
	bcopy(&cr->cr_ini_dst_addr, &ic->ic_ini_dst_addr,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   196
	    sizeof (cr->cr_ini_dst_addr));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   197
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   198
	/* create the transport-specific connection components */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   199
	rc = it->it_ops->it_ini_conn_create(cr, ic);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   200
	if (rc != IDM_STATUS_SUCCESS) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   201
		/* cleanup the failed connection */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   202
		idm_conn_destroy_common(ic);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   203
		kmem_free(ic, sizeof (idm_conn_t));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   204
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   205
		/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   206
		 * It is possible for an IB client to connect to
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   207
		 * an ethernet-only client via an IB-eth gateway.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   208
		 * Therefore, if we are attempting to use iSER and
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   209
		 * fail, retry with sockets before ultimately
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   210
		 * failing the connection.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   211
		 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   212
		if (it->it_type == IDM_TRANSPORT_TYPE_ISER) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   213
			it = &idm_transport_list[IDM_TRANSPORT_TYPE_SOCKETS];
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   214
			goto retry;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   215
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   216
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   217
		return (IDM_STATUS_FAIL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   218
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   219
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   220
	*new_con = ic;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   221
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   222
	mutex_enter(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   223
	list_insert_tail(&idm.idm_ini_conn_list, ic);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   224
	mutex_exit(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   225
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   226
	return (IDM_STATUS_SUCCESS);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   227
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   228
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   229
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   230
 * idm_ini_conn_destroy
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   231
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   232
 * Releases any resources associated with the connection.  This is the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   233
 * complement to idm_ini_conn_create.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   234
 * ic - idm_conn_t structure representing the relevant connection
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   235
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   236
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   237
void
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   238
idm_ini_conn_destroy_task(void *ic_void)
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   239
{
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   240
	idm_conn_t *ic = ic_void;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   241
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   242
	ic->ic_transport_ops->it_ini_conn_destroy(ic);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   243
	idm_conn_destroy_common(ic);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   244
}
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   245
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   246
void
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   247
idm_ini_conn_destroy(idm_conn_t *ic)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   248
{
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   249
	/*
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   250
	 * It's reasonable for the initiator to call idm_ini_conn_destroy
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   251
	 * from within the context of the CN_CONNECT_DESTROY notification.
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   252
	 * That's a problem since we want to destroy the taskq for the
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   253
	 * state machine associated with the connection.  Remove the
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   254
	 * connection from the list right away then handle the remaining
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   255
	 * work via the idm_global_taskq.
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   256
	 */
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   257
	mutex_enter(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   258
	list_remove(&idm.idm_ini_conn_list, ic);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   259
	mutex_exit(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   260
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   261
	if (taskq_dispatch(idm.idm_global_taskq,
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   262
	    &idm_ini_conn_destroy_task, ic, TQ_SLEEP) == NULL) {
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   263
		cmn_err(CE_WARN,
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   264
		    "idm_ini_conn_destroy: Couldn't dispatch task");
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   265
	}
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   266
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   267
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   268
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   269
 * idm_ini_conn_connect
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   270
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   271
 * Establish connection to the remote system identified in idm_conn_t.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   272
 * The connection parameters including the remote IP address were established
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   273
 * in the call to idm_ini_conn_create.  The IDM state machine will
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   274
 * perform client notifications as necessary to prompt the initiator through
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   275
 * the login process.  IDM also keeps a timer running so that if the login
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   276
 * process doesn't complete in a timely manner it will fail.
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   277
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   278
 * ic - idm_conn_t structure representing the relevant connection
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   279
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   280
 * Returns success if the connection was established, otherwise some kind
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   281
 * of meaningful error code.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   282
 *
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   283
 * Upon return the login has either failed or is loggin in (ffp)
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   284
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   285
idm_status_t
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   286
idm_ini_conn_connect(idm_conn_t *ic)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   287
{
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   288
	idm_status_t	rc = IDM_STATUS_SUCCESS;
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   289
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   290
	rc = idm_conn_sm_init(ic);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   291
	if (rc != IDM_STATUS_SUCCESS) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   292
		return (ic->ic_conn_sm_status);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   293
	}
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   294
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   295
	/* Hold connection until we return */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   296
	idm_conn_hold(ic);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   297
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   298
	/* Kick state machine */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   299
	idm_conn_event(ic, CE_CONNECT_REQ, NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   300
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   301
	/* Wait for login flag */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   302
	mutex_enter(&ic->ic_state_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   303
	while (!(ic->ic_state_flags & CF_LOGIN_READY) &&
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   304
	    !(ic->ic_state_flags & CF_ERROR)) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   305
		cv_wait(&ic->ic_state_cv, &ic->ic_state_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   306
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   307
	mutex_exit(&ic->ic_state_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   308
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   309
	if (ic->ic_state_flags & CF_ERROR) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   310
		/* ic->ic_conn_sm_status will contains failure status */
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   311
		idm_conn_rele(ic);
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   312
		return (ic->ic_conn_sm_status);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   313
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   314
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   315
	/* Ready to login */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   316
	ASSERT(ic->ic_state_flags & CF_LOGIN_READY);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   317
	(void) idm_notify_client(ic, CN_READY_FOR_LOGIN, NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   318
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   319
	idm_conn_rele(ic);
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   320
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   321
	return (rc);
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   322
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   323
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   324
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   325
 * idm_ini_conn_disconnect
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   326
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   327
 * Forces a connection (previously established using idm_ini_conn_connect)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   328
 * to perform a controlled shutdown, cleaning up any outstanding requests.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   329
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   330
 * ic - idm_conn_t structure representing the relevant connection
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   331
 *
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   332
 * This is asynchronous and will return before the connection is properly
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   333
 * shutdown
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   334
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   335
/* ARGSUSED */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   336
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   337
idm_ini_conn_disconnect(idm_conn_t *ic)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   338
{
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   339
	idm_conn_event(ic, CE_TRANSPORT_FAIL, NULL);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   340
}
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   341
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   342
/*
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   343
 * idm_ini_conn_disconnect_wait
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   344
 *
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   345
 * Forces a connection (previously established using idm_ini_conn_connect)
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   346
 * to perform a controlled shutdown.  Blocks until the connection is
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   347
 * disconnected.
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   348
 *
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   349
 * ic - idm_conn_t structure representing the relevant connection
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   350
 */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   351
/* ARGSUSED */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   352
void
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   353
idm_ini_conn_disconnect_sync(idm_conn_t *ic)
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   354
{
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   355
	mutex_enter(&ic->ic_state_mutex);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   356
	if ((ic->ic_state != CS_S9_INIT_ERROR) &&
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   357
	    (ic->ic_state != CS_S11_COMPLETE)) {
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   358
		idm_conn_event_locked(ic, CE_TRANSPORT_FAIL, NULL, CT_NONE);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   359
		while ((ic->ic_state != CS_S9_INIT_ERROR) &&
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   360
		    (ic->ic_state != CS_S11_COMPLETE))
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   361
			cv_wait(&ic->ic_state_cv, &ic->ic_state_mutex);
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   362
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   363
	mutex_exit(&ic->ic_state_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   364
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   365
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   366
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   367
 * idm_tgt_svc_create
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   368
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   369
 * The target calls this service to obtain a service context for each available
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   370
 * transport, starting a service of each type related to the IP address and port
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   371
 * passed. The idm_svc_req_t contains the service parameters.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   372
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   373
idm_status_t
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   374
idm_tgt_svc_create(idm_svc_req_t *sr, idm_svc_t **new_svc)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   375
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   376
	idm_transport_type_t	type;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   377
	idm_transport_t		*it;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   378
	idm_svc_t		*is;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   379
	int			rc;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   380
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   381
	*new_svc = NULL;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   382
	is = kmem_zalloc(sizeof (idm_svc_t), KM_SLEEP);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   383
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   384
	/* Initialize transport-agnostic components of the service handle */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   385
	is->is_svc_req = *sr;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   386
	mutex_init(&is->is_mutex, NULL, MUTEX_DEFAULT, NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   387
	cv_init(&is->is_cv, NULL, CV_DEFAULT, NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   388
	mutex_init(&is->is_count_mutex, NULL, MUTEX_DEFAULT, NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   389
	cv_init(&is->is_count_cv, NULL, CV_DEFAULT, NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   390
	idm_refcnt_init(&is->is_refcnt, is);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   391
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   392
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   393
	 * Make sure all available transports are setup.  We call this now
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   394
	 * instead of at initialization time in case IB has become available
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   395
	 * since we started (hotplug, etc).
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   396
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   397
	idm_transport_setup(sr->sr_li);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   398
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   399
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   400
	 * Loop through the transports, configuring the transport-specific
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   401
	 * components of each one.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   402
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   403
	for (type = 0; type < IDM_TRANSPORT_NUM_TYPES; type++) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   404
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   405
		it = &idm_transport_list[type];
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   406
		/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   407
		 * If it_ops is NULL then the transport is unconfigured
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   408
		 * and we shouldn't try to start the service.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   409
		 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   410
		if (it->it_ops == NULL) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   411
			continue;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   412
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   413
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   414
		rc = it->it_ops->it_tgt_svc_create(sr, is);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   415
		if (rc != IDM_STATUS_SUCCESS) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   416
			/* Teardown any configured services */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   417
			while (type--) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   418
				it = &idm_transport_list[type];
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   419
				if (it->it_ops == NULL) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   420
					continue;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   421
				}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   422
				it->it_ops->it_tgt_svc_destroy(is);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   423
			}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   424
			/* Free the svc context and return */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   425
			kmem_free(is, sizeof (idm_svc_t));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   426
			return (rc);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   427
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   428
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   429
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   430
	*new_svc = is;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   431
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   432
	mutex_enter(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   433
	list_insert_tail(&idm.idm_tgt_svc_list, is);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   434
	mutex_exit(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   435
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   436
	return (IDM_STATUS_SUCCESS);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   437
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   438
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   439
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   440
 * idm_tgt_svc_destroy
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   441
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   442
 * is - idm_svc_t returned by the call to idm_tgt_svc_create
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   443
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   444
 * Cleanup any resources associated with the idm_svc_t.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   445
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   446
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   447
idm_tgt_svc_destroy(idm_svc_t *is)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   448
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   449
	idm_transport_type_t	type;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   450
	idm_transport_t		*it;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   451
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   452
	mutex_enter(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   453
	/* remove this service from the global list */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   454
	list_remove(&idm.idm_tgt_svc_list, is);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   455
	/* wakeup any waiters for service change */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   456
	cv_broadcast(&idm.idm_tgt_svc_cv);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   457
	mutex_exit(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   458
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   459
	/* teardown each transport-specific service */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   460
	for (type = 0; type < IDM_TRANSPORT_NUM_TYPES; type++) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   461
		it = &idm_transport_list[type];
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   462
		if (it->it_ops == NULL) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   463
			continue;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   464
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   465
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   466
		it->it_ops->it_tgt_svc_destroy(is);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   467
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   468
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   469
	/* tear down the svc resources */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   470
	idm_refcnt_destroy(&is->is_refcnt);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   471
	cv_destroy(&is->is_count_cv);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   472
	mutex_destroy(&is->is_count_mutex);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   473
	cv_destroy(&is->is_cv);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   474
	mutex_destroy(&is->is_mutex);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   475
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   476
	/* free the svc handle */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   477
	kmem_free(is, sizeof (idm_svc_t));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   478
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   479
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   480
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   481
idm_tgt_svc_hold(idm_svc_t *is)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   482
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   483
	idm_refcnt_hold(&is->is_refcnt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   484
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   485
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   486
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   487
idm_tgt_svc_rele_and_destroy(idm_svc_t *is)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   488
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   489
	idm_refcnt_rele_and_destroy(&is->is_refcnt,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   490
	    (idm_refcnt_cb_t *)&idm_tgt_svc_destroy);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   491
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   492
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   493
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   494
 * idm_tgt_svc_online
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   495
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   496
 * is - idm_svc_t returned by the call to idm_tgt_svc_create
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   497
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   498
 * Online each transport service, as we want this target to be accessible
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   499
 * via any configured transport.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   500
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   501
 * When the initiator establishes a new connection to the target, IDM will
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   502
 * call the "new connect" callback defined in the idm_svc_req_t structure
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   503
 * and it will pass an idm_conn_t structure representing that new connection.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   504
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   505
idm_status_t
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   506
idm_tgt_svc_online(idm_svc_t *is)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   507
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   508
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   509
	idm_transport_type_t	type, last_type;
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   510
	idm_transport_t		*it;
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   511
	int			rc = IDM_STATUS_SUCCESS;
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   512
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   513
	mutex_enter(&is->is_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   514
	if (is->is_online == 0) {
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   515
		/* Walk through each of the transports and online them */
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   516
		for (type = 0; type < IDM_TRANSPORT_NUM_TYPES; type++) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   517
			it = &idm_transport_list[type];
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   518
			if (it->it_ops == NULL) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   519
				/* transport is not registered */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   520
				continue;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   521
			}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   522
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   523
			mutex_exit(&is->is_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   524
			rc = it->it_ops->it_tgt_svc_online(is);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   525
			mutex_enter(&is->is_mutex);
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   526
			if (rc != IDM_STATUS_SUCCESS) {
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   527
				last_type = type;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   528
				break;
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   529
			}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   530
		}
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   531
		if (rc != IDM_STATUS_SUCCESS) {
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   532
			/*
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   533
			 * The last transport failed to online.
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   534
			 * Offline any transport onlined above and
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   535
			 * do not online the target.
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   536
			 */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   537
			for (type = 0; type < last_type; type++) {
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   538
				it = &idm_transport_list[type];
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   539
				if (it->it_ops == NULL) {
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   540
					/* transport is not registered */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   541
					continue;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   542
				}
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   543
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   544
				mutex_exit(&is->is_mutex);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   545
				it->it_ops->it_tgt_svc_offline(is);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   546
				mutex_enter(&is->is_mutex);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   547
			}
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   548
		} else {
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   549
			/* Target service now online */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   550
			is->is_online = 1;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   551
		}
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   552
	} else {
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   553
		/* Target service already online, just bump the count */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   554
		is->is_online++;
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   555
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   556
	mutex_exit(&is->is_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   557
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   558
	return (rc);
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   559
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   560
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   561
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   562
 * idm_tgt_svc_offline
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   563
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   564
 * is - idm_svc_t returned by the call to idm_tgt_svc_create
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   565
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   566
 * Shutdown any online target services.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   567
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   568
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   569
idm_tgt_svc_offline(idm_svc_t *is)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   570
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   571
	idm_transport_type_t	type;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   572
	idm_transport_t		*it;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   573
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   574
	mutex_enter(&is->is_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   575
	is->is_online--;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   576
	if (is->is_online == 0) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   577
		/* Walk through each of the transports and offline them */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   578
		for (type = 0; type < IDM_TRANSPORT_NUM_TYPES; type++) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   579
			it = &idm_transport_list[type];
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   580
			if (it->it_ops == NULL) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   581
				/* transport is not registered */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   582
				continue;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   583
			}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   584
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   585
			mutex_exit(&is->is_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   586
			it->it_ops->it_tgt_svc_offline(is);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   587
			mutex_enter(&is->is_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   588
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   589
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   590
	mutex_exit(&is->is_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   591
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   592
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   593
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   594
 * idm_tgt_svc_lookup
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   595
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   596
 * Lookup a service instance listening on the specified port
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   597
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   598
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   599
idm_svc_t *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   600
idm_tgt_svc_lookup(uint16_t port)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   601
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   602
	idm_svc_t *result;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   603
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   604
retry:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   605
	mutex_enter(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   606
	for (result = list_head(&idm.idm_tgt_svc_list);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   607
	    result != NULL;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   608
	    result = list_next(&idm.idm_tgt_svc_list, result)) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   609
		if (result->is_svc_req.sr_port == port) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   610
			if (result->is_online == 0) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   611
				/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   612
				 * A service exists on this port, but it
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   613
				 * is going away, wait for it to cleanup.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   614
				 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   615
				cv_wait(&idm.idm_tgt_svc_cv,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   616
				    &idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   617
				mutex_exit(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   618
				goto retry;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   619
			}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   620
			idm_tgt_svc_hold(result);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   621
			mutex_exit(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   622
			return (result);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   623
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   624
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   625
	mutex_exit(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   626
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   627
	return (NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   628
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   629
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   630
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   631
 * idm_negotiate_key_values()
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   632
 * Give IDM level a chance to negotiate any login parameters it should own.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   633
 *  -- leave unhandled parameters alone on request_nvl
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   634
 *  -- move all handled parameters to response_nvl with an appropriate response
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   635
 *  -- also add an entry to negotiated_nvl for any accepted parameters
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   636
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   637
kv_status_t
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   638
idm_negotiate_key_values(idm_conn_t *ic, nvlist_t *request_nvl,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   639
    nvlist_t *response_nvl, nvlist_t *negotiated_nvl)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   640
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   641
	ASSERT(ic->ic_transport_ops != NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   642
	return (ic->ic_transport_ops->it_negotiate_key_values(ic,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   643
	    request_nvl, response_nvl, negotiated_nvl));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   644
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   645
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   646
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   647
 * idm_notice_key_values()
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   648
 * Activate at the IDM level any parameters that have been negotiated.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   649
 * Passes the set of key value pairs to the transport for activation.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   650
 * This will be invoked as the connection is entering full-feature mode.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   651
 */
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   652
void
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   653
idm_notice_key_values(idm_conn_t *ic, nvlist_t *negotiated_nvl)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   654
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   655
	ASSERT(ic->ic_transport_ops != NULL);
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   656
	ic->ic_transport_ops->it_notice_key_values(ic, negotiated_nvl);
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   657
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   658
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   659
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   660
 * idm_buf_tx_to_ini
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   661
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   662
 * This is IDM's implementation of the 'Put_Data' operational primitive.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   663
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   664
 * This function is invoked by a target iSCSI layer to request its local
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   665
 * Datamover layer to transmit the Data-In PDU to the peer iSCSI layer
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   666
 * on the remote iSCSI node. The I/O buffer represented by 'idb' is
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   667
 * transferred to the initiator associated with task 'idt'. The connection
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   668
 * info, contents of the Data-In PDU header, the DataDescriptorIn, BHS,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   669
 * and the callback (idb->idb_buf_cb) at transfer completion are
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   670
 * provided as input.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   671
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   672
 * This data transfer takes place transparently to the remote iSCSI layer,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   673
 * i.e. without its participation.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   674
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   675
 * Using sockets, IDM implements the data transfer by segmenting the data
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   676
 * buffer into appropriately sized iSCSI PDUs and transmitting them to the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   677
 * initiator. iSER performs the transfer using RDMA write.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   678
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   679
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   680
idm_status_t
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   681
idm_buf_tx_to_ini(idm_task_t *idt, idm_buf_t *idb,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   682
    uint32_t offset, uint32_t xfer_len,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   683
    idm_buf_cb_t idb_buf_cb, void *cb_arg)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   684
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   685
	idm_status_t rc;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   686
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   687
	idb->idb_bufoffset = offset;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   688
	idb->idb_xfer_len = xfer_len;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   689
	idb->idb_buf_cb = idb_buf_cb;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   690
	idb->idb_cb_arg = cb_arg;
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   691
	gethrestime(&idb->idb_xfer_start);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   692
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   693
	/*
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   694
	 * Buffer should not contain the pattern.  If the pattern is
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   695
	 * present then we've been asked to transmit initialized data
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   696
	 */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   697
	IDM_BUFPAT_CHECK(idb, xfer_len, BP_CHECK_ASSERT);
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   698
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   699
	mutex_enter(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   700
	switch (idt->idt_state) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   701
	case TASK_ACTIVE:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   702
		idt->idt_tx_to_ini_start++;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   703
		idm_task_hold(idt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   704
		idm_buf_bind_in_locked(idt, idb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   705
		idb->idb_in_transport = B_TRUE;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   706
		rc = (*idt->idt_ic->ic_transport_ops->it_buf_tx_to_ini)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   707
		    (idt, idb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   708
		return (rc);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   709
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   710
	case TASK_SUSPENDING:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   711
	case TASK_SUSPENDED:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   712
		/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   713
		 * Bind buffer but don't start a transfer since the task
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   714
		 * is suspended
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   715
		 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   716
		idm_buf_bind_in_locked(idt, idb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   717
		mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   718
		return (IDM_STATUS_SUCCESS);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   719
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   720
	case TASK_ABORTING:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   721
	case TASK_ABORTED:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   722
		/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   723
		 * Once the task is aborted, any buffers added to the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   724
		 * idt_inbufv will never get cleaned up, so just return
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   725
		 * SUCCESS.  The buffer should get cleaned up by the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   726
		 * client or framework once task_aborted has completed.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   727
		 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   728
		mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   729
		return (IDM_STATUS_SUCCESS);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   730
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   731
	default:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   732
		ASSERT(0);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   733
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   734
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   735
	mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   736
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   737
	return (IDM_STATUS_FAIL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   738
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   739
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   740
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   741
 * idm_buf_rx_from_ini
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   742
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   743
 * This is IDM's implementation of the 'Get_Data' operational primitive.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   744
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   745
 * This function is invoked by a target iSCSI layer to request its local
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   746
 * Datamover layer to retrieve certain data identified by the R2T PDU from the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   747
 * peer iSCSI layer on the remote node. The retrieved Data-Out PDU will be
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   748
 * mapped to the respective buffer by the task tags (ITT & TTT).
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   749
 * The connection information, contents of an R2T PDU, DataDescriptor, BHS, and
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   750
 * the callback (idb->idb_buf_cb) notification for data transfer completion are
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   751
 * are provided as input.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   752
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   753
 * When an iSCSI node sends an R2T PDU to its local Datamover layer, the local
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   754
 * Datamover layer, the local and remote Datamover layers transparently bring
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   755
 * about the data transfer requested by the R2T PDU, without the participation
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   756
 * of the iSCSI layers.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   757
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   758
 * Using sockets, IDM transmits an R2T PDU for each buffer and the rx_data_out()
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   759
 * assembles the Data-Out PDUs into the buffer. iSER uses RDMA read.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   760
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   761
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   762
idm_status_t
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   763
idm_buf_rx_from_ini(idm_task_t *idt, idm_buf_t *idb,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   764
    uint32_t offset, uint32_t xfer_len,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   765
    idm_buf_cb_t idb_buf_cb, void *cb_arg)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   766
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   767
	idm_status_t rc;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   768
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   769
	idb->idb_bufoffset = offset;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   770
	idb->idb_xfer_len = xfer_len;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   771
	idb->idb_buf_cb = idb_buf_cb;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   772
	idb->idb_cb_arg = cb_arg;
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   773
	gethrestime(&idb->idb_xfer_start);
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   774
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   775
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   776
	 * "In" buf list is for "Data In" PDU's, "Out" buf list is for
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   777
	 * "Data Out" PDU's
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   778
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   779
	mutex_enter(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   780
	switch (idt->idt_state) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   781
	case TASK_ACTIVE:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   782
		idt->idt_rx_from_ini_start++;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   783
		idm_task_hold(idt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   784
		idm_buf_bind_out_locked(idt, idb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   785
		idb->idb_in_transport = B_TRUE;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   786
		rc = (*idt->idt_ic->ic_transport_ops->it_buf_rx_from_ini)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   787
		    (idt, idb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   788
		return (rc);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   789
	case TASK_SUSPENDING:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   790
	case TASK_SUSPENDED:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   791
	case TASK_ABORTING:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   792
	case TASK_ABORTED:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   793
		/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   794
		 * Bind buffer but don't start a transfer since the task
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   795
		 * is suspended
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   796
		 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   797
		idm_buf_bind_out_locked(idt, idb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   798
		mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   799
		return (IDM_STATUS_SUCCESS);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   800
	default:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   801
		ASSERT(0);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   802
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   803
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   804
	mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   805
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   806
	return (IDM_STATUS_FAIL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   807
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   808
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   809
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   810
 * idm_buf_tx_to_ini_done
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   811
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   812
 * The transport calls this after it has completed a transfer requested by
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   813
 * a call to transport_buf_tx_to_ini
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   814
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   815
 * Caller holds idt->idt_mutex, idt->idt_mutex is released before returning.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   816
 * idt may be freed after the call to idb->idb_buf_cb.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   817
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   818
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   819
idm_buf_tx_to_ini_done(idm_task_t *idt, idm_buf_t *idb, idm_status_t status)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   820
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   821
	ASSERT(mutex_owned(&idt->idt_mutex));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   822
	idb->idb_in_transport = B_FALSE;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   823
	idb->idb_tx_thread = B_FALSE;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   824
	idt->idt_tx_to_ini_done++;
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   825
	gethrestime(&idb->idb_xfer_done);
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   826
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   827
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   828
	 * idm_refcnt_rele may cause TASK_SUSPENDING --> TASK_SUSPENDED or
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   829
	 * TASK_ABORTING --> TASK_ABORTED transistion if the refcount goes
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   830
	 * to 0.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   831
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   832
	idm_task_rele(idt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   833
	idb->idb_status = status;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   834
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   835
	switch (idt->idt_state) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   836
	case TASK_ACTIVE:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   837
		idm_buf_unbind_in_locked(idt, idb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   838
		mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   839
		(*idb->idb_buf_cb)(idb, status);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   840
		return;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   841
	case TASK_SUSPENDING:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   842
	case TASK_SUSPENDED:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   843
	case TASK_ABORTING:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   844
	case TASK_ABORTED:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   845
		/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   846
		 * To keep things simple we will ignore the case where the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   847
		 * transfer was successful and leave all buffers bound to the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   848
		 * task.  This allows us to also ignore the case where we've
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   849
		 * been asked to abort a task but the last transfer of the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   850
		 * task has completed.  IDM has no idea whether this was, in
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   851
		 * fact, the last transfer of the task so it would be difficult
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   852
		 * to handle this case.  Everything should get sorted out again
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   853
		 * after task reassignment is complete.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   854
		 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   855
		 * In the case of TASK_ABORTING we could conceivably call the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   856
		 * buffer callback here but the timing of when the client's
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   857
		 * client_task_aborted callback is invoked vs. when the client's
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   858
		 * buffer callback gets invoked gets sticky.  We don't want
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   859
		 * the client to here from us again after the call to
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   860
		 * client_task_aborted() but we don't want to give it a bunch
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   861
		 * of failed buffer transfers until we've called
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   862
		 * client_task_aborted().  Instead we'll just leave all the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   863
		 * buffers bound and allow the client to cleanup.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   864
		 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   865
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   866
	default:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   867
		ASSERT(0);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   868
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   869
	mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   870
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   871
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   872
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   873
 * idm_buf_rx_from_ini_done
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   874
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   875
 * The transport calls this after it has completed a transfer requested by
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   876
 * a call totransport_buf_tx_to_ini
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   877
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   878
 * Caller holds idt->idt_mutex, idt->idt_mutex is released before returning.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   879
 * idt may be freed after the call to idb->idb_buf_cb.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   880
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   881
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   882
idm_buf_rx_from_ini_done(idm_task_t *idt, idm_buf_t *idb, idm_status_t status)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   883
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   884
	ASSERT(mutex_owned(&idt->idt_mutex));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   885
	idb->idb_in_transport = B_FALSE;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   886
	idt->idt_rx_from_ini_done++;
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   887
	gethrestime(&idb->idb_xfer_done);
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   888
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   889
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   890
	 * idm_refcnt_rele may cause TASK_SUSPENDING --> TASK_SUSPENDED or
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   891
	 * TASK_ABORTING --> TASK_ABORTED transistion if the refcount goes
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   892
	 * to 0.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   893
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   894
	idm_task_rele(idt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   895
	idb->idb_status = status;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   896
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   897
	if (status == IDM_STATUS_SUCCESS) {
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   898
		/*
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   899
		 * Buffer should not contain the pattern.  If it does then
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   900
		 * we did not get the data from the remote host.
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   901
		 */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   902
		IDM_BUFPAT_CHECK(idb, idb->idb_xfer_len, BP_CHECK_ASSERT);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   903
	}
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   904
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   905
	switch (idt->idt_state) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   906
	case TASK_ACTIVE:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   907
		idm_buf_unbind_out_locked(idt, idb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   908
		mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   909
		(*idb->idb_buf_cb)(idb, status);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   910
		return;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   911
	case TASK_SUSPENDING:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   912
	case TASK_SUSPENDED:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   913
	case TASK_ABORTING:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   914
	case TASK_ABORTED:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   915
		/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   916
		 * To keep things simple we will ignore the case where the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   917
		 * transfer was successful and leave all buffers bound to the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   918
		 * task.  This allows us to also ignore the case where we've
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   919
		 * been asked to abort a task but the last transfer of the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   920
		 * task has completed.  IDM has no idea whether this was, in
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   921
		 * fact, the last transfer of the task so it would be difficult
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   922
		 * to handle this case.  Everything should get sorted out again
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   923
		 * after task reassignment is complete.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   924
		 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   925
		 * In the case of TASK_ABORTING we could conceivably call the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   926
		 * buffer callback here but the timing of when the client's
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   927
		 * client_task_aborted callback is invoked vs. when the client's
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   928
		 * buffer callback gets invoked gets sticky.  We don't want
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   929
		 * the client to here from us again after the call to
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   930
		 * client_task_aborted() but we don't want to give it a bunch
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   931
		 * of failed buffer transfers until we've called
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   932
		 * client_task_aborted().  Instead we'll just leave all the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   933
		 * buffers bound and allow the client to cleanup.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   934
		 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   935
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   936
	default:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   937
		ASSERT(0);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   938
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   939
	mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   940
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   941
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   942
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   943
 * idm_buf_alloc
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   944
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   945
 * Allocates a buffer handle and registers it for use with the transport
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   946
 * layer. If a buffer is not passed on bufptr, the buffer will be allocated
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   947
 * as well as the handle.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   948
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   949
 * ic		- connection on which the buffer will be transferred
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   950
 * bufptr	- allocate memory for buffer if NULL, else assign to buffer
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   951
 * buflen	- length of buffer
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   952
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   953
 * Returns idm_buf_t handle if successful, otherwise NULL
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   954
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   955
idm_buf_t *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   956
idm_buf_alloc(idm_conn_t *ic, void *bufptr, uint64_t buflen)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   957
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   958
	idm_buf_t	*buf = NULL;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   959
	int		rc;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   960
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   961
	ASSERT(ic != NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   962
	ASSERT(idm.idm_buf_cache != NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   963
	ASSERT(buflen > 0);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   964
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   965
	/* Don't allocate new buffers if we are not in FFP */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   966
	mutex_enter(&ic->ic_state_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   967
	if (!ic->ic_ffp) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   968
		mutex_exit(&ic->ic_state_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   969
		return (NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   970
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   971
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   972
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   973
	idm_conn_hold(ic);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   974
	mutex_exit(&ic->ic_state_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   975
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   976
	buf = kmem_cache_alloc(idm.idm_buf_cache, KM_NOSLEEP);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   977
	if (buf == NULL) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   978
		idm_conn_rele(ic);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   979
		return (NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   980
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   981
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   982
	buf->idb_ic		= ic;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   983
	buf->idb_buflen		= buflen;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   984
	buf->idb_exp_offset	= 0;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   985
	buf->idb_bufoffset	= 0;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   986
	buf->idb_xfer_len 	= 0;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   987
	buf->idb_magic		= IDM_BUF_MAGIC;
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   988
	buf->idb_in_transport	= B_FALSE;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
   989
	buf->idb_bufbcopy	= B_FALSE;
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   990
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   991
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   992
	 * If bufptr is NULL, we have an implicit request to allocate
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   993
	 * memory for this IDM buffer handle and register it for use
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   994
	 * with the transport. To simplify this, and to give more freedom
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   995
	 * to the transport layer for it's own buffer management, both of
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   996
	 * these actions will take place in the transport layer.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   997
	 * If bufptr is set, then the caller has allocated memory (or more
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   998
	 * likely it's been passed from an upper layer), and we need only
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
   999
	 * register the buffer for use with the transport layer.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1000
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1001
	if (bufptr == NULL) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1002
		/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1003
		 * Allocate a buffer from the transport layer (which
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1004
		 * will also register the buffer for use).
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1005
		 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1006
		rc = ic->ic_transport_ops->it_buf_alloc(buf, buflen);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1007
		if (rc != 0) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1008
			idm_conn_rele(ic);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1009
			kmem_cache_free(idm.idm_buf_cache, buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1010
			return (NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1011
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1012
		/* Set the bufalloc'd flag */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1013
		buf->idb_bufalloc = B_TRUE;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1014
	} else {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1015
		/*
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1016
		 * For large transfers, Set the passed bufptr into
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1017
		 * the buf handle, and register the handle with the
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1018
		 * transport layer. As memory registration with the
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1019
		 * transport layer is a time/cpu intensive operation,
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1020
		 * for small transfers (up to a pre-defined bcopy
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1021
		 * threshold), use pre-registered memory buffers
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1022
		 * and bcopy data at the appropriate time.
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1023
		 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1024
		buf->idb_buf = bufptr;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1025
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1026
		rc = ic->ic_transport_ops->it_buf_setup(buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1027
		if (rc != 0) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1028
			idm_conn_rele(ic);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1029
			kmem_cache_free(idm.idm_buf_cache, buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1030
			return (NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1031
		}
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1032
		/*
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1033
		 * The transport layer is now expected to set the idb_bufalloc
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1034
		 * correctly to indicate if resources have been allocated.
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1035
		 */
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1036
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1037
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1038
	IDM_BUFPAT_SET(buf);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1039
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1040
	return (buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1041
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1042
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1043
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1044
 * idm_buf_free
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1045
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1046
 * Release a buffer handle along with the associated buffer that was allocated
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1047
 * or assigned with idm_buf_alloc
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1048
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1049
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1050
idm_buf_free(idm_buf_t *buf)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1051
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1052
	idm_conn_t *ic = buf->idb_ic;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1053
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1054
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1055
	buf->idb_task_binding	= NULL;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1056
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1057
	if (buf->idb_bufalloc) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1058
		ic->ic_transport_ops->it_buf_free(buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1059
	} else {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1060
		ic->ic_transport_ops->it_buf_teardown(buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1061
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1062
	kmem_cache_free(idm.idm_buf_cache, buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1063
	idm_conn_rele(ic);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1064
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1065
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1066
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1067
 * idm_buf_bind_in
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1068
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1069
 * This function associates a buffer with a task. This is only for use by the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1070
 * iSCSI initiator that will have only one buffer per transfer direction
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1071
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1072
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1073
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1074
idm_buf_bind_in(idm_task_t *idt, idm_buf_t *buf)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1075
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1076
	mutex_enter(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1077
	idm_buf_bind_in_locked(idt, buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1078
	mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1079
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1080
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1081
static void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1082
idm_buf_bind_in_locked(idm_task_t *idt, idm_buf_t *buf)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1083
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1084
	buf->idb_task_binding = idt;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1085
	buf->idb_ic = idt->idt_ic;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1086
	idm_listbuf_insert(&idt->idt_inbufv, buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1087
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1088
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1089
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1090
idm_buf_bind_out(idm_task_t *idt, idm_buf_t *buf)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1091
{
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1092
	/*
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1093
	 * For small transfers, the iSER transport delegates the IDM
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1094
	 * layer to bcopy the SCSI Write data for faster IOPS.
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1095
	 */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1096
	if (buf->idb_bufbcopy == B_TRUE) {
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1097
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1098
		bcopy(buf->idb_bufptr, buf->idb_buf, buf->idb_buflen);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1099
	}
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1100
	mutex_enter(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1101
	idm_buf_bind_out_locked(idt, buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1102
	mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1103
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1104
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1105
static void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1106
idm_buf_bind_out_locked(idm_task_t *idt, idm_buf_t *buf)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1107
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1108
	buf->idb_task_binding = idt;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1109
	buf->idb_ic = idt->idt_ic;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1110
	idm_listbuf_insert(&idt->idt_outbufv, buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1111
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1112
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1113
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1114
idm_buf_unbind_in(idm_task_t *idt, idm_buf_t *buf)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1115
{
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1116
	/*
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1117
	 * For small transfers, the iSER transport delegates the IDM
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1118
	 * layer to bcopy the SCSI Read data into the read buufer
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1119
	 * for faster IOPS.
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1120
	 */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1121
	if (buf->idb_bufbcopy == B_TRUE) {
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1122
		bcopy(buf->idb_buf, buf->idb_bufptr, buf->idb_buflen);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1123
	}
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1124
	mutex_enter(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1125
	idm_buf_unbind_in_locked(idt, buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1126
	mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1127
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1128
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1129
static void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1130
idm_buf_unbind_in_locked(idm_task_t *idt, idm_buf_t *buf)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1131
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1132
	list_remove(&idt->idt_inbufv, buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1133
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1134
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1135
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1136
idm_buf_unbind_out(idm_task_t *idt, idm_buf_t *buf)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1137
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1138
	mutex_enter(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1139
	idm_buf_unbind_out_locked(idt, buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1140
	mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1141
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1142
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1143
static void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1144
idm_buf_unbind_out_locked(idm_task_t *idt, idm_buf_t *buf)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1145
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1146
	list_remove(&idt->idt_outbufv, buf);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1147
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1148
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1149
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1150
 * idm_buf_find() will lookup the idm_buf_t based on the relative offset in the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1151
 * iSCSI PDU
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1152
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1153
idm_buf_t *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1154
idm_buf_find(void *lbuf, size_t data_offset)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1155
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1156
	idm_buf_t	*idb;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1157
	list_t		*lst = (list_t *)lbuf;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1158
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1159
	/* iterate through the list to find the buffer */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1160
	for (idb = list_head(lst); idb != NULL; idb = list_next(lst, idb)) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1161
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1162
		ASSERT((idb->idb_ic->ic_conn_type == CONN_TYPE_TGT) ||
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1163
		    (idb->idb_bufoffset == 0));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1164
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1165
		if ((data_offset >= idb->idb_bufoffset) &&
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1166
		    (data_offset < (idb->idb_bufoffset + idb->idb_buflen))) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1167
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1168
			return (idb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1169
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1170
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1171
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1172
	return (NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1173
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1174
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1175
void
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1176
idm_bufpat_set(idm_buf_t *idb)
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1177
{
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1178
	idm_bufpat_t	*bufpat;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1179
	int		len, i;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1180
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1181
	len = idb->idb_buflen;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1182
	len = (len / sizeof (idm_bufpat_t)) * sizeof (idm_bufpat_t);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1183
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1184
	bufpat = idb->idb_buf;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1185
	for (i = 0; i < len; i += sizeof (idm_bufpat_t)) {
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1186
		bufpat->bufpat_idb = idb;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1187
		bufpat->bufpat_bufmagic = IDM_BUF_MAGIC;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1188
		bufpat->bufpat_offset = i;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1189
		bufpat++;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1190
	}
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1191
}
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1192
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1193
boolean_t
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1194
idm_bufpat_check(idm_buf_t *idb, int check_len, idm_bufpat_check_type_t type)
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1195
{
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1196
	idm_bufpat_t	*bufpat;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1197
	int		len, i;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1198
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1199
	len = (type == BP_CHECK_QUICK) ? sizeof (idm_bufpat_t) : check_len;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1200
	len = (len / sizeof (idm_bufpat_t)) * sizeof (idm_bufpat_t);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1201
	ASSERT(len <= idb->idb_buflen);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1202
	bufpat = idb->idb_buf;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1203
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1204
	/*
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1205
	 * Don't check the pattern in buffers that came from outside IDM
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1206
	 * (these will be buffers from the initiator that we opted not
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1207
	 * to double-buffer)
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1208
	 */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1209
	if (!idb->idb_bufalloc)
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1210
		return (B_FALSE);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1211
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1212
	/*
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1213
	 * Return true if we find the pattern anywhere in the buffer
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1214
	 */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1215
	for (i = 0; i < len; i += sizeof (idm_bufpat_t)) {
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1216
		if (BUFPAT_MATCH(bufpat, idb)) {
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1217
			IDM_CONN_LOG(CE_WARN, "idm_bufpat_check found: "
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1218
			    "idb %p bufpat %p "
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1219
			    "bufpat_idb=%p bufmagic=%08x offset=%08x",
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1220
			    (void *)idb, (void *)bufpat, bufpat->bufpat_idb,
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1221
			    bufpat->bufpat_bufmagic, bufpat->bufpat_offset);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1222
			DTRACE_PROBE2(bufpat__pattern__found,
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1223
			    idm_buf_t *, idb, idm_bufpat_t *, bufpat);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1224
			if (type == BP_CHECK_ASSERT) {
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1225
				ASSERT(0);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1226
			}
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1227
			return (B_TRUE);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1228
		}
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1229
		bufpat++;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1230
	}
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1231
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1232
	return (B_FALSE);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1233
}
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1234
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1235
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1236
 * idm_task_alloc
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1237
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1238
 * This function will allocate a idm_task_t structure. A task tag is also
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1239
 * generated and saved in idt_tt. The task is not active.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1240
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1241
idm_task_t *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1242
idm_task_alloc(idm_conn_t *ic)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1243
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1244
	idm_task_t	*idt;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1245
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1246
	ASSERT(ic != NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1247
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1248
	/* Don't allocate new tasks if we are not in FFP */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1249
	mutex_enter(&ic->ic_state_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1250
	if (!ic->ic_ffp) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1251
		mutex_exit(&ic->ic_state_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1252
		return (NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1253
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1254
	idt = kmem_cache_alloc(idm.idm_task_cache, KM_NOSLEEP);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1255
	if (idt == NULL) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1256
		mutex_exit(&ic->ic_state_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1257
		return (NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1258
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1259
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1260
	ASSERT(list_is_empty(&idt->idt_inbufv));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1261
	ASSERT(list_is_empty(&idt->idt_outbufv));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1262
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1263
	idm_conn_hold(ic);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1264
	mutex_exit(&ic->ic_state_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1265
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1266
	idt->idt_state		= TASK_IDLE;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1267
	idt->idt_ic		= ic;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1268
	idt->idt_private 	= NULL;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1269
	idt->idt_exp_datasn	= 0;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1270
	idt->idt_exp_rttsn	= 0;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1271
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1272
	return (idt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1273
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1274
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1275
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1276
 * idm_task_start
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1277
 *
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1278
 * Mark the task active and initialize some stats. The caller
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1279
 * sets up the idm_task_t structure with a prior call to idm_task_alloc().
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1280
 * The task service does not function as a task/work engine, it is the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1281
 * responsibility of the initiator to start the data transfer and free the
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1282
 * resources.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1283
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1284
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1285
idm_task_start(idm_task_t *idt, uintptr_t handle)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1286
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1287
	ASSERT(idt != NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1288
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1289
	/* mark the task as ACTIVE */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1290
	idt->idt_state = TASK_ACTIVE;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1291
	idt->idt_client_handle = handle;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1292
	idt->idt_tx_to_ini_start = idt->idt_tx_to_ini_done =
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1293
	    idt->idt_rx_from_ini_start = idt->idt_rx_from_ini_done =
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1294
	    idt->idt_tx_bytes = idt->idt_rx_bytes = 0;
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1295
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1296
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1297
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1298
 * idm_task_done
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1299
 *
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1300
 * This function sets the state to indicate that the task is no longer active.
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1301
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1302
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1303
idm_task_done(idm_task_t *idt)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1304
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1305
	ASSERT(idt != NULL);
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1306
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1307
	mutex_enter(&idt->idt_mutex);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1308
	idt->idt_state = TASK_IDLE;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1309
	mutex_exit(&idt->idt_mutex);
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1310
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1311
	/*
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1312
	 * Although unlikely it is possible for a reference to come in after
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1313
	 * the client has decided the task is over but before we've marked
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1314
	 * the task idle.  One specific unavoidable scenario is the case where
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1315
	 * received PDU with the matching ITT/TTT results in a successful
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1316
	 * lookup of this task.  We are at the mercy of the remote node in
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1317
	 * that case so we need to handle it.  Now that the task state
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1318
	 * has changed no more references will occur so a simple call to
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1319
	 * idm_refcnt_wait_ref should deal with the situation.
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1320
	 */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1321
	idm_refcnt_wait_ref(&idt->idt_refcnt);
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1322
	idm_refcnt_reset(&idt->idt_refcnt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1323
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1324
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1325
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1326
 * idm_task_free
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1327
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1328
 * This function will free the Task Tag and the memory allocated for the task
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1329
 * idm_task_done should be called prior to this call
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1330
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1331
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1332
idm_task_free(idm_task_t *idt)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1333
{
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1334
	idm_conn_t *ic;
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1335
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1336
	ASSERT(idt != NULL);
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1337
	ASSERT(idt->idt_refcnt.ir_refcnt == 0);
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1338
	ASSERT(idt->idt_state == TASK_IDLE);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1339
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1340
	ic = idt->idt_ic;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1341
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1342
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1343
	 * It's possible for items to still be in the idt_inbufv list if
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1344
	 * they were added after idm_task_cleanup was called.  We rely on
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1345
	 * STMF to free all buffers associated with the task however STMF
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1346
	 * doesn't know that we have this reference to the buffers.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1347
	 * Use list_create so that we don't end up with stale references
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1348
	 * to these buffers.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1349
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1350
	list_create(&idt->idt_inbufv, sizeof (idm_buf_t),
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1351
	    offsetof(idm_buf_t, idb_buflink));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1352
	list_create(&idt->idt_outbufv, sizeof (idm_buf_t),
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1353
	    offsetof(idm_buf_t, idb_buflink));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1354
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1355
	kmem_cache_free(idm.idm_task_cache, idt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1356
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1357
	idm_conn_rele(ic);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1358
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1359
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1360
/*
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1361
 * idm_task_find_common
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1362
 *	common code for idm_task_find() and idm_task_find_and_complete()
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1363
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1364
/*ARGSUSED*/
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1365
static idm_task_t *
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1366
idm_task_find_common(idm_conn_t *ic, uint32_t itt, uint32_t ttt,
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1367
    boolean_t complete)
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1368
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1369
	uint32_t	tt, client_handle;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1370
	idm_task_t	*idt;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1371
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1372
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1373
	 * Must match both itt and ttt.  The table is indexed by itt
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1374
	 * for initiator connections and ttt for target connections.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1375
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1376
	if (IDM_CONN_ISTGT(ic)) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1377
		tt = ttt;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1378
		client_handle = itt;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1379
	} else {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1380
		tt = itt;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1381
		client_handle = ttt;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1382
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1383
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1384
	rw_enter(&idm.idm_taskid_table_lock, RW_READER);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1385
	if (tt >= idm.idm_taskid_max) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1386
		rw_exit(&idm.idm_taskid_table_lock);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1387
		return (NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1388
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1389
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1390
	idt = idm.idm_taskid_table[tt];
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1391
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1392
	if (idt != NULL) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1393
		mutex_enter(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1394
		if ((idt->idt_state != TASK_ACTIVE) ||
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1395
		    (idt->idt_ic != ic) ||
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1396
		    (IDM_CONN_ISTGT(ic) &&
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1397
		    (idt->idt_client_handle != client_handle))) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1398
			/*
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1399
			 * Task doesn't match or task is aborting and
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1400
			 * we don't want any more references.
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1401
			 */
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1402
			if ((idt->idt_ic != ic) &&
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1403
			    (idt->idt_state == TASK_ACTIVE) &&
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1404
			    (IDM_CONN_ISINI(ic) || idt->idt_client_handle ==
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1405
			    client_handle)) {
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1406
				IDM_CONN_LOG(CE_WARN,
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1407
				"idm_task_find: wrong connection %p != %p",
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1408
				    (void *)ic, (void *)idt->idt_ic);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1409
			}
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1410
			mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1411
			rw_exit(&idm.idm_taskid_table_lock);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1412
			return (NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1413
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1414
		idm_task_hold(idt);
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1415
		/*
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1416
		 * Set the task state to TASK_COMPLETE so it can no longer
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1417
		 * be found or aborted.
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1418
		 */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1419
		if (B_TRUE == complete)
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1420
			idt->idt_state = TASK_COMPLETE;
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1421
		mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1422
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1423
	rw_exit(&idm.idm_taskid_table_lock);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1424
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1425
	return (idt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1426
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1427
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1428
/*
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1429
 * This function looks up a task by task tag.
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1430
 */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1431
idm_task_t *
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1432
idm_task_find(idm_conn_t *ic, uint32_t itt, uint32_t ttt)
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1433
{
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1434
	return (idm_task_find_common(ic, itt, ttt, B_FALSE));
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1435
}
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1436
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1437
/*
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1438
 * This function looks up a task by task tag. If found, the task state
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1439
 * is atomically set to TASK_COMPLETE so it can longer be found or aborted.
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1440
 */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1441
idm_task_t *
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1442
idm_task_find_and_complete(idm_conn_t *ic, uint32_t itt, uint32_t ttt)
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1443
{
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1444
	return (idm_task_find_common(ic, itt, ttt, B_TRUE));
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1445
}
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1446
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1447
/*
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1448
 * idm_task_find_by_handle
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1449
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1450
 * This function looks up a task by the client-private idt_client_handle.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1451
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1452
 * This function should NEVER be called in the performance path.  It is
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1453
 * intended strictly for error recovery/task management.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1454
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1455
/*ARGSUSED*/
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1456
void *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1457
idm_task_find_by_handle(idm_conn_t *ic, uintptr_t handle)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1458
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1459
	idm_task_t	*idt = NULL;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1460
	int		idx = 0;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1461
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1462
	rw_enter(&idm.idm_taskid_table_lock, RW_READER);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1463
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1464
	for (idx = 0; idx < idm.idm_taskid_max; idx++) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1465
		idt = idm.idm_taskid_table[idx];
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1466
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1467
		if (idt == NULL)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1468
			continue;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1469
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1470
		mutex_enter(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1471
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1472
		if (idt->idt_state != TASK_ACTIVE) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1473
			/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1474
			 * Task is either in suspend, abort, or already
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1475
			 * complete.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1476
			 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1477
			mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1478
			continue;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1479
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1480
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1481
		if (idt->idt_client_handle == handle) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1482
			idm_task_hold(idt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1483
			mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1484
			break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1485
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1486
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1487
		mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1488
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1489
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1490
	rw_exit(&idm.idm_taskid_table_lock);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1491
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1492
	if ((idt == NULL) || (idx == idm.idm_taskid_max))
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1493
		return (NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1494
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1495
	return (idt->idt_private);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1496
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1497
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1498
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1499
idm_task_hold(idm_task_t *idt)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1500
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1501
	idm_refcnt_hold(&idt->idt_refcnt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1502
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1503
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1504
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1505
idm_task_rele(idm_task_t *idt)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1506
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1507
	idm_refcnt_rele(&idt->idt_refcnt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1508
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1509
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1510
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1511
idm_task_abort(idm_conn_t *ic, idm_task_t *idt, idm_abort_type_t abort_type)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1512
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1513
	idm_task_t	*task;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1514
	int		idx;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1515
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1516
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1517
	 * Passing NULL as the task indicates that all tasks
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1518
	 * for this connection should be aborted.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1519
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1520
	if (idt == NULL) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1521
		/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1522
		 * Only the connection state machine should ask for
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1523
		 * all tasks to abort and this should never happen in FFP.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1524
		 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1525
		ASSERT(!ic->ic_ffp);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1526
		rw_enter(&idm.idm_taskid_table_lock, RW_READER);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1527
		for (idx = 0; idx < idm.idm_taskid_max; idx++) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1528
			task = idm.idm_taskid_table[idx];
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1529
			if (task == NULL)
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1530
				continue;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1531
			mutex_enter(&task->idt_mutex);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1532
			if ((task->idt_state != TASK_IDLE) &&
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1533
			    (task->idt_state != TASK_COMPLETE) &&
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1534
			    (task->idt_ic == ic)) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1535
				rw_exit(&idm.idm_taskid_table_lock);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1536
				idm_task_abort_one(ic, task, abort_type);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1537
				rw_enter(&idm.idm_taskid_table_lock, RW_READER);
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1538
			} else
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1539
				mutex_exit(&task->idt_mutex);
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1540
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1541
		rw_exit(&idm.idm_taskid_table_lock);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1542
	} else {
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1543
		mutex_enter(&idt->idt_mutex);
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1544
		idm_task_abort_one(ic, idt, abort_type);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1545
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1546
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1547
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1548
static void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1549
idm_task_abort_unref_cb(void *ref)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1550
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1551
	idm_task_t *idt = ref;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1552
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1553
	mutex_enter(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1554
	switch (idt->idt_state) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1555
	case TASK_SUSPENDING:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1556
		idt->idt_state = TASK_SUSPENDED;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1557
		mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1558
		idm_task_aborted(idt, IDM_STATUS_SUSPENDED);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1559
		return;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1560
	case TASK_ABORTING:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1561
		idt->idt_state = TASK_ABORTED;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1562
		mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1563
		idm_task_aborted(idt, IDM_STATUS_ABORTED);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1564
		return;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1565
	default:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1566
		mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1567
		ASSERT(0);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1568
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1569
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1570
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1571
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1572
/*
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1573
 * Abort the idm task.
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1574
 *    Caller must hold the task mutex, which will be released before return
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1575
 */
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1576
static void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1577
idm_task_abort_one(idm_conn_t *ic, idm_task_t *idt, idm_abort_type_t abort_type)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1578
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1579
	/* Caller must hold connection mutex */
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1580
	ASSERT(mutex_owned(&idt->idt_mutex));
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1581
	switch (idt->idt_state) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1582
	case TASK_ACTIVE:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1583
		switch (abort_type) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1584
		case AT_INTERNAL_SUSPEND:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1585
			/* Call transport to release any resources */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1586
			idt->idt_state = TASK_SUSPENDING;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1587
			mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1588
			ic->ic_transport_ops->it_free_task_rsrc(idt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1589
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1590
			/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1591
			 * Wait for outstanding references.  When all
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1592
			 * references are released the callback will call
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1593
			 * idm_task_aborted().
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1594
			 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1595
			idm_refcnt_async_wait_ref(&idt->idt_refcnt,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1596
			    &idm_task_abort_unref_cb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1597
			return;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1598
		case AT_INTERNAL_ABORT:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1599
		case AT_TASK_MGMT_ABORT:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1600
			idt->idt_state = TASK_ABORTING;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1601
			mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1602
			ic->ic_transport_ops->it_free_task_rsrc(idt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1603
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1604
			/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1605
			 * Wait for outstanding references.  When all
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1606
			 * references are released the callback will call
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1607
			 * idm_task_aborted().
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1608
			 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1609
			idm_refcnt_async_wait_ref(&idt->idt_refcnt,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1610
			    &idm_task_abort_unref_cb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1611
			return;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1612
		default:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1613
			ASSERT(0);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1614
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1615
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1616
	case TASK_SUSPENDING:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1617
		/* Already called transport_free_task_rsrc(); */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1618
		switch (abort_type) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1619
		case AT_INTERNAL_SUSPEND:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1620
			/* Already doing it */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1621
			break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1622
		case AT_INTERNAL_ABORT:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1623
		case AT_TASK_MGMT_ABORT:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1624
			idt->idt_state = TASK_ABORTING;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1625
			break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1626
		default:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1627
			ASSERT(0);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1628
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1629
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1630
	case TASK_SUSPENDED:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1631
		/* Already called transport_free_task_rsrc(); */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1632
		switch (abort_type) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1633
		case AT_INTERNAL_SUSPEND:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1634
			/* Already doing it */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1635
			break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1636
		case AT_INTERNAL_ABORT:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1637
		case AT_TASK_MGMT_ABORT:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1638
			idt->idt_state = TASK_ABORTING;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1639
			mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1640
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1641
			/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1642
			 * We could probably call idm_task_aborted directly
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1643
			 * here but we may be holding the conn lock. It's
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1644
			 * easier to just switch contexts.  Even though
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1645
			 * we shouldn't really have any references we'll
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1646
			 * set the state to TASK_ABORTING instead of
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1647
			 * TASK_ABORTED so we can use the same code path.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1648
			 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1649
			idm_refcnt_async_wait_ref(&idt->idt_refcnt,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1650
			    &idm_task_abort_unref_cb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1651
			return;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1652
		default:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1653
			ASSERT(0);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1654
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1655
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1656
	case TASK_ABORTING:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1657
	case TASK_ABORTED:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1658
		switch (abort_type) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1659
		case AT_INTERNAL_SUSPEND:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1660
			/* We're already past this point... */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1661
		case AT_INTERNAL_ABORT:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1662
		case AT_TASK_MGMT_ABORT:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1663
			/* Already doing it */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1664
			break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1665
		default:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1666
			ASSERT(0);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1667
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1668
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1669
	case TASK_COMPLETE:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1670
		/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1671
		 * In this case, let it go.  The status has already been
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1672
		 * sent (which may or may not get successfully transmitted)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1673
		 * and we don't want to end up in a race between completing
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1674
		 * the status PDU and marking the task suspended.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1675
		 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1676
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1677
	default:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1678
		ASSERT(0);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1679
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1680
	mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1681
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1682
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1683
static void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1684
idm_task_aborted(idm_task_t *idt, idm_status_t status)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1685
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1686
	(*idt->idt_ic->ic_conn_ops.icb_task_aborted)(idt, status);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1687
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1688
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1689
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1690
idm_task_cleanup(idm_task_t *idt)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1691
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1692
	idm_buf_t *idb, *next_idb;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1693
	list_t		tmp_buflist;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1694
	ASSERT((idt->idt_state == TASK_SUSPENDED) ||
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1695
	    (idt->idt_state == TASK_ABORTED));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1696
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1697
	list_create(&tmp_buflist, sizeof (idm_buf_t),
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1698
	    offsetof(idm_buf_t, idb_buflink));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1699
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1700
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1701
	 * Remove all the buffers from the task and add them to a
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1702
	 * temporary local list -- we do this so that we can hold
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1703
	 * the task lock and prevent the task from going away if
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1704
	 * the client decides to call idm_task_done/idm_task_free.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1705
	 * This could happen during abort in iscsit.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1706
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1707
	mutex_enter(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1708
	for (idb = list_head(&idt->idt_inbufv);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1709
	    idb != NULL;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1710
	    idb = next_idb) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1711
		next_idb = list_next(&idt->idt_inbufv, idb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1712
		idm_buf_unbind_in_locked(idt, idb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1713
		list_insert_tail(&tmp_buflist, idb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1714
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1715
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1716
	for (idb = list_head(&idt->idt_outbufv);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1717
	    idb != NULL;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1718
	    idb = next_idb) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1719
		next_idb = list_next(&idt->idt_outbufv, idb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1720
		idm_buf_unbind_out_locked(idt, idb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1721
		list_insert_tail(&tmp_buflist, idb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1722
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1723
	mutex_exit(&idt->idt_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1724
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1725
	for (idb = list_head(&tmp_buflist); idb != NULL; idb = next_idb) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1726
		next_idb = list_next(&tmp_buflist, idb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1727
		list_remove(&tmp_buflist, idb);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1728
		(*idb->idb_buf_cb)(idb, IDM_STATUS_ABORTED);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1729
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1730
	list_destroy(&tmp_buflist);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1731
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1732
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1733
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1734
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1735
 * idm_pdu_tx
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1736
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1737
 * This is IDM's implementation of the 'Send_Control' operational primitive.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1738
 * This function is invoked by an initiator iSCSI layer requesting the transfer
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1739
 * of a iSCSI command PDU or a target iSCSI layer requesting the transfer of a
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1740
 * iSCSI response PDU. The PDU will be transmitted as-is by the local Datamover
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1741
 * layer to the peer iSCSI layer in the remote iSCSI node. The connection info
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1742
 * and iSCSI PDU-specific qualifiers namely BHS, AHS, DataDescriptor and Size
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1743
 * are provided as input.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1744
 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1745
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1746
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1747
idm_pdu_tx(idm_pdu_t *pdu)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1748
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1749
	idm_conn_t		*ic = pdu->isp_ic;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1750
	iscsi_async_evt_hdr_t	*async_evt;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1751
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1752
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1753
	 * If we are in full-featured mode then route SCSI-related
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1754
	 * commands to the appropriate function vector without checking
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1755
	 * the connection state.  We will only be in full-feature mode
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1756
	 * when we are in an acceptable state for SCSI PDU's.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1757
	 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1758
	 * We also need to ensure that there are no PDU events outstanding
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1759
	 * on the state machine.  Any non-SCSI PDU's received in full-feature
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1760
	 * mode will result in PDU events and until these have been handled
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1761
	 * we need to route all PDU's through the state machine as PDU
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1762
	 * events to maintain ordering.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1763
	 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1764
	 * Note that IDM cannot enter FFP mode until it processes in
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1765
	 * its state machine the last xmit of the login process.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1766
	 * Hence, checking the IDM_PDU_LOGIN_TX flag here would be
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1767
	 * superfluous.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1768
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1769
	mutex_enter(&ic->ic_state_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1770
	if (ic->ic_ffp && (ic->ic_pdu_events == 0)) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1771
		mutex_exit(&ic->ic_state_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1772
		switch (IDM_PDU_OPCODE(pdu)) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1773
		case ISCSI_OP_SCSI_RSP:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1774
			/* Target only */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1775
			idm_pdu_tx_forward(ic, pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1776
			return;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1777
		case ISCSI_OP_SCSI_TASK_MGT_RSP:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1778
			/* Target only */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1779
			idm_pdu_tx_forward(ic, pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1780
			return;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1781
		case ISCSI_OP_SCSI_DATA_RSP:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1782
			/* Target only */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1783
			idm_pdu_tx_forward(ic, pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1784
			return;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1785
		case ISCSI_OP_RTT_RSP:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1786
			/* Target only */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1787
			idm_pdu_tx_forward(ic, pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1788
			return;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1789
		case ISCSI_OP_NOOP_IN:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1790
			/* Target only */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1791
			idm_pdu_tx_forward(ic, pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1792
			return;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1793
		case ISCSI_OP_TEXT_RSP:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1794
			/* Target only */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1795
			idm_pdu_tx_forward(ic, pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1796
			return;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1797
		case ISCSI_OP_TEXT_CMD:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1798
		case ISCSI_OP_NOOP_OUT:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1799
		case ISCSI_OP_SCSI_CMD:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1800
		case ISCSI_OP_SCSI_DATA:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1801
		case ISCSI_OP_SCSI_TASK_MGT_MSG:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1802
			/* Initiator only */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1803
			idm_pdu_tx_forward(ic, pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1804
			return;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1805
		default:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1806
			break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1807
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1808
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1809
		mutex_enter(&ic->ic_state_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1810
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1811
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1812
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1813
	 * Any PDU's processed outside of full-feature mode and non-SCSI
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1814
	 * PDU's in full-feature mode are handled by generating an
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1815
	 * event to the connection state machine.  The state machine
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1816
	 * will validate the PDU against the current state and either
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1817
	 * transmit the PDU if the opcode is allowed or handle an
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1818
	 * error if the PDU is not allowed.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1819
	 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1820
	 * This code-path will also generate any events that are implied
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1821
	 * by the PDU opcode.  For example a "login response" with success
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1822
	 * status generates a CE_LOGOUT_SUCCESS_SND event.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1823
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1824
	switch (IDM_PDU_OPCODE(pdu)) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1825
	case ISCSI_OP_LOGIN_CMD:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1826
		idm_conn_tx_pdu_event(ic, CE_LOGIN_SND, (uintptr_t)pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1827
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1828
	case ISCSI_OP_LOGIN_RSP:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1829
		idm_parse_login_rsp(ic, pdu, /* Is RX */ B_FALSE);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1830
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1831
	case ISCSI_OP_LOGOUT_CMD:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1832
		idm_parse_logout_req(ic, pdu, /* Is RX */ B_FALSE);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1833
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1834
	case ISCSI_OP_LOGOUT_RSP:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1835
		idm_parse_logout_rsp(ic, pdu, /* Is RX */ B_FALSE);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1836
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1837
	case ISCSI_OP_ASYNC_EVENT:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1838
		async_evt = (iscsi_async_evt_hdr_t *)pdu->isp_hdr;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1839
		switch (async_evt->async_event) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1840
		case ISCSI_ASYNC_EVENT_REQUEST_LOGOUT:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1841
			idm_conn_tx_pdu_event(ic, CE_ASYNC_LOGOUT_SND,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1842
			    (uintptr_t)pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1843
			break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1844
		case ISCSI_ASYNC_EVENT_DROPPING_CONNECTION:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1845
			idm_conn_tx_pdu_event(ic, CE_ASYNC_DROP_CONN_SND,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1846
			    (uintptr_t)pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1847
			break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1848
		case ISCSI_ASYNC_EVENT_DROPPING_ALL_CONNECTIONS:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1849
			idm_conn_tx_pdu_event(ic, CE_ASYNC_DROP_ALL_CONN_SND,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1850
			    (uintptr_t)pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1851
			break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1852
		case ISCSI_ASYNC_EVENT_SCSI_EVENT:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1853
		case ISCSI_ASYNC_EVENT_PARAM_NEGOTIATION:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1854
		default:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1855
			idm_conn_tx_pdu_event(ic, CE_MISC_TX,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1856
			    (uintptr_t)pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1857
			break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1858
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1859
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1860
	case ISCSI_OP_SCSI_RSP:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1861
		/* Target only */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1862
		idm_conn_tx_pdu_event(ic, CE_MISC_TX, (uintptr_t)pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1863
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1864
	case ISCSI_OP_SCSI_TASK_MGT_RSP:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1865
		/* Target only */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1866
		idm_conn_tx_pdu_event(ic, CE_MISC_TX, (uintptr_t)pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1867
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1868
	case ISCSI_OP_SCSI_DATA_RSP:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1869
		/* Target only */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1870
		idm_conn_tx_pdu_event(ic, CE_MISC_TX, (uintptr_t)pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1871
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1872
	case ISCSI_OP_RTT_RSP:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1873
		/* Target only */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1874
		idm_conn_tx_pdu_event(ic, CE_MISC_TX, (uintptr_t)pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1875
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1876
	case ISCSI_OP_NOOP_IN:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1877
		/* Target only */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1878
		idm_conn_tx_pdu_event(ic, CE_MISC_TX, (uintptr_t)pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1879
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1880
	case ISCSI_OP_TEXT_RSP:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1881
		/* Target only */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1882
		idm_conn_tx_pdu_event(ic, CE_MISC_TX, (uintptr_t)pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1883
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1884
		/* Initiator only */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1885
	case ISCSI_OP_SCSI_CMD:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1886
	case ISCSI_OP_SCSI_TASK_MGT_MSG:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1887
	case ISCSI_OP_SCSI_DATA:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1888
	case ISCSI_OP_NOOP_OUT:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1889
	case ISCSI_OP_TEXT_CMD:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1890
	case ISCSI_OP_SNACK_CMD:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1891
	case ISCSI_OP_REJECT_MSG:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1892
	default:
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1893
		/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1894
		 * Connection state machine will validate these PDU's against
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1895
		 * the current state.  A PDU not allowed in the current
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1896
		 * state will cause a protocol error.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1897
		 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1898
		idm_conn_tx_pdu_event(ic, CE_MISC_TX, (uintptr_t)pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1899
		break;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1900
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1901
	mutex_exit(&ic->ic_state_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1902
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1903
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1904
/*
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1905
 * Common allocation of a PDU along with memory for header and data.
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1906
 */
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1907
static idm_pdu_t *
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1908
idm_pdu_alloc_common(uint_t hdrlen, uint_t datalen, int sleepflag)
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1909
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1910
	idm_pdu_t *result;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1911
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1912
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1913
	 * IDM clients should cache these structures for performance
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1914
	 * critical paths.  We can't cache effectively in IDM because we
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1915
	 * don't know the correct header and data size.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1916
	 *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1917
	 * Valid header length is assumed to be hdrlen and valid data
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1918
	 * length is assumed to be datalen.  isp_hdrlen and isp_datalen
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1919
	 * can be adjusted after the PDU is returned if necessary.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1920
	 */
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1921
	result = kmem_zalloc(sizeof (idm_pdu_t) + hdrlen + datalen, sleepflag);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1922
	if (result != NULL) {
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1923
		/* For idm_pdu_free sanity check */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1924
		result->isp_flags |= IDM_PDU_ALLOC;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1925
		/* pointer arithmetic */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1926
		result->isp_hdr = (iscsi_hdr_t *)(result + 1);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1927
		result->isp_hdrlen = hdrlen;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1928
		result->isp_hdrbuflen = hdrlen;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1929
		result->isp_transport_hdrlen = 0;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1930
		result->isp_data = (uint8_t *)result->isp_hdr + hdrlen;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1931
		result->isp_datalen = datalen;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1932
		result->isp_databuflen = datalen;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1933
		result->isp_magic = IDM_PDU_MAGIC;
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1934
	}
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1935
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1936
	return (result);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1937
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1938
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1939
/*
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1940
 * Typical idm_pdu_alloc invocation, will block for resources.
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1941
 */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1942
idm_pdu_t *
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1943
idm_pdu_alloc(uint_t hdrlen, uint_t datalen)
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1944
{
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1945
	return (idm_pdu_alloc_common(hdrlen, datalen, KM_SLEEP));
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1946
}
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1947
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1948
/*
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1949
 * Non-blocking idm_pdu_alloc implementation, returns NULL if resources
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1950
 * are not available.  Needed for transport-layer allocations which may
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1951
 * be invoking in interrupt context.
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1952
 */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1953
idm_pdu_t *
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1954
idm_pdu_alloc_nosleep(uint_t hdrlen, uint_t datalen)
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1955
{
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1956
	return (idm_pdu_alloc_common(hdrlen, datalen, KM_NOSLEEP));
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1957
}
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1958
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  1959
/*
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1960
 * Free a PDU previously allocated with idm_pdu_alloc() including any
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1961
 * header and data space allocated as part of the original request.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1962
 * Additional memory regions referenced by subsequent modification of
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1963
 * the isp_hdr and/or isp_data fields will not be freed.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1964
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1965
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1966
idm_pdu_free(idm_pdu_t *pdu)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1967
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1968
	/* Make sure the structure was allocated using idm_pdu_alloc() */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1969
	ASSERT(pdu->isp_flags & IDM_PDU_ALLOC);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1970
	kmem_free(pdu,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1971
	    sizeof (idm_pdu_t) + pdu->isp_hdrbuflen + pdu->isp_databuflen);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1972
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1973
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1974
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1975
 * Initialize the connection, private and callback fields in a PDU.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1976
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1977
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1978
idm_pdu_init(idm_pdu_t *pdu, idm_conn_t *ic, void *private, idm_pdu_cb_t *cb)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1979
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1980
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1981
	 * idm_pdu_complete() will call idm_pdu_free if the callback is
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1982
	 * NULL.  This will only work if the PDU was originally allocated
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1983
	 * with idm_pdu_alloc().
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1984
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1985
	ASSERT((pdu->isp_flags & IDM_PDU_ALLOC) ||
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1986
	    (cb != NULL));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1987
	pdu->isp_magic = IDM_PDU_MAGIC;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1988
	pdu->isp_ic = ic;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1989
	pdu->isp_private = private;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1990
	pdu->isp_callback = cb;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1991
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1992
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1993
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1994
 * Initialize the header and header length field.  This function should
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1995
 * not be used to adjust the header length in a buffer allocated via
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1996
 * pdu_pdu_alloc since it overwrites the existing header pointer.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1997
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1998
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  1999
idm_pdu_init_hdr(idm_pdu_t *pdu, uint8_t *hdr, uint_t hdrlen)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2000
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2001
	pdu->isp_hdr = (iscsi_hdr_t *)((void *)hdr);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2002
	pdu->isp_hdrlen = hdrlen;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2003
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2004
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2005
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2006
 * Initialize the data and data length fields.  This function should
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2007
 * not be used to adjust the data length of a buffer allocated via
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2008
 * idm_pdu_alloc since it overwrites the existing data pointer.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2009
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2010
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2011
idm_pdu_init_data(idm_pdu_t *pdu, uint8_t *data, uint_t datalen)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2012
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2013
	pdu->isp_data = data;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2014
	pdu->isp_datalen = datalen;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2015
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2016
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2017
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2018
idm_pdu_complete(idm_pdu_t *pdu, idm_status_t status)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2019
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2020
	if (pdu->isp_callback) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2021
		pdu->isp_status = status;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2022
		(*pdu->isp_callback)(pdu, status);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2023
	} else {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2024
		idm_pdu_free(pdu);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2025
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2026
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2027
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2028
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2029
 * State machine auditing
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2030
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2031
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2032
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2033
idm_sm_audit_init(sm_audit_buf_t *audit_buf)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2034
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2035
	bzero(audit_buf, sizeof (sm_audit_buf_t));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2036
	audit_buf->sab_max_index = SM_AUDIT_BUF_MAX_REC - 1;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2037
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2038
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2039
static
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2040
sm_audit_record_t *
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2041
idm_sm_audit_common(sm_audit_buf_t *audit_buf, sm_audit_record_type_t r_type,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2042
    sm_audit_sm_type_t sm_type,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2043
    int current_state)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2044
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2045
	sm_audit_record_t *sar;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2046
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2047
	sar = audit_buf->sab_records;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2048
	sar += audit_buf->sab_index;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2049
	audit_buf->sab_index++;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2050
	audit_buf->sab_index &= audit_buf->sab_max_index;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2051
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2052
	sar->sar_type = r_type;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2053
	gethrestime(&sar->sar_timestamp);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2054
	sar->sar_sm_type = sm_type;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2055
	sar->sar_state = current_state;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2056
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2057
	return (sar);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2058
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2059
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2060
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2061
idm_sm_audit_event(sm_audit_buf_t *audit_buf,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2062
    sm_audit_sm_type_t sm_type, int current_state,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2063
    int event, uintptr_t event_info)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2064
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2065
	sm_audit_record_t *sar;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2066
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2067
	sar = idm_sm_audit_common(audit_buf, SAR_STATE_EVENT,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2068
	    sm_type, current_state);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2069
	sar->sar_event = event;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2070
	sar->sar_event_info = event_info;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2071
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2072
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2073
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2074
idm_sm_audit_state_change(sm_audit_buf_t *audit_buf,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2075
    sm_audit_sm_type_t sm_type, int current_state, int new_state)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2076
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2077
	sm_audit_record_t *sar;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2078
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2079
	sar = idm_sm_audit_common(audit_buf, SAR_STATE_CHANGE,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2080
	    sm_type, current_state);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2081
	sar->sar_new_state = new_state;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2082
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2083
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2084
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2085
/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2086
 * Object reference tracking
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2087
 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2088
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2089
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2090
idm_refcnt_init(idm_refcnt_t *refcnt, void *referenced_obj)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2091
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2092
	bzero(refcnt, sizeof (*refcnt));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2093
	idm_refcnt_reset(refcnt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2094
	refcnt->ir_referenced_obj = referenced_obj;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2095
	bzero(&refcnt->ir_audit_buf, sizeof (refcnt_audit_buf_t));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2096
	refcnt->ir_audit_buf.anb_max_index = REFCNT_AUDIT_BUF_MAX_REC - 1;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2097
	mutex_init(&refcnt->ir_mutex, NULL, MUTEX_DEFAULT, NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2098
	cv_init(&refcnt->ir_cv, NULL, CV_DEFAULT, NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2099
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2100
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2101
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2102
idm_refcnt_destroy(idm_refcnt_t *refcnt)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2103
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2104
	ASSERT(refcnt->ir_refcnt == 0);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2105
	cv_destroy(&refcnt->ir_cv);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2106
	mutex_destroy(&refcnt->ir_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2107
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2108
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2109
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2110
idm_refcnt_reset(idm_refcnt_t *refcnt)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2111
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2112
	refcnt->ir_waiting = REF_NOWAIT;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2113
	refcnt->ir_refcnt = 0;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2114
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2115
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2116
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2117
idm_refcnt_hold(idm_refcnt_t *refcnt)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2118
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2119
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2120
	 * Nothing should take a hold on an object after a call to
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2121
	 * idm_refcnt_wait_ref or idm_refcnd_async_wait_ref
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2122
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2123
	ASSERT(refcnt->ir_waiting == REF_NOWAIT);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2124
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2125
	mutex_enter(&refcnt->ir_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2126
	refcnt->ir_refcnt++;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2127
	REFCNT_AUDIT(refcnt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2128
	mutex_exit(&refcnt->ir_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2129
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2130
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2131
static void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2132
idm_refcnt_unref_task(void *refcnt_void)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2133
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2134
	idm_refcnt_t *refcnt = refcnt_void;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2135
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2136
	REFCNT_AUDIT(refcnt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2137
	(*refcnt->ir_cb)(refcnt->ir_referenced_obj);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2138
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2139
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2140
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2141
idm_refcnt_rele(idm_refcnt_t *refcnt)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2142
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2143
	mutex_enter(&refcnt->ir_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2144
	ASSERT(refcnt->ir_refcnt > 0);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2145
	refcnt->ir_refcnt--;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2146
	REFCNT_AUDIT(refcnt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2147
	if (refcnt->ir_waiting == REF_NOWAIT) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2148
		/* No one is waiting on this object */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2149
		mutex_exit(&refcnt->ir_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2150
		return;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2151
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2152
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2153
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2154
	 * Someone is waiting for this object to go idle so check if
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2155
	 * refcnt is 0.  Waiting on an object then later grabbing another
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2156
	 * reference is not allowed so we don't need to handle that case.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2157
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2158
	if (refcnt->ir_refcnt == 0) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2159
		if (refcnt->ir_waiting == REF_WAIT_ASYNC) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2160
			if (taskq_dispatch(idm.idm_global_taskq,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2161
			    &idm_refcnt_unref_task, refcnt, TQ_SLEEP) == NULL) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2162
				cmn_err(CE_WARN,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2163
				    "idm_refcnt_rele: Couldn't dispatch task");
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2164
			}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2165
		} else if (refcnt->ir_waiting == REF_WAIT_SYNC) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2166
			cv_signal(&refcnt->ir_cv);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2167
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2168
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2169
	mutex_exit(&refcnt->ir_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2170
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2171
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2172
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2173
idm_refcnt_rele_and_destroy(idm_refcnt_t *refcnt, idm_refcnt_cb_t *cb_func)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2174
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2175
	mutex_enter(&refcnt->ir_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2176
	ASSERT(refcnt->ir_refcnt > 0);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2177
	refcnt->ir_refcnt--;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2178
	REFCNT_AUDIT(refcnt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2179
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2180
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2181
	 * Someone is waiting for this object to go idle so check if
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2182
	 * refcnt is 0.  Waiting on an object then later grabbing another
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2183
	 * reference is not allowed so we don't need to handle that case.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2184
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2185
	if (refcnt->ir_refcnt == 0) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2186
		refcnt->ir_cb = cb_func;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2187
		refcnt->ir_waiting = REF_WAIT_ASYNC;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2188
		if (taskq_dispatch(idm.idm_global_taskq,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2189
		    &idm_refcnt_unref_task, refcnt, TQ_SLEEP) == NULL) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2190
			cmn_err(CE_WARN,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2191
			    "idm_refcnt_rele: Couldn't dispatch task");
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2192
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2193
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2194
	mutex_exit(&refcnt->ir_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2195
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2196
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2197
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2198
idm_refcnt_wait_ref(idm_refcnt_t *refcnt)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2199
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2200
	mutex_enter(&refcnt->ir_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2201
	refcnt->ir_waiting = REF_WAIT_SYNC;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2202
	REFCNT_AUDIT(refcnt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2203
	while (refcnt->ir_refcnt != 0)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2204
		cv_wait(&refcnt->ir_cv, &refcnt->ir_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2205
	mutex_exit(&refcnt->ir_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2206
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2207
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2208
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2209
idm_refcnt_async_wait_ref(idm_refcnt_t *refcnt, idm_refcnt_cb_t *cb_func)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2210
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2211
	mutex_enter(&refcnt->ir_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2212
	refcnt->ir_waiting = REF_WAIT_ASYNC;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2213
	refcnt->ir_cb = cb_func;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2214
	REFCNT_AUDIT(refcnt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2215
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2216
	 * It's possible we don't have any references.  To make things easier
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2217
	 * on the caller use a taskq to call the callback instead of
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2218
	 * calling it synchronously
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2219
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2220
	if (refcnt->ir_refcnt == 0) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2221
		if (taskq_dispatch(idm.idm_global_taskq,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2222
		    &idm_refcnt_unref_task, refcnt, TQ_SLEEP) == NULL) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2223
			cmn_err(CE_WARN,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2224
			    "idm_refcnt_async_wait_ref: "
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2225
			    "Couldn't dispatch task");
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2226
		}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2227
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2228
	mutex_exit(&refcnt->ir_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2229
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2230
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2231
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2232
idm_refcnt_destroy_unref_obj(idm_refcnt_t *refcnt,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2233
    idm_refcnt_cb_t *cb_func)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2234
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2235
	mutex_enter(&refcnt->ir_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2236
	if (refcnt->ir_refcnt == 0) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2237
		mutex_exit(&refcnt->ir_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2238
		(*cb_func)(refcnt->ir_referenced_obj);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2239
		return;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2240
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2241
	mutex_exit(&refcnt->ir_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2242
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2243
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2244
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2245
idm_conn_hold(idm_conn_t *ic)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2246
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2247
	idm_refcnt_hold(&ic->ic_refcnt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2248
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2249
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2250
void
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2251
idm_conn_rele(idm_conn_t *ic)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2252
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2253
	idm_refcnt_rele(&ic->ic_refcnt);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2254
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2255
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2256
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2257
static int
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2258
_idm_init(void)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2259
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2260
	/* Initialize the rwlock for the taskid table */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2261
	rw_init(&idm.idm_taskid_table_lock, NULL, RW_DRIVER, NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2262
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2263
	/* Initialize the global mutex and taskq */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2264
	mutex_init(&idm.idm_global_mutex, NULL, MUTEX_DEFAULT, NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2265
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2266
	cv_init(&idm.idm_tgt_svc_cv, NULL, CV_DEFAULT, NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2267
	cv_init(&idm.idm_wd_cv, NULL, CV_DEFAULT, NULL);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2268
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  2269
	/*
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  2270
	 * The maximum allocation needs to be high here since there can be
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  2271
	 * many concurrent tasks using the global taskq.
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  2272
	 */
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2273
	idm.idm_global_taskq = taskq_create("idm_global_taskq", 1, minclsyspri,
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  2274
	    128, 16384, TASKQ_PREPOPULATE);
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2275
	if (idm.idm_global_taskq == NULL) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2276
		cv_destroy(&idm.idm_wd_cv);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2277
		cv_destroy(&idm.idm_tgt_svc_cv);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2278
		mutex_destroy(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2279
		rw_destroy(&idm.idm_taskid_table_lock);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2280
		return (ENOMEM);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2281
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2282
8209
c5db9bfe2b4b 6771003 panic[cpu0]/thread=2a104909ca0: BAD TRAP: type=31 rp=2a104909940 addr=e0 mmu_fsr=0 in module idm
James Moore <James.Moore@Sun.COM>
parents: 7978
diff changeset
  2283
	/* Start watchdog thread */
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2284
	idm.idm_wd_thread = thread_create(NULL, 0,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2285
	    idm_wd_thread, NULL, 0, &p0, TS_RUN, minclsyspri);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2286
	if (idm.idm_wd_thread == NULL) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2287
		/* Couldn't create the watchdog thread */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2288
		taskq_destroy(idm.idm_global_taskq);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2289
		cv_destroy(&idm.idm_wd_cv);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2290
		cv_destroy(&idm.idm_tgt_svc_cv);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2291
		mutex_destroy(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2292
		rw_destroy(&idm.idm_taskid_table_lock);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2293
		return (ENOMEM);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2294
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2295
8209
c5db9bfe2b4b 6771003 panic[cpu0]/thread=2a104909ca0: BAD TRAP: type=31 rp=2a104909940 addr=e0 mmu_fsr=0 in module idm
James Moore <James.Moore@Sun.COM>
parents: 7978
diff changeset
  2296
	/* Pause until the watchdog thread is running */
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2297
	mutex_enter(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2298
	while (!idm.idm_wd_thread_running)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2299
		cv_wait(&idm.idm_wd_cv, &idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2300
	mutex_exit(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2301
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2302
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2303
	 * Allocate the task ID table and set "next" to 0.
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2304
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2305
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2306
	idm.idm_taskid_max = idm_max_taskids;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2307
	idm.idm_taskid_table = (idm_task_t **)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2308
	    kmem_zalloc(idm.idm_taskid_max * sizeof (idm_task_t *), KM_SLEEP);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2309
	idm.idm_taskid_next = 0;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2310
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2311
	/* Create the global buffer and task kmem caches */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2312
	idm.idm_buf_cache = kmem_cache_create("idm_buf_cache",
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2313
	    sizeof (idm_buf_t), 8, NULL, NULL, NULL, NULL, NULL, KM_SLEEP);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2314
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2315
	/*
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2316
	 * Note, we're explicitly allocating an additional iSER header-
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2317
	 * sized chunk for each of these elements. See idm_task_constructor().
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2318
	 */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2319
	idm.idm_task_cache = kmem_cache_create("idm_task_cache",
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2320
	    sizeof (idm_task_t) + IDM_TRANSPORT_HEADER_LENGTH, 8,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2321
	    &idm_task_constructor, &idm_task_destructor,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2322
	    NULL, NULL, NULL, KM_SLEEP);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2323
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2324
	/* Create the service and connection context lists */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2325
	list_create(&idm.idm_tgt_svc_list, sizeof (idm_svc_t),
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2326
	    offsetof(idm_svc_t, is_list_node));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2327
	list_create(&idm.idm_tgt_conn_list, sizeof (idm_conn_t),
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2328
	    offsetof(idm_conn_t, ic_list_node));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2329
	list_create(&idm.idm_ini_conn_list, sizeof (idm_conn_t),
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2330
	    offsetof(idm_conn_t, ic_list_node));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2331
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2332
	/* Initialize the native sockets transport */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2333
	idm_so_init(&idm_transport_list[IDM_TRANSPORT_TYPE_SOCKETS]);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2334
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2335
	/* Create connection ID pool */
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2336
	(void) idm_idpool_create(&idm.idm_conn_id_pool);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2337
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2338
	return (DDI_SUCCESS);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2339
}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2340
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2341
static int
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2342
_idm_fini(void)
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2343
{
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2344
	if (!list_is_empty(&idm.idm_ini_conn_list) ||
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2345
	    !list_is_empty(&idm.idm_tgt_conn_list) ||
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2346
	    !list_is_empty(&idm.idm_tgt_svc_list)) {
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2347
		return (EBUSY);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2348
	}
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2349
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2350
	mutex_enter(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2351
	idm.idm_wd_thread_running = B_FALSE;
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2352
	cv_signal(&idm.idm_wd_cv);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2353
	mutex_exit(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2354
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2355
	thread_join(idm.idm_wd_thread_did);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2356
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2357
	idm_idpool_destroy(&idm.idm_conn_id_pool);
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  2358
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  2359
	/* Close any LDI handles we have open on transport drivers */
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  2360
	mutex_enter(&idm.idm_global_mutex);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  2361
	idm_transport_teardown();
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  2362
	mutex_exit(&idm.idm_global_mutex);
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  2363
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  2364
	/* Teardown the native sockets transport */
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2365
	idm_so_fini();
9162
b011b0287065 PSARC 2008/395 iSER: iSCSI Extensions for RDMA
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents: 8209
diff changeset
  2366
7978
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2367
	list_destroy(&idm.idm_ini_conn_list);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2368
	list_destroy(&idm.idm_tgt_conn_list);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2369
	list_destroy(&idm.idm_tgt_svc_list);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2370
	kmem_cache_destroy(idm.idm_task_cache);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2371
	kmem_cache_destroy(idm.idm_buf_cache);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2372
	kmem_free(idm.idm_taskid_table,
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2373
	    idm.idm_taskid_max * sizeof (idm_task_t *));
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2374
	mutex_destroy(&idm.idm_global_mutex);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2375
	cv_destroy(&idm.idm_wd_cv);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2376
	cv_destroy(&idm.idm_tgt_svc_cv);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2377
	rw_destroy(&idm.idm_taskid_table_lock);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2378
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2379
	return (0);
4559e57ec313 PSARC 2008/587 iSCSI Port Provider for COMSTAR
Peter Dunlap <Peter.Dunlap@Sun.COM>
parents:
diff changeset
  2380
}