aboutsummaryrefslogtreecommitdiffstats
path: root/include/scsi
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@g5.osdl.org>2006-06-21 14:18:25 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-06-21 14:18:25 -0400
commit28e4b224955cbe30275b2a7842e729023a4f4b03 (patch)
treeab4d28fecc06070fc2a2742f4b4550b29de44912 /include/scsi
parent22ae813b85df7c0b0fc7c8d6f336d6a9f566ff97 (diff)
parent67d59dfdeb21df2c16dcd478b66177e91178ecd0 (diff)
Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (85 commits) [SCSI] 53c700: remove reliance on deprecated cmnd fields [SCSI] hptiop: don't use cmnd->bufflen [SCSI] hptiop: HighPoint RocketRAID 3xxx controller driver [SCSI] aacraid: small misc. cleanups [SCSI] aacraid: Update supported product information [SCSI] aacraid: Fix return code interpretation [SCSI] scsi_transport_sas: fix panic in sas_free_rphy [SCSI] remove RQ_SCSI_* flags [SCSI] remove scsi_request infrastructure [SCSI] mptfusion: change driver revision to 3.03.10 [SCSI] mptfc: abort of board reset leaves port dead requiring reboot [SCSI] mptfc: fix fibre channel infinite request/response loop [SCSI] mptfc: set fibre channel fw target missing timers to one second [SCSI] mptfusion: move fc event/reset handling to mptfc [SCSI] spi transport: don't allow dt to be set on SE or HVD buses [SCSI] aic7xxx: expose the bus setting to sysfs [SCSI] scsi: remove Documentation/scsi/cpqfc.txt [SCSI] drivers/scsi: Use ARRAY_SIZE macro [SCSI] Remove last page_address from dc395x.c [SCSI] hptiop: HighPoint RocketRAID 3xxx controller driver ... Fixed up conflicts in drivers/message/fusion/mptbase.c manually (due to the sparc interrupt cleanups)
Diffstat (limited to 'include/scsi')
-rw-r--r--include/scsi/iscsi_if.h127
-rw-r--r--include/scsi/iscsi_proto.h2
-rw-r--r--include/scsi/libiscsi.h282
-rw-r--r--include/scsi/scsi_cmnd.h10
-rw-r--r--include/scsi/scsi_dbg.h2
-rw-r--r--include/scsi/scsi_devinfo.h1
-rw-r--r--include/scsi/scsi_eh.h3
-rw-r--r--include/scsi/scsi_request.h54
-rw-r--r--include/scsi/scsi_transport_iscsi.h119
-rw-r--r--include/scsi/sg_request.h26
10 files changed, 482 insertions, 144 deletions
diff --git a/include/scsi/iscsi_if.h b/include/scsi/iscsi_if.h
index e5618b90996e..253797c60095 100644
--- a/include/scsi/iscsi_if.h
+++ b/include/scsi/iscsi_if.h
@@ -43,6 +43,10 @@ enum iscsi_uevent_e {
43 ISCSI_UEVENT_GET_STATS = UEVENT_BASE + 10, 43 ISCSI_UEVENT_GET_STATS = UEVENT_BASE + 10,
44 ISCSI_UEVENT_GET_PARAM = UEVENT_BASE + 11, 44 ISCSI_UEVENT_GET_PARAM = UEVENT_BASE + 11,
45 45
46 ISCSI_UEVENT_TRANSPORT_EP_CONNECT = UEVENT_BASE + 12,
47 ISCSI_UEVENT_TRANSPORT_EP_POLL = UEVENT_BASE + 13,
48 ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT = UEVENT_BASE + 14,
49
46 /* up events */ 50 /* up events */
47 ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1, 51 ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1,
48 ISCSI_KEVENT_CONN_ERROR = KEVENT_BASE + 2, 52 ISCSI_KEVENT_CONN_ERROR = KEVENT_BASE + 2,
@@ -60,61 +64,83 @@ struct iscsi_uevent {
60 uint32_t initial_cmdsn; 64 uint32_t initial_cmdsn;
61 } c_session; 65 } c_session;
62 struct msg_destroy_session { 66 struct msg_destroy_session {
63 uint64_t session_handle;
64 uint32_t sid; 67 uint32_t sid;
65 } d_session; 68 } d_session;
66 struct msg_create_conn { 69 struct msg_create_conn {
67 uint64_t session_handle;
68 uint32_t cid;
69 uint32_t sid; 70 uint32_t sid;
71 uint32_t cid;
70 } c_conn; 72 } c_conn;
71 struct msg_bind_conn { 73 struct msg_bind_conn {
72 uint64_t session_handle; 74 uint32_t sid;
73 uint64_t conn_handle; 75 uint32_t cid;
74 uint32_t transport_fd; 76 uint64_t transport_eph;
75 uint32_t is_leading; 77 uint32_t is_leading;
76 } b_conn; 78 } b_conn;
77 struct msg_destroy_conn { 79 struct msg_destroy_conn {
78 uint64_t conn_handle; 80 uint32_t sid;
79 uint32_t cid; 81 uint32_t cid;
80 } d_conn; 82 } d_conn;
81 struct msg_send_pdu { 83 struct msg_send_pdu {
84 uint32_t sid;
85 uint32_t cid;
82 uint32_t hdr_size; 86 uint32_t hdr_size;
83 uint32_t data_size; 87 uint32_t data_size;
84 uint64_t conn_handle;
85 } send_pdu; 88 } send_pdu;
86 struct msg_set_param { 89 struct msg_set_param {
87 uint64_t conn_handle; 90 uint32_t sid;
91 uint32_t cid;
88 uint32_t param; /* enum iscsi_param */ 92 uint32_t param; /* enum iscsi_param */
89 uint32_t value; 93 uint32_t len;
90 } set_param; 94 } set_param;
91 struct msg_start_conn { 95 struct msg_start_conn {
92 uint64_t conn_handle; 96 uint32_t sid;
97 uint32_t cid;
93 } start_conn; 98 } start_conn;
94 struct msg_stop_conn { 99 struct msg_stop_conn {
100 uint32_t sid;
101 uint32_t cid;
95 uint64_t conn_handle; 102 uint64_t conn_handle;
96 uint32_t flag; 103 uint32_t flag;
97 } stop_conn; 104 } stop_conn;
98 struct msg_get_stats { 105 struct msg_get_stats {
99 uint64_t conn_handle; 106 uint32_t sid;
107 uint32_t cid;
100 } get_stats; 108 } get_stats;
109 struct msg_transport_connect {
110 uint32_t non_blocking;
111 } ep_connect;
112 struct msg_transport_poll {
113 uint64_t ep_handle;
114 uint32_t timeout_ms;
115 } ep_poll;
116 struct msg_transport_disconnect {
117 uint64_t ep_handle;
118 } ep_disconnect;
101 } u; 119 } u;
102 union { 120 union {
103 /* messages k -> u */ 121 /* messages k -> u */
104 uint64_t handle;
105 int retcode; 122 int retcode;
106 struct msg_create_session_ret { 123 struct msg_create_session_ret {
107 uint64_t session_handle;
108 uint32_t sid; 124 uint32_t sid;
125 uint32_t host_no;
109 } c_session_ret; 126 } c_session_ret;
127 struct msg_create_conn_ret {
128 uint32_t sid;
129 uint32_t cid;
130 } c_conn_ret;
110 struct msg_recv_req { 131 struct msg_recv_req {
132 uint32_t sid;
133 uint32_t cid;
111 uint64_t recv_handle; 134 uint64_t recv_handle;
112 uint64_t conn_handle;
113 } recv_req; 135 } recv_req;
114 struct msg_conn_error { 136 struct msg_conn_error {
115 uint64_t conn_handle; 137 uint32_t sid;
138 uint32_t cid;
116 uint32_t error; /* enum iscsi_err */ 139 uint32_t error; /* enum iscsi_err */
117 } connerror; 140 } connerror;
141 struct msg_transport_connect_ret {
142 uint64_t handle;
143 } ep_connect_ret;
118 } r; 144 } r;
119} __attribute__ ((aligned (sizeof(uint64_t)))); 145} __attribute__ ((aligned (sizeof(uint64_t))));
120 146
@@ -139,29 +165,66 @@ enum iscsi_err {
139 ISCSI_ERR_SESSION_FAILED = ISCSI_ERR_BASE + 13, 165 ISCSI_ERR_SESSION_FAILED = ISCSI_ERR_BASE + 13,
140 ISCSI_ERR_HDR_DGST = ISCSI_ERR_BASE + 14, 166 ISCSI_ERR_HDR_DGST = ISCSI_ERR_BASE + 14,
141 ISCSI_ERR_DATA_DGST = ISCSI_ERR_BASE + 15, 167 ISCSI_ERR_DATA_DGST = ISCSI_ERR_BASE + 15,
142 ISCSI_ERR_PARAM_NOT_FOUND = ISCSI_ERR_BASE + 16 168 ISCSI_ERR_PARAM_NOT_FOUND = ISCSI_ERR_BASE + 16,
169 ISCSI_ERR_NO_SCSI_CMD = ISCSI_ERR_BASE + 17,
143}; 170};
144 171
145/* 172/*
146 * iSCSI Parameters (RFC3720) 173 * iSCSI Parameters (RFC3720)
147 */ 174 */
148enum iscsi_param { 175enum iscsi_param {
149 ISCSI_PARAM_MAX_RECV_DLENGTH = 0, 176 /* passed in using netlink set param */
150 ISCSI_PARAM_MAX_XMIT_DLENGTH = 1, 177 ISCSI_PARAM_MAX_RECV_DLENGTH,
151 ISCSI_PARAM_HDRDGST_EN = 2, 178 ISCSI_PARAM_MAX_XMIT_DLENGTH,
152 ISCSI_PARAM_DATADGST_EN = 3, 179 ISCSI_PARAM_HDRDGST_EN,
153 ISCSI_PARAM_INITIAL_R2T_EN = 4, 180 ISCSI_PARAM_DATADGST_EN,
154 ISCSI_PARAM_MAX_R2T = 5, 181 ISCSI_PARAM_INITIAL_R2T_EN,
155 ISCSI_PARAM_IMM_DATA_EN = 6, 182 ISCSI_PARAM_MAX_R2T,
156 ISCSI_PARAM_FIRST_BURST = 7, 183 ISCSI_PARAM_IMM_DATA_EN,
157 ISCSI_PARAM_MAX_BURST = 8, 184 ISCSI_PARAM_FIRST_BURST,
158 ISCSI_PARAM_PDU_INORDER_EN = 9, 185 ISCSI_PARAM_MAX_BURST,
159 ISCSI_PARAM_DATASEQ_INORDER_EN = 10, 186 ISCSI_PARAM_PDU_INORDER_EN,
160 ISCSI_PARAM_ERL = 11, 187 ISCSI_PARAM_DATASEQ_INORDER_EN,
161 ISCSI_PARAM_IFMARKER_EN = 12, 188 ISCSI_PARAM_ERL,
162 ISCSI_PARAM_OFMARKER_EN = 13, 189 ISCSI_PARAM_IFMARKER_EN,
190 ISCSI_PARAM_OFMARKER_EN,
191 ISCSI_PARAM_EXP_STATSN,
192 ISCSI_PARAM_TARGET_NAME,
193 ISCSI_PARAM_TPGT,
194 ISCSI_PARAM_PERSISTENT_ADDRESS,
195 ISCSI_PARAM_PERSISTENT_PORT,
196 ISCSI_PARAM_SESS_RECOVERY_TMO,
197
198 /* pased in through bind conn using transport_fd */
199 ISCSI_PARAM_CONN_PORT,
200 ISCSI_PARAM_CONN_ADDRESS,
201
202 /* must always be last */
203 ISCSI_PARAM_MAX,
163}; 204};
164#define ISCSI_PARAM_MAX 14 205
206#define ISCSI_MAX_RECV_DLENGTH (1 << ISCSI_PARAM_MAX_RECV_DLENGTH)
207#define ISCSI_MAX_XMIT_DLENGTH (1 << ISCSI_PARAM_MAX_XMIT_DLENGTH)
208#define ISCSI_HDRDGST_EN (1 << ISCSI_PARAM_HDRDGST_EN)
209#define ISCSI_DATADGST_EN (1 << ISCSI_PARAM_DATADGST_EN)
210#define ISCSI_INITIAL_R2T_EN (1 << ISCSI_PARAM_INITIAL_R2T_EN)
211#define ISCSI_MAX_R2T (1 << ISCSI_PARAM_MAX_R2T)
212#define ISCSI_IMM_DATA_EN (1 << ISCSI_PARAM_IMM_DATA_EN)
213#define ISCSI_FIRST_BURST (1 << ISCSI_PARAM_FIRST_BURST)
214#define ISCSI_MAX_BURST (1 << ISCSI_PARAM_MAX_BURST)
215#define ISCSI_PDU_INORDER_EN (1 << ISCSI_PARAM_PDU_INORDER_EN)
216#define ISCSI_DATASEQ_INORDER_EN (1 << ISCSI_PARAM_DATASEQ_INORDER_EN)
217#define ISCSI_ERL (1 << ISCSI_PARAM_ERL)
218#define ISCSI_IFMARKER_EN (1 << ISCSI_PARAM_IFMARKER_EN)
219#define ISCSI_OFMARKER_EN (1 << ISCSI_PARAM_OFMARKER_EN)
220#define ISCSI_EXP_STATSN (1 << ISCSI_PARAM_EXP_STATSN)
221#define ISCSI_TARGET_NAME (1 << ISCSI_PARAM_TARGET_NAME)
222#define ISCSI_TPGT (1 << ISCSI_PARAM_TPGT)
223#define ISCSI_PERSISTENT_ADDRESS (1 << ISCSI_PARAM_PERSISTENT_ADDRESS)
224#define ISCSI_PERSISTENT_PORT (1 << ISCSI_PARAM_PERSISTENT_PORT)
225#define ISCSI_SESS_RECOVERY_TMO (1 << ISCSI_PARAM_SESS_RECOVERY_TMO)
226#define ISCSI_CONN_PORT (1 << ISCSI_PARAM_CONN_PORT)
227#define ISCSI_CONN_ADDRESS (1 << ISCSI_PARAM_CONN_ADDRESS)
165 228
166#define iscsi_ptr(_handle) ((void*)(unsigned long)_handle) 229#define iscsi_ptr(_handle) ((void*)(unsigned long)_handle)
167#define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr) 230#define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr)
diff --git a/include/scsi/iscsi_proto.h b/include/scsi/iscsi_proto.h
index 4feda05fdf25..02f6e4b9e693 100644
--- a/include/scsi/iscsi_proto.h
+++ b/include/scsi/iscsi_proto.h
@@ -21,8 +21,6 @@
21#ifndef ISCSI_PROTO_H 21#ifndef ISCSI_PROTO_H
22#define ISCSI_PROTO_H 22#define ISCSI_PROTO_H
23 23
24#define ISCSI_VERSION_STR "0.3"
25#define ISCSI_DATE_STR "22-Apr-2005"
26#define ISCSI_DRAFT20_VERSION 0x00 24#define ISCSI_DRAFT20_VERSION 0x00
27 25
28/* default iSCSI listen port for incoming connections */ 26/* default iSCSI listen port for incoming connections */
diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h
new file mode 100644
index 000000000000..cbf7e58bd6f9
--- /dev/null
+++ b/include/scsi/libiscsi.h
@@ -0,0 +1,282 @@
1/*
2 * iSCSI lib definitions
3 *
4 * Copyright (C) 2006 Red Hat, Inc. All rights reserved.
5 * Copyright (C) 2004 - 2006 Mike Christie
6 * Copyright (C) 2004 - 2005 Dmitry Yusupov
7 * Copyright (C) 2004 - 2005 Alex Aizman
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 */
23#ifndef LIBISCSI_H
24#define LIBISCSI_H
25
26#include <linux/types.h>
27#include <linux/mutex.h>
28#include <scsi/iscsi_proto.h>
29#include <scsi/iscsi_if.h>
30
31struct scsi_transport_template;
32struct scsi_device;
33struct Scsi_Host;
34struct scsi_cmnd;
35struct socket;
36struct iscsi_transport;
37struct iscsi_cls_session;
38struct iscsi_cls_conn;
39struct iscsi_session;
40struct iscsi_nopin;
41
42/* #define DEBUG_SCSI */
43#ifdef DEBUG_SCSI
44#define debug_scsi(fmt...) printk(KERN_INFO "iscsi: " fmt)
45#else
46#define debug_scsi(fmt...)
47#endif
48
49#define ISCSI_XMIT_CMDS_MAX 128 /* must be power of 2 */
50#define ISCSI_MGMT_CMDS_MAX 32 /* must be power of 2 */
51#define ISCSI_CONN_MAX 1
52
53#define ISCSI_MGMT_ITT_OFFSET 0xa00
54
55#define ISCSI_DEF_CMD_PER_LUN 32
56#define ISCSI_MAX_CMD_PER_LUN 128
57
58/* Task Mgmt states */
59#define TMABORT_INITIAL 0x0
60#define TMABORT_SUCCESS 0x1
61#define TMABORT_FAILED 0x2
62#define TMABORT_TIMEDOUT 0x3
63
64/* Connection suspend "bit" */
65#define ISCSI_SUSPEND_BIT 1
66
67#define ISCSI_ITT_MASK (0xfff)
68#define ISCSI_CID_SHIFT 12
69#define ISCSI_CID_MASK (0xffff << ISCSI_CID_SHIFT)
70#define ISCSI_AGE_SHIFT 28
71#define ISCSI_AGE_MASK (0xf << ISCSI_AGE_SHIFT)
72
73struct iscsi_mgmt_task {
74 /*
75 * Becuae LLDs allocate their hdr differently, this is a pointer to
76 * that storage. It must be setup at session creation time.
77 */
78 struct iscsi_hdr *hdr;
79 char *data; /* mgmt payload */
80 int data_count; /* counts data to be sent */
81 uint32_t itt; /* this ITT */
82 void *dd_data; /* driver/transport data */
83 struct list_head running;
84};
85
86struct iscsi_cmd_task {
87 /*
88 * Becuae LLDs allocate their hdr differently, this is a pointer to
89 * that storage. It must be setup at session creation time.
90 */
91 struct iscsi_cmd *hdr;
92 int itt; /* this ITT */
93 int datasn; /* DataSN */
94
95 uint32_t unsol_datasn;
96 int imm_count; /* imm-data (bytes) */
97 int unsol_count; /* unsolicited (bytes)*/
98 int data_count; /* remaining Data-Out */
99 struct scsi_cmnd *sc; /* associated SCSI cmd*/
100 int total_length;
101 struct iscsi_conn *conn; /* used connection */
102 struct iscsi_mgmt_task *mtask; /* tmf mtask in progr */
103
104 struct list_head running; /* running cmd list */
105 void *dd_data; /* driver/transport data */
106};
107
108struct iscsi_conn {
109 struct iscsi_cls_conn *cls_conn; /* ptr to class connection */
110 void *dd_data; /* iscsi_transport data */
111 struct iscsi_session *session; /* parent session */
112 /*
113 * LLDs should set this lock. It protects the transport recv
114 * code
115 */
116 rwlock_t *recv_lock;
117 /*
118 * conn_stop() flag: stop to recover, stop to terminate
119 */
120 int stop_stage;
121
122 /* iSCSI connection-wide sequencing */
123 uint32_t exp_statsn;
124
125 /* control data */
126 int id; /* CID */
127 struct list_head item; /* maintains list of conns */
128 int c_stage; /* connection state */
129 struct iscsi_mgmt_task *login_mtask; /* mtask used for login/text */
130 struct iscsi_mgmt_task *mtask; /* xmit mtask in progress */
131 struct iscsi_cmd_task *ctask; /* xmit ctask in progress */
132
133 /* xmit */
134 struct kfifo *immqueue; /* immediate xmit queue */
135 struct kfifo *mgmtqueue; /* mgmt (control) xmit queue */
136 struct list_head mgmt_run_list; /* list of control tasks */
137 struct kfifo *xmitqueue; /* data-path cmd queue */
138 struct list_head run_list; /* list of cmds in progress */
139 struct work_struct xmitwork; /* per-conn. xmit workqueue */
140 /*
141 * serializes connection xmit, access to kfifos:
142 * xmitqueue, immqueue, mgmtqueue
143 */
144 struct mutex xmitmutex;
145
146 unsigned long suspend_tx; /* suspend Tx */
147 unsigned long suspend_rx; /* suspend Rx */
148
149 /* abort */
150 wait_queue_head_t ehwait; /* used in eh_abort() */
151 struct iscsi_tm tmhdr;
152 struct timer_list tmabort_timer;
153 int tmabort_state; /* see TMABORT_INITIAL, etc.*/
154
155 /* negotiated params */
156 int max_recv_dlength; /* initiator_max_recv_dsl*/
157 int max_xmit_dlength; /* target_max_recv_dsl */
158 int hdrdgst_en;
159 int datadgst_en;
160
161 /* MIB-statistics */
162 uint64_t txdata_octets;
163 uint64_t rxdata_octets;
164 uint32_t scsicmd_pdus_cnt;
165 uint32_t dataout_pdus_cnt;
166 uint32_t scsirsp_pdus_cnt;
167 uint32_t datain_pdus_cnt;
168 uint32_t r2t_pdus_cnt;
169 uint32_t tmfcmd_pdus_cnt;
170 int32_t tmfrsp_pdus_cnt;
171
172 /* custom statistics */
173 uint32_t eh_abort_cnt;
174};
175
176struct iscsi_queue {
177 struct kfifo *queue; /* FIFO Queue */
178 void **pool; /* Pool of elements */
179 int max; /* Max number of elements */
180};
181
182struct iscsi_session {
183 /* iSCSI session-wide sequencing */
184 uint32_t cmdsn;
185 uint32_t exp_cmdsn;
186 uint32_t max_cmdsn;
187
188 /* configuration */
189 int initial_r2t_en;
190 int max_r2t;
191 int imm_data_en;
192 int first_burst;
193 int max_burst;
194 int time2wait;
195 int time2retain;
196 int pdu_inorder_en;
197 int dataseq_inorder_en;
198 int erl;
199 int ifmarker_en;
200 int ofmarker_en;
201
202 /* control data */
203 struct iscsi_transport *tt;
204 struct Scsi_Host *host;
205 struct iscsi_conn *leadconn; /* leading connection */
206 spinlock_t lock; /* protects session state, *
207 * sequence numbers, *
208 * session resources: *
209 * - cmdpool, *
210 * - mgmtpool, *
211 * - r2tpool */
212 int state; /* session state */
213 struct list_head item;
214 int age; /* counts session re-opens */
215
216 struct list_head connections; /* list of connections */
217 int cmds_max; /* size of cmds array */
218 struct iscsi_cmd_task **cmds; /* Original Cmds arr */
219 struct iscsi_queue cmdpool; /* PDU's pool */
220 int mgmtpool_max; /* size of mgmt array */
221 struct iscsi_mgmt_task **mgmt_cmds; /* Original mgmt arr */
222 struct iscsi_queue mgmtpool; /* Mgmt PDU's pool */
223};
224
225/*
226 * scsi host template
227 */
228extern int iscsi_change_queue_depth(struct scsi_device *sdev, int depth);
229extern int iscsi_eh_abort(struct scsi_cmnd *sc);
230extern int iscsi_eh_host_reset(struct scsi_cmnd *sc);
231extern int iscsi_queuecommand(struct scsi_cmnd *sc,
232 void (*done)(struct scsi_cmnd *));
233
234/*
235 * session management
236 */
237extern struct iscsi_cls_session *
238iscsi_session_setup(struct iscsi_transport *, struct scsi_transport_template *,
239 int, int, uint32_t, uint32_t *);
240extern void iscsi_session_teardown(struct iscsi_cls_session *);
241extern struct iscsi_session *class_to_transport_session(struct iscsi_cls_session *);
242extern void iscsi_session_recovery_timedout(struct iscsi_cls_session *);
243
244#define session_to_cls(_sess) \
245 hostdata_session(_sess->host->hostdata)
246
247/*
248 * connection management
249 */
250extern struct iscsi_cls_conn *iscsi_conn_setup(struct iscsi_cls_session *,
251 uint32_t);
252extern void iscsi_conn_teardown(struct iscsi_cls_conn *);
253extern int iscsi_conn_start(struct iscsi_cls_conn *);
254extern void iscsi_conn_stop(struct iscsi_cls_conn *, int);
255extern int iscsi_conn_bind(struct iscsi_cls_session *, struct iscsi_cls_conn *,
256 int);
257extern void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err);
258
259/*
260 * pdu and task processing
261 */
262extern int iscsi_check_assign_cmdsn(struct iscsi_session *,
263 struct iscsi_nopin *);
264extern void iscsi_prep_unsolicit_data_pdu(struct iscsi_cmd_task *,
265 struct iscsi_data *hdr,
266 int transport_data_cnt);
267extern int iscsi_conn_send_pdu(struct iscsi_cls_conn *, struct iscsi_hdr *,
268 char *, uint32_t);
269extern int iscsi_complete_pdu(struct iscsi_conn *, struct iscsi_hdr *,
270 char *, int);
271extern int __iscsi_complete_pdu(struct iscsi_conn *, struct iscsi_hdr *,
272 char *, int);
273extern int iscsi_verify_itt(struct iscsi_conn *, struct iscsi_hdr *,
274 uint32_t *);
275
276/*
277 * generic helpers
278 */
279extern void iscsi_pool_free(struct iscsi_queue *, void **);
280extern int iscsi_pool_init(struct iscsi_queue *, int, void ***, int);
281
282#endif
diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h
index 1ace1b9fe537..b0caabec1bd1 100644
--- a/include/scsi/scsi_cmnd.h
+++ b/include/scsi/scsi_cmnd.h
@@ -9,7 +9,6 @@
9struct request; 9struct request;
10struct scatterlist; 10struct scatterlist;
11struct scsi_device; 11struct scsi_device;
12struct scsi_request;
13 12
14 13
15/* embedded in scsi_cmnd */ 14/* embedded in scsi_cmnd */
@@ -29,13 +28,8 @@ struct scsi_pointer {
29}; 28};
30 29
31struct scsi_cmnd { 30struct scsi_cmnd {
32 int sc_magic;
33
34 struct scsi_device *device; 31 struct scsi_device *device;
35 struct scsi_request *sc_request;
36
37 struct list_head list; /* scsi_cmnd participates in queue lists */ 32 struct list_head list; /* scsi_cmnd participates in queue lists */
38
39 struct list_head eh_entry; /* entry for the host eh_cmd_q */ 33 struct list_head eh_entry; /* entry for the host eh_cmd_q */
40 int eh_eflags; /* Used by error handlr */ 34 int eh_eflags; /* Used by error handlr */
41 void (*done) (struct scsi_cmnd *); /* Mid-level done function */ 35 void (*done) (struct scsi_cmnd *); /* Mid-level done function */
@@ -152,4 +146,8 @@ extern void scsi_put_command(struct scsi_cmnd *);
152extern void scsi_io_completion(struct scsi_cmnd *, unsigned int, unsigned int); 146extern void scsi_io_completion(struct scsi_cmnd *, unsigned int, unsigned int);
153extern void scsi_finish_command(struct scsi_cmnd *cmd); 147extern void scsi_finish_command(struct scsi_cmnd *cmd);
154 148
149extern void *scsi_kmap_atomic_sg(struct scatterlist *sg, int sg_count,
150 size_t *offset, size_t *len);
151extern void scsi_kunmap_atomic_sg(void *virt);
152
155#endif /* _SCSI_SCSI_CMND_H */ 153#endif /* _SCSI_SCSI_CMND_H */
diff --git a/include/scsi/scsi_dbg.h b/include/scsi/scsi_dbg.h
index 4d69dee66d4d..3bbbfbe8cbfc 100644
--- a/include/scsi/scsi_dbg.h
+++ b/include/scsi/scsi_dbg.h
@@ -2,14 +2,12 @@
2#define _SCSI_SCSI_DBG_H 2#define _SCSI_SCSI_DBG_H
3 3
4struct scsi_cmnd; 4struct scsi_cmnd;
5struct scsi_request;
6struct scsi_sense_hdr; 5struct scsi_sense_hdr;
7 6
8extern void scsi_print_command(struct scsi_cmnd *); 7extern void scsi_print_command(struct scsi_cmnd *);
9extern void scsi_print_sense_hdr(const char *, struct scsi_sense_hdr *); 8extern void scsi_print_sense_hdr(const char *, struct scsi_sense_hdr *);
10extern void __scsi_print_command(unsigned char *); 9extern void __scsi_print_command(unsigned char *);
11extern void scsi_print_sense(const char *, struct scsi_cmnd *); 10extern void scsi_print_sense(const char *, struct scsi_cmnd *);
12extern void scsi_print_req_sense(const char *, struct scsi_request *);
13extern void __scsi_print_sense(const char *name, 11extern void __scsi_print_sense(const char *name,
14 const unsigned char *sense_buffer, 12 const unsigned char *sense_buffer,
15 int sense_len); 13 int sense_len);
diff --git a/include/scsi/scsi_devinfo.h b/include/scsi/scsi_devinfo.h
index d31b16d25a09..b4ddd3b18b4c 100644
--- a/include/scsi/scsi_devinfo.h
+++ b/include/scsi/scsi_devinfo.h
@@ -29,4 +29,5 @@
29#define BLIST_SELECT_NO_ATN 0x200000 /* select without ATN */ 29#define BLIST_SELECT_NO_ATN 0x200000 /* select without ATN */
30#define BLIST_RETRY_HWERROR 0x400000 /* retry HARDWARE_ERROR */ 30#define BLIST_RETRY_HWERROR 0x400000 /* retry HARDWARE_ERROR */
31#define BLIST_MAX_512 0x800000 /* maximum 512 sector cdb length */ 31#define BLIST_MAX_512 0x800000 /* maximum 512 sector cdb length */
32#define BLIST_ATTACH_PQ3 0x1000000 /* Scan: Attach to PQ3 devices */
32#endif 33#endif
diff --git a/include/scsi/scsi_eh.h b/include/scsi/scsi_eh.h
index d160880b2a87..c5c0f6762a01 100644
--- a/include/scsi/scsi_eh.h
+++ b/include/scsi/scsi_eh.h
@@ -3,7 +3,6 @@
3 3
4struct scsi_cmnd; 4struct scsi_cmnd;
5struct scsi_device; 5struct scsi_device;
6struct scsi_request;
7struct Scsi_Host; 6struct Scsi_Host;
8 7
9/* 8/*
@@ -43,8 +42,6 @@ extern void scsi_report_device_reset(struct Scsi_Host *, int, int);
43extern int scsi_block_when_processing_errors(struct scsi_device *); 42extern int scsi_block_when_processing_errors(struct scsi_device *);
44extern int scsi_normalize_sense(const u8 *sense_buffer, int sb_len, 43extern int scsi_normalize_sense(const u8 *sense_buffer, int sb_len,
45 struct scsi_sense_hdr *sshdr); 44 struct scsi_sense_hdr *sshdr);
46extern int scsi_request_normalize_sense(struct scsi_request *sreq,
47 struct scsi_sense_hdr *sshdr);
48extern int scsi_command_normalize_sense(struct scsi_cmnd *cmd, 45extern int scsi_command_normalize_sense(struct scsi_cmnd *cmd,
49 struct scsi_sense_hdr *sshdr); 46 struct scsi_sense_hdr *sshdr);
50 47
diff --git a/include/scsi/scsi_request.h b/include/scsi/scsi_request.h
deleted file mode 100644
index 98d69fdb851c..000000000000
--- a/include/scsi/scsi_request.h
+++ /dev/null
@@ -1,54 +0,0 @@
1#ifndef _SCSI_SCSI_REQUEST_H
2#define _SCSI_SCSI_REQUEST_H
3
4#include <scsi/scsi_cmnd.h>
5
6struct request;
7struct scsi_cmnd;
8struct scsi_device;
9struct Scsi_Host;
10
11
12/*
13 * This is essentially a slimmed down version of Scsi_Cmnd. The point of
14 * having this is that requests that are injected into the queue as result
15 * of things like ioctls and character devices shouldn't be using a
16 * Scsi_Cmnd until such a time that the command is actually at the head
17 * of the queue and being sent to the driver.
18 */
19struct scsi_request {
20 int sr_magic;
21 int sr_result; /* Status code from lower level driver */
22 unsigned char sr_sense_buffer[SCSI_SENSE_BUFFERSIZE]; /* obtained by REQUEST SENSE
23 * when CHECK CONDITION is
24 * received on original command
25 * (auto-sense) */
26
27 struct Scsi_Host *sr_host;
28 struct scsi_device *sr_device;
29 struct scsi_cmnd *sr_command;
30 struct request *sr_request; /* A copy of the command we are
31 working on */
32 unsigned sr_bufflen; /* Size of data buffer */
33 void *sr_buffer; /* Data buffer */
34 int sr_allowed;
35 enum dma_data_direction sr_data_direction;
36 unsigned char sr_cmd_len;
37 unsigned char sr_cmnd[MAX_COMMAND_SIZE];
38 void (*sr_done) (struct scsi_cmnd *); /* Mid-level done function */
39 int sr_timeout_per_command;
40 unsigned short sr_use_sg; /* Number of pieces of scatter-gather */
41 unsigned short sr_sglist_len; /* size of malloc'd scatter-gather list */
42 unsigned sr_underflow; /* Return error if less than
43 this amount is transferred */
44 void *upper_private_data; /* reserved for owner (usually upper
45 level driver) of this request */
46};
47
48extern struct scsi_request *scsi_allocate_request(struct scsi_device *, gfp_t);
49extern void scsi_release_request(struct scsi_request *);
50extern void scsi_do_req(struct scsi_request *, const void *cmnd,
51 void *buffer, unsigned bufflen,
52 void (*done) (struct scsi_cmnd *),
53 int timeout, int retries);
54#endif /* _SCSI_SCSI_REQUEST_H */
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h
index b41cf077e54b..b684426a5900 100644
--- a/include/scsi/scsi_transport_iscsi.h
+++ b/include/scsi/scsi_transport_iscsi.h
@@ -2,7 +2,7 @@
2 * iSCSI transport class definitions 2 * iSCSI transport class definitions
3 * 3 *
4 * Copyright (C) IBM Corporation, 2004 4 * Copyright (C) IBM Corporation, 2004
5 * Copyright (C) Mike Christie, 2004 - 2005 5 * Copyright (C) Mike Christie, 2004 - 2006
6 * Copyright (C) Dmitry Yusupov, 2004 - 2005 6 * Copyright (C) Dmitry Yusupov, 2004 - 2005
7 * Copyright (C) Alex Aizman, 2004 - 2005 7 * Copyright (C) Alex Aizman, 2004 - 2005
8 * 8 *
@@ -27,9 +27,13 @@
27#include <scsi/iscsi_if.h> 27#include <scsi/iscsi_if.h>
28 28
29struct scsi_transport_template; 29struct scsi_transport_template;
30struct iscsi_transport;
30struct Scsi_Host; 31struct Scsi_Host;
31struct mempool_zone; 32struct mempool_zone;
32struct iscsi_cls_conn; 33struct iscsi_cls_conn;
34struct iscsi_conn;
35struct iscsi_cmd_task;
36struct iscsi_mgmt_task;
33 37
34/** 38/**
35 * struct iscsi_transport - iSCSI Transport template 39 * struct iscsi_transport - iSCSI Transport template
@@ -46,6 +50,24 @@ struct iscsi_cls_conn;
46 * @start_conn: set connection to be operational 50 * @start_conn: set connection to be operational
47 * @stop_conn: suspend/recover/terminate connection 51 * @stop_conn: suspend/recover/terminate connection
48 * @send_pdu: send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text. 52 * @send_pdu: send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text.
53 * @session_recovery_timedout: notify LLD a block during recovery timed out
54 * @suspend_conn_recv: susepend the recv side of the connection
55 * @termincate_conn: destroy socket connection. Called with mutex lock.
56 * @init_cmd_task: Initialize a iscsi_cmd_task and any internal structs.
57 * Called from queuecommand with session lock held.
58 * @init_mgmt_task: Initialize a iscsi_mgmt_task and any internal structs.
59 * Called from iscsi_conn_send_generic with xmitmutex.
60 * @xmit_cmd_task: Requests LLD to transfer cmd task. Returns 0 or the
61 * the number of bytes transferred on success, and -Exyz
62 * value on error.
63 * @xmit_mgmt_task: Requests LLD to transfer mgmt task. Returns 0 or the
64 * the number of bytes transferred on success, and -Exyz
65 * value on error.
66 * @cleanup_cmd_task: requests LLD to fail cmd task. Called with xmitmutex
67 * and session->lock after the connection has been
68 * suspended and terminated during recovery. If called
69 * from abort task then connection is not suspended
70 * or terminated but sk_callback_lock is held
49 * 71 *
50 * Template API provided by iSCSI Transport 72 * Template API provided by iSCSI Transport
51 */ 73 */
@@ -53,38 +75,58 @@ struct iscsi_transport {
53 struct module *owner; 75 struct module *owner;
54 char *name; 76 char *name;
55 unsigned int caps; 77 unsigned int caps;
78 /* LLD sets this to indicate what values it can export to sysfs */
79 unsigned int param_mask;
56 struct scsi_host_template *host_template; 80 struct scsi_host_template *host_template;
57 /* LLD session/scsi_host data size */
58 int hostdata_size;
59 /* LLD iscsi_host data size */
60 int ihostdata_size;
61 /* LLD connection data size */ 81 /* LLD connection data size */
62 int conndata_size; 82 int conndata_size;
83 /* LLD session data size */
84 int sessiondata_size;
63 int max_lun; 85 int max_lun;
64 unsigned int max_conn; 86 unsigned int max_conn;
65 unsigned int max_cmd_len; 87 unsigned int max_cmd_len;
66 struct iscsi_cls_session *(*create_session) 88 struct iscsi_cls_session *(*create_session) (struct iscsi_transport *it,
67 (struct scsi_transport_template *t, uint32_t sn, uint32_t *sid); 89 struct scsi_transport_template *t, uint32_t sn, uint32_t *hn);
68 void (*destroy_session) (struct iscsi_cls_session *session); 90 void (*destroy_session) (struct iscsi_cls_session *session);
69 struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess, 91 struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess,
70 uint32_t cid); 92 uint32_t cid);
71 int (*bind_conn) (struct iscsi_cls_session *session, 93 int (*bind_conn) (struct iscsi_cls_session *session,
72 struct iscsi_cls_conn *cls_conn, 94 struct iscsi_cls_conn *cls_conn,
73 uint32_t transport_fd, int is_leading); 95 uint64_t transport_eph, int is_leading);
74 int (*start_conn) (struct iscsi_cls_conn *conn); 96 int (*start_conn) (struct iscsi_cls_conn *conn);
75 void (*stop_conn) (struct iscsi_cls_conn *conn, int flag); 97 void (*stop_conn) (struct iscsi_cls_conn *conn, int flag);
76 void (*destroy_conn) (struct iscsi_cls_conn *conn); 98 void (*destroy_conn) (struct iscsi_cls_conn *conn);
77 int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param, 99 int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param,
78 uint32_t value); 100 uint32_t value);
79 int (*get_conn_param) (struct iscsi_cls_conn *conn, 101 int (*get_conn_param) (struct iscsi_cls_conn *conn,
80 enum iscsi_param param, 102 enum iscsi_param param, uint32_t *value);
81 uint32_t *value);
82 int (*get_session_param) (struct iscsi_cls_session *session, 103 int (*get_session_param) (struct iscsi_cls_session *session,
83 enum iscsi_param param, uint32_t *value); 104 enum iscsi_param param, uint32_t *value);
105 int (*get_conn_str_param) (struct iscsi_cls_conn *conn,
106 enum iscsi_param param, char *buf);
107 int (*get_session_str_param) (struct iscsi_cls_session *session,
108 enum iscsi_param param, char *buf);
84 int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, 109 int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
85 char *data, uint32_t data_size); 110 char *data, uint32_t data_size);
86 void (*get_stats) (struct iscsi_cls_conn *conn, 111 void (*get_stats) (struct iscsi_cls_conn *conn,
87 struct iscsi_stats *stats); 112 struct iscsi_stats *stats);
113 void (*suspend_conn_recv) (struct iscsi_conn *conn);
114 void (*terminate_conn) (struct iscsi_conn *conn);
115 void (*init_cmd_task) (struct iscsi_cmd_task *ctask);
116 void (*init_mgmt_task) (struct iscsi_conn *conn,
117 struct iscsi_mgmt_task *mtask,
118 char *data, uint32_t data_size);
119 int (*xmit_cmd_task) (struct iscsi_conn *conn,
120 struct iscsi_cmd_task *ctask);
121 void (*cleanup_cmd_task) (struct iscsi_conn *conn,
122 struct iscsi_cmd_task *ctask);
123 int (*xmit_mgmt_task) (struct iscsi_conn *conn,
124 struct iscsi_mgmt_task *mtask);
125 void (*session_recovery_timedout) (struct iscsi_cls_session *session);
126 int (*ep_connect) (struct sockaddr *dst_addr, int non_blocking,
127 uint64_t *ep_handle);
128 int (*ep_poll) (uint64_t ep_handle, int timeout_ms);
129 void (*ep_disconnect) (uint64_t ep_handle);
88}; 130};
89 131
90/* 132/*
@@ -100,10 +142,26 @@ extern void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error);
100extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, 142extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
101 char *data, uint32_t data_size); 143 char *data, uint32_t data_size);
102 144
145
146/* Connection's states */
147#define ISCSI_CONN_INITIAL_STAGE 0
148#define ISCSI_CONN_STARTED 1
149#define ISCSI_CONN_STOPPED 2
150#define ISCSI_CONN_CLEANUP_WAIT 3
151
103struct iscsi_cls_conn { 152struct iscsi_cls_conn {
104 struct list_head conn_list; /* item in connlist */ 153 struct list_head conn_list; /* item in connlist */
105 void *dd_data; /* LLD private data */ 154 void *dd_data; /* LLD private data */
106 struct iscsi_transport *transport; 155 struct iscsi_transport *transport;
156 uint32_t cid; /* connection id */
157
158 /* portal/group values we got during discovery */
159 char *persistent_address;
160 int persistent_port;
161 /* portal/group values we are currently using */
162 char *address;
163 int port;
164
107 int active; /* must be accessed with the connlock */ 165 int active; /* must be accessed with the connlock */
108 struct device dev; /* sysfs transport/container device */ 166 struct device dev; /* sysfs transport/container device */
109 struct mempool_zone *z_error; 167 struct mempool_zone *z_error;
@@ -114,9 +172,32 @@ struct iscsi_cls_conn {
114#define iscsi_dev_to_conn(_dev) \ 172#define iscsi_dev_to_conn(_dev) \
115 container_of(_dev, struct iscsi_cls_conn, dev) 173 container_of(_dev, struct iscsi_cls_conn, dev)
116 174
175/* Session's states */
176#define ISCSI_STATE_FREE 1
177#define ISCSI_STATE_LOGGED_IN 2
178#define ISCSI_STATE_FAILED 3
179#define ISCSI_STATE_TERMINATE 4
180#define ISCSI_STATE_IN_RECOVERY 5
181#define ISCSI_STATE_RECOVERY_FAILED 6
182
117struct iscsi_cls_session { 183struct iscsi_cls_session {
118 struct list_head sess_list; /* item in session_list */ 184 struct list_head sess_list; /* item in session_list */
185 struct list_head host_list;
119 struct iscsi_transport *transport; 186 struct iscsi_transport *transport;
187
188 /* iSCSI values used as unique id by userspace. */
189 char *targetname;
190 int tpgt;
191
192 /* recovery fields */
193 int recovery_tmo;
194 struct work_struct recovery_work;
195
196 int target_id;
197 int channel;
198
199 int sid; /* session id */
200 void *dd_data; /* LLD private data */
120 struct device dev; /* sysfs transport/container device */ 201 struct device dev; /* sysfs transport/container device */
121}; 202};
122 203
@@ -126,22 +207,22 @@ struct iscsi_cls_session {
126#define iscsi_session_to_shost(_session) \ 207#define iscsi_session_to_shost(_session) \
127 dev_to_shost(_session->dev.parent) 208 dev_to_shost(_session->dev.parent)
128 209
210struct iscsi_host {
211 int next_target_id;
212 struct list_head sessions;
213 struct mutex mutex;
214};
215
129/* 216/*
130 * session and connection functions that can be used by HW iSCSI LLDs 217 * session and connection functions that can be used by HW iSCSI LLDs
131 */ 218 */
132extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost, 219extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost,
133 struct iscsi_transport *t); 220 struct iscsi_transport *t, int channel);
134extern int iscsi_destroy_session(struct iscsi_cls_session *session); 221extern int iscsi_destroy_session(struct iscsi_cls_session *session);
135extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess, 222extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess,
136 uint32_t cid); 223 uint32_t cid);
137extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn); 224extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn);
138 225extern void iscsi_unblock_session(struct iscsi_cls_session *session);
139/* 226extern void iscsi_block_session(struct iscsi_cls_session *session);
140 * session functions used by software iscsi
141 */
142extern struct Scsi_Host *
143iscsi_transport_create_session(struct scsi_transport_template *scsit,
144 struct iscsi_transport *transport);
145extern int iscsi_transport_destroy_session(struct Scsi_Host *shost);
146 227
147#endif 228#endif
diff --git a/include/scsi/sg_request.h b/include/scsi/sg_request.h
deleted file mode 100644
index 57ff525bdd3b..000000000000
--- a/include/scsi/sg_request.h
+++ /dev/null
@@ -1,26 +0,0 @@
1typedef struct scsi_request Scsi_Request;
2
3static Scsi_Request *dummy_cmdp; /* only used for sizeof */
4
5typedef struct sg_scatter_hold { /* holding area for scsi scatter gather info */
6 unsigned short k_use_sg; /* Count of kernel scatter-gather pieces */
7 unsigned short sglist_len; /* size of malloc'd scatter-gather list ++ */
8 unsigned bufflen; /* Size of (aggregate) data buffer */
9 unsigned b_malloc_len; /* actual len malloc'ed in buffer */
10 void *buffer; /* Data buffer or scatter list (k_use_sg>0) */
11 char dio_in_use; /* 0->indirect IO (or mmap), 1->dio */
12 unsigned char cmd_opcode; /* first byte of command */
13} Sg_scatter_hold;
14
15typedef struct sg_request { /* SG_MAX_QUEUE requests outstanding per file */
16 Scsi_Request *my_cmdp; /* != 0 when request with lower levels */
17 struct sg_request *nextrp; /* NULL -> tail request (slist) */
18 struct sg_fd *parentfp; /* NULL -> not in use */
19 Sg_scatter_hold data; /* hold buffer, perhaps scatter list */
20 sg_io_hdr_t header; /* scsi command+info, see <scsi/sg.h> */
21 unsigned char sense_b[sizeof (dummy_cmdp->sr_sense_buffer)];
22 char res_used; /* 1 -> using reserve buffer, 0 -> not ... */
23 char orphan; /* 1 -> drop on sight, 0 -> normal */
24 char sg_io_owned; /* 1 -> packet belongs to SG_IO */
25 volatile char done; /* 0->before bh, 1->before read, 2->read */
26} Sg_request;