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 * maintained by open-iscsi@googlegroups.com
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 #include <linux/types.h>
25 #include <linux/kfifo.h>
26 #include <linux/delay.h>
27 #include <linux/log2.h>
28 #include <asm/unaligned.h>
30 #include <scsi/scsi_cmnd.h>
31 #include <scsi/scsi_device.h>
32 #include <scsi/scsi_eh.h>
33 #include <scsi/scsi_tcq.h>
34 #include <scsi/scsi_host.h>
35 #include <scsi/scsi.h>
36 #include <scsi/iscsi_proto.h>
37 #include <scsi/scsi_transport.h>
38 #include <scsi/scsi_transport_iscsi.h>
39 #include <scsi/libiscsi.h>
41 static int iscsi_dbg_lib_conn
;
42 module_param_named(debug_libiscsi_conn
, iscsi_dbg_lib_conn
, int,
44 MODULE_PARM_DESC(debug_libiscsi_conn
,
45 "Turn on debugging for connections in libiscsi module. "
46 "Set to 1 to turn on, and zero to turn off. Default is off.");
48 static int iscsi_dbg_lib_session
;
49 module_param_named(debug_libiscsi_session
, iscsi_dbg_lib_session
, int,
51 MODULE_PARM_DESC(debug_libiscsi_session
,
52 "Turn on debugging for sessions in libiscsi module. "
53 "Set to 1 to turn on, and zero to turn off. Default is off.");
55 static int iscsi_dbg_lib_eh
;
56 module_param_named(debug_libiscsi_eh
, iscsi_dbg_lib_eh
, int,
58 MODULE_PARM_DESC(debug_libiscsi_eh
,
59 "Turn on debugging for error handling in libiscsi module. "
60 "Set to 1 to turn on, and zero to turn off. Default is off.");
62 #define ISCSI_DBG_CONN(_conn, dbg_fmt, arg...) \
64 if (iscsi_dbg_lib_conn) \
65 iscsi_conn_printk(KERN_INFO, _conn, \
70 #define ISCSI_DBG_SESSION(_session, dbg_fmt, arg...) \
72 if (iscsi_dbg_lib_session) \
73 iscsi_session_printk(KERN_INFO, _session, \
78 #define ISCSI_DBG_EH(_session, dbg_fmt, arg...) \
80 if (iscsi_dbg_lib_eh) \
81 iscsi_session_printk(KERN_INFO, _session, \
86 /* Serial Number Arithmetic, 32 bits, less than, RFC1982 */
87 #define SNA32_CHECK 2147483648UL
89 static int iscsi_sna_lt(u32 n1
, u32 n2
)
91 return n1
!= n2
&& ((n1
< n2
&& (n2
- n1
< SNA32_CHECK
)) ||
92 (n1
> n2
&& (n2
- n1
< SNA32_CHECK
)));
95 /* Serial Number Arithmetic, 32 bits, less than, RFC1982 */
96 static int iscsi_sna_lte(u32 n1
, u32 n2
)
98 return n1
== n2
|| ((n1
< n2
&& (n2
- n1
< SNA32_CHECK
)) ||
99 (n1
> n2
&& (n2
- n1
< SNA32_CHECK
)));
102 inline void iscsi_conn_queue_work(struct iscsi_conn
*conn
)
104 struct Scsi_Host
*shost
= conn
->session
->host
;
105 struct iscsi_host
*ihost
= shost_priv(shost
);
108 queue_work(ihost
->workq
, &conn
->xmitwork
);
110 EXPORT_SYMBOL_GPL(iscsi_conn_queue_work
);
112 static void __iscsi_update_cmdsn(struct iscsi_session
*session
,
113 uint32_t exp_cmdsn
, uint32_t max_cmdsn
)
116 * standard specifies this check for when to update expected and
117 * max sequence numbers
119 if (iscsi_sna_lt(max_cmdsn
, exp_cmdsn
- 1))
122 if (exp_cmdsn
!= session
->exp_cmdsn
&&
123 !iscsi_sna_lt(exp_cmdsn
, session
->exp_cmdsn
))
124 session
->exp_cmdsn
= exp_cmdsn
;
126 if (max_cmdsn
!= session
->max_cmdsn
&&
127 !iscsi_sna_lt(max_cmdsn
, session
->max_cmdsn
)) {
128 session
->max_cmdsn
= max_cmdsn
;
130 * if the window closed with IO queued, then kick the
133 if (!list_empty(&session
->leadconn
->cmdqueue
) ||
134 !list_empty(&session
->leadconn
->mgmtqueue
))
135 iscsi_conn_queue_work(session
->leadconn
);
139 void iscsi_update_cmdsn(struct iscsi_session
*session
, struct iscsi_nopin
*hdr
)
141 __iscsi_update_cmdsn(session
, be32_to_cpu(hdr
->exp_cmdsn
),
142 be32_to_cpu(hdr
->max_cmdsn
));
144 EXPORT_SYMBOL_GPL(iscsi_update_cmdsn
);
147 * iscsi_prep_data_out_pdu - initialize Data-Out
148 * @task: scsi command task
150 * @hdr: iscsi data in pdu
153 * Initialize Data-Out within this R2T sequence and finds
154 * proper data_offset within this SCSI command.
156 * This function is called with connection lock taken.
158 void iscsi_prep_data_out_pdu(struct iscsi_task
*task
, struct iscsi_r2t_info
*r2t
,
159 struct iscsi_data
*hdr
)
161 struct iscsi_conn
*conn
= task
->conn
;
162 unsigned int left
= r2t
->data_length
- r2t
->sent
;
164 task
->hdr_len
= sizeof(struct iscsi_data
);
166 memset(hdr
, 0, sizeof(struct iscsi_data
));
168 hdr
->datasn
= cpu_to_be32(r2t
->datasn
);
170 hdr
->opcode
= ISCSI_OP_SCSI_DATA_OUT
;
171 memcpy(hdr
->lun
, task
->lun
, sizeof(hdr
->lun
));
172 hdr
->itt
= task
->hdr_itt
;
173 hdr
->exp_statsn
= r2t
->exp_statsn
;
174 hdr
->offset
= cpu_to_be32(r2t
->data_offset
+ r2t
->sent
);
175 if (left
> conn
->max_xmit_dlength
) {
176 hton24(hdr
->dlength
, conn
->max_xmit_dlength
);
177 r2t
->data_count
= conn
->max_xmit_dlength
;
180 hton24(hdr
->dlength
, left
);
181 r2t
->data_count
= left
;
182 hdr
->flags
= ISCSI_FLAG_CMD_FINAL
;
184 conn
->dataout_pdus_cnt
++;
186 EXPORT_SYMBOL_GPL(iscsi_prep_data_out_pdu
);
188 static int iscsi_add_hdr(struct iscsi_task
*task
, unsigned len
)
190 unsigned exp_len
= task
->hdr_len
+ len
;
192 if (exp_len
> task
->hdr_max
) {
197 WARN_ON(len
& (ISCSI_PAD_LEN
- 1)); /* caller must pad the AHS */
198 task
->hdr_len
= exp_len
;
203 * make an extended cdb AHS
205 static int iscsi_prep_ecdb_ahs(struct iscsi_task
*task
)
207 struct scsi_cmnd
*cmd
= task
->sc
;
208 unsigned rlen
, pad_len
;
209 unsigned short ahslength
;
210 struct iscsi_ecdb_ahdr
*ecdb_ahdr
;
213 ecdb_ahdr
= iscsi_next_hdr(task
);
214 rlen
= cmd
->cmd_len
- ISCSI_CDB_SIZE
;
216 BUG_ON(rlen
> sizeof(ecdb_ahdr
->ecdb
));
217 ahslength
= rlen
+ sizeof(ecdb_ahdr
->reserved
);
219 pad_len
= iscsi_padding(rlen
);
221 rc
= iscsi_add_hdr(task
, sizeof(ecdb_ahdr
->ahslength
) +
222 sizeof(ecdb_ahdr
->ahstype
) + ahslength
+ pad_len
);
227 memset(&ecdb_ahdr
->ecdb
[rlen
], 0, pad_len
);
229 ecdb_ahdr
->ahslength
= cpu_to_be16(ahslength
);
230 ecdb_ahdr
->ahstype
= ISCSI_AHSTYPE_CDB
;
231 ecdb_ahdr
->reserved
= 0;
232 memcpy(ecdb_ahdr
->ecdb
, cmd
->cmnd
+ ISCSI_CDB_SIZE
, rlen
);
234 ISCSI_DBG_SESSION(task
->conn
->session
,
235 "iscsi_prep_ecdb_ahs: varlen_cdb_len %d "
236 "rlen %d pad_len %d ahs_length %d iscsi_headers_size "
237 "%u\n", cmd
->cmd_len
, rlen
, pad_len
, ahslength
,
242 static int iscsi_prep_bidi_ahs(struct iscsi_task
*task
)
244 struct scsi_cmnd
*sc
= task
->sc
;
245 struct iscsi_rlength_ahdr
*rlen_ahdr
;
248 rlen_ahdr
= iscsi_next_hdr(task
);
249 rc
= iscsi_add_hdr(task
, sizeof(*rlen_ahdr
));
253 rlen_ahdr
->ahslength
=
254 cpu_to_be16(sizeof(rlen_ahdr
->read_length
) +
255 sizeof(rlen_ahdr
->reserved
));
256 rlen_ahdr
->ahstype
= ISCSI_AHSTYPE_RLENGTH
;
257 rlen_ahdr
->reserved
= 0;
258 rlen_ahdr
->read_length
= cpu_to_be32(scsi_in(sc
)->length
);
260 ISCSI_DBG_SESSION(task
->conn
->session
,
261 "bidi-in rlen_ahdr->read_length(%d) "
262 "rlen_ahdr->ahslength(%d)\n",
263 be32_to_cpu(rlen_ahdr
->read_length
),
264 be16_to_cpu(rlen_ahdr
->ahslength
));
269 * iscsi_prep_scsi_cmd_pdu - prep iscsi scsi cmd pdu
272 * Prep basic iSCSI PDU fields for a scsi cmd pdu. The LLD should set
273 * fields like dlength or final based on how much data it sends
275 static int iscsi_prep_scsi_cmd_pdu(struct iscsi_task
*task
)
277 struct iscsi_conn
*conn
= task
->conn
;
278 struct iscsi_session
*session
= conn
->session
;
279 struct scsi_cmnd
*sc
= task
->sc
;
280 struct iscsi_cmd
*hdr
;
281 unsigned hdrlength
, cmd_len
;
285 if (conn
->session
->tt
->alloc_pdu
) {
286 rc
= conn
->session
->tt
->alloc_pdu(task
, ISCSI_OP_SCSI_CMD
);
290 hdr
= (struct iscsi_cmd
*) task
->hdr
;
292 memset(hdr
, 0, sizeof(*hdr
));
294 if (session
->tt
->parse_pdu_itt
)
295 hdr
->itt
= task
->hdr_itt
= itt
;
297 hdr
->itt
= task
->hdr_itt
= build_itt(task
->itt
,
298 task
->conn
->session
->age
);
300 rc
= iscsi_add_hdr(task
, sizeof(*hdr
));
303 hdr
->opcode
= ISCSI_OP_SCSI_CMD
;
304 hdr
->flags
= ISCSI_ATTR_SIMPLE
;
305 int_to_scsilun(sc
->device
->lun
, (struct scsi_lun
*)hdr
->lun
);
306 memcpy(task
->lun
, hdr
->lun
, sizeof(task
->lun
));
307 hdr
->exp_statsn
= cpu_to_be32(conn
->exp_statsn
);
308 cmd_len
= sc
->cmd_len
;
309 if (cmd_len
< ISCSI_CDB_SIZE
)
310 memset(&hdr
->cdb
[cmd_len
], 0, ISCSI_CDB_SIZE
- cmd_len
);
311 else if (cmd_len
> ISCSI_CDB_SIZE
) {
312 rc
= iscsi_prep_ecdb_ahs(task
);
315 cmd_len
= ISCSI_CDB_SIZE
;
317 memcpy(hdr
->cdb
, sc
->cmnd
, cmd_len
);
320 if (scsi_bidi_cmnd(sc
)) {
321 hdr
->flags
|= ISCSI_FLAG_CMD_READ
;
322 rc
= iscsi_prep_bidi_ahs(task
);
326 if (sc
->sc_data_direction
== DMA_TO_DEVICE
) {
327 unsigned out_len
= scsi_out(sc
)->length
;
328 struct iscsi_r2t_info
*r2t
= &task
->unsol_r2t
;
330 hdr
->data_length
= cpu_to_be32(out_len
);
331 hdr
->flags
|= ISCSI_FLAG_CMD_WRITE
;
335 * imm_count bytes to be sent right after
338 * unsol_count bytes(as Data-Out) to be sent
339 * without R2T ack right after
342 * r2t data_length bytes to be sent via R2T ack's
344 * pad_count bytes to be sent as zero-padding
346 memset(r2t
, 0, sizeof(*r2t
));
348 if (session
->imm_data_en
) {
349 if (out_len
>= session
->first_burst
)
350 task
->imm_count
= min(session
->first_burst
,
351 conn
->max_xmit_dlength
);
353 task
->imm_count
= min(out_len
,
354 conn
->max_xmit_dlength
);
355 hton24(hdr
->dlength
, task
->imm_count
);
357 zero_data(hdr
->dlength
);
359 if (!session
->initial_r2t_en
) {
360 r2t
->data_length
= min(session
->first_burst
, out_len
) -
362 r2t
->data_offset
= task
->imm_count
;
363 r2t
->ttt
= cpu_to_be32(ISCSI_RESERVED_TAG
);
364 r2t
->exp_statsn
= cpu_to_be32(conn
->exp_statsn
);
367 if (!task
->unsol_r2t
.data_length
)
368 /* No unsolicit Data-Out's */
369 hdr
->flags
|= ISCSI_FLAG_CMD_FINAL
;
371 hdr
->flags
|= ISCSI_FLAG_CMD_FINAL
;
372 zero_data(hdr
->dlength
);
373 hdr
->data_length
= cpu_to_be32(scsi_in(sc
)->length
);
375 if (sc
->sc_data_direction
== DMA_FROM_DEVICE
)
376 hdr
->flags
|= ISCSI_FLAG_CMD_READ
;
379 /* calculate size of additional header segments (AHSs) */
380 hdrlength
= task
->hdr_len
- sizeof(*hdr
);
382 WARN_ON(hdrlength
& (ISCSI_PAD_LEN
-1));
383 hdrlength
/= ISCSI_PAD_LEN
;
385 WARN_ON(hdrlength
>= 256);
386 hdr
->hlength
= hdrlength
& 0xFF;
388 if (session
->tt
->init_task
&& session
->tt
->init_task(task
))
391 task
->state
= ISCSI_TASK_RUNNING
;
392 hdr
->cmdsn
= task
->cmdsn
= cpu_to_be32(session
->cmdsn
);
395 conn
->scsicmd_pdus_cnt
++;
396 ISCSI_DBG_SESSION(session
, "iscsi prep [%s cid %d sc %p cdb 0x%x "
397 "itt 0x%x len %d bidi_len %d cmdsn %d win %d]\n",
398 scsi_bidi_cmnd(sc
) ? "bidirectional" :
399 sc
->sc_data_direction
== DMA_TO_DEVICE
?
400 "write" : "read", conn
->id
, sc
, sc
->cmnd
[0],
401 task
->itt
, scsi_bufflen(sc
),
402 scsi_bidi_cmnd(sc
) ? scsi_in(sc
)->length
: 0,
404 session
->max_cmdsn
- session
->exp_cmdsn
+ 1);
409 * iscsi_free_task - free a task
410 * @task: iscsi cmd task
412 * Must be called with session lock.
413 * This function returns the scsi command to scsi-ml or cleans
414 * up mgmt tasks then returns the task to the pool.
416 static void iscsi_free_task(struct iscsi_task
*task
)
418 struct iscsi_conn
*conn
= task
->conn
;
419 struct iscsi_session
*session
= conn
->session
;
420 struct scsi_cmnd
*sc
= task
->sc
;
422 ISCSI_DBG_SESSION(session
, "freeing task itt 0x%x state %d sc %p\n",
423 task
->itt
, task
->state
, task
->sc
);
425 session
->tt
->cleanup_task(task
);
426 task
->state
= ISCSI_TASK_FREE
;
429 * login task is preallocated so do not free
431 if (conn
->login_task
== task
)
434 __kfifo_put(session
->cmdpool
.queue
, (void*)&task
, sizeof(void*));
438 /* SCSI eh reuses commands to verify us */
441 * queue command may call this to free the task, but
442 * not have setup the sc callback
449 void __iscsi_get_task(struct iscsi_task
*task
)
451 atomic_inc(&task
->refcount
);
453 EXPORT_SYMBOL_GPL(__iscsi_get_task
);
455 static void __iscsi_put_task(struct iscsi_task
*task
)
457 if (atomic_dec_and_test(&task
->refcount
))
458 iscsi_free_task(task
);
461 void iscsi_put_task(struct iscsi_task
*task
)
463 struct iscsi_session
*session
= task
->conn
->session
;
465 spin_lock_bh(&session
->lock
);
466 __iscsi_put_task(task
);
467 spin_unlock_bh(&session
->lock
);
469 EXPORT_SYMBOL_GPL(iscsi_put_task
);
472 * iscsi_complete_task - finish a task
473 * @task: iscsi cmd task
474 * @state: state to complete task with
476 * Must be called with session lock.
478 static void iscsi_complete_task(struct iscsi_task
*task
, int state
)
480 struct iscsi_conn
*conn
= task
->conn
;
482 ISCSI_DBG_SESSION(conn
->session
,
483 "complete task itt 0x%x state %d sc %p\n",
484 task
->itt
, task
->state
, task
->sc
);
485 if (task
->state
== ISCSI_TASK_COMPLETED
||
486 task
->state
== ISCSI_TASK_ABRT_TMF
||
487 task
->state
== ISCSI_TASK_ABRT_SESS_RECOV
)
489 WARN_ON_ONCE(task
->state
== ISCSI_TASK_FREE
);
492 if (!list_empty(&task
->running
))
493 list_del_init(&task
->running
);
495 if (conn
->task
== task
)
498 if (conn
->ping_task
== task
)
499 conn
->ping_task
= NULL
;
501 /* release get from queueing */
502 __iscsi_put_task(task
);
506 * iscsi_complete_scsi_task - finish scsi task normally
507 * @task: iscsi task for scsi cmd
508 * @exp_cmdsn: expected cmd sn in cpu format
509 * @max_cmdsn: max cmd sn in cpu format
511 * This is used when drivers do not need or cannot perform
512 * lower level pdu processing.
514 * Called with session lock
516 void iscsi_complete_scsi_task(struct iscsi_task
*task
,
517 uint32_t exp_cmdsn
, uint32_t max_cmdsn
)
519 struct iscsi_conn
*conn
= task
->conn
;
521 ISCSI_DBG_SESSION(conn
->session
, "[itt 0x%x]\n", task
->itt
);
523 conn
->last_recv
= jiffies
;
524 __iscsi_update_cmdsn(conn
->session
, exp_cmdsn
, max_cmdsn
);
525 iscsi_complete_task(task
, ISCSI_TASK_COMPLETED
);
527 EXPORT_SYMBOL_GPL(iscsi_complete_scsi_task
);
531 * session lock must be held and if not called for a task that is
532 * still pending or from the xmit thread, then xmit thread must
535 static void fail_scsi_task(struct iscsi_task
*task
, int err
)
537 struct iscsi_conn
*conn
= task
->conn
;
538 struct scsi_cmnd
*sc
;
542 * if a command completes and we get a successful tmf response
543 * we will hit this because the scsi eh abort code does not take
550 if (task
->state
== ISCSI_TASK_PENDING
) {
552 * cmd never made it to the xmit thread, so we should not count
553 * the cmd in the sequencing
555 conn
->session
->queued_cmdsn
--;
556 /* it was never sent so just complete like normal */
557 state
= ISCSI_TASK_COMPLETED
;
558 } else if (err
== DID_TRANSPORT_DISRUPTED
)
559 state
= ISCSI_TASK_ABRT_SESS_RECOV
;
561 state
= ISCSI_TASK_ABRT_TMF
;
563 sc
->result
= err
<< 16;
564 if (!scsi_bidi_cmnd(sc
))
565 scsi_set_resid(sc
, scsi_bufflen(sc
));
567 scsi_out(sc
)->resid
= scsi_out(sc
)->length
;
568 scsi_in(sc
)->resid
= scsi_in(sc
)->length
;
571 iscsi_complete_task(task
, state
);
574 static int iscsi_prep_mgmt_task(struct iscsi_conn
*conn
,
575 struct iscsi_task
*task
)
577 struct iscsi_session
*session
= conn
->session
;
578 struct iscsi_hdr
*hdr
= task
->hdr
;
579 struct iscsi_nopout
*nop
= (struct iscsi_nopout
*)hdr
;
581 if (conn
->session
->state
== ISCSI_STATE_LOGGING_OUT
)
584 if (hdr
->opcode
!= (ISCSI_OP_LOGIN
| ISCSI_OP_IMMEDIATE
) &&
585 hdr
->opcode
!= (ISCSI_OP_TEXT
| ISCSI_OP_IMMEDIATE
))
586 nop
->exp_statsn
= cpu_to_be32(conn
->exp_statsn
);
588 * pre-format CmdSN for outgoing PDU.
590 nop
->cmdsn
= cpu_to_be32(session
->cmdsn
);
591 if (hdr
->itt
!= RESERVED_ITT
) {
593 * TODO: We always use immediate, so we never hit this.
594 * If we start to send tmfs or nops as non-immediate then
595 * we should start checking the cmdsn numbers for mgmt tasks.
597 if (conn
->c_stage
== ISCSI_CONN_STARTED
&&
598 !(hdr
->opcode
& ISCSI_OP_IMMEDIATE
)) {
599 session
->queued_cmdsn
++;
604 if (session
->tt
->init_task
&& session
->tt
->init_task(task
))
607 if ((hdr
->opcode
& ISCSI_OPCODE_MASK
) == ISCSI_OP_LOGOUT
)
608 session
->state
= ISCSI_STATE_LOGGING_OUT
;
610 task
->state
= ISCSI_TASK_RUNNING
;
611 ISCSI_DBG_SESSION(session
, "mgmtpdu [op 0x%x hdr->itt 0x%x "
612 "datalen %d]\n", hdr
->opcode
& ISCSI_OPCODE_MASK
,
613 hdr
->itt
, task
->data_count
);
617 static struct iscsi_task
*
618 __iscsi_conn_send_pdu(struct iscsi_conn
*conn
, struct iscsi_hdr
*hdr
,
619 char *data
, uint32_t data_size
)
621 struct iscsi_session
*session
= conn
->session
;
622 struct iscsi_host
*ihost
= shost_priv(session
->host
);
623 struct iscsi_task
*task
;
626 if (session
->state
== ISCSI_STATE_TERMINATE
)
629 if (hdr
->opcode
== (ISCSI_OP_LOGIN
| ISCSI_OP_IMMEDIATE
) ||
630 hdr
->opcode
== (ISCSI_OP_TEXT
| ISCSI_OP_IMMEDIATE
))
632 * Login and Text are sent serially, in
633 * request-followed-by-response sequence.
634 * Same task can be used. Same ITT must be used.
635 * Note that login_task is preallocated at conn_create().
637 task
= conn
->login_task
;
639 if (session
->state
!= ISCSI_STATE_LOGGED_IN
)
642 BUG_ON(conn
->c_stage
== ISCSI_CONN_INITIAL_STAGE
);
643 BUG_ON(conn
->c_stage
== ISCSI_CONN_STOPPED
);
645 if (!__kfifo_get(session
->cmdpool
.queue
,
646 (void*)&task
, sizeof(void*)))
650 * released in complete pdu for task we expect a response for, and
651 * released by the lld when it has transmitted the task for
652 * pdus we do not expect a response for.
654 atomic_set(&task
->refcount
, 1);
657 INIT_LIST_HEAD(&task
->running
);
658 task
->state
= ISCSI_TASK_PENDING
;
661 memcpy(task
->data
, data
, data_size
);
662 task
->data_count
= data_size
;
664 task
->data_count
= 0;
666 if (conn
->session
->tt
->alloc_pdu
) {
667 if (conn
->session
->tt
->alloc_pdu(task
, hdr
->opcode
)) {
668 iscsi_conn_printk(KERN_ERR
, conn
, "Could not allocate "
669 "pdu for mgmt task.\n");
674 itt
= task
->hdr
->itt
;
675 task
->hdr_len
= sizeof(struct iscsi_hdr
);
676 memcpy(task
->hdr
, hdr
, sizeof(struct iscsi_hdr
));
678 if (hdr
->itt
!= RESERVED_ITT
) {
679 if (session
->tt
->parse_pdu_itt
)
680 task
->hdr
->itt
= itt
;
682 task
->hdr
->itt
= build_itt(task
->itt
,
683 task
->conn
->session
->age
);
687 if (iscsi_prep_mgmt_task(conn
, task
))
690 if (session
->tt
->xmit_task(task
))
693 list_add_tail(&task
->running
, &conn
->mgmtqueue
);
694 iscsi_conn_queue_work(conn
);
700 __iscsi_put_task(task
);
704 int iscsi_conn_send_pdu(struct iscsi_cls_conn
*cls_conn
, struct iscsi_hdr
*hdr
,
705 char *data
, uint32_t data_size
)
707 struct iscsi_conn
*conn
= cls_conn
->dd_data
;
708 struct iscsi_session
*session
= conn
->session
;
711 spin_lock_bh(&session
->lock
);
712 if (!__iscsi_conn_send_pdu(conn
, hdr
, data
, data_size
))
714 spin_unlock_bh(&session
->lock
);
717 EXPORT_SYMBOL_GPL(iscsi_conn_send_pdu
);
720 * iscsi_cmd_rsp - SCSI Command Response processing
721 * @conn: iscsi connection
723 * @task: scsi command task
724 * @data: cmd data buffer
725 * @datalen: len of buffer
727 * iscsi_cmd_rsp sets up the scsi_cmnd fields based on the PDU and
728 * then completes the command and task.
730 static void iscsi_scsi_cmd_rsp(struct iscsi_conn
*conn
, struct iscsi_hdr
*hdr
,
731 struct iscsi_task
*task
, char *data
,
734 struct iscsi_cmd_rsp
*rhdr
= (struct iscsi_cmd_rsp
*)hdr
;
735 struct iscsi_session
*session
= conn
->session
;
736 struct scsi_cmnd
*sc
= task
->sc
;
738 iscsi_update_cmdsn(session
, (struct iscsi_nopin
*)rhdr
);
739 conn
->exp_statsn
= be32_to_cpu(rhdr
->statsn
) + 1;
741 sc
->result
= (DID_OK
<< 16) | rhdr
->cmd_status
;
743 if (rhdr
->response
!= ISCSI_STATUS_CMD_COMPLETED
) {
744 sc
->result
= DID_ERROR
<< 16;
748 if (rhdr
->cmd_status
== SAM_STAT_CHECK_CONDITION
) {
753 iscsi_conn_printk(KERN_ERR
, conn
,
754 "Got CHECK_CONDITION but invalid data "
755 "buffer size of %d\n", datalen
);
756 sc
->result
= DID_BAD_TARGET
<< 16;
760 senselen
= get_unaligned_be16(data
);
761 if (datalen
< senselen
)
762 goto invalid_datalen
;
764 memcpy(sc
->sense_buffer
, data
+ 2,
765 min_t(uint16_t, senselen
, SCSI_SENSE_BUFFERSIZE
));
766 ISCSI_DBG_SESSION(session
, "copied %d bytes of sense\n",
767 min_t(uint16_t, senselen
,
768 SCSI_SENSE_BUFFERSIZE
));
771 if (rhdr
->flags
& (ISCSI_FLAG_CMD_BIDI_UNDERFLOW
|
772 ISCSI_FLAG_CMD_BIDI_OVERFLOW
)) {
773 int res_count
= be32_to_cpu(rhdr
->bi_residual_count
);
775 if (scsi_bidi_cmnd(sc
) && res_count
> 0 &&
776 (rhdr
->flags
& ISCSI_FLAG_CMD_BIDI_OVERFLOW
||
777 res_count
<= scsi_in(sc
)->length
))
778 scsi_in(sc
)->resid
= res_count
;
780 sc
->result
= (DID_BAD_TARGET
<< 16) | rhdr
->cmd_status
;
783 if (rhdr
->flags
& (ISCSI_FLAG_CMD_UNDERFLOW
|
784 ISCSI_FLAG_CMD_OVERFLOW
)) {
785 int res_count
= be32_to_cpu(rhdr
->residual_count
);
788 (rhdr
->flags
& ISCSI_FLAG_CMD_OVERFLOW
||
789 res_count
<= scsi_bufflen(sc
)))
790 /* write side for bidi or uni-io set_resid */
791 scsi_set_resid(sc
, res_count
);
793 sc
->result
= (DID_BAD_TARGET
<< 16) | rhdr
->cmd_status
;
796 ISCSI_DBG_SESSION(session
, "cmd rsp done [sc %p res %d itt 0x%x]\n",
797 sc
, sc
->result
, task
->itt
);
798 conn
->scsirsp_pdus_cnt
++;
799 iscsi_complete_task(task
, ISCSI_TASK_COMPLETED
);
803 * iscsi_data_in_rsp - SCSI Data-In Response processing
804 * @conn: iscsi connection
806 * @task: scsi command task
809 iscsi_data_in_rsp(struct iscsi_conn
*conn
, struct iscsi_hdr
*hdr
,
810 struct iscsi_task
*task
)
812 struct iscsi_data_rsp
*rhdr
= (struct iscsi_data_rsp
*)hdr
;
813 struct scsi_cmnd
*sc
= task
->sc
;
815 if (!(rhdr
->flags
& ISCSI_FLAG_DATA_STATUS
))
818 iscsi_update_cmdsn(conn
->session
, (struct iscsi_nopin
*)hdr
);
819 sc
->result
= (DID_OK
<< 16) | rhdr
->cmd_status
;
820 conn
->exp_statsn
= be32_to_cpu(rhdr
->statsn
) + 1;
821 if (rhdr
->flags
& (ISCSI_FLAG_DATA_UNDERFLOW
|
822 ISCSI_FLAG_DATA_OVERFLOW
)) {
823 int res_count
= be32_to_cpu(rhdr
->residual_count
);
826 (rhdr
->flags
& ISCSI_FLAG_CMD_OVERFLOW
||
827 res_count
<= scsi_in(sc
)->length
))
828 scsi_in(sc
)->resid
= res_count
;
830 sc
->result
= (DID_BAD_TARGET
<< 16) | rhdr
->cmd_status
;
833 ISCSI_DBG_SESSION(conn
->session
, "data in with status done "
834 "[sc %p res %d itt 0x%x]\n",
835 sc
, sc
->result
, task
->itt
);
836 conn
->scsirsp_pdus_cnt
++;
837 iscsi_complete_task(task
, ISCSI_TASK_COMPLETED
);
840 static void iscsi_tmf_rsp(struct iscsi_conn
*conn
, struct iscsi_hdr
*hdr
)
842 struct iscsi_tm_rsp
*tmf
= (struct iscsi_tm_rsp
*)hdr
;
844 conn
->exp_statsn
= be32_to_cpu(hdr
->statsn
) + 1;
845 conn
->tmfrsp_pdus_cnt
++;
847 if (conn
->tmf_state
!= TMF_QUEUED
)
850 if (tmf
->response
== ISCSI_TMF_RSP_COMPLETE
)
851 conn
->tmf_state
= TMF_SUCCESS
;
852 else if (tmf
->response
== ISCSI_TMF_RSP_NO_TASK
)
853 conn
->tmf_state
= TMF_NOT_FOUND
;
855 conn
->tmf_state
= TMF_FAILED
;
856 wake_up(&conn
->ehwait
);
859 static void iscsi_send_nopout(struct iscsi_conn
*conn
, struct iscsi_nopin
*rhdr
)
861 struct iscsi_nopout hdr
;
862 struct iscsi_task
*task
;
864 if (!rhdr
&& conn
->ping_task
)
867 memset(&hdr
, 0, sizeof(struct iscsi_nopout
));
868 hdr
.opcode
= ISCSI_OP_NOOP_OUT
| ISCSI_OP_IMMEDIATE
;
869 hdr
.flags
= ISCSI_FLAG_CMD_FINAL
;
872 memcpy(hdr
.lun
, rhdr
->lun
, 8);
874 hdr
.itt
= RESERVED_ITT
;
876 hdr
.ttt
= RESERVED_ITT
;
878 task
= __iscsi_conn_send_pdu(conn
, (struct iscsi_hdr
*)&hdr
, NULL
, 0);
880 iscsi_conn_printk(KERN_ERR
, conn
, "Could not send nopout\n");
882 /* only track our nops */
883 conn
->ping_task
= task
;
884 conn
->last_ping
= jiffies
;
888 static int iscsi_nop_out_rsp(struct iscsi_task
*task
,
889 struct iscsi_nopin
*nop
, char *data
, int datalen
)
891 struct iscsi_conn
*conn
= task
->conn
;
894 if (conn
->ping_task
!= task
) {
896 * If this is not in response to one of our
897 * nops then it must be from userspace.
899 if (iscsi_recv_pdu(conn
->cls_conn
, (struct iscsi_hdr
*)nop
,
901 rc
= ISCSI_ERR_CONN_FAILED
;
903 mod_timer(&conn
->transport_timer
, jiffies
+ conn
->recv_timeout
);
904 iscsi_complete_task(task
, ISCSI_TASK_COMPLETED
);
908 static int iscsi_handle_reject(struct iscsi_conn
*conn
, struct iscsi_hdr
*hdr
,
909 char *data
, int datalen
)
911 struct iscsi_reject
*reject
= (struct iscsi_reject
*)hdr
;
912 struct iscsi_hdr rejected_pdu
;
915 conn
->exp_statsn
= be32_to_cpu(reject
->statsn
) + 1;
917 if (ntoh24(reject
->dlength
) > datalen
||
918 ntoh24(reject
->dlength
) < sizeof(struct iscsi_hdr
)) {
919 iscsi_conn_printk(KERN_ERR
, conn
, "Cannot handle rejected "
920 "pdu. Invalid data length (pdu dlength "
921 "%u, datalen %d\n", ntoh24(reject
->dlength
),
923 return ISCSI_ERR_PROTO
;
925 memcpy(&rejected_pdu
, data
, sizeof(struct iscsi_hdr
));
926 opcode
= rejected_pdu
.opcode
& ISCSI_OPCODE_MASK
;
928 switch (reject
->reason
) {
929 case ISCSI_REASON_DATA_DIGEST_ERROR
:
930 iscsi_conn_printk(KERN_ERR
, conn
,
931 "pdu (op 0x%x itt 0x%x) rejected "
932 "due to DataDigest error.\n",
933 rejected_pdu
.itt
, opcode
);
935 case ISCSI_REASON_IMM_CMD_REJECT
:
936 iscsi_conn_printk(KERN_ERR
, conn
,
937 "pdu (op 0x%x itt 0x%x) rejected. Too many "
938 "immediate commands.\n",
939 rejected_pdu
.itt
, opcode
);
941 * We only send one TMF at a time so if the target could not
942 * handle it, then it should get fixed (RFC mandates that
943 * a target can handle one immediate TMF per conn).
945 * For nops-outs, we could have sent more than one if
946 * the target is sending us lots of nop-ins
948 if (opcode
!= ISCSI_OP_NOOP_OUT
)
951 if (rejected_pdu
.itt
== cpu_to_be32(ISCSI_RESERVED_TAG
))
953 * nop-out in response to target's nop-out rejected.
956 iscsi_send_nopout(conn
,
957 (struct iscsi_nopin
*)&rejected_pdu
);
959 struct iscsi_task
*task
;
961 * Our nop as ping got dropped. We know the target
962 * and transport are ok so just clean up
964 task
= iscsi_itt_to_task(conn
, rejected_pdu
.itt
);
966 iscsi_conn_printk(KERN_ERR
, conn
,
967 "Invalid pdu reject. Could "
968 "not lookup rejected task.\n");
969 rc
= ISCSI_ERR_BAD_ITT
;
971 rc
= iscsi_nop_out_rsp(task
,
972 (struct iscsi_nopin
*)&rejected_pdu
,
977 iscsi_conn_printk(KERN_ERR
, conn
,
978 "pdu (op 0x%x itt 0x%x) rejected. Reason "
979 "code 0x%x\n", rejected_pdu
.itt
,
980 rejected_pdu
.opcode
, reject
->reason
);
987 * iscsi_itt_to_task - look up task by itt
988 * @conn: iscsi connection
991 * This should be used for mgmt tasks like login and nops, or if
992 * the LDD's itt space does not include the session age.
994 * The session lock must be held.
996 struct iscsi_task
*iscsi_itt_to_task(struct iscsi_conn
*conn
, itt_t itt
)
998 struct iscsi_session
*session
= conn
->session
;
1001 if (itt
== RESERVED_ITT
)
1004 if (session
->tt
->parse_pdu_itt
)
1005 session
->tt
->parse_pdu_itt(conn
, itt
, &i
, NULL
);
1008 if (i
>= session
->cmds_max
)
1011 return session
->cmds
[i
];
1013 EXPORT_SYMBOL_GPL(iscsi_itt_to_task
);
1016 * __iscsi_complete_pdu - complete pdu
1018 * @hdr: iscsi header
1019 * @data: data buffer
1020 * @datalen: len of data buffer
1022 * Completes pdu processing by freeing any resources allocated at
1023 * queuecommand or send generic. session lock must be held and verify
1024 * itt must have been called.
1026 int __iscsi_complete_pdu(struct iscsi_conn
*conn
, struct iscsi_hdr
*hdr
,
1027 char *data
, int datalen
)
1029 struct iscsi_session
*session
= conn
->session
;
1030 int opcode
= hdr
->opcode
& ISCSI_OPCODE_MASK
, rc
= 0;
1031 struct iscsi_task
*task
;
1034 conn
->last_recv
= jiffies
;
1035 rc
= iscsi_verify_itt(conn
, hdr
->itt
);
1039 if (hdr
->itt
!= RESERVED_ITT
)
1040 itt
= get_itt(hdr
->itt
);
1044 ISCSI_DBG_SESSION(session
, "[op 0x%x cid %d itt 0x%x len %d]\n",
1045 opcode
, conn
->id
, itt
, datalen
);
1048 iscsi_update_cmdsn(session
, (struct iscsi_nopin
*)hdr
);
1051 case ISCSI_OP_NOOP_IN
:
1053 rc
= ISCSI_ERR_PROTO
;
1057 if (hdr
->ttt
== cpu_to_be32(ISCSI_RESERVED_TAG
))
1060 iscsi_send_nopout(conn
, (struct iscsi_nopin
*)hdr
);
1062 case ISCSI_OP_REJECT
:
1063 rc
= iscsi_handle_reject(conn
, hdr
, data
, datalen
);
1065 case ISCSI_OP_ASYNC_EVENT
:
1066 conn
->exp_statsn
= be32_to_cpu(hdr
->statsn
) + 1;
1067 if (iscsi_recv_pdu(conn
->cls_conn
, hdr
, data
, datalen
))
1068 rc
= ISCSI_ERR_CONN_FAILED
;
1071 rc
= ISCSI_ERR_BAD_OPCODE
;
1078 case ISCSI_OP_SCSI_CMD_RSP
:
1079 case ISCSI_OP_SCSI_DATA_IN
:
1080 task
= iscsi_itt_to_ctask(conn
, hdr
->itt
);
1082 return ISCSI_ERR_BAD_ITT
;
1083 task
->last_xfer
= jiffies
;
1087 * LLD handles R2Ts if they need to.
1090 case ISCSI_OP_LOGOUT_RSP
:
1091 case ISCSI_OP_LOGIN_RSP
:
1092 case ISCSI_OP_TEXT_RSP
:
1093 case ISCSI_OP_SCSI_TMFUNC_RSP
:
1094 case ISCSI_OP_NOOP_IN
:
1095 task
= iscsi_itt_to_task(conn
, hdr
->itt
);
1097 return ISCSI_ERR_BAD_ITT
;
1100 return ISCSI_ERR_BAD_OPCODE
;
1104 case ISCSI_OP_SCSI_CMD_RSP
:
1105 iscsi_scsi_cmd_rsp(conn
, hdr
, task
, data
, datalen
);
1107 case ISCSI_OP_SCSI_DATA_IN
:
1108 iscsi_data_in_rsp(conn
, hdr
, task
);
1110 case ISCSI_OP_LOGOUT_RSP
:
1111 iscsi_update_cmdsn(session
, (struct iscsi_nopin
*)hdr
);
1113 rc
= ISCSI_ERR_PROTO
;
1116 conn
->exp_statsn
= be32_to_cpu(hdr
->statsn
) + 1;
1118 case ISCSI_OP_LOGIN_RSP
:
1119 case ISCSI_OP_TEXT_RSP
:
1120 iscsi_update_cmdsn(session
, (struct iscsi_nopin
*)hdr
);
1122 * login related PDU's exp_statsn is handled in
1126 case ISCSI_OP_SCSI_TMFUNC_RSP
:
1127 iscsi_update_cmdsn(session
, (struct iscsi_nopin
*)hdr
);
1129 rc
= ISCSI_ERR_PROTO
;
1133 iscsi_tmf_rsp(conn
, hdr
);
1134 iscsi_complete_task(task
, ISCSI_TASK_COMPLETED
);
1136 case ISCSI_OP_NOOP_IN
:
1137 iscsi_update_cmdsn(session
, (struct iscsi_nopin
*)hdr
);
1138 if (hdr
->ttt
!= cpu_to_be32(ISCSI_RESERVED_TAG
) || datalen
) {
1139 rc
= ISCSI_ERR_PROTO
;
1142 conn
->exp_statsn
= be32_to_cpu(hdr
->statsn
) + 1;
1144 rc
= iscsi_nop_out_rsp(task
, (struct iscsi_nopin
*)hdr
,
1148 rc
= ISCSI_ERR_BAD_OPCODE
;
1155 if (iscsi_recv_pdu(conn
->cls_conn
, hdr
, data
, datalen
))
1156 rc
= ISCSI_ERR_CONN_FAILED
;
1157 iscsi_complete_task(task
, ISCSI_TASK_COMPLETED
);
1160 EXPORT_SYMBOL_GPL(__iscsi_complete_pdu
);
1162 int iscsi_complete_pdu(struct iscsi_conn
*conn
, struct iscsi_hdr
*hdr
,
1163 char *data
, int datalen
)
1167 spin_lock(&conn
->session
->lock
);
1168 rc
= __iscsi_complete_pdu(conn
, hdr
, data
, datalen
);
1169 spin_unlock(&conn
->session
->lock
);
1172 EXPORT_SYMBOL_GPL(iscsi_complete_pdu
);
1174 int iscsi_verify_itt(struct iscsi_conn
*conn
, itt_t itt
)
1176 struct iscsi_session
*session
= conn
->session
;
1179 if (itt
== RESERVED_ITT
)
1182 if (session
->tt
->parse_pdu_itt
)
1183 session
->tt
->parse_pdu_itt(conn
, itt
, &i
, &age
);
1186 age
= ((__force u32
)itt
>> ISCSI_AGE_SHIFT
) & ISCSI_AGE_MASK
;
1189 if (age
!= session
->age
) {
1190 iscsi_conn_printk(KERN_ERR
, conn
,
1191 "received itt %x expected session age (%x)\n",
1192 (__force u32
)itt
, session
->age
);
1193 return ISCSI_ERR_BAD_ITT
;
1196 if (i
>= session
->cmds_max
) {
1197 iscsi_conn_printk(KERN_ERR
, conn
,
1198 "received invalid itt index %u (max cmds "
1199 "%u.\n", i
, session
->cmds_max
);
1200 return ISCSI_ERR_BAD_ITT
;
1204 EXPORT_SYMBOL_GPL(iscsi_verify_itt
);
1207 * iscsi_itt_to_ctask - look up ctask by itt
1208 * @conn: iscsi connection
1211 * This should be used for cmd tasks.
1213 * The session lock must be held.
1215 struct iscsi_task
*iscsi_itt_to_ctask(struct iscsi_conn
*conn
, itt_t itt
)
1217 struct iscsi_task
*task
;
1219 if (iscsi_verify_itt(conn
, itt
))
1222 task
= iscsi_itt_to_task(conn
, itt
);
1223 if (!task
|| !task
->sc
)
1226 if (task
->sc
->SCp
.phase
!= conn
->session
->age
) {
1227 iscsi_session_printk(KERN_ERR
, conn
->session
,
1228 "task's session age %d, expected %d\n",
1229 task
->sc
->SCp
.phase
, conn
->session
->age
);
1235 EXPORT_SYMBOL_GPL(iscsi_itt_to_ctask
);
1237 void iscsi_session_failure(struct iscsi_session
*session
,
1240 struct iscsi_conn
*conn
;
1242 unsigned long flags
;
1244 spin_lock_irqsave(&session
->lock
, flags
);
1245 conn
= session
->leadconn
;
1246 if (session
->state
== ISCSI_STATE_TERMINATE
|| !conn
) {
1247 spin_unlock_irqrestore(&session
->lock
, flags
);
1251 dev
= get_device(&conn
->cls_conn
->dev
);
1252 spin_unlock_irqrestore(&session
->lock
, flags
);
1256 * if the host is being removed bypass the connection
1257 * recovery initialization because we are going to kill
1260 if (err
== ISCSI_ERR_INVALID_HOST
)
1261 iscsi_conn_error_event(conn
->cls_conn
, err
);
1263 iscsi_conn_failure(conn
, err
);
1266 EXPORT_SYMBOL_GPL(iscsi_session_failure
);
1268 void iscsi_conn_failure(struct iscsi_conn
*conn
, enum iscsi_err err
)
1270 struct iscsi_session
*session
= conn
->session
;
1271 unsigned long flags
;
1273 spin_lock_irqsave(&session
->lock
, flags
);
1274 if (session
->state
== ISCSI_STATE_FAILED
) {
1275 spin_unlock_irqrestore(&session
->lock
, flags
);
1279 if (conn
->stop_stage
== 0)
1280 session
->state
= ISCSI_STATE_FAILED
;
1281 spin_unlock_irqrestore(&session
->lock
, flags
);
1283 set_bit(ISCSI_SUSPEND_BIT
, &conn
->suspend_tx
);
1284 set_bit(ISCSI_SUSPEND_BIT
, &conn
->suspend_rx
);
1285 iscsi_conn_error_event(conn
->cls_conn
, err
);
1287 EXPORT_SYMBOL_GPL(iscsi_conn_failure
);
1289 static int iscsi_check_cmdsn_window_closed(struct iscsi_conn
*conn
)
1291 struct iscsi_session
*session
= conn
->session
;
1294 * Check for iSCSI window and take care of CmdSN wrap-around
1296 if (!iscsi_sna_lte(session
->queued_cmdsn
, session
->max_cmdsn
)) {
1297 ISCSI_DBG_SESSION(session
, "iSCSI CmdSN closed. ExpCmdSn "
1298 "%u MaxCmdSN %u CmdSN %u/%u\n",
1299 session
->exp_cmdsn
, session
->max_cmdsn
,
1300 session
->cmdsn
, session
->queued_cmdsn
);
1306 static int iscsi_xmit_task(struct iscsi_conn
*conn
)
1308 struct iscsi_task
*task
= conn
->task
;
1311 if (test_bit(ISCSI_SUSPEND_BIT
, &conn
->suspend_tx
))
1314 __iscsi_get_task(task
);
1315 spin_unlock_bh(&conn
->session
->lock
);
1316 rc
= conn
->session
->tt
->xmit_task(task
);
1317 spin_lock_bh(&conn
->session
->lock
);
1319 /* done with this task */
1320 task
->last_xfer
= jiffies
;
1323 __iscsi_put_task(task
);
1328 * iscsi_requeue_task - requeue task to run from session workqueue
1329 * @task: task to requeue
1331 * LLDs that need to run a task from the session workqueue should call
1332 * this. The session lock must be held. This should only be called
1333 * by software drivers.
1335 void iscsi_requeue_task(struct iscsi_task
*task
)
1337 struct iscsi_conn
*conn
= task
->conn
;
1340 * this may be on the requeue list already if the xmit_task callout
1341 * is handling the r2ts while we are adding new ones
1343 if (list_empty(&task
->running
))
1344 list_add_tail(&task
->running
, &conn
->requeue
);
1345 iscsi_conn_queue_work(conn
);
1347 EXPORT_SYMBOL_GPL(iscsi_requeue_task
);
1350 * iscsi_data_xmit - xmit any command into the scheduled connection
1351 * @conn: iscsi connection
1354 * The function can return -EAGAIN in which case the caller must
1355 * re-schedule it again later or recover. '0' return code means
1358 static int iscsi_data_xmit(struct iscsi_conn
*conn
)
1362 spin_lock_bh(&conn
->session
->lock
);
1363 if (test_bit(ISCSI_SUSPEND_BIT
, &conn
->suspend_tx
)) {
1364 ISCSI_DBG_SESSION(conn
->session
, "Tx suspended!\n");
1365 spin_unlock_bh(&conn
->session
->lock
);
1370 rc
= iscsi_xmit_task(conn
);
1376 * process mgmt pdus like nops before commands since we should
1377 * only have one nop-out as a ping from us and targets should not
1378 * overflow us with nop-ins
1381 while (!list_empty(&conn
->mgmtqueue
)) {
1382 conn
->task
= list_entry(conn
->mgmtqueue
.next
,
1383 struct iscsi_task
, running
);
1384 list_del_init(&conn
->task
->running
);
1385 if (iscsi_prep_mgmt_task(conn
, conn
->task
)) {
1386 __iscsi_put_task(conn
->task
);
1390 rc
= iscsi_xmit_task(conn
);
1395 /* process pending command queue */
1396 while (!list_empty(&conn
->cmdqueue
)) {
1397 if (conn
->tmf_state
== TMF_QUEUED
)
1400 conn
->task
= list_entry(conn
->cmdqueue
.next
,
1401 struct iscsi_task
, running
);
1402 list_del_init(&conn
->task
->running
);
1403 if (conn
->session
->state
== ISCSI_STATE_LOGGING_OUT
) {
1404 fail_scsi_task(conn
->task
, DID_IMM_RETRY
);
1407 rc
= iscsi_prep_scsi_cmd_pdu(conn
->task
);
1409 if (rc
== -ENOMEM
) {
1410 list_add_tail(&conn
->task
->running
,
1415 fail_scsi_task(conn
->task
, DID_ABORT
);
1418 rc
= iscsi_xmit_task(conn
);
1422 * we could continuously get new task requests so
1423 * we need to check the mgmt queue for nops that need to
1424 * be sent to aviod starvation
1426 if (!list_empty(&conn
->mgmtqueue
))
1430 while (!list_empty(&conn
->requeue
)) {
1431 if (conn
->session
->fast_abort
&& conn
->tmf_state
!= TMF_INITIAL
)
1435 * we always do fastlogout - conn stop code will clean up.
1437 if (conn
->session
->state
== ISCSI_STATE_LOGGING_OUT
)
1440 conn
->task
= list_entry(conn
->requeue
.next
,
1441 struct iscsi_task
, running
);
1442 list_del_init(&conn
->task
->running
);
1443 conn
->task
->state
= ISCSI_TASK_RUNNING
;
1444 rc
= iscsi_xmit_task(conn
);
1447 if (!list_empty(&conn
->mgmtqueue
))
1450 spin_unlock_bh(&conn
->session
->lock
);
1454 spin_unlock_bh(&conn
->session
->lock
);
1458 static void iscsi_xmitworker(struct work_struct
*work
)
1460 struct iscsi_conn
*conn
=
1461 container_of(work
, struct iscsi_conn
, xmitwork
);
1464 * serialize Xmit worker on a per-connection basis.
1467 rc
= iscsi_data_xmit(conn
);
1468 } while (rc
>= 0 || rc
== -EAGAIN
);
1471 static inline struct iscsi_task
*iscsi_alloc_task(struct iscsi_conn
*conn
,
1472 struct scsi_cmnd
*sc
)
1474 struct iscsi_task
*task
;
1476 if (!__kfifo_get(conn
->session
->cmdpool
.queue
,
1477 (void *) &task
, sizeof(void *)))
1480 sc
->SCp
.phase
= conn
->session
->age
;
1481 sc
->SCp
.ptr
= (char *) task
;
1483 atomic_set(&task
->refcount
, 1);
1484 task
->state
= ISCSI_TASK_PENDING
;
1487 task
->have_checked_conn
= false;
1488 task
->last_timeout
= jiffies
;
1489 task
->last_xfer
= jiffies
;
1490 INIT_LIST_HEAD(&task
->running
);
1495 FAILURE_BAD_HOST
= 1,
1496 FAILURE_SESSION_FAILED
,
1497 FAILURE_SESSION_FREED
,
1498 FAILURE_WINDOW_CLOSED
,
1500 FAILURE_SESSION_TERMINATE
,
1501 FAILURE_SESSION_IN_RECOVERY
,
1502 FAILURE_SESSION_RECOVERY_TIMEOUT
,
1503 FAILURE_SESSION_LOGGING_OUT
,
1504 FAILURE_SESSION_NOT_READY
,
1507 int iscsi_queuecommand(struct scsi_cmnd
*sc
, void (*done
)(struct scsi_cmnd
*))
1509 struct iscsi_cls_session
*cls_session
;
1510 struct Scsi_Host
*host
;
1511 struct iscsi_host
*ihost
;
1513 struct iscsi_session
*session
;
1514 struct iscsi_conn
*conn
;
1515 struct iscsi_task
*task
= NULL
;
1517 sc
->scsi_done
= done
;
1521 host
= sc
->device
->host
;
1522 ihost
= shost_priv(host
);
1523 spin_unlock(host
->host_lock
);
1525 cls_session
= starget_to_session(scsi_target(sc
->device
));
1526 session
= cls_session
->dd_data
;
1527 spin_lock(&session
->lock
);
1529 reason
= iscsi_session_chkready(cls_session
);
1531 sc
->result
= reason
;
1535 if (session
->state
!= ISCSI_STATE_LOGGED_IN
) {
1537 * to handle the race between when we set the recovery state
1538 * and block the session we requeue here (commands could
1539 * be entering our queuecommand while a block is starting
1540 * up because the block code is not locked)
1542 switch (session
->state
) {
1543 case ISCSI_STATE_FAILED
:
1544 case ISCSI_STATE_IN_RECOVERY
:
1545 reason
= FAILURE_SESSION_IN_RECOVERY
;
1546 sc
->result
= DID_IMM_RETRY
<< 16;
1548 case ISCSI_STATE_LOGGING_OUT
:
1549 reason
= FAILURE_SESSION_LOGGING_OUT
;
1550 sc
->result
= DID_IMM_RETRY
<< 16;
1552 case ISCSI_STATE_RECOVERY_FAILED
:
1553 reason
= FAILURE_SESSION_RECOVERY_TIMEOUT
;
1554 sc
->result
= DID_TRANSPORT_FAILFAST
<< 16;
1556 case ISCSI_STATE_TERMINATE
:
1557 reason
= FAILURE_SESSION_TERMINATE
;
1558 sc
->result
= DID_NO_CONNECT
<< 16;
1561 reason
= FAILURE_SESSION_FREED
;
1562 sc
->result
= DID_NO_CONNECT
<< 16;
1567 conn
= session
->leadconn
;
1569 reason
= FAILURE_SESSION_FREED
;
1570 sc
->result
= DID_NO_CONNECT
<< 16;
1574 if (test_bit(ISCSI_SUSPEND_BIT
, &conn
->suspend_tx
)) {
1575 reason
= FAILURE_SESSION_IN_RECOVERY
;
1576 sc
->result
= DID_REQUEUE
;
1580 if (iscsi_check_cmdsn_window_closed(conn
)) {
1581 reason
= FAILURE_WINDOW_CLOSED
;
1585 task
= iscsi_alloc_task(conn
, sc
);
1587 reason
= FAILURE_OOM
;
1591 if (!ihost
->workq
) {
1592 reason
= iscsi_prep_scsi_cmd_pdu(task
);
1594 if (reason
== -ENOMEM
) {
1595 reason
= FAILURE_OOM
;
1598 sc
->result
= DID_ABORT
<< 16;
1602 if (session
->tt
->xmit_task(task
)) {
1604 reason
= FAILURE_SESSION_NOT_READY
;
1608 list_add_tail(&task
->running
, &conn
->cmdqueue
);
1609 iscsi_conn_queue_work(conn
);
1612 session
->queued_cmdsn
++;
1613 spin_unlock(&session
->lock
);
1614 spin_lock(host
->host_lock
);
1618 sc
->scsi_done
= NULL
;
1619 iscsi_complete_task(task
, ISCSI_TASK_COMPLETED
);
1621 spin_unlock(&session
->lock
);
1622 ISCSI_DBG_SESSION(session
, "cmd 0x%x rejected (%d)\n",
1623 sc
->cmnd
[0], reason
);
1624 spin_lock(host
->host_lock
);
1625 return SCSI_MLQUEUE_TARGET_BUSY
;
1628 sc
->scsi_done
= NULL
;
1629 iscsi_complete_task(task
, ISCSI_TASK_COMPLETED
);
1631 spin_unlock(&session
->lock
);
1632 ISCSI_DBG_SESSION(session
, "iscsi: cmd 0x%x is not queued (%d)\n",
1633 sc
->cmnd
[0], reason
);
1634 if (!scsi_bidi_cmnd(sc
))
1635 scsi_set_resid(sc
, scsi_bufflen(sc
));
1637 scsi_out(sc
)->resid
= scsi_out(sc
)->length
;
1638 scsi_in(sc
)->resid
= scsi_in(sc
)->length
;
1641 spin_lock(host
->host_lock
);
1644 EXPORT_SYMBOL_GPL(iscsi_queuecommand
);
1646 int iscsi_change_queue_depth(struct scsi_device
*sdev
, int depth
)
1648 scsi_adjust_queue_depth(sdev
, scsi_get_tag_type(sdev
), depth
);
1649 return sdev
->queue_depth
;
1651 EXPORT_SYMBOL_GPL(iscsi_change_queue_depth
);
1653 int iscsi_target_alloc(struct scsi_target
*starget
)
1655 struct iscsi_cls_session
*cls_session
= starget_to_session(starget
);
1656 struct iscsi_session
*session
= cls_session
->dd_data
;
1658 starget
->can_queue
= session
->scsi_cmds_max
;
1661 EXPORT_SYMBOL_GPL(iscsi_target_alloc
);
1663 void iscsi_session_recovery_timedout(struct iscsi_cls_session
*cls_session
)
1665 struct iscsi_session
*session
= cls_session
->dd_data
;
1667 spin_lock_bh(&session
->lock
);
1668 if (session
->state
!= ISCSI_STATE_LOGGED_IN
) {
1669 session
->state
= ISCSI_STATE_RECOVERY_FAILED
;
1670 if (session
->leadconn
)
1671 wake_up(&session
->leadconn
->ehwait
);
1673 spin_unlock_bh(&session
->lock
);
1675 EXPORT_SYMBOL_GPL(iscsi_session_recovery_timedout
);
1677 int iscsi_eh_target_reset(struct scsi_cmnd
*sc
)
1679 struct iscsi_cls_session
*cls_session
;
1680 struct iscsi_session
*session
;
1681 struct iscsi_conn
*conn
;
1683 cls_session
= starget_to_session(scsi_target(sc
->device
));
1684 session
= cls_session
->dd_data
;
1685 conn
= session
->leadconn
;
1687 mutex_lock(&session
->eh_mutex
);
1688 spin_lock_bh(&session
->lock
);
1689 if (session
->state
== ISCSI_STATE_TERMINATE
) {
1691 ISCSI_DBG_EH(session
,
1692 "failing target reset: Could not log back into "
1693 "target [age %d]\n",
1695 spin_unlock_bh(&session
->lock
);
1696 mutex_unlock(&session
->eh_mutex
);
1700 spin_unlock_bh(&session
->lock
);
1701 mutex_unlock(&session
->eh_mutex
);
1703 * we drop the lock here but the leadconn cannot be destoyed while
1704 * we are in the scsi eh
1706 iscsi_conn_failure(conn
, ISCSI_ERR_CONN_FAILED
);
1708 ISCSI_DBG_EH(session
, "wait for relogin\n");
1709 wait_event_interruptible(conn
->ehwait
,
1710 session
->state
== ISCSI_STATE_TERMINATE
||
1711 session
->state
== ISCSI_STATE_LOGGED_IN
||
1712 session
->state
== ISCSI_STATE_RECOVERY_FAILED
);
1713 if (signal_pending(current
))
1714 flush_signals(current
);
1716 mutex_lock(&session
->eh_mutex
);
1717 spin_lock_bh(&session
->lock
);
1718 if (session
->state
== ISCSI_STATE_LOGGED_IN
) {
1719 ISCSI_DBG_EH(session
,
1720 "target reset succeeded\n");
1723 spin_unlock_bh(&session
->lock
);
1724 mutex_unlock(&session
->eh_mutex
);
1727 EXPORT_SYMBOL_GPL(iscsi_eh_target_reset
);
1729 static void iscsi_tmf_timedout(unsigned long data
)
1731 struct iscsi_conn
*conn
= (struct iscsi_conn
*)data
;
1732 struct iscsi_session
*session
= conn
->session
;
1734 spin_lock(&session
->lock
);
1735 if (conn
->tmf_state
== TMF_QUEUED
) {
1736 conn
->tmf_state
= TMF_TIMEDOUT
;
1737 ISCSI_DBG_EH(session
, "tmf timedout\n");
1738 /* unblock eh_abort() */
1739 wake_up(&conn
->ehwait
);
1741 spin_unlock(&session
->lock
);
1744 static int iscsi_exec_task_mgmt_fn(struct iscsi_conn
*conn
,
1745 struct iscsi_tm
*hdr
, int age
,
1748 struct iscsi_session
*session
= conn
->session
;
1749 struct iscsi_task
*task
;
1751 task
= __iscsi_conn_send_pdu(conn
, (struct iscsi_hdr
*)hdr
,
1754 spin_unlock_bh(&session
->lock
);
1755 iscsi_conn_failure(conn
, ISCSI_ERR_CONN_FAILED
);
1756 spin_lock_bh(&session
->lock
);
1757 ISCSI_DBG_EH(session
, "tmf exec failure\n");
1760 conn
->tmfcmd_pdus_cnt
++;
1761 conn
->tmf_timer
.expires
= timeout
* HZ
+ jiffies
;
1762 conn
->tmf_timer
.function
= iscsi_tmf_timedout
;
1763 conn
->tmf_timer
.data
= (unsigned long)conn
;
1764 add_timer(&conn
->tmf_timer
);
1765 ISCSI_DBG_EH(session
, "tmf set timeout\n");
1767 spin_unlock_bh(&session
->lock
);
1768 mutex_unlock(&session
->eh_mutex
);
1771 * block eh thread until:
1775 * 3) session is terminated or restarted or userspace has
1776 * given up on recovery
1778 wait_event_interruptible(conn
->ehwait
, age
!= session
->age
||
1779 session
->state
!= ISCSI_STATE_LOGGED_IN
||
1780 conn
->tmf_state
!= TMF_QUEUED
);
1781 if (signal_pending(current
))
1782 flush_signals(current
);
1783 del_timer_sync(&conn
->tmf_timer
);
1785 mutex_lock(&session
->eh_mutex
);
1786 spin_lock_bh(&session
->lock
);
1787 /* if the session drops it will clean up the task */
1788 if (age
!= session
->age
||
1789 session
->state
!= ISCSI_STATE_LOGGED_IN
)
1795 * Fail commands. session lock held and recv side suspended and xmit
1798 static void fail_scsi_tasks(struct iscsi_conn
*conn
, unsigned lun
,
1801 struct iscsi_task
*task
;
1804 for (i
= 0; i
< conn
->session
->cmds_max
; i
++) {
1805 task
= conn
->session
->cmds
[i
];
1806 if (!task
->sc
|| task
->state
== ISCSI_TASK_FREE
)
1809 if (lun
!= -1 && lun
!= task
->sc
->device
->lun
)
1812 ISCSI_DBG_SESSION(conn
->session
,
1813 "failing sc %p itt 0x%x state %d\n",
1814 task
->sc
, task
->itt
, task
->state
);
1815 fail_scsi_task(task
, error
);
1820 * iscsi_suspend_queue - suspend iscsi_queuecommand
1821 * @conn: iscsi conn to stop queueing IO on
1823 * This grabs the session lock to make sure no one is in
1824 * xmit_task/queuecommand, and then sets suspend to prevent
1825 * new commands from being queued. This only needs to be called
1826 * by offload drivers that need to sync a path like ep disconnect
1827 * with the iscsi_queuecommand/xmit_task. To start IO again libiscsi
1828 * will call iscsi_start_tx and iscsi_unblock_session when in FFP.
1830 void iscsi_suspend_queue(struct iscsi_conn
*conn
)
1832 spin_lock_bh(&conn
->session
->lock
);
1833 set_bit(ISCSI_SUSPEND_BIT
, &conn
->suspend_tx
);
1834 spin_unlock_bh(&conn
->session
->lock
);
1836 EXPORT_SYMBOL_GPL(iscsi_suspend_queue
);
1839 * iscsi_suspend_tx - suspend iscsi_data_xmit
1840 * @conn: iscsi conn tp stop processing IO on.
1842 * This function sets the suspend bit to prevent iscsi_data_xmit
1843 * from sending new IO, and if work is queued on the xmit thread
1844 * it will wait for it to be completed.
1846 void iscsi_suspend_tx(struct iscsi_conn
*conn
)
1848 struct Scsi_Host
*shost
= conn
->session
->host
;
1849 struct iscsi_host
*ihost
= shost_priv(shost
);
1851 set_bit(ISCSI_SUSPEND_BIT
, &conn
->suspend_tx
);
1853 flush_workqueue(ihost
->workq
);
1855 EXPORT_SYMBOL_GPL(iscsi_suspend_tx
);
1857 static void iscsi_start_tx(struct iscsi_conn
*conn
)
1859 clear_bit(ISCSI_SUSPEND_BIT
, &conn
->suspend_tx
);
1860 iscsi_conn_queue_work(conn
);
1864 * We want to make sure a ping is in flight. It has timed out.
1865 * And we are not busy processing a pdu that is making
1866 * progress but got started before the ping and is taking a while
1867 * to complete so the ping is just stuck behind it in a queue.
1869 static int iscsi_has_ping_timed_out(struct iscsi_conn
*conn
)
1871 if (conn
->ping_task
&&
1872 time_before_eq(conn
->last_recv
+ (conn
->recv_timeout
* HZ
) +
1873 (conn
->ping_timeout
* HZ
), jiffies
))
1879 static enum blk_eh_timer_return
iscsi_eh_cmd_timed_out(struct scsi_cmnd
*sc
)
1881 enum blk_eh_timer_return rc
= BLK_EH_NOT_HANDLED
;
1882 struct iscsi_task
*task
= NULL
;
1883 struct iscsi_cls_session
*cls_session
;
1884 struct iscsi_session
*session
;
1885 struct iscsi_conn
*conn
;
1887 cls_session
= starget_to_session(scsi_target(sc
->device
));
1888 session
= cls_session
->dd_data
;
1890 ISCSI_DBG_EH(session
, "scsi cmd %p timedout\n", sc
);
1892 spin_lock(&session
->lock
);
1893 if (session
->state
!= ISCSI_STATE_LOGGED_IN
) {
1895 * We are probably in the middle of iscsi recovery so let
1896 * that complete and handle the error.
1898 rc
= BLK_EH_RESET_TIMER
;
1902 conn
= session
->leadconn
;
1904 /* In the middle of shuting down */
1905 rc
= BLK_EH_RESET_TIMER
;
1909 task
= (struct iscsi_task
*)sc
->SCp
.ptr
;
1913 * If we have sent (at least queued to the network layer) a pdu or
1914 * recvd one for the task since the last timeout ask for
1915 * more time. If on the next timeout we have not made progress
1916 * we can check if it is the task or connection when we send the
1919 if (time_after_eq(task
->last_xfer
, task
->last_timeout
)) {
1920 ISCSI_DBG_EH(session
, "Command making progress. Asking "
1921 "scsi-ml for more time to complete. "
1922 "Last data recv at %lu. Last timeout was at "
1923 "%lu\n.", task
->last_xfer
, task
->last_timeout
);
1924 task
->have_checked_conn
= false;
1925 rc
= BLK_EH_RESET_TIMER
;
1929 if (!conn
->recv_timeout
&& !conn
->ping_timeout
)
1932 * if the ping timedout then we are in the middle of cleaning up
1933 * and can let the iscsi eh handle it
1935 if (iscsi_has_ping_timed_out(conn
)) {
1936 rc
= BLK_EH_RESET_TIMER
;
1940 /* Assumes nop timeout is shorter than scsi cmd timeout */
1941 if (task
->have_checked_conn
)
1945 * Checking the transport already or nop from a cmd timeout still
1948 if (conn
->ping_task
) {
1949 task
->have_checked_conn
= true;
1950 rc
= BLK_EH_RESET_TIMER
;
1954 /* Make sure there is a transport check done */
1955 iscsi_send_nopout(conn
, NULL
);
1956 task
->have_checked_conn
= true;
1957 rc
= BLK_EH_RESET_TIMER
;
1961 task
->last_timeout
= jiffies
;
1962 spin_unlock(&session
->lock
);
1963 ISCSI_DBG_EH(session
, "return %s\n", rc
== BLK_EH_RESET_TIMER
?
1964 "timer reset" : "nh");
1968 static void iscsi_check_transport_timeouts(unsigned long data
)
1970 struct iscsi_conn
*conn
= (struct iscsi_conn
*)data
;
1971 struct iscsi_session
*session
= conn
->session
;
1972 unsigned long recv_timeout
, next_timeout
= 0, last_recv
;
1974 spin_lock(&session
->lock
);
1975 if (session
->state
!= ISCSI_STATE_LOGGED_IN
)
1978 recv_timeout
= conn
->recv_timeout
;
1983 last_recv
= conn
->last_recv
;
1985 if (iscsi_has_ping_timed_out(conn
)) {
1986 iscsi_conn_printk(KERN_ERR
, conn
, "ping timeout of %d secs "
1987 "expired, recv timeout %d, last rx %lu, "
1988 "last ping %lu, now %lu\n",
1989 conn
->ping_timeout
, conn
->recv_timeout
,
1990 last_recv
, conn
->last_ping
, jiffies
);
1991 spin_unlock(&session
->lock
);
1992 iscsi_conn_failure(conn
, ISCSI_ERR_CONN_FAILED
);
1996 if (time_before_eq(last_recv
+ recv_timeout
, jiffies
)) {
1997 /* send a ping to try to provoke some traffic */
1998 ISCSI_DBG_CONN(conn
, "Sending nopout as ping\n");
1999 iscsi_send_nopout(conn
, NULL
);
2000 next_timeout
= conn
->last_ping
+ (conn
->ping_timeout
* HZ
);
2002 next_timeout
= last_recv
+ recv_timeout
;
2004 ISCSI_DBG_CONN(conn
, "Setting next tmo %lu\n", next_timeout
);
2005 mod_timer(&conn
->transport_timer
, next_timeout
);
2007 spin_unlock(&session
->lock
);
2010 static void iscsi_prep_abort_task_pdu(struct iscsi_task
*task
,
2011 struct iscsi_tm
*hdr
)
2013 memset(hdr
, 0, sizeof(*hdr
));
2014 hdr
->opcode
= ISCSI_OP_SCSI_TMFUNC
| ISCSI_OP_IMMEDIATE
;
2015 hdr
->flags
= ISCSI_TM_FUNC_ABORT_TASK
& ISCSI_FLAG_TM_FUNC_MASK
;
2016 hdr
->flags
|= ISCSI_FLAG_CMD_FINAL
;
2017 memcpy(hdr
->lun
, task
->lun
, sizeof(hdr
->lun
));
2018 hdr
->rtt
= task
->hdr_itt
;
2019 hdr
->refcmdsn
= task
->cmdsn
;
2022 int iscsi_eh_abort(struct scsi_cmnd
*sc
)
2024 struct iscsi_cls_session
*cls_session
;
2025 struct iscsi_session
*session
;
2026 struct iscsi_conn
*conn
;
2027 struct iscsi_task
*task
;
2028 struct iscsi_tm
*hdr
;
2031 cls_session
= starget_to_session(scsi_target(sc
->device
));
2032 session
= cls_session
->dd_data
;
2034 ISCSI_DBG_EH(session
, "aborting sc %p\n", sc
);
2036 mutex_lock(&session
->eh_mutex
);
2037 spin_lock_bh(&session
->lock
);
2039 * if session was ISCSI_STATE_IN_RECOVERY then we may not have
2043 ISCSI_DBG_EH(session
, "sc never reached iscsi layer or "
2045 spin_unlock_bh(&session
->lock
);
2046 mutex_unlock(&session
->eh_mutex
);
2051 * If we are not logged in or we have started a new session
2052 * then let the host reset code handle this
2054 if (!session
->leadconn
|| session
->state
!= ISCSI_STATE_LOGGED_IN
||
2055 sc
->SCp
.phase
!= session
->age
) {
2056 spin_unlock_bh(&session
->lock
);
2057 mutex_unlock(&session
->eh_mutex
);
2058 ISCSI_DBG_EH(session
, "failing abort due to dropped "
2063 conn
= session
->leadconn
;
2064 conn
->eh_abort_cnt
++;
2067 task
= (struct iscsi_task
*)sc
->SCp
.ptr
;
2068 ISCSI_DBG_EH(session
, "aborting [sc %p itt 0x%x]\n",
2071 /* task completed before time out */
2073 ISCSI_DBG_EH(session
, "sc completed while abort in progress\n");
2077 if (task
->state
== ISCSI_TASK_PENDING
) {
2078 fail_scsi_task(task
, DID_ABORT
);
2082 /* only have one tmf outstanding at a time */
2083 if (conn
->tmf_state
!= TMF_INITIAL
)
2085 conn
->tmf_state
= TMF_QUEUED
;
2088 iscsi_prep_abort_task_pdu(task
, hdr
);
2090 if (iscsi_exec_task_mgmt_fn(conn
, hdr
, age
, session
->abort_timeout
)) {
2095 switch (conn
->tmf_state
) {
2097 spin_unlock_bh(&session
->lock
);
2099 * stop tx side incase the target had sent a abort rsp but
2100 * the initiator was still writing out data.
2102 iscsi_suspend_tx(conn
);
2104 * we do not stop the recv side because targets have been
2105 * good and have never sent us a successful tmf response
2106 * then sent more data for the cmd.
2108 spin_lock_bh(&session
->lock
);
2109 fail_scsi_task(task
, DID_ABORT
);
2110 conn
->tmf_state
= TMF_INITIAL
;
2111 spin_unlock_bh(&session
->lock
);
2112 iscsi_start_tx(conn
);
2113 goto success_unlocked
;
2115 spin_unlock_bh(&session
->lock
);
2116 iscsi_conn_failure(conn
, ISCSI_ERR_CONN_FAILED
);
2117 goto failed_unlocked
;
2120 conn
->tmf_state
= TMF_INITIAL
;
2121 /* task completed before tmf abort response */
2122 ISCSI_DBG_EH(session
, "sc completed while abort in "
2128 conn
->tmf_state
= TMF_INITIAL
;
2133 spin_unlock_bh(&session
->lock
);
2135 ISCSI_DBG_EH(session
, "abort success [sc %p itt 0x%x]\n",
2137 mutex_unlock(&session
->eh_mutex
);
2141 spin_unlock_bh(&session
->lock
);
2143 ISCSI_DBG_EH(session
, "abort failed [sc %p itt 0x%x]\n", sc
,
2144 task
? task
->itt
: 0);
2145 mutex_unlock(&session
->eh_mutex
);
2148 EXPORT_SYMBOL_GPL(iscsi_eh_abort
);
2150 static void iscsi_prep_lun_reset_pdu(struct scsi_cmnd
*sc
, struct iscsi_tm
*hdr
)
2152 memset(hdr
, 0, sizeof(*hdr
));
2153 hdr
->opcode
= ISCSI_OP_SCSI_TMFUNC
| ISCSI_OP_IMMEDIATE
;
2154 hdr
->flags
= ISCSI_TM_FUNC_LOGICAL_UNIT_RESET
& ISCSI_FLAG_TM_FUNC_MASK
;
2155 hdr
->flags
|= ISCSI_FLAG_CMD_FINAL
;
2156 int_to_scsilun(sc
->device
->lun
, (struct scsi_lun
*)hdr
->lun
);
2157 hdr
->rtt
= RESERVED_ITT
;
2160 int iscsi_eh_device_reset(struct scsi_cmnd
*sc
)
2162 struct iscsi_cls_session
*cls_session
;
2163 struct iscsi_session
*session
;
2164 struct iscsi_conn
*conn
;
2165 struct iscsi_tm
*hdr
;
2168 cls_session
= starget_to_session(scsi_target(sc
->device
));
2169 session
= cls_session
->dd_data
;
2171 ISCSI_DBG_EH(session
, "LU Reset [sc %p lun %u]\n", sc
, sc
->device
->lun
);
2173 mutex_lock(&session
->eh_mutex
);
2174 spin_lock_bh(&session
->lock
);
2176 * Just check if we are not logged in. We cannot check for
2177 * the phase because the reset could come from a ioctl.
2179 if (!session
->leadconn
|| session
->state
!= ISCSI_STATE_LOGGED_IN
)
2181 conn
= session
->leadconn
;
2183 /* only have one tmf outstanding at a time */
2184 if (conn
->tmf_state
!= TMF_INITIAL
)
2186 conn
->tmf_state
= TMF_QUEUED
;
2189 iscsi_prep_lun_reset_pdu(sc
, hdr
);
2191 if (iscsi_exec_task_mgmt_fn(conn
, hdr
, session
->age
,
2192 session
->lu_reset_timeout
)) {
2197 switch (conn
->tmf_state
) {
2201 spin_unlock_bh(&session
->lock
);
2202 iscsi_conn_failure(conn
, ISCSI_ERR_CONN_FAILED
);
2205 conn
->tmf_state
= TMF_INITIAL
;
2210 spin_unlock_bh(&session
->lock
);
2212 iscsi_suspend_tx(conn
);
2214 spin_lock_bh(&session
->lock
);
2215 fail_scsi_tasks(conn
, sc
->device
->lun
, DID_ERROR
);
2216 conn
->tmf_state
= TMF_INITIAL
;
2217 spin_unlock_bh(&session
->lock
);
2219 iscsi_start_tx(conn
);
2223 spin_unlock_bh(&session
->lock
);
2225 ISCSI_DBG_EH(session
, "dev reset result = %s\n",
2226 rc
== SUCCESS
? "SUCCESS" : "FAILED");
2227 mutex_unlock(&session
->eh_mutex
);
2230 EXPORT_SYMBOL_GPL(iscsi_eh_device_reset
);
2233 * Pre-allocate a pool of @max items of @item_size. By default, the pool
2234 * should be accessed via kfifo_{get,put} on q->queue.
2235 * Optionally, the caller can obtain the array of object pointers
2236 * by passing in a non-NULL @items pointer
2239 iscsi_pool_init(struct iscsi_pool
*q
, int max
, void ***items
, int item_size
)
2241 int i
, num_arrays
= 1;
2243 memset(q
, 0, sizeof(*q
));
2247 /* If the user passed an items pointer, he wants a copy of
2251 q
->pool
= kzalloc(num_arrays
* max
* sizeof(void*), GFP_KERNEL
);
2252 if (q
->pool
== NULL
)
2255 q
->queue
= kfifo_init((void*)q
->pool
, max
* sizeof(void*),
2257 if (IS_ERR(q
->queue
)) {
2262 for (i
= 0; i
< max
; i
++) {
2263 q
->pool
[i
] = kzalloc(item_size
, GFP_KERNEL
);
2264 if (q
->pool
[i
] == NULL
) {
2268 __kfifo_put(q
->queue
, (void*)&q
->pool
[i
], sizeof(void*));
2272 *items
= q
->pool
+ max
;
2273 memcpy(*items
, q
->pool
, max
* sizeof(void *));
2282 EXPORT_SYMBOL_GPL(iscsi_pool_init
);
2284 void iscsi_pool_free(struct iscsi_pool
*q
)
2288 for (i
= 0; i
< q
->max
; i
++)
2293 EXPORT_SYMBOL_GPL(iscsi_pool_free
);
2296 * iscsi_host_add - add host to system
2298 * @pdev: parent device
2300 * This should be called by partial offload and software iscsi drivers
2301 * to add a host to the system.
2303 int iscsi_host_add(struct Scsi_Host
*shost
, struct device
*pdev
)
2305 if (!shost
->can_queue
)
2306 shost
->can_queue
= ISCSI_DEF_XMIT_CMDS_MAX
;
2308 if (!shost
->cmd_per_lun
)
2309 shost
->cmd_per_lun
= ISCSI_DEF_CMD_PER_LUN
;
2311 if (!shost
->transportt
->eh_timed_out
)
2312 shost
->transportt
->eh_timed_out
= iscsi_eh_cmd_timed_out
;
2313 return scsi_add_host(shost
, pdev
);
2315 EXPORT_SYMBOL_GPL(iscsi_host_add
);
2318 * iscsi_host_alloc - allocate a host and driver data
2319 * @sht: scsi host template
2320 * @dd_data_size: driver host data size
2321 * @xmit_can_sleep: bool indicating if LLD will queue IO from a work queue
2323 * This should be called by partial offload and software iscsi drivers.
2324 * To access the driver specific memory use the iscsi_host_priv() macro.
2326 struct Scsi_Host
*iscsi_host_alloc(struct scsi_host_template
*sht
,
2327 int dd_data_size
, bool xmit_can_sleep
)
2329 struct Scsi_Host
*shost
;
2330 struct iscsi_host
*ihost
;
2332 shost
= scsi_host_alloc(sht
, sizeof(struct iscsi_host
) + dd_data_size
);
2335 ihost
= shost_priv(shost
);
2337 if (xmit_can_sleep
) {
2338 snprintf(ihost
->workq_name
, sizeof(ihost
->workq_name
),
2339 "iscsi_q_%d", shost
->host_no
);
2340 ihost
->workq
= create_singlethread_workqueue(ihost
->workq_name
);
2345 spin_lock_init(&ihost
->lock
);
2346 ihost
->state
= ISCSI_HOST_SETUP
;
2347 ihost
->num_sessions
= 0;
2348 init_waitqueue_head(&ihost
->session_removal_wq
);
2352 scsi_host_put(shost
);
2355 EXPORT_SYMBOL_GPL(iscsi_host_alloc
);
2357 static void iscsi_notify_host_removed(struct iscsi_cls_session
*cls_session
)
2359 iscsi_session_failure(cls_session
->dd_data
, ISCSI_ERR_INVALID_HOST
);
2363 * iscsi_host_remove - remove host and sessions
2366 * If there are any sessions left, this will initiate the removal and wait
2367 * for the completion.
2369 void iscsi_host_remove(struct Scsi_Host
*shost
)
2371 struct iscsi_host
*ihost
= shost_priv(shost
);
2372 unsigned long flags
;
2374 spin_lock_irqsave(&ihost
->lock
, flags
);
2375 ihost
->state
= ISCSI_HOST_REMOVED
;
2376 spin_unlock_irqrestore(&ihost
->lock
, flags
);
2378 iscsi_host_for_each_session(shost
, iscsi_notify_host_removed
);
2379 wait_event_interruptible(ihost
->session_removal_wq
,
2380 ihost
->num_sessions
== 0);
2381 if (signal_pending(current
))
2382 flush_signals(current
);
2384 scsi_remove_host(shost
);
2386 destroy_workqueue(ihost
->workq
);
2388 EXPORT_SYMBOL_GPL(iscsi_host_remove
);
2390 void iscsi_host_free(struct Scsi_Host
*shost
)
2392 struct iscsi_host
*ihost
= shost_priv(shost
);
2394 kfree(ihost
->netdev
);
2395 kfree(ihost
->hwaddress
);
2396 kfree(ihost
->initiatorname
);
2397 scsi_host_put(shost
);
2399 EXPORT_SYMBOL_GPL(iscsi_host_free
);
2401 static void iscsi_host_dec_session_cnt(struct Scsi_Host
*shost
)
2403 struct iscsi_host
*ihost
= shost_priv(shost
);
2404 unsigned long flags
;
2406 shost
= scsi_host_get(shost
);
2408 printk(KERN_ERR
"Invalid state. Cannot notify host removal "
2409 "of session teardown event because host already "
2414 spin_lock_irqsave(&ihost
->lock
, flags
);
2415 ihost
->num_sessions
--;
2416 if (ihost
->num_sessions
== 0)
2417 wake_up(&ihost
->session_removal_wq
);
2418 spin_unlock_irqrestore(&ihost
->lock
, flags
);
2419 scsi_host_put(shost
);
2423 * iscsi_session_setup - create iscsi cls session and host and session
2424 * @iscsit: iscsi transport template
2426 * @cmds_max: session can queue
2427 * @cmd_task_size: LLD task private data size
2428 * @initial_cmdsn: initial CmdSN
2430 * This can be used by software iscsi_transports that allocate
2431 * a session per scsi host.
2433 * Callers should set cmds_max to the largest total numer (mgmt + scsi) of
2434 * tasks they support. The iscsi layer reserves ISCSI_MGMT_CMDS_MAX tasks
2435 * for nop handling and login/logout requests.
2437 struct iscsi_cls_session
*
2438 iscsi_session_setup(struct iscsi_transport
*iscsit
, struct Scsi_Host
*shost
,
2439 uint16_t cmds_max
, int dd_size
, int cmd_task_size
,
2440 uint32_t initial_cmdsn
, unsigned int id
)
2442 struct iscsi_host
*ihost
= shost_priv(shost
);
2443 struct iscsi_session
*session
;
2444 struct iscsi_cls_session
*cls_session
;
2445 int cmd_i
, scsi_cmds
, total_cmds
= cmds_max
;
2446 unsigned long flags
;
2448 spin_lock_irqsave(&ihost
->lock
, flags
);
2449 if (ihost
->state
== ISCSI_HOST_REMOVED
) {
2450 spin_unlock_irqrestore(&ihost
->lock
, flags
);
2453 ihost
->num_sessions
++;
2454 spin_unlock_irqrestore(&ihost
->lock
, flags
);
2457 total_cmds
= ISCSI_DEF_XMIT_CMDS_MAX
;
2459 * The iscsi layer needs some tasks for nop handling and tmfs,
2460 * so the cmds_max must at least be greater than ISCSI_MGMT_CMDS_MAX
2461 * + 1 command for scsi IO.
2463 if (total_cmds
< ISCSI_TOTAL_CMDS_MIN
) {
2464 printk(KERN_ERR
"iscsi: invalid can_queue of %d. can_queue "
2465 "must be a power of two that is at least %d.\n",
2466 total_cmds
, ISCSI_TOTAL_CMDS_MIN
);
2467 goto dec_session_count
;
2470 if (total_cmds
> ISCSI_TOTAL_CMDS_MAX
) {
2471 printk(KERN_ERR
"iscsi: invalid can_queue of %d. can_queue "
2472 "must be a power of 2 less than or equal to %d.\n",
2473 cmds_max
, ISCSI_TOTAL_CMDS_MAX
);
2474 total_cmds
= ISCSI_TOTAL_CMDS_MAX
;
2477 if (!is_power_of_2(total_cmds
)) {
2478 printk(KERN_ERR
"iscsi: invalid can_queue of %d. can_queue "
2479 "must be a power of 2.\n", total_cmds
);
2480 total_cmds
= rounddown_pow_of_two(total_cmds
);
2481 if (total_cmds
< ISCSI_TOTAL_CMDS_MIN
)
2483 printk(KERN_INFO
"iscsi: Rounding can_queue to %d.\n",
2486 scsi_cmds
= total_cmds
- ISCSI_MGMT_CMDS_MAX
;
2488 cls_session
= iscsi_alloc_session(shost
, iscsit
,
2489 sizeof(struct iscsi_session
) +
2492 goto dec_session_count
;
2493 session
= cls_session
->dd_data
;
2494 session
->cls_session
= cls_session
;
2495 session
->host
= shost
;
2496 session
->state
= ISCSI_STATE_FREE
;
2497 session
->fast_abort
= 1;
2498 session
->lu_reset_timeout
= 15;
2499 session
->abort_timeout
= 10;
2500 session
->scsi_cmds_max
= scsi_cmds
;
2501 session
->cmds_max
= total_cmds
;
2502 session
->queued_cmdsn
= session
->cmdsn
= initial_cmdsn
;
2503 session
->exp_cmdsn
= initial_cmdsn
+ 1;
2504 session
->max_cmdsn
= initial_cmdsn
+ 1;
2505 session
->max_r2t
= 1;
2506 session
->tt
= iscsit
;
2507 session
->dd_data
= cls_session
->dd_data
+ sizeof(*session
);
2508 mutex_init(&session
->eh_mutex
);
2509 spin_lock_init(&session
->lock
);
2511 /* initialize SCSI PDU commands pool */
2512 if (iscsi_pool_init(&session
->cmdpool
, session
->cmds_max
,
2513 (void***)&session
->cmds
,
2514 cmd_task_size
+ sizeof(struct iscsi_task
)))
2515 goto cmdpool_alloc_fail
;
2517 /* pre-format cmds pool with ITT */
2518 for (cmd_i
= 0; cmd_i
< session
->cmds_max
; cmd_i
++) {
2519 struct iscsi_task
*task
= session
->cmds
[cmd_i
];
2522 task
->dd_data
= &task
[1];
2524 task
->state
= ISCSI_TASK_FREE
;
2525 INIT_LIST_HEAD(&task
->running
);
2528 if (!try_module_get(iscsit
->owner
))
2529 goto module_get_fail
;
2531 if (iscsi_add_session(cls_session
, id
))
2532 goto cls_session_fail
;
2537 module_put(iscsit
->owner
);
2539 iscsi_pool_free(&session
->cmdpool
);
2541 iscsi_free_session(cls_session
);
2543 iscsi_host_dec_session_cnt(shost
);
2546 EXPORT_SYMBOL_GPL(iscsi_session_setup
);
2549 * iscsi_session_teardown - destroy session, host, and cls_session
2550 * @cls_session: iscsi session
2552 * The driver must have called iscsi_remove_session before
2555 void iscsi_session_teardown(struct iscsi_cls_session
*cls_session
)
2557 struct iscsi_session
*session
= cls_session
->dd_data
;
2558 struct module
*owner
= cls_session
->transport
->owner
;
2559 struct Scsi_Host
*shost
= session
->host
;
2561 iscsi_pool_free(&session
->cmdpool
);
2563 kfree(session
->password
);
2564 kfree(session
->password_in
);
2565 kfree(session
->username
);
2566 kfree(session
->username_in
);
2567 kfree(session
->targetname
);
2568 kfree(session
->initiatorname
);
2569 kfree(session
->ifacename
);
2571 iscsi_destroy_session(cls_session
);
2572 iscsi_host_dec_session_cnt(shost
);
2575 EXPORT_SYMBOL_GPL(iscsi_session_teardown
);
2578 * iscsi_conn_setup - create iscsi_cls_conn and iscsi_conn
2579 * @cls_session: iscsi_cls_session
2580 * @dd_size: private driver data size
2583 struct iscsi_cls_conn
*
2584 iscsi_conn_setup(struct iscsi_cls_session
*cls_session
, int dd_size
,
2587 struct iscsi_session
*session
= cls_session
->dd_data
;
2588 struct iscsi_conn
*conn
;
2589 struct iscsi_cls_conn
*cls_conn
;
2592 cls_conn
= iscsi_create_conn(cls_session
, sizeof(*conn
) + dd_size
,
2596 conn
= cls_conn
->dd_data
;
2597 memset(conn
, 0, sizeof(*conn
) + dd_size
);
2599 conn
->dd_data
= cls_conn
->dd_data
+ sizeof(*conn
);
2600 conn
->session
= session
;
2601 conn
->cls_conn
= cls_conn
;
2602 conn
->c_stage
= ISCSI_CONN_INITIAL_STAGE
;
2603 conn
->id
= conn_idx
;
2604 conn
->exp_statsn
= 0;
2605 conn
->tmf_state
= TMF_INITIAL
;
2607 init_timer(&conn
->transport_timer
);
2608 conn
->transport_timer
.data
= (unsigned long)conn
;
2609 conn
->transport_timer
.function
= iscsi_check_transport_timeouts
;
2611 INIT_LIST_HEAD(&conn
->mgmtqueue
);
2612 INIT_LIST_HEAD(&conn
->cmdqueue
);
2613 INIT_LIST_HEAD(&conn
->requeue
);
2614 INIT_WORK(&conn
->xmitwork
, iscsi_xmitworker
);
2616 /* allocate login_task used for the login/text sequences */
2617 spin_lock_bh(&session
->lock
);
2618 if (!__kfifo_get(session
->cmdpool
.queue
,
2619 (void*)&conn
->login_task
,
2621 spin_unlock_bh(&session
->lock
);
2622 goto login_task_alloc_fail
;
2624 spin_unlock_bh(&session
->lock
);
2626 data
= (char *) __get_free_pages(GFP_KERNEL
,
2627 get_order(ISCSI_DEF_MAX_RECV_SEG_LEN
));
2629 goto login_task_data_alloc_fail
;
2630 conn
->login_task
->data
= conn
->data
= data
;
2632 init_timer(&conn
->tmf_timer
);
2633 init_waitqueue_head(&conn
->ehwait
);
2637 login_task_data_alloc_fail
:
2638 __kfifo_put(session
->cmdpool
.queue
, (void*)&conn
->login_task
,
2640 login_task_alloc_fail
:
2641 iscsi_destroy_conn(cls_conn
);
2644 EXPORT_SYMBOL_GPL(iscsi_conn_setup
);
2647 * iscsi_conn_teardown - teardown iscsi connection
2648 * cls_conn: iscsi class connection
2650 * TODO: we may need to make this into a two step process
2651 * like scsi-mls remove + put host
2653 void iscsi_conn_teardown(struct iscsi_cls_conn
*cls_conn
)
2655 struct iscsi_conn
*conn
= cls_conn
->dd_data
;
2656 struct iscsi_session
*session
= conn
->session
;
2657 unsigned long flags
;
2659 del_timer_sync(&conn
->transport_timer
);
2661 spin_lock_bh(&session
->lock
);
2662 conn
->c_stage
= ISCSI_CONN_CLEANUP_WAIT
;
2663 if (session
->leadconn
== conn
) {
2665 * leading connection? then give up on recovery.
2667 session
->state
= ISCSI_STATE_TERMINATE
;
2668 wake_up(&conn
->ehwait
);
2670 spin_unlock_bh(&session
->lock
);
2673 * Block until all in-progress commands for this connection
2677 spin_lock_irqsave(session
->host
->host_lock
, flags
);
2678 if (!session
->host
->host_busy
) { /* OK for ERL == 0 */
2679 spin_unlock_irqrestore(session
->host
->host_lock
, flags
);
2682 spin_unlock_irqrestore(session
->host
->host_lock
, flags
);
2683 msleep_interruptible(500);
2684 iscsi_conn_printk(KERN_INFO
, conn
, "iscsi conn_destroy(): "
2685 "host_busy %d host_failed %d\n",
2686 session
->host
->host_busy
,
2687 session
->host
->host_failed
);
2689 * force eh_abort() to unblock
2691 wake_up(&conn
->ehwait
);
2694 /* flush queued up work because we free the connection below */
2695 iscsi_suspend_tx(conn
);
2697 spin_lock_bh(&session
->lock
);
2698 free_pages((unsigned long) conn
->data
,
2699 get_order(ISCSI_DEF_MAX_RECV_SEG_LEN
));
2700 kfree(conn
->persistent_address
);
2701 __kfifo_put(session
->cmdpool
.queue
, (void*)&conn
->login_task
,
2703 if (session
->leadconn
== conn
)
2704 session
->leadconn
= NULL
;
2705 spin_unlock_bh(&session
->lock
);
2707 iscsi_destroy_conn(cls_conn
);
2709 EXPORT_SYMBOL_GPL(iscsi_conn_teardown
);
2711 int iscsi_conn_start(struct iscsi_cls_conn
*cls_conn
)
2713 struct iscsi_conn
*conn
= cls_conn
->dd_data
;
2714 struct iscsi_session
*session
= conn
->session
;
2717 iscsi_conn_printk(KERN_ERR
, conn
,
2718 "can't start unbound connection\n");
2722 if ((session
->imm_data_en
|| !session
->initial_r2t_en
) &&
2723 session
->first_burst
> session
->max_burst
) {
2724 iscsi_conn_printk(KERN_INFO
, conn
, "invalid burst lengths: "
2725 "first_burst %d max_burst %d\n",
2726 session
->first_burst
, session
->max_burst
);
2730 if (conn
->ping_timeout
&& !conn
->recv_timeout
) {
2731 iscsi_conn_printk(KERN_ERR
, conn
, "invalid recv timeout of "
2732 "zero. Using 5 seconds\n.");
2733 conn
->recv_timeout
= 5;
2736 if (conn
->recv_timeout
&& !conn
->ping_timeout
) {
2737 iscsi_conn_printk(KERN_ERR
, conn
, "invalid ping timeout of "
2738 "zero. Using 5 seconds.\n");
2739 conn
->ping_timeout
= 5;
2742 spin_lock_bh(&session
->lock
);
2743 conn
->c_stage
= ISCSI_CONN_STARTED
;
2744 session
->state
= ISCSI_STATE_LOGGED_IN
;
2745 session
->queued_cmdsn
= session
->cmdsn
;
2747 conn
->last_recv
= jiffies
;
2748 conn
->last_ping
= jiffies
;
2749 if (conn
->recv_timeout
&& conn
->ping_timeout
)
2750 mod_timer(&conn
->transport_timer
,
2751 jiffies
+ (conn
->recv_timeout
* HZ
));
2753 switch(conn
->stop_stage
) {
2754 case STOP_CONN_RECOVER
:
2756 * unblock eh_abort() if it is blocked. re-try all
2757 * commands after successful recovery
2759 conn
->stop_stage
= 0;
2760 conn
->tmf_state
= TMF_INITIAL
;
2762 if (session
->age
== 16)
2765 case STOP_CONN_TERM
:
2766 conn
->stop_stage
= 0;
2771 spin_unlock_bh(&session
->lock
);
2773 iscsi_unblock_session(session
->cls_session
);
2774 wake_up(&conn
->ehwait
);
2777 EXPORT_SYMBOL_GPL(iscsi_conn_start
);
2780 fail_mgmt_tasks(struct iscsi_session
*session
, struct iscsi_conn
*conn
)
2782 struct iscsi_task
*task
;
2785 for (i
= 0; i
< conn
->session
->cmds_max
; i
++) {
2786 task
= conn
->session
->cmds
[i
];
2790 if (task
->state
== ISCSI_TASK_FREE
)
2793 ISCSI_DBG_SESSION(conn
->session
,
2794 "failing mgmt itt 0x%x state %d\n",
2795 task
->itt
, task
->state
);
2796 state
= ISCSI_TASK_ABRT_SESS_RECOV
;
2797 if (task
->state
== ISCSI_TASK_PENDING
)
2798 state
= ISCSI_TASK_COMPLETED
;
2799 iscsi_complete_task(task
, state
);
2804 static void iscsi_start_session_recovery(struct iscsi_session
*session
,
2805 struct iscsi_conn
*conn
, int flag
)
2809 mutex_lock(&session
->eh_mutex
);
2810 spin_lock_bh(&session
->lock
);
2811 if (conn
->stop_stage
== STOP_CONN_TERM
) {
2812 spin_unlock_bh(&session
->lock
);
2813 mutex_unlock(&session
->eh_mutex
);
2818 * When this is called for the in_login state, we only want to clean
2819 * up the login task and connection. We do not need to block and set
2820 * the recovery state again
2822 if (flag
== STOP_CONN_TERM
)
2823 session
->state
= ISCSI_STATE_TERMINATE
;
2824 else if (conn
->stop_stage
!= STOP_CONN_RECOVER
)
2825 session
->state
= ISCSI_STATE_IN_RECOVERY
;
2826 spin_unlock_bh(&session
->lock
);
2828 del_timer_sync(&conn
->transport_timer
);
2829 iscsi_suspend_tx(conn
);
2831 spin_lock_bh(&session
->lock
);
2832 old_stop_stage
= conn
->stop_stage
;
2833 conn
->stop_stage
= flag
;
2834 conn
->c_stage
= ISCSI_CONN_STOPPED
;
2835 spin_unlock_bh(&session
->lock
);
2838 * for connection level recovery we should not calculate
2839 * header digest. conn->hdr_size used for optimization
2840 * in hdr_extract() and will be re-negotiated at
2843 if (flag
== STOP_CONN_RECOVER
) {
2844 conn
->hdrdgst_en
= 0;
2845 conn
->datadgst_en
= 0;
2846 if (session
->state
== ISCSI_STATE_IN_RECOVERY
&&
2847 old_stop_stage
!= STOP_CONN_RECOVER
) {
2848 ISCSI_DBG_SESSION(session
, "blocking session\n");
2849 iscsi_block_session(session
->cls_session
);
2856 spin_lock_bh(&session
->lock
);
2857 fail_scsi_tasks(conn
, -1, DID_TRANSPORT_DISRUPTED
);
2858 fail_mgmt_tasks(session
, conn
);
2859 spin_unlock_bh(&session
->lock
);
2860 mutex_unlock(&session
->eh_mutex
);
2863 void iscsi_conn_stop(struct iscsi_cls_conn
*cls_conn
, int flag
)
2865 struct iscsi_conn
*conn
= cls_conn
->dd_data
;
2866 struct iscsi_session
*session
= conn
->session
;
2869 case STOP_CONN_RECOVER
:
2870 case STOP_CONN_TERM
:
2871 iscsi_start_session_recovery(session
, conn
, flag
);
2874 iscsi_conn_printk(KERN_ERR
, conn
,
2875 "invalid stop flag %d\n", flag
);
2878 EXPORT_SYMBOL_GPL(iscsi_conn_stop
);
2880 int iscsi_conn_bind(struct iscsi_cls_session
*cls_session
,
2881 struct iscsi_cls_conn
*cls_conn
, int is_leading
)
2883 struct iscsi_session
*session
= cls_session
->dd_data
;
2884 struct iscsi_conn
*conn
= cls_conn
->dd_data
;
2886 spin_lock_bh(&session
->lock
);
2888 session
->leadconn
= conn
;
2889 spin_unlock_bh(&session
->lock
);
2892 * Unblock xmitworker(), Login Phase will pass through.
2894 clear_bit(ISCSI_SUSPEND_BIT
, &conn
->suspend_rx
);
2895 clear_bit(ISCSI_SUSPEND_BIT
, &conn
->suspend_tx
);
2898 EXPORT_SYMBOL_GPL(iscsi_conn_bind
);
2900 static int iscsi_switch_str_param(char **param
, char *new_val_buf
)
2905 if (!strcmp(*param
, new_val_buf
))
2909 new_val
= kstrdup(new_val_buf
, GFP_NOIO
);
2918 int iscsi_set_param(struct iscsi_cls_conn
*cls_conn
,
2919 enum iscsi_param param
, char *buf
, int buflen
)
2921 struct iscsi_conn
*conn
= cls_conn
->dd_data
;
2922 struct iscsi_session
*session
= conn
->session
;
2926 case ISCSI_PARAM_FAST_ABORT
:
2927 sscanf(buf
, "%d", &session
->fast_abort
);
2929 case ISCSI_PARAM_ABORT_TMO
:
2930 sscanf(buf
, "%d", &session
->abort_timeout
);
2932 case ISCSI_PARAM_LU_RESET_TMO
:
2933 sscanf(buf
, "%d", &session
->lu_reset_timeout
);
2935 case ISCSI_PARAM_PING_TMO
:
2936 sscanf(buf
, "%d", &conn
->ping_timeout
);
2938 case ISCSI_PARAM_RECV_TMO
:
2939 sscanf(buf
, "%d", &conn
->recv_timeout
);
2941 case ISCSI_PARAM_MAX_RECV_DLENGTH
:
2942 sscanf(buf
, "%d", &conn
->max_recv_dlength
);
2944 case ISCSI_PARAM_MAX_XMIT_DLENGTH
:
2945 sscanf(buf
, "%d", &conn
->max_xmit_dlength
);
2947 case ISCSI_PARAM_HDRDGST_EN
:
2948 sscanf(buf
, "%d", &conn
->hdrdgst_en
);
2950 case ISCSI_PARAM_DATADGST_EN
:
2951 sscanf(buf
, "%d", &conn
->datadgst_en
);
2953 case ISCSI_PARAM_INITIAL_R2T_EN
:
2954 sscanf(buf
, "%d", &session
->initial_r2t_en
);
2956 case ISCSI_PARAM_MAX_R2T
:
2957 sscanf(buf
, "%d", &session
->max_r2t
);
2959 case ISCSI_PARAM_IMM_DATA_EN
:
2960 sscanf(buf
, "%d", &session
->imm_data_en
);
2962 case ISCSI_PARAM_FIRST_BURST
:
2963 sscanf(buf
, "%d", &session
->first_burst
);
2965 case ISCSI_PARAM_MAX_BURST
:
2966 sscanf(buf
, "%d", &session
->max_burst
);
2968 case ISCSI_PARAM_PDU_INORDER_EN
:
2969 sscanf(buf
, "%d", &session
->pdu_inorder_en
);
2971 case ISCSI_PARAM_DATASEQ_INORDER_EN
:
2972 sscanf(buf
, "%d", &session
->dataseq_inorder_en
);
2974 case ISCSI_PARAM_ERL
:
2975 sscanf(buf
, "%d", &session
->erl
);
2977 case ISCSI_PARAM_IFMARKER_EN
:
2978 sscanf(buf
, "%d", &value
);
2981 case ISCSI_PARAM_OFMARKER_EN
:
2982 sscanf(buf
, "%d", &value
);
2985 case ISCSI_PARAM_EXP_STATSN
:
2986 sscanf(buf
, "%u", &conn
->exp_statsn
);
2988 case ISCSI_PARAM_USERNAME
:
2989 return iscsi_switch_str_param(&session
->username
, buf
);
2990 case ISCSI_PARAM_USERNAME_IN
:
2991 return iscsi_switch_str_param(&session
->username_in
, buf
);
2992 case ISCSI_PARAM_PASSWORD
:
2993 return iscsi_switch_str_param(&session
->password
, buf
);
2994 case ISCSI_PARAM_PASSWORD_IN
:
2995 return iscsi_switch_str_param(&session
->password_in
, buf
);
2996 case ISCSI_PARAM_TARGET_NAME
:
2997 return iscsi_switch_str_param(&session
->targetname
, buf
);
2998 case ISCSI_PARAM_TPGT
:
2999 sscanf(buf
, "%d", &session
->tpgt
);
3001 case ISCSI_PARAM_PERSISTENT_PORT
:
3002 sscanf(buf
, "%d", &conn
->persistent_port
);
3004 case ISCSI_PARAM_PERSISTENT_ADDRESS
:
3005 return iscsi_switch_str_param(&conn
->persistent_address
, buf
);
3006 case ISCSI_PARAM_IFACE_NAME
:
3007 return iscsi_switch_str_param(&session
->ifacename
, buf
);
3008 case ISCSI_PARAM_INITIATOR_NAME
:
3009 return iscsi_switch_str_param(&session
->initiatorname
, buf
);
3016 EXPORT_SYMBOL_GPL(iscsi_set_param
);
3018 int iscsi_session_get_param(struct iscsi_cls_session
*cls_session
,
3019 enum iscsi_param param
, char *buf
)
3021 struct iscsi_session
*session
= cls_session
->dd_data
;
3025 case ISCSI_PARAM_FAST_ABORT
:
3026 len
= sprintf(buf
, "%d\n", session
->fast_abort
);
3028 case ISCSI_PARAM_ABORT_TMO
:
3029 len
= sprintf(buf
, "%d\n", session
->abort_timeout
);
3031 case ISCSI_PARAM_LU_RESET_TMO
:
3032 len
= sprintf(buf
, "%d\n", session
->lu_reset_timeout
);
3034 case ISCSI_PARAM_INITIAL_R2T_EN
:
3035 len
= sprintf(buf
, "%d\n", session
->initial_r2t_en
);
3037 case ISCSI_PARAM_MAX_R2T
:
3038 len
= sprintf(buf
, "%hu\n", session
->max_r2t
);
3040 case ISCSI_PARAM_IMM_DATA_EN
:
3041 len
= sprintf(buf
, "%d\n", session
->imm_data_en
);
3043 case ISCSI_PARAM_FIRST_BURST
:
3044 len
= sprintf(buf
, "%u\n", session
->first_burst
);
3046 case ISCSI_PARAM_MAX_BURST
:
3047 len
= sprintf(buf
, "%u\n", session
->max_burst
);
3049 case ISCSI_PARAM_PDU_INORDER_EN
:
3050 len
= sprintf(buf
, "%d\n", session
->pdu_inorder_en
);
3052 case ISCSI_PARAM_DATASEQ_INORDER_EN
:
3053 len
= sprintf(buf
, "%d\n", session
->dataseq_inorder_en
);
3055 case ISCSI_PARAM_ERL
:
3056 len
= sprintf(buf
, "%d\n", session
->erl
);
3058 case ISCSI_PARAM_TARGET_NAME
:
3059 len
= sprintf(buf
, "%s\n", session
->targetname
);
3061 case ISCSI_PARAM_TPGT
:
3062 len
= sprintf(buf
, "%d\n", session
->tpgt
);
3064 case ISCSI_PARAM_USERNAME
:
3065 len
= sprintf(buf
, "%s\n", session
->username
);
3067 case ISCSI_PARAM_USERNAME_IN
:
3068 len
= sprintf(buf
, "%s\n", session
->username_in
);
3070 case ISCSI_PARAM_PASSWORD
:
3071 len
= sprintf(buf
, "%s\n", session
->password
);
3073 case ISCSI_PARAM_PASSWORD_IN
:
3074 len
= sprintf(buf
, "%s\n", session
->password_in
);
3076 case ISCSI_PARAM_IFACE_NAME
:
3077 len
= sprintf(buf
, "%s\n", session
->ifacename
);
3079 case ISCSI_PARAM_INITIATOR_NAME
:
3080 len
= sprintf(buf
, "%s\n", session
->initiatorname
);
3088 EXPORT_SYMBOL_GPL(iscsi_session_get_param
);
3090 int iscsi_conn_get_param(struct iscsi_cls_conn
*cls_conn
,
3091 enum iscsi_param param
, char *buf
)
3093 struct iscsi_conn
*conn
= cls_conn
->dd_data
;
3097 case ISCSI_PARAM_PING_TMO
:
3098 len
= sprintf(buf
, "%u\n", conn
->ping_timeout
);
3100 case ISCSI_PARAM_RECV_TMO
:
3101 len
= sprintf(buf
, "%u\n", conn
->recv_timeout
);
3103 case ISCSI_PARAM_MAX_RECV_DLENGTH
:
3104 len
= sprintf(buf
, "%u\n", conn
->max_recv_dlength
);
3106 case ISCSI_PARAM_MAX_XMIT_DLENGTH
:
3107 len
= sprintf(buf
, "%u\n", conn
->max_xmit_dlength
);
3109 case ISCSI_PARAM_HDRDGST_EN
:
3110 len
= sprintf(buf
, "%d\n", conn
->hdrdgst_en
);
3112 case ISCSI_PARAM_DATADGST_EN
:
3113 len
= sprintf(buf
, "%d\n", conn
->datadgst_en
);
3115 case ISCSI_PARAM_IFMARKER_EN
:
3116 len
= sprintf(buf
, "%d\n", conn
->ifmarker_en
);
3118 case ISCSI_PARAM_OFMARKER_EN
:
3119 len
= sprintf(buf
, "%d\n", conn
->ofmarker_en
);
3121 case ISCSI_PARAM_EXP_STATSN
:
3122 len
= sprintf(buf
, "%u\n", conn
->exp_statsn
);
3124 case ISCSI_PARAM_PERSISTENT_PORT
:
3125 len
= sprintf(buf
, "%d\n", conn
->persistent_port
);
3127 case ISCSI_PARAM_PERSISTENT_ADDRESS
:
3128 len
= sprintf(buf
, "%s\n", conn
->persistent_address
);
3136 EXPORT_SYMBOL_GPL(iscsi_conn_get_param
);
3138 int iscsi_host_get_param(struct Scsi_Host
*shost
, enum iscsi_host_param param
,
3141 struct iscsi_host
*ihost
= shost_priv(shost
);
3145 case ISCSI_HOST_PARAM_NETDEV_NAME
:
3146 len
= sprintf(buf
, "%s\n", ihost
->netdev
);
3148 case ISCSI_HOST_PARAM_HWADDRESS
:
3149 len
= sprintf(buf
, "%s\n", ihost
->hwaddress
);
3151 case ISCSI_HOST_PARAM_INITIATOR_NAME
:
3152 len
= sprintf(buf
, "%s\n", ihost
->initiatorname
);
3154 case ISCSI_HOST_PARAM_IPADDRESS
:
3155 len
= sprintf(buf
, "%s\n", ihost
->local_address
);
3163 EXPORT_SYMBOL_GPL(iscsi_host_get_param
);
3165 int iscsi_host_set_param(struct Scsi_Host
*shost
, enum iscsi_host_param param
,
3166 char *buf
, int buflen
)
3168 struct iscsi_host
*ihost
= shost_priv(shost
);
3171 case ISCSI_HOST_PARAM_NETDEV_NAME
:
3172 return iscsi_switch_str_param(&ihost
->netdev
, buf
);
3173 case ISCSI_HOST_PARAM_HWADDRESS
:
3174 return iscsi_switch_str_param(&ihost
->hwaddress
, buf
);
3175 case ISCSI_HOST_PARAM_INITIATOR_NAME
:
3176 return iscsi_switch_str_param(&ihost
->initiatorname
, buf
);
3183 EXPORT_SYMBOL_GPL(iscsi_host_set_param
);
3185 MODULE_AUTHOR("Mike Christie");
3186 MODULE_DESCRIPTION("iSCSI library functions");
3187 MODULE_LICENSE("GPL");