scsi: iscsi: Add iscsi_cls_conn refcount helpers
[linux-2.6-block.git] / drivers / scsi / libiscsi.c
CommitLineData
1a59d1b8 1// SPDX-License-Identifier: GPL-2.0-or-later
7996a778
MC
2/*
3 * iSCSI lib functions
4 *
5 * Copyright (C) 2006 Red Hat, Inc. All rights reserved.
6 * Copyright (C) 2004 - 2006 Mike Christie
7 * Copyright (C) 2004 - 2005 Dmitry Yusupov
8 * Copyright (C) 2004 - 2005 Alex Aizman
9 * maintained by open-iscsi@googlegroups.com
7996a778
MC
10 */
11#include <linux/types.h>
7996a778
MC
12#include <linux/kfifo.h>
13#include <linux/delay.h>
11836572 14#include <linux/log2.h>
5a0e3ad6 15#include <linux/slab.h>
3f07c014 16#include <linux/sched/signal.h>
acf3368f 17#include <linux/module.h>
8eb00539 18#include <asm/unaligned.h>
7996a778
MC
19#include <net/tcp.h>
20#include <scsi/scsi_cmnd.h>
21#include <scsi/scsi_device.h>
22#include <scsi/scsi_eh.h>
23#include <scsi/scsi_tcq.h>
24#include <scsi/scsi_host.h>
25#include <scsi/scsi.h>
26#include <scsi/iscsi_proto.h>
27#include <scsi/scsi_transport.h>
28#include <scsi/scsi_transport_iscsi.h>
29#include <scsi/libiscsi.h>
c2332b00 30#include <trace/events/iscsi.h>
7996a778 31
bd2199d4
EZ
32static int iscsi_dbg_lib_conn;
33module_param_named(debug_libiscsi_conn, iscsi_dbg_lib_conn, int,
34 S_IRUGO | S_IWUSR);
35MODULE_PARM_DESC(debug_libiscsi_conn,
36 "Turn on debugging for connections in libiscsi module. "
37 "Set to 1 to turn on, and zero to turn off. Default is off.");
38
39static int iscsi_dbg_lib_session;
40module_param_named(debug_libiscsi_session, iscsi_dbg_lib_session, int,
41 S_IRUGO | S_IWUSR);
42MODULE_PARM_DESC(debug_libiscsi_session,
43 "Turn on debugging for sessions in libiscsi module. "
44 "Set to 1 to turn on, and zero to turn off. Default is off.");
45
46static int iscsi_dbg_lib_eh;
47module_param_named(debug_libiscsi_eh, iscsi_dbg_lib_eh, int,
48 S_IRUGO | S_IWUSR);
49MODULE_PARM_DESC(debug_libiscsi_eh,
50 "Turn on debugging for error handling in libiscsi module. "
51 "Set to 1 to turn on, and zero to turn off. Default is off.");
1b2c7af8
MC
52
53#define ISCSI_DBG_CONN(_conn, dbg_fmt, arg...) \
54 do { \
bd2199d4 55 if (iscsi_dbg_lib_conn) \
1b2c7af8
MC
56 iscsi_conn_printk(KERN_INFO, _conn, \
57 "%s " dbg_fmt, \
58 __func__, ##arg); \
c2332b00
FH
59 iscsi_dbg_trace(trace_iscsi_dbg_conn, \
60 &(_conn)->cls_conn->dev, \
61 "%s " dbg_fmt, __func__, ##arg);\
1b2c7af8
MC
62 } while (0);
63
64#define ISCSI_DBG_SESSION(_session, dbg_fmt, arg...) \
65 do { \
bd2199d4
EZ
66 if (iscsi_dbg_lib_session) \
67 iscsi_session_printk(KERN_INFO, _session, \
68 "%s " dbg_fmt, \
69 __func__, ##arg); \
c2332b00
FH
70 iscsi_dbg_trace(trace_iscsi_dbg_session, \
71 &(_session)->cls_session->dev, \
72 "%s " dbg_fmt, __func__, ##arg); \
bd2199d4
EZ
73 } while (0);
74
75#define ISCSI_DBG_EH(_session, dbg_fmt, arg...) \
76 do { \
77 if (iscsi_dbg_lib_eh) \
1b2c7af8
MC
78 iscsi_session_printk(KERN_INFO, _session, \
79 "%s " dbg_fmt, \
80 __func__, ##arg); \
c2332b00
FH
81 iscsi_dbg_trace(trace_iscsi_dbg_eh, \
82 &(_session)->cls_session->dev, \
83 "%s " dbg_fmt, __func__, ##arg); \
1b2c7af8
MC
84 } while (0);
85
32ae763e
MC
86inline void iscsi_conn_queue_work(struct iscsi_conn *conn)
87{
88 struct Scsi_Host *shost = conn->session->host;
89 struct iscsi_host *ihost = shost_priv(shost);
90
1336aed1
MC
91 if (ihost->workq)
92 queue_work(ihost->workq, &conn->xmitwork);
32ae763e
MC
93}
94EXPORT_SYMBOL_GPL(iscsi_conn_queue_work);
95
4c0ba5d2
MC
96static void __iscsi_update_cmdsn(struct iscsi_session *session,
97 uint32_t exp_cmdsn, uint32_t max_cmdsn)
7996a778 98{
77a23c21
MC
99 /*
100 * standard specifies this check for when to update expected and
101 * max sequence numbers
102 */
103 if (iscsi_sna_lt(max_cmdsn, exp_cmdsn - 1))
104 return;
105
106 if (exp_cmdsn != session->exp_cmdsn &&
107 !iscsi_sna_lt(exp_cmdsn, session->exp_cmdsn))
7996a778
MC
108 session->exp_cmdsn = exp_cmdsn;
109
77a23c21 110 if (max_cmdsn != session->max_cmdsn &&
46a84c65 111 !iscsi_sna_lt(max_cmdsn, session->max_cmdsn))
77a23c21 112 session->max_cmdsn = max_cmdsn;
7996a778 113}
4c0ba5d2
MC
114
115void iscsi_update_cmdsn(struct iscsi_session *session, struct iscsi_nopin *hdr)
116{
117 __iscsi_update_cmdsn(session, be32_to_cpu(hdr->exp_cmdsn),
118 be32_to_cpu(hdr->max_cmdsn));
119}
77a23c21 120EXPORT_SYMBOL_GPL(iscsi_update_cmdsn);
7996a778 121
577577da
MC
122/**
123 * iscsi_prep_data_out_pdu - initialize Data-Out
124 * @task: scsi command task
125 * @r2t: R2T info
126 * @hdr: iscsi data in pdu
127 *
128 * Notes:
129 * Initialize Data-Out within this R2T sequence and finds
130 * proper data_offset within this SCSI command.
131 *
132 * This function is called with connection lock taken.
133 **/
134void iscsi_prep_data_out_pdu(struct iscsi_task *task, struct iscsi_r2t_info *r2t,
135 struct iscsi_data *hdr)
7996a778 136{
9c19a7d0 137 struct iscsi_conn *conn = task->conn;
577577da
MC
138 unsigned int left = r2t->data_length - r2t->sent;
139
140 task->hdr_len = sizeof(struct iscsi_data);
7996a778
MC
141
142 memset(hdr, 0, sizeof(struct iscsi_data));
577577da
MC
143 hdr->ttt = r2t->ttt;
144 hdr->datasn = cpu_to_be32(r2t->datasn);
145 r2t->datasn++;
7996a778 146 hdr->opcode = ISCSI_OP_SCSI_DATA_OUT;
55bdabdf 147 hdr->lun = task->lun;
577577da
MC
148 hdr->itt = task->hdr_itt;
149 hdr->exp_statsn = r2t->exp_statsn;
150 hdr->offset = cpu_to_be32(r2t->data_offset + r2t->sent);
151 if (left > conn->max_xmit_dlength) {
7996a778 152 hton24(hdr->dlength, conn->max_xmit_dlength);
577577da 153 r2t->data_count = conn->max_xmit_dlength;
7996a778
MC
154 hdr->flags = 0;
155 } else {
577577da
MC
156 hton24(hdr->dlength, left);
157 r2t->data_count = left;
7996a778
MC
158 hdr->flags = ISCSI_FLAG_CMD_FINAL;
159 }
577577da 160 conn->dataout_pdus_cnt++;
7996a778 161}
577577da 162EXPORT_SYMBOL_GPL(iscsi_prep_data_out_pdu);
7996a778 163
9c19a7d0 164static int iscsi_add_hdr(struct iscsi_task *task, unsigned len)
004d6530 165{
9c19a7d0 166 unsigned exp_len = task->hdr_len + len;
004d6530 167
9c19a7d0 168 if (exp_len > task->hdr_max) {
004d6530
BH
169 WARN_ON(1);
170 return -EINVAL;
171 }
172
173 WARN_ON(len & (ISCSI_PAD_LEN - 1)); /* caller must pad the AHS */
9c19a7d0 174 task->hdr_len = exp_len;
004d6530
BH
175 return 0;
176}
177
38d1c069
BH
178/*
179 * make an extended cdb AHS
180 */
9c19a7d0 181static int iscsi_prep_ecdb_ahs(struct iscsi_task *task)
38d1c069 182{
9c19a7d0 183 struct scsi_cmnd *cmd = task->sc;
38d1c069
BH
184 unsigned rlen, pad_len;
185 unsigned short ahslength;
186 struct iscsi_ecdb_ahdr *ecdb_ahdr;
187 int rc;
188
9c19a7d0 189 ecdb_ahdr = iscsi_next_hdr(task);
38d1c069
BH
190 rlen = cmd->cmd_len - ISCSI_CDB_SIZE;
191
192 BUG_ON(rlen > sizeof(ecdb_ahdr->ecdb));
193 ahslength = rlen + sizeof(ecdb_ahdr->reserved);
194
195 pad_len = iscsi_padding(rlen);
196
9c19a7d0 197 rc = iscsi_add_hdr(task, sizeof(ecdb_ahdr->ahslength) +
38d1c069
BH
198 sizeof(ecdb_ahdr->ahstype) + ahslength + pad_len);
199 if (rc)
200 return rc;
201
202 if (pad_len)
203 memset(&ecdb_ahdr->ecdb[rlen], 0, pad_len);
204
205 ecdb_ahdr->ahslength = cpu_to_be16(ahslength);
206 ecdb_ahdr->ahstype = ISCSI_AHSTYPE_CDB;
207 ecdb_ahdr->reserved = 0;
208 memcpy(ecdb_ahdr->ecdb, cmd->cmnd + ISCSI_CDB_SIZE, rlen);
209
1b2c7af8
MC
210 ISCSI_DBG_SESSION(task->conn->session,
211 "iscsi_prep_ecdb_ahs: varlen_cdb_len %d "
212 "rlen %d pad_len %d ahs_length %d iscsi_headers_size "
213 "%u\n", cmd->cmd_len, rlen, pad_len, ahslength,
214 task->hdr_len);
38d1c069
BH
215 return 0;
216}
217
5d12c05e
MC
218/**
219 * iscsi_check_tmf_restrictions - check if a task is affected by TMF
220 * @task: iscsi task
221 * @opcode: opcode to check for
222 *
223 * During TMF a task has to be checked if it's affected.
224 * All unrelated I/O can be passed through, but I/O to the
225 * affected LUN should be restricted.
226 * If 'fast_abort' is set we won't be sending any I/O to the
227 * affected LUN.
228 * Otherwise the target is waiting for all TTTs to be completed,
229 * so we have to send all outstanding Data-Out PDUs to the target.
230 */
231static int iscsi_check_tmf_restrictions(struct iscsi_task *task, int opcode)
232{
233 struct iscsi_conn *conn = task->conn;
234 struct iscsi_tm *tmf = &conn->tmhdr;
9cb78c16 235 u64 hdr_lun;
5d12c05e
MC
236
237 if (conn->tmf_state == TMF_INITIAL)
238 return 0;
239
240 if ((tmf->opcode & ISCSI_OPCODE_MASK) != ISCSI_OP_SCSI_TMFUNC)
241 return 0;
242
243 switch (ISCSI_TM_FUNC_VALUE(tmf)) {
244 case ISCSI_TM_FUNC_LOGICAL_UNIT_RESET:
245 /*
246 * Allow PDUs for unrelated LUNs
247 */
55bdabdf 248 hdr_lun = scsilun_to_int(&tmf->lun);
5d12c05e
MC
249 if (hdr_lun != task->sc->device->lun)
250 return 0;
df561f66 251 fallthrough;
3fe5ae8b 252 case ISCSI_TM_FUNC_TARGET_WARM_RESET:
5d12c05e
MC
253 /*
254 * Fail all SCSI cmd PDUs
255 */
256 if (opcode != ISCSI_OP_SCSI_DATA_OUT) {
257 iscsi_conn_printk(KERN_INFO, conn,
a17037e7 258 "task [op %x itt "
3fe5ae8b 259 "0x%x/0x%x] "
5d12c05e 260 "rejected.\n",
a17037e7
VP
261 opcode, task->itt,
262 task->hdr_itt);
5d12c05e
MC
263 return -EACCES;
264 }
265 /*
266 * And also all data-out PDUs in response to R2T
267 * if fast_abort is set.
268 */
269 if (conn->session->fast_abort) {
270 iscsi_conn_printk(KERN_INFO, conn,
a17037e7 271 "task [op %x itt "
3fe5ae8b 272 "0x%x/0x%x] fast abort.\n",
a17037e7
VP
273 opcode, task->itt,
274 task->hdr_itt);
5d12c05e
MC
275 return -EACCES;
276 }
277 break;
278 case ISCSI_TM_FUNC_ABORT_TASK:
279 /*
280 * the caller has already checked if the task
281 * they want to abort was in the pending queue so if
282 * we are here the cmd pdu has gone out already, and
283 * we will only hit this for data-outs
284 */
285 if (opcode == ISCSI_OP_SCSI_DATA_OUT &&
286 task->hdr_itt == tmf->rtt) {
287 ISCSI_DBG_SESSION(conn->session,
288 "Preventing task %x/%x from sending "
289 "data-out due to abort task in "
290 "progress\n", task->itt,
291 task->hdr_itt);
292 return -EACCES;
293 }
294 break;
295 }
296
297 return 0;
298}
299
7996a778
MC
300/**
301 * iscsi_prep_scsi_cmd_pdu - prep iscsi scsi cmd pdu
9c19a7d0 302 * @task: iscsi task
7996a778
MC
303 *
304 * Prep basic iSCSI PDU fields for a scsi cmd pdu. The LLD should set
305 * fields like dlength or final based on how much data it sends
306 */
9c19a7d0 307static int iscsi_prep_scsi_cmd_pdu(struct iscsi_task *task)
7996a778 308{
9c19a7d0 309 struct iscsi_conn *conn = task->conn;
7996a778 310 struct iscsi_session *session = conn->session;
9c19a7d0 311 struct scsi_cmnd *sc = task->sc;
12352183 312 struct iscsi_scsi_req *hdr;
d77e6535 313 unsigned hdrlength, cmd_len, transfer_length;
262ef636 314 itt_t itt;
004d6530 315 int rc;
7996a778 316
5d12c05e
MC
317 rc = iscsi_check_tmf_restrictions(task, ISCSI_OP_SCSI_CMD);
318 if (rc)
319 return rc;
320
184b57c6
MC
321 if (conn->session->tt->alloc_pdu) {
322 rc = conn->session->tt->alloc_pdu(task, ISCSI_OP_SCSI_CMD);
323 if (rc)
324 return rc;
325 }
12352183 326 hdr = (struct iscsi_scsi_req *)task->hdr;
262ef636 327 itt = hdr->itt;
577577da
MC
328 memset(hdr, 0, sizeof(*hdr));
329
2ff79d52
MC
330 if (session->tt->parse_pdu_itt)
331 hdr->itt = task->hdr_itt = itt;
332 else
333 hdr->itt = task->hdr_itt = build_itt(task->itt,
334 task->conn->session->age);
9c19a7d0
MC
335 task->hdr_len = 0;
336 rc = iscsi_add_hdr(task, sizeof(*hdr));
004d6530
BH
337 if (rc)
338 return rc;
a8ac6311
OK
339 hdr->opcode = ISCSI_OP_SCSI_CMD;
340 hdr->flags = ISCSI_ATTR_SIMPLE;
55bdabdf
AG
341 int_to_scsilun(sc->device->lun, &hdr->lun);
342 task->lun = hdr->lun;
a8ac6311 343 hdr->exp_statsn = cpu_to_be32(conn->exp_statsn);
38d1c069
BH
344 cmd_len = sc->cmd_len;
345 if (cmd_len < ISCSI_CDB_SIZE)
346 memset(&hdr->cdb[cmd_len], 0, ISCSI_CDB_SIZE - cmd_len);
347 else if (cmd_len > ISCSI_CDB_SIZE) {
9c19a7d0 348 rc = iscsi_prep_ecdb_ahs(task);
38d1c069
BH
349 if (rc)
350 return rc;
351 cmd_len = ISCSI_CDB_SIZE;
352 }
353 memcpy(hdr->cdb, sc->cmnd, cmd_len);
7996a778 354
9c19a7d0 355 task->imm_count = 0;
55e51eda
SG
356 if (scsi_get_prot_op(sc) != SCSI_PROT_NORMAL)
357 task->protected = true;
358
d77e6535
SG
359 transfer_length = scsi_transfer_length(sc);
360 hdr->data_length = cpu_to_be32(transfer_length);
7996a778 361 if (sc->sc_data_direction == DMA_TO_DEVICE) {
577577da
MC
362 struct iscsi_r2t_info *r2t = &task->unsol_r2t;
363
7996a778
MC
364 hdr->flags |= ISCSI_FLAG_CMD_WRITE;
365 /*
366 * Write counters:
367 *
368 * imm_count bytes to be sent right after
369 * SCSI PDU Header
370 *
371 * unsol_count bytes(as Data-Out) to be sent
372 * without R2T ack right after
373 * immediate data
374 *
577577da 375 * r2t data_length bytes to be sent via R2T ack's
7996a778
MC
376 *
377 * pad_count bytes to be sent as zero-padding
378 */
577577da 379 memset(r2t, 0, sizeof(*r2t));
7996a778
MC
380
381 if (session->imm_data_en) {
d77e6535 382 if (transfer_length >= session->first_burst)
9c19a7d0 383 task->imm_count = min(session->first_burst,
7996a778
MC
384 conn->max_xmit_dlength);
385 else
d77e6535
SG
386 task->imm_count = min(transfer_length,
387 conn->max_xmit_dlength);
9c19a7d0 388 hton24(hdr->dlength, task->imm_count);
7996a778 389 } else
a8ac6311 390 zero_data(hdr->dlength);
7996a778 391
ffd0436e 392 if (!session->initial_r2t_en) {
d77e6535
SG
393 r2t->data_length = min(session->first_burst,
394 transfer_length) -
577577da
MC
395 task->imm_count;
396 r2t->data_offset = task->imm_count;
397 r2t->ttt = cpu_to_be32(ISCSI_RESERVED_TAG);
398 r2t->exp_statsn = cpu_to_be32(conn->exp_statsn);
ffd0436e
MC
399 }
400
577577da 401 if (!task->unsol_r2t.data_length)
7996a778 402 /* No unsolicit Data-Out's */
a8ac6311 403 hdr->flags |= ISCSI_FLAG_CMD_FINAL;
7996a778 404 } else {
7996a778
MC
405 hdr->flags |= ISCSI_FLAG_CMD_FINAL;
406 zero_data(hdr->dlength);
407
408 if (sc->sc_data_direction == DMA_FROM_DEVICE)
409 hdr->flags |= ISCSI_FLAG_CMD_READ;
410 }
411
004d6530 412 /* calculate size of additional header segments (AHSs) */
9c19a7d0 413 hdrlength = task->hdr_len - sizeof(*hdr);
004d6530
BH
414
415 WARN_ON(hdrlength & (ISCSI_PAD_LEN-1));
416 hdrlength /= ISCSI_PAD_LEN;
417
418 WARN_ON(hdrlength >= 256);
419 hdr->hlength = hdrlength & 0xFF;
96b1f96d 420 hdr->cmdsn = task->cmdsn = cpu_to_be32(session->cmdsn);
004d6530 421
577577da 422 if (session->tt->init_task && session->tt->init_task(task))
052d0144
MC
423 return -EIO;
424
9c19a7d0 425 task->state = ISCSI_TASK_RUNNING;
d3305f34 426 session->cmdsn++;
77a23c21 427
a8ac6311 428 conn->scsicmd_pdus_cnt++;
1b2c7af8 429 ISCSI_DBG_SESSION(session, "iscsi prep [%s cid %d sc %p cdb 0x%x "
ae3d56d8 430 "itt 0x%x len %d cmdsn %d win %d]\n",
1b2c7af8
MC
431 sc->sc_data_direction == DMA_TO_DEVICE ?
432 "write" : "read", conn->id, sc, sc->cmnd[0],
d77e6535 433 task->itt, transfer_length,
1b2c7af8
MC
434 session->cmdsn,
435 session->max_cmdsn - session->exp_cmdsn + 1);
004d6530 436 return 0;
7996a778 437}
7996a778
MC
438
439/**
3bbaaad9 440 * iscsi_free_task - free a task
9c19a7d0 441 * @task: iscsi cmd task
7996a778 442 *
659743b0 443 * Must be called with session back_lock.
3e5c28ad
MC
444 * This function returns the scsi command to scsi-ml or cleans
445 * up mgmt tasks then returns the task to the pool.
7996a778 446 */
3bbaaad9 447static void iscsi_free_task(struct iscsi_task *task)
7996a778 448{
9c19a7d0 449 struct iscsi_conn *conn = task->conn;
c1635cb7 450 struct iscsi_session *session = conn->session;
9c19a7d0 451 struct scsi_cmnd *sc = task->sc;
f41d4721 452 int oldstate = task->state;
7996a778 453
4421c9eb
MC
454 ISCSI_DBG_SESSION(session, "freeing task itt 0x%x state %d sc %p\n",
455 task->itt, task->state, task->sc);
456
577577da 457 session->tt->cleanup_task(task);
3bbaaad9 458 task->state = ISCSI_TASK_FREE;
9c19a7d0 459 task->sc = NULL;
3e5c28ad 460 /*
9c19a7d0 461 * login task is preallocated so do not free
3e5c28ad 462 */
9c19a7d0 463 if (conn->login_task == task)
3e5c28ad
MC
464 return;
465
7acd72eb 466 kfifo_in(&session->cmdpool.queue, (void*)&task, sizeof(void*));
052d0144 467
3e5c28ad 468 if (sc) {
3e5c28ad
MC
469 /* SCSI eh reuses commands to verify us */
470 sc->SCp.ptr = NULL;
471 /*
f41d4721
MC
472 * queue command may call this to free the task, so
473 * it will decide how to return sc to scsi-ml.
3e5c28ad 474 */
f41d4721 475 if (oldstate != ISCSI_TASK_REQUEUE_SCSIQ)
3e5c28ad
MC
476 sc->scsi_done(sc);
477 }
7996a778
MC
478}
479
913e5bf4 480void __iscsi_get_task(struct iscsi_task *task)
60ecebf5 481{
6dc618cd 482 refcount_inc(&task->refcount);
60ecebf5 483}
913e5bf4 484EXPORT_SYMBOL_GPL(__iscsi_get_task);
60ecebf5 485
8eea2f55 486void __iscsi_put_task(struct iscsi_task *task)
60ecebf5 487{
6dc618cd 488 if (refcount_dec_and_test(&task->refcount))
3bbaaad9 489 iscsi_free_task(task);
60ecebf5 490}
8eea2f55 491EXPORT_SYMBOL_GPL(__iscsi_put_task);
60ecebf5 492
9c19a7d0 493void iscsi_put_task(struct iscsi_task *task)
3e5c28ad 494{
9c19a7d0 495 struct iscsi_session *session = task->conn->session;
3e5c28ad 496
659743b0
SP
497 /* regular RX path uses back_lock */
498 spin_lock_bh(&session->back_lock);
9c19a7d0 499 __iscsi_put_task(task);
659743b0 500 spin_unlock_bh(&session->back_lock);
3e5c28ad 501}
9c19a7d0 502EXPORT_SYMBOL_GPL(iscsi_put_task);
3e5c28ad 503
3bbaaad9
MC
504/**
505 * iscsi_complete_task - finish a task
506 * @task: iscsi cmd task
b3cd5050 507 * @state: state to complete task with
3bbaaad9 508 *
659743b0 509 * Must be called with session back_lock.
3bbaaad9 510 */
b3cd5050 511static void iscsi_complete_task(struct iscsi_task *task, int state)
3bbaaad9
MC
512{
513 struct iscsi_conn *conn = task->conn;
514
4421c9eb
MC
515 ISCSI_DBG_SESSION(conn->session,
516 "complete task itt 0x%x state %d sc %p\n",
517 task->itt, task->state, task->sc);
b3cd5050
MC
518 if (task->state == ISCSI_TASK_COMPLETED ||
519 task->state == ISCSI_TASK_ABRT_TMF ||
f41d4721
MC
520 task->state == ISCSI_TASK_ABRT_SESS_RECOV ||
521 task->state == ISCSI_TASK_REQUEUE_SCSIQ)
3bbaaad9
MC
522 return;
523 WARN_ON_ONCE(task->state == ISCSI_TASK_FREE);
b3cd5050 524 task->state = state;
3bbaaad9 525
fe0a8a95
LD
526 if (READ_ONCE(conn->ping_task) == task)
527 WRITE_ONCE(conn->ping_task, NULL);
3bbaaad9
MC
528
529 /* release get from queueing */
530 __iscsi_put_task(task);
531}
532
4c0ba5d2
MC
533/**
534 * iscsi_complete_scsi_task - finish scsi task normally
535 * @task: iscsi task for scsi cmd
536 * @exp_cmdsn: expected cmd sn in cpu format
537 * @max_cmdsn: max cmd sn in cpu format
538 *
539 * This is used when drivers do not need or cannot perform
540 * lower level pdu processing.
541 *
659743b0 542 * Called with session back_lock
4c0ba5d2
MC
543 */
544void iscsi_complete_scsi_task(struct iscsi_task *task,
545 uint32_t exp_cmdsn, uint32_t max_cmdsn)
546{
547 struct iscsi_conn *conn = task->conn;
548
549 ISCSI_DBG_SESSION(conn->session, "[itt 0x%x]\n", task->itt);
550
551 conn->last_recv = jiffies;
552 __iscsi_update_cmdsn(conn->session, exp_cmdsn, max_cmdsn);
553 iscsi_complete_task(task, ISCSI_TASK_COMPLETED);
554}
555EXPORT_SYMBOL_GPL(iscsi_complete_scsi_task);
556
5923d64b
MC
557/*
558 * Must be called with back and frwd lock
559 */
560static bool cleanup_queued_task(struct iscsi_task *task)
561{
562 struct iscsi_conn *conn = task->conn;
563 bool early_complete = false;
564
565 /* Bad target might have completed task while it was still running */
566 if (task->state == ISCSI_TASK_COMPLETED)
567 early_complete = true;
568
569 if (!list_empty(&task->running)) {
570 list_del_init(&task->running);
571 /*
572 * If it's on a list but still running, this could be from
573 * a bad target sending a rsp early, cleanup from a TMF, or
574 * session recovery.
575 */
576 if (task->state == ISCSI_TASK_RUNNING ||
577 task->state == ISCSI_TASK_COMPLETED)
578 __iscsi_put_task(task);
579 }
580
581 if (conn->task == task) {
582 conn->task = NULL;
583 __iscsi_put_task(task);
584 }
585
586 return early_complete;
587}
4c0ba5d2 588
b3a7ea8d 589/*
14936b1e
MC
590 * session frwd lock must be held and if not called for a task that is still
591 * pending or from the xmit thread, then xmit thread must be suspended
b3a7ea8d 592 */
3bbaaad9 593static void fail_scsi_task(struct iscsi_task *task, int err)
b3a7ea8d 594{
3bbaaad9 595 struct iscsi_conn *conn = task->conn;
b3a7ea8d 596 struct scsi_cmnd *sc;
b3cd5050 597 int state;
b3a7ea8d 598
5923d64b
MC
599 spin_lock_bh(&conn->session->back_lock);
600 if (cleanup_queued_task(task)) {
601 spin_unlock_bh(&conn->session->back_lock);
602 return;
603 }
604
b3cd5050 605 if (task->state == ISCSI_TASK_PENDING) {
b3a7ea8d
MC
606 /*
607 * cmd never made it to the xmit thread, so we should not count
608 * the cmd in the sequencing
609 */
610 conn->session->queued_cmdsn--;
b3cd5050
MC
611 /* it was never sent so just complete like normal */
612 state = ISCSI_TASK_COMPLETED;
613 } else if (err == DID_TRANSPORT_DISRUPTED)
614 state = ISCSI_TASK_ABRT_SESS_RECOV;
615 else
616 state = ISCSI_TASK_ABRT_TMF;
b3a7ea8d 617
14936b1e 618 sc = task->sc;
b3cd5050 619 sc->result = err << 16;
ae3d56d8 620 scsi_set_resid(sc, scsi_bufflen(sc));
b3cd5050 621 iscsi_complete_task(task, state);
659743b0 622 spin_unlock_bh(&conn->session->back_lock);
b3a7ea8d
MC
623}
624
3e5c28ad 625static int iscsi_prep_mgmt_task(struct iscsi_conn *conn,
9c19a7d0 626 struct iscsi_task *task)
052d0144
MC
627{
628 struct iscsi_session *session = conn->session;
577577da 629 struct iscsi_hdr *hdr = task->hdr;
052d0144 630 struct iscsi_nopout *nop = (struct iscsi_nopout *)hdr;
4f704dc0 631 uint8_t opcode = hdr->opcode & ISCSI_OPCODE_MASK;
052d0144
MC
632
633 if (conn->session->state == ISCSI_STATE_LOGGING_OUT)
634 return -ENOTCONN;
635
4f704dc0 636 if (opcode != ISCSI_OP_LOGIN && opcode != ISCSI_OP_TEXT)
052d0144
MC
637 nop->exp_statsn = cpu_to_be32(conn->exp_statsn);
638 /*
639 * pre-format CmdSN for outgoing PDU.
640 */
641 nop->cmdsn = cpu_to_be32(session->cmdsn);
642 if (hdr->itt != RESERVED_ITT) {
052d0144 643 /*
4f704dc0 644 * TODO: We always use immediate for normal session pdus.
052d0144
MC
645 * If we start to send tmfs or nops as non-immediate then
646 * we should start checking the cmdsn numbers for mgmt tasks.
4f704dc0
MC
647 *
648 * During discovery sessions iscsid sends TEXT as non immediate,
649 * but we always only send one PDU at a time.
052d0144
MC
650 */
651 if (conn->c_stage == ISCSI_CONN_STARTED &&
652 !(hdr->opcode & ISCSI_OP_IMMEDIATE)) {
653 session->queued_cmdsn++;
654 session->cmdsn++;
655 }
656 }
657
ae15f801
MC
658 if (session->tt->init_task && session->tt->init_task(task))
659 return -EIO;
052d0144
MC
660
661 if ((hdr->opcode & ISCSI_OPCODE_MASK) == ISCSI_OP_LOGOUT)
662 session->state = ISCSI_STATE_LOGGING_OUT;
663
577577da 664 task->state = ISCSI_TASK_RUNNING;
1b2c7af8
MC
665 ISCSI_DBG_SESSION(session, "mgmtpdu [op 0x%x hdr->itt 0x%x "
666 "datalen %d]\n", hdr->opcode & ISCSI_OPCODE_MASK,
667 hdr->itt, task->data_count);
052d0144
MC
668 return 0;
669}
670
9c19a7d0 671static struct iscsi_task *
f6d5180c
MC
672__iscsi_conn_send_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
673 char *data, uint32_t data_size)
674{
675 struct iscsi_session *session = conn->session;
1336aed1 676 struct iscsi_host *ihost = shost_priv(session->host);
4f704dc0 677 uint8_t opcode = hdr->opcode & ISCSI_OPCODE_MASK;
9c19a7d0 678 struct iscsi_task *task;
262ef636 679 itt_t itt;
f6d5180c
MC
680
681 if (session->state == ISCSI_STATE_TERMINATE)
682 return NULL;
683
4f704dc0 684 if (opcode == ISCSI_OP_LOGIN || opcode == ISCSI_OP_TEXT) {
f6d5180c
MC
685 /*
686 * Login and Text are sent serially, in
687 * request-followed-by-response sequence.
3e5c28ad
MC
688 * Same task can be used. Same ITT must be used.
689 * Note that login_task is preallocated at conn_create().
f6d5180c 690 */
4f704dc0
MC
691 if (conn->login_task->state != ISCSI_TASK_FREE) {
692 iscsi_conn_printk(KERN_ERR, conn, "Login/Text in "
693 "progress. Cannot start new task.\n");
694 return NULL;
695 }
696
cbaa4221
MC
697 if (data_size > ISCSI_DEF_MAX_RECV_SEG_LEN) {
698 iscsi_conn_printk(KERN_ERR, conn, "Invalid buffer len of %u for login task. Max len is %u\n", data_size, ISCSI_DEF_MAX_RECV_SEG_LEN);
699 return NULL;
700 }
701
9c19a7d0 702 task = conn->login_task;
4f704dc0 703 } else {
26013ad4
MC
704 if (session->state != ISCSI_STATE_LOGGED_IN)
705 return NULL;
706
cbaa4221
MC
707 if (data_size != 0) {
708 iscsi_conn_printk(KERN_ERR, conn, "Can not send data buffer of len %u for op 0x%x\n", data_size, opcode);
709 return NULL;
710 }
711
f6d5180c
MC
712 BUG_ON(conn->c_stage == ISCSI_CONN_INITIAL_STAGE);
713 BUG_ON(conn->c_stage == ISCSI_CONN_STOPPED);
714
7acd72eb 715 if (!kfifo_out(&session->cmdpool.queue,
9c19a7d0 716 (void*)&task, sizeof(void*)))
f6d5180c
MC
717 return NULL;
718 }
3e5c28ad
MC
719 /*
720 * released in complete pdu for task we expect a response for, and
721 * released by the lld when it has transmitted the task for
722 * pdus we do not expect a response for.
723 */
6dc618cd 724 refcount_set(&task->refcount, 1);
9c19a7d0
MC
725 task->conn = conn;
726 task->sc = NULL;
3bbaaad9
MC
727 INIT_LIST_HEAD(&task->running);
728 task->state = ISCSI_TASK_PENDING;
f6d5180c
MC
729
730 if (data_size) {
9c19a7d0
MC
731 memcpy(task->data, data, data_size);
732 task->data_count = data_size;
f6d5180c 733 } else
9c19a7d0 734 task->data_count = 0;
f6d5180c 735
184b57c6
MC
736 if (conn->session->tt->alloc_pdu) {
737 if (conn->session->tt->alloc_pdu(task, hdr->opcode)) {
738 iscsi_conn_printk(KERN_ERR, conn, "Could not allocate "
739 "pdu for mgmt task.\n");
3bbaaad9 740 goto free_task;
184b57c6 741 }
577577da 742 }
184b57c6 743
262ef636 744 itt = task->hdr->itt;
577577da 745 task->hdr_len = sizeof(struct iscsi_hdr);
9c19a7d0 746 memcpy(task->hdr, hdr, sizeof(struct iscsi_hdr));
262ef636
MC
747
748 if (hdr->itt != RESERVED_ITT) {
749 if (session->tt->parse_pdu_itt)
750 task->hdr->itt = itt;
751 else
752 task->hdr->itt = build_itt(task->itt,
753 task->conn->session->age);
754 }
755
fe0a8a95
LD
756 if (unlikely(READ_ONCE(conn->ping_task) == INVALID_SCSI_TASK))
757 WRITE_ONCE(conn->ping_task, task);
758
1336aed1 759 if (!ihost->workq) {
577577da
MC
760 if (iscsi_prep_mgmt_task(conn, task))
761 goto free_task;
052d0144 762
9c19a7d0 763 if (session->tt->xmit_task(task))
577577da 764 goto free_task;
3bbaaad9
MC
765 } else {
766 list_add_tail(&task->running, &conn->mgmtqueue);
32ae763e 767 iscsi_conn_queue_work(conn);
3bbaaad9 768 }
052d0144 769
9c19a7d0 770 return task;
577577da
MC
771
772free_task:
659743b0 773 /* regular RX path uses back_lock */
4fa50799 774 spin_lock(&session->back_lock);
577577da 775 __iscsi_put_task(task);
4fa50799 776 spin_unlock(&session->back_lock);
577577da 777 return NULL;
f6d5180c
MC
778}
779
780int iscsi_conn_send_pdu(struct iscsi_cls_conn *cls_conn, struct iscsi_hdr *hdr,
781 char *data, uint32_t data_size)
782{
783 struct iscsi_conn *conn = cls_conn->dd_data;
784 struct iscsi_session *session = conn->session;
785 int err = 0;
786
659743b0 787 spin_lock_bh(&session->frwd_lock);
f6d5180c
MC
788 if (!__iscsi_conn_send_pdu(conn, hdr, data, data_size))
789 err = -EPERM;
659743b0 790 spin_unlock_bh(&session->frwd_lock);
f6d5180c
MC
791 return err;
792}
793EXPORT_SYMBOL_GPL(iscsi_conn_send_pdu);
794
7996a778 795/**
ae6b4e69 796 * iscsi_scsi_cmd_rsp - SCSI Command Response processing
7996a778
MC
797 * @conn: iscsi connection
798 * @hdr: iscsi header
9c19a7d0 799 * @task: scsi command task
7996a778
MC
800 * @data: cmd data buffer
801 * @datalen: len of buffer
802 *
803 * iscsi_cmd_rsp sets up the scsi_cmnd fields based on the PDU and
a656183e 804 * then completes the command and task. called under back_lock
7996a778 805 **/
77a23c21 806static void iscsi_scsi_cmd_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
9c19a7d0 807 struct iscsi_task *task, char *data,
77a23c21 808 int datalen)
7996a778 809{
12352183 810 struct iscsi_scsi_rsp *rhdr = (struct iscsi_scsi_rsp *)hdr;
7996a778 811 struct iscsi_session *session = conn->session;
9c19a7d0 812 struct scsi_cmnd *sc = task->sc;
7996a778 813
77a23c21 814 iscsi_update_cmdsn(session, (struct iscsi_nopin*)rhdr);
7996a778
MC
815 conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1;
816
817 sc->result = (DID_OK << 16) | rhdr->cmd_status;
818
55e51eda
SG
819 if (task->protected) {
820 sector_t sector;
821 u8 ascq;
822
823 /**
824 * Transports that didn't implement check_protection
825 * callback but still published T10-PI support to scsi-mid
826 * deserve this BUG_ON.
827 **/
828 BUG_ON(!session->tt->check_protection);
829
830 ascq = session->tt->check_protection(task, &sector);
831 if (ascq) {
832 sc->result = DRIVER_SENSE << 24 |
833 SAM_STAT_CHECK_CONDITION;
834 scsi_build_sense_buffer(1, sc->sense_buffer,
835 ILLEGAL_REQUEST, 0x10, ascq);
a73c2a2f
SG
836 scsi_set_sense_information(sc->sense_buffer,
837 SCSI_SENSE_BUFFERSIZE,
838 sector);
55e51eda
SG
839 goto out;
840 }
841 }
842
7996a778
MC
843 if (rhdr->response != ISCSI_STATUS_CMD_COMPLETED) {
844 sc->result = DID_ERROR << 16;
845 goto out;
846 }
847
848 if (rhdr->cmd_status == SAM_STAT_CHECK_CONDITION) {
9b80cb4b 849 uint16_t senselen;
7996a778
MC
850
851 if (datalen < 2) {
852invalid_datalen:
322d739d
MC
853 iscsi_conn_printk(KERN_ERR, conn,
854 "Got CHECK_CONDITION but invalid data "
855 "buffer size of %d\n", datalen);
7996a778
MC
856 sc->result = DID_BAD_TARGET << 16;
857 goto out;
858 }
859
8f333991 860 senselen = get_unaligned_be16(data);
7996a778
MC
861 if (datalen < senselen)
862 goto invalid_datalen;
863
864 memcpy(sc->sense_buffer, data + 2,
9b80cb4b 865 min_t(uint16_t, senselen, SCSI_SENSE_BUFFERSIZE));
1b2c7af8
MC
866 ISCSI_DBG_SESSION(session, "copied %d bytes of sense\n",
867 min_t(uint16_t, senselen,
868 SCSI_SENSE_BUFFERSIZE));
7996a778
MC
869 }
870
c07d4444
BH
871 if (rhdr->flags & (ISCSI_FLAG_CMD_BIDI_UNDERFLOW |
872 ISCSI_FLAG_CMD_BIDI_OVERFLOW)) {
ae3d56d8 873 sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status;
c07d4444
BH
874 }
875
7207fea4
BH
876 if (rhdr->flags & (ISCSI_FLAG_CMD_UNDERFLOW |
877 ISCSI_FLAG_CMD_OVERFLOW)) {
7996a778
MC
878 int res_count = be32_to_cpu(rhdr->residual_count);
879
7207fea4
BH
880 if (res_count > 0 &&
881 (rhdr->flags & ISCSI_FLAG_CMD_OVERFLOW ||
882 res_count <= scsi_bufflen(sc)))
c07d4444 883 /* write side for bidi or uni-io set_resid */
1c138991 884 scsi_set_resid(sc, res_count);
7996a778
MC
885 else
886 sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status;
c07d4444 887 }
7996a778 888out:
3bbaaad9 889 ISCSI_DBG_SESSION(session, "cmd rsp done [sc %p res %d itt 0x%x]\n",
1b2c7af8 890 sc, sc->result, task->itt);
7996a778 891 conn->scsirsp_pdus_cnt++;
b3cd5050 892 iscsi_complete_task(task, ISCSI_TASK_COMPLETED);
7996a778
MC
893}
894
1d9edf02
MC
895/**
896 * iscsi_data_in_rsp - SCSI Data-In Response processing
897 * @conn: iscsi connection
898 * @hdr: iscsi pdu
899 * @task: scsi command task
a656183e
LD
900 *
901 * iscsi_data_in_rsp sets up the scsi_cmnd fields based on the data received
902 * then completes the command and task. called under back_lock
1d9edf02
MC
903 **/
904static void
905iscsi_data_in_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
906 struct iscsi_task *task)
907{
908 struct iscsi_data_rsp *rhdr = (struct iscsi_data_rsp *)hdr;
909 struct scsi_cmnd *sc = task->sc;
910
911 if (!(rhdr->flags & ISCSI_FLAG_DATA_STATUS))
912 return;
913
edbc9aa0 914 iscsi_update_cmdsn(conn->session, (struct iscsi_nopin *)hdr);
1d9edf02
MC
915 sc->result = (DID_OK << 16) | rhdr->cmd_status;
916 conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1;
917 if (rhdr->flags & (ISCSI_FLAG_DATA_UNDERFLOW |
918 ISCSI_FLAG_DATA_OVERFLOW)) {
919 int res_count = be32_to_cpu(rhdr->residual_count);
920
921 if (res_count > 0 &&
922 (rhdr->flags & ISCSI_FLAG_CMD_OVERFLOW ||
ae3d56d8 923 res_count <= sc->sdb.length))
960bf87a 924 scsi_set_resid(sc, res_count);
1d9edf02
MC
925 else
926 sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status;
927 }
928
3bbaaad9
MC
929 ISCSI_DBG_SESSION(conn->session, "data in with status done "
930 "[sc %p res %d itt 0x%x]\n",
931 sc, sc->result, task->itt);
1d9edf02 932 conn->scsirsp_pdus_cnt++;
b3cd5050 933 iscsi_complete_task(task, ISCSI_TASK_COMPLETED);
1d9edf02
MC
934}
935
7ea8b828
MC
936static void iscsi_tmf_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr)
937{
938 struct iscsi_tm_rsp *tmf = (struct iscsi_tm_rsp *)hdr;
939
940 conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1;
941 conn->tmfrsp_pdus_cnt++;
942
843c0a8a 943 if (conn->tmf_state != TMF_QUEUED)
7ea8b828
MC
944 return;
945
946 if (tmf->response == ISCSI_TMF_RSP_COMPLETE)
843c0a8a 947 conn->tmf_state = TMF_SUCCESS;
7ea8b828 948 else if (tmf->response == ISCSI_TMF_RSP_NO_TASK)
843c0a8a 949 conn->tmf_state = TMF_NOT_FOUND;
7ea8b828 950 else
843c0a8a 951 conn->tmf_state = TMF_FAILED;
7ea8b828
MC
952 wake_up(&conn->ehwait);
953}
954
52f5664a 955static int iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr)
f6d5180c
MC
956{
957 struct iscsi_nopout hdr;
9c19a7d0 958 struct iscsi_task *task;
f6d5180c 959
fe0a8a95
LD
960 if (!rhdr) {
961 if (READ_ONCE(conn->ping_task))
962 return -EINVAL;
963 WRITE_ONCE(conn->ping_task, INVALID_SCSI_TASK);
964 }
f6d5180c
MC
965
966 memset(&hdr, 0, sizeof(struct iscsi_nopout));
967 hdr.opcode = ISCSI_OP_NOOP_OUT | ISCSI_OP_IMMEDIATE;
968 hdr.flags = ISCSI_FLAG_CMD_FINAL;
969
970 if (rhdr) {
55bdabdf 971 hdr.lun = rhdr->lun;
f6d5180c
MC
972 hdr.ttt = rhdr->ttt;
973 hdr.itt = RESERVED_ITT;
974 } else
975 hdr.ttt = RESERVED_ITT;
976
9c19a7d0 977 task = __iscsi_conn_send_pdu(conn, (struct iscsi_hdr *)&hdr, NULL, 0);
52f5664a 978 if (!task) {
fe0a8a95
LD
979 if (!rhdr)
980 WRITE_ONCE(conn->ping_task, NULL);
322d739d 981 iscsi_conn_printk(KERN_ERR, conn, "Could not send nopout\n");
52f5664a
AN
982 return -EIO;
983 } else if (!rhdr) {
d3acf022 984 /* only track our nops */
d3acf022
MC
985 conn->last_ping = jiffies;
986 }
52f5664a
AN
987
988 return 0;
f6d5180c
MC
989}
990
a656183e
LD
991/**
992 * iscsi_nop_out_rsp - SCSI NOP Response processing
993 * @task: scsi command task
994 * @nop: the nop structure
995 * @data: where to put the data
996 * @datalen: length of data
997 *
998 * iscsi_nop_out_rsp handles nop response from use or
999 * from user space. called under back_lock
1000 **/
8afa1439
MC
1001static int iscsi_nop_out_rsp(struct iscsi_task *task,
1002 struct iscsi_nopin *nop, char *data, int datalen)
1003{
1004 struct iscsi_conn *conn = task->conn;
1005 int rc = 0;
1006
fe0a8a95 1007 if (READ_ONCE(conn->ping_task) != task) {
8afa1439
MC
1008 /*
1009 * If this is not in response to one of our
1010 * nops then it must be from userspace.
1011 */
1012 if (iscsi_recv_pdu(conn->cls_conn, (struct iscsi_hdr *)nop,
1013 data, datalen))
1014 rc = ISCSI_ERR_CONN_FAILED;
1015 } else
1016 mod_timer(&conn->transport_timer, jiffies + conn->recv_timeout);
1017 iscsi_complete_task(task, ISCSI_TASK_COMPLETED);
1018 return rc;
1019}
1020
62f38300
MC
1021static int iscsi_handle_reject(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
1022 char *data, int datalen)
1023{
1024 struct iscsi_reject *reject = (struct iscsi_reject *)hdr;
1025 struct iscsi_hdr rejected_pdu;
8afa1439 1026 int opcode, rc = 0;
62f38300
MC
1027
1028 conn->exp_statsn = be32_to_cpu(reject->statsn) + 1;
1029
8afa1439
MC
1030 if (ntoh24(reject->dlength) > datalen ||
1031 ntoh24(reject->dlength) < sizeof(struct iscsi_hdr)) {
1032 iscsi_conn_printk(KERN_ERR, conn, "Cannot handle rejected "
1033 "pdu. Invalid data length (pdu dlength "
1034 "%u, datalen %d\n", ntoh24(reject->dlength),
1035 datalen);
1036 return ISCSI_ERR_PROTO;
1037 }
1038 memcpy(&rejected_pdu, data, sizeof(struct iscsi_hdr));
1039 opcode = rejected_pdu.opcode & ISCSI_OPCODE_MASK;
1040
1041 switch (reject->reason) {
1042 case ISCSI_REASON_DATA_DIGEST_ERROR:
1043 iscsi_conn_printk(KERN_ERR, conn,
1044 "pdu (op 0x%x itt 0x%x) rejected "
1045 "due to DataDigest error.\n",
e5dbbe27 1046 opcode, rejected_pdu.itt);
8afa1439
MC
1047 break;
1048 case ISCSI_REASON_IMM_CMD_REJECT:
1049 iscsi_conn_printk(KERN_ERR, conn,
1050 "pdu (op 0x%x itt 0x%x) rejected. Too many "
1051 "immediate commands.\n",
e5dbbe27 1052 opcode, rejected_pdu.itt);
8afa1439
MC
1053 /*
1054 * We only send one TMF at a time so if the target could not
1055 * handle it, then it should get fixed (RFC mandates that
1056 * a target can handle one immediate TMF per conn).
1057 *
1058 * For nops-outs, we could have sent more than one if
1059 * the target is sending us lots of nop-ins
1060 */
1061 if (opcode != ISCSI_OP_NOOP_OUT)
1062 return 0;
62f38300 1063
4dec6a8f 1064 if (rejected_pdu.itt == cpu_to_be32(ISCSI_RESERVED_TAG)) {
8afa1439
MC
1065 /*
1066 * nop-out in response to target's nop-out rejected.
1067 * Just resend.
1068 */
659743b0
SP
1069 /* In RX path we are under back lock */
1070 spin_unlock(&conn->session->back_lock);
1071 spin_lock(&conn->session->frwd_lock);
8afa1439
MC
1072 iscsi_send_nopout(conn,
1073 (struct iscsi_nopin*)&rejected_pdu);
659743b0
SP
1074 spin_unlock(&conn->session->frwd_lock);
1075 spin_lock(&conn->session->back_lock);
1076 } else {
8afa1439
MC
1077 struct iscsi_task *task;
1078 /*
1079 * Our nop as ping got dropped. We know the target
1080 * and transport are ok so just clean up
1081 */
1082 task = iscsi_itt_to_task(conn, rejected_pdu.itt);
1083 if (!task) {
1084 iscsi_conn_printk(KERN_ERR, conn,
1085 "Invalid pdu reject. Could "
1086 "not lookup rejected task.\n");
1087 rc = ISCSI_ERR_BAD_ITT;
1088 } else
1089 rc = iscsi_nop_out_rsp(task,
1090 (struct iscsi_nopin*)&rejected_pdu,
1091 NULL, 0);
62f38300 1092 }
8afa1439
MC
1093 break;
1094 default:
1095 iscsi_conn_printk(KERN_ERR, conn,
1096 "pdu (op 0x%x itt 0x%x) rejected. Reason "
e5dbbe27
VC
1097 "code 0x%x\n", rejected_pdu.opcode,
1098 rejected_pdu.itt, reject->reason);
8afa1439 1099 break;
62f38300 1100 }
8afa1439 1101 return rc;
62f38300
MC
1102}
1103
913e5bf4
MC
1104/**
1105 * iscsi_itt_to_task - look up task by itt
1106 * @conn: iscsi connection
1107 * @itt: itt
1108 *
1109 * This should be used for mgmt tasks like login and nops, or if
1110 * the LDD's itt space does not include the session age.
1111 *
659743b0 1112 * The session back_lock must be held.
913e5bf4 1113 */
8f9256ce 1114struct iscsi_task *iscsi_itt_to_task(struct iscsi_conn *conn, itt_t itt)
913e5bf4
MC
1115{
1116 struct iscsi_session *session = conn->session;
262ef636 1117 int i;
913e5bf4
MC
1118
1119 if (itt == RESERVED_ITT)
1120 return NULL;
1121
262ef636
MC
1122 if (session->tt->parse_pdu_itt)
1123 session->tt->parse_pdu_itt(conn, itt, &i, NULL);
1124 else
1125 i = get_itt(itt);
913e5bf4
MC
1126 if (i >= session->cmds_max)
1127 return NULL;
1128
1129 return session->cmds[i];
1130}
8f9256ce 1131EXPORT_SYMBOL_GPL(iscsi_itt_to_task);
913e5bf4 1132
7996a778
MC
1133/**
1134 * __iscsi_complete_pdu - complete pdu
1135 * @conn: iscsi conn
1136 * @hdr: iscsi header
1137 * @data: data buffer
1138 * @datalen: len of data buffer
1139 *
1140 * Completes pdu processing by freeing any resources allocated at
659743b0 1141 * queuecommand or send generic. session back_lock must be held and verify
7996a778
MC
1142 * itt must have been called.
1143 */
913e5bf4
MC
1144int __iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
1145 char *data, int datalen)
7996a778
MC
1146{
1147 struct iscsi_session *session = conn->session;
1148 int opcode = hdr->opcode & ISCSI_OPCODE_MASK, rc = 0;
9c19a7d0 1149 struct iscsi_task *task;
7996a778
MC
1150 uint32_t itt;
1151
f6d5180c 1152 conn->last_recv = jiffies;
0af967f5
MC
1153 rc = iscsi_verify_itt(conn, hdr->itt);
1154 if (rc)
1155 return rc;
1156
b4377356
AV
1157 if (hdr->itt != RESERVED_ITT)
1158 itt = get_itt(hdr->itt);
7996a778 1159 else
b4377356 1160 itt = ~0U;
7996a778 1161
1b2c7af8
MC
1162 ISCSI_DBG_SESSION(session, "[op 0x%x cid %d itt 0x%x len %d]\n",
1163 opcode, conn->id, itt, datalen);
7996a778 1164
3e5c28ad 1165 if (itt == ~0U) {
77a23c21 1166 iscsi_update_cmdsn(session, (struct iscsi_nopin*)hdr);
62f38300 1167
7996a778
MC
1168 switch(opcode) {
1169 case ISCSI_OP_NOOP_IN:
40527afe 1170 if (datalen) {
7996a778 1171 rc = ISCSI_ERR_PROTO;
40527afe
MC
1172 break;
1173 }
1174
b4377356 1175 if (hdr->ttt == cpu_to_be32(ISCSI_RESERVED_TAG))
40527afe
MC
1176 break;
1177
659743b0
SP
1178 /* In RX path we are under back lock */
1179 spin_unlock(&session->back_lock);
1180 spin_lock(&session->frwd_lock);
f6d5180c 1181 iscsi_send_nopout(conn, (struct iscsi_nopin*)hdr);
659743b0
SP
1182 spin_unlock(&session->frwd_lock);
1183 spin_lock(&session->back_lock);
7996a778
MC
1184 break;
1185 case ISCSI_OP_REJECT:
62f38300
MC
1186 rc = iscsi_handle_reject(conn, hdr, data, datalen);
1187 break;
7996a778 1188 case ISCSI_OP_ASYNC_EVENT:
8d2860b3 1189 conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1;
5831c737
MC
1190 if (iscsi_recv_pdu(conn->cls_conn, hdr, data, datalen))
1191 rc = ISCSI_ERR_CONN_FAILED;
7996a778
MC
1192 break;
1193 default:
1194 rc = ISCSI_ERR_BAD_OPCODE;
1195 break;
1196 }
3e5c28ad
MC
1197 goto out;
1198 }
1199
3e5c28ad
MC
1200 switch(opcode) {
1201 case ISCSI_OP_SCSI_CMD_RSP:
913e5bf4
MC
1202 case ISCSI_OP_SCSI_DATA_IN:
1203 task = iscsi_itt_to_ctask(conn, hdr->itt);
1204 if (!task)
1205 return ISCSI_ERR_BAD_ITT;
d355e57d 1206 task->last_xfer = jiffies;
913e5bf4
MC
1207 break;
1208 case ISCSI_OP_R2T:
1209 /*
1210 * LLD handles R2Ts if they need to.
1211 */
1212 return 0;
1213 case ISCSI_OP_LOGOUT_RSP:
1214 case ISCSI_OP_LOGIN_RSP:
1215 case ISCSI_OP_TEXT_RSP:
1216 case ISCSI_OP_SCSI_TMFUNC_RSP:
1217 case ISCSI_OP_NOOP_IN:
1218 task = iscsi_itt_to_task(conn, hdr->itt);
1219 if (!task)
1220 return ISCSI_ERR_BAD_ITT;
1221 break;
1222 default:
1223 return ISCSI_ERR_BAD_OPCODE;
1224 }
1225
1226 switch(opcode) {
1227 case ISCSI_OP_SCSI_CMD_RSP:
9c19a7d0 1228 iscsi_scsi_cmd_rsp(conn, hdr, task, data, datalen);
3e5c28ad
MC
1229 break;
1230 case ISCSI_OP_SCSI_DATA_IN:
1d9edf02 1231 iscsi_data_in_rsp(conn, hdr, task);
3e5c28ad 1232 break;
3e5c28ad
MC
1233 case ISCSI_OP_LOGOUT_RSP:
1234 iscsi_update_cmdsn(session, (struct iscsi_nopin*)hdr);
1235 if (datalen) {
1236 rc = ISCSI_ERR_PROTO;
1237 break;
1238 }
1239 conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1;
1240 goto recv_pdu;
1241 case ISCSI_OP_LOGIN_RSP:
1242 case ISCSI_OP_TEXT_RSP:
1243 iscsi_update_cmdsn(session, (struct iscsi_nopin*)hdr);
1244 /*
1245 * login related PDU's exp_statsn is handled in
1246 * userspace
1247 */
1248 goto recv_pdu;
1249 case ISCSI_OP_SCSI_TMFUNC_RSP:
1250 iscsi_update_cmdsn(session, (struct iscsi_nopin*)hdr);
1251 if (datalen) {
1252 rc = ISCSI_ERR_PROTO;
1253 break;
1254 }
1255
1256 iscsi_tmf_rsp(conn, hdr);
b3cd5050 1257 iscsi_complete_task(task, ISCSI_TASK_COMPLETED);
3e5c28ad
MC
1258 break;
1259 case ISCSI_OP_NOOP_IN:
1260 iscsi_update_cmdsn(session, (struct iscsi_nopin*)hdr);
1261 if (hdr->ttt != cpu_to_be32(ISCSI_RESERVED_TAG) || datalen) {
1262 rc = ISCSI_ERR_PROTO;
1263 break;
1264 }
1265 conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1;
1266
8afa1439
MC
1267 rc = iscsi_nop_out_rsp(task, (struct iscsi_nopin*)hdr,
1268 data, datalen);
3e5c28ad
MC
1269 break;
1270 default:
1271 rc = ISCSI_ERR_BAD_OPCODE;
1272 break;
1273 }
7996a778 1274
3e5c28ad
MC
1275out:
1276 return rc;
1277recv_pdu:
1278 if (iscsi_recv_pdu(conn->cls_conn, hdr, data, datalen))
1279 rc = ISCSI_ERR_CONN_FAILED;
b3cd5050 1280 iscsi_complete_task(task, ISCSI_TASK_COMPLETED);
7996a778
MC
1281 return rc;
1282}
913e5bf4 1283EXPORT_SYMBOL_GPL(__iscsi_complete_pdu);
7996a778
MC
1284
1285int iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
1286 char *data, int datalen)
1287{
1288 int rc;
1289
659743b0 1290 spin_lock(&conn->session->back_lock);
7996a778 1291 rc = __iscsi_complete_pdu(conn, hdr, data, datalen);
659743b0 1292 spin_unlock(&conn->session->back_lock);
7996a778
MC
1293 return rc;
1294}
1295EXPORT_SYMBOL_GPL(iscsi_complete_pdu);
1296
0af967f5 1297int iscsi_verify_itt(struct iscsi_conn *conn, itt_t itt)
7996a778
MC
1298{
1299 struct iscsi_session *session = conn->session;
262ef636 1300 int age = 0, i = 0;
7996a778 1301
0af967f5
MC
1302 if (itt == RESERVED_ITT)
1303 return 0;
7996a778 1304
262ef636
MC
1305 if (session->tt->parse_pdu_itt)
1306 session->tt->parse_pdu_itt(conn, itt, &i, &age);
1307 else {
1308 i = get_itt(itt);
1309 age = ((__force u32)itt >> ISCSI_AGE_SHIFT) & ISCSI_AGE_MASK;
1310 }
1311
1312 if (age != session->age) {
0af967f5
MC
1313 iscsi_conn_printk(KERN_ERR, conn,
1314 "received itt %x expected session age (%x)\n",
913e5bf4 1315 (__force u32)itt, session->age);
0af967f5
MC
1316 return ISCSI_ERR_BAD_ITT;
1317 }
7996a778 1318
3e5c28ad
MC
1319 if (i >= session->cmds_max) {
1320 iscsi_conn_printk(KERN_ERR, conn,
1321 "received invalid itt index %u (max cmds "
1322 "%u.\n", i, session->cmds_max);
1323 return ISCSI_ERR_BAD_ITT;
7996a778 1324 }
7996a778
MC
1325 return 0;
1326}
1327EXPORT_SYMBOL_GPL(iscsi_verify_itt);
1328
913e5bf4
MC
1329/**
1330 * iscsi_itt_to_ctask - look up ctask by itt
1331 * @conn: iscsi connection
1332 * @itt: itt
1333 *
1334 * This should be used for cmd tasks.
1335 *
659743b0 1336 * The session back_lock must be held.
913e5bf4
MC
1337 */
1338struct iscsi_task *iscsi_itt_to_ctask(struct iscsi_conn *conn, itt_t itt)
0af967f5 1339{
9c19a7d0 1340 struct iscsi_task *task;
0af967f5
MC
1341
1342 if (iscsi_verify_itt(conn, itt))
1343 return NULL;
1344
913e5bf4
MC
1345 task = iscsi_itt_to_task(conn, itt);
1346 if (!task || !task->sc)
0af967f5
MC
1347 return NULL;
1348
913e5bf4
MC
1349 if (task->sc->SCp.phase != conn->session->age) {
1350 iscsi_session_printk(KERN_ERR, conn->session,
1351 "task's session age %d, expected %d\n",
1352 task->sc->SCp.phase, conn->session->age);
0af967f5 1353 return NULL;
913e5bf4 1354 }
0af967f5 1355
9c19a7d0 1356 return task;
0af967f5
MC
1357}
1358EXPORT_SYMBOL_GPL(iscsi_itt_to_ctask);
1359
40a06e75 1360void iscsi_session_failure(struct iscsi_session *session,
e5bd7b54
MC
1361 enum iscsi_err err)
1362{
e5bd7b54 1363 struct iscsi_conn *conn;
e5bd7b54 1364
659743b0 1365 spin_lock_bh(&session->frwd_lock);
e5bd7b54
MC
1366 conn = session->leadconn;
1367 if (session->state == ISCSI_STATE_TERMINATE || !conn) {
659743b0 1368 spin_unlock_bh(&session->frwd_lock);
e5bd7b54
MC
1369 return;
1370 }
1371
b1d19e8c 1372 iscsi_get_conn(conn->cls_conn);
659743b0 1373 spin_unlock_bh(&session->frwd_lock);
e5bd7b54
MC
1374 /*
1375 * if the host is being removed bypass the connection
1376 * recovery initialization because we are going to kill
1377 * the session.
1378 */
1379 if (err == ISCSI_ERR_INVALID_HOST)
1380 iscsi_conn_error_event(conn->cls_conn, err);
1381 else
1382 iscsi_conn_failure(conn, err);
b1d19e8c 1383 iscsi_put_conn(conn->cls_conn);
e5bd7b54
MC
1384}
1385EXPORT_SYMBOL_GPL(iscsi_session_failure);
1386
891e2639 1387static bool iscsi_set_conn_failed(struct iscsi_conn *conn)
7996a778
MC
1388{
1389 struct iscsi_session *session = conn->session;
7996a778 1390
891e2639
MC
1391 if (session->state == ISCSI_STATE_FAILED)
1392 return false;
656cffc9 1393
67a61114 1394 if (conn->stop_stage == 0)
7996a778 1395 session->state = ISCSI_STATE_FAILED;
e5bd7b54 1396
7996a778
MC
1397 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx);
1398 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx);
891e2639
MC
1399 return true;
1400}
1401
1402void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err)
1403{
1404 struct iscsi_session *session = conn->session;
1405 bool needs_evt;
1406
1407 spin_lock_bh(&session->frwd_lock);
1408 needs_evt = iscsi_set_conn_failed(conn);
1409 spin_unlock_bh(&session->frwd_lock);
1410
1411 if (needs_evt)
1412 iscsi_conn_error_event(conn->cls_conn, err);
7996a778
MC
1413}
1414EXPORT_SYMBOL_GPL(iscsi_conn_failure);
1415
77a23c21
MC
1416static int iscsi_check_cmdsn_window_closed(struct iscsi_conn *conn)
1417{
1418 struct iscsi_session *session = conn->session;
1419
1420 /*
1421 * Check for iSCSI window and take care of CmdSN wrap-around
1422 */
e0726407 1423 if (!iscsi_sna_lte(session->queued_cmdsn, session->max_cmdsn)) {
1b2c7af8
MC
1424 ISCSI_DBG_SESSION(session, "iSCSI CmdSN closed. ExpCmdSn "
1425 "%u MaxCmdSN %u CmdSN %u/%u\n",
1426 session->exp_cmdsn, session->max_cmdsn,
1427 session->cmdsn, session->queued_cmdsn);
77a23c21
MC
1428 return -ENOSPC;
1429 }
1430 return 0;
1431}
1432
5923d64b
MC
1433static int iscsi_xmit_task(struct iscsi_conn *conn, struct iscsi_task *task,
1434 bool was_requeue)
77a23c21 1435{
843c0a8a 1436 int rc;
77a23c21 1437
79edd00d 1438 spin_lock_bh(&conn->session->back_lock);
5923d64b
MC
1439
1440 if (!conn->task) {
1441 /* Take a ref so we can access it after xmit_task() */
1442 __iscsi_get_task(task);
1443 } else {
1444 /* Already have a ref from when we failed to send it last call */
1445 conn->task = NULL;
1446 }
1447
1448 /*
1449 * If this was a requeue for a R2T we have an extra ref on the task in
1450 * case a bad target sends a cmd rsp before we have handled the task.
1451 */
1452 if (was_requeue)
1453 __iscsi_put_task(task);
1454
1455 /*
1456 * Do this after dropping the extra ref because if this was a requeue
1457 * it's removed from that list and cleanup_queued_task would miss it.
1458 */
1459 if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) {
1460 /*
1461 * Save the task and ref in case we weren't cleaning up this
1462 * task and get woken up again.
1463 */
1464 conn->task = task;
79edd00d
AS
1465 spin_unlock_bh(&conn->session->back_lock);
1466 return -ENODATA;
1467 }
79edd00d 1468 spin_unlock_bh(&conn->session->back_lock);
5923d64b 1469
659743b0 1470 spin_unlock_bh(&conn->session->frwd_lock);
9c19a7d0 1471 rc = conn->session->tt->xmit_task(task);
659743b0 1472 spin_lock_bh(&conn->session->frwd_lock);
d355e57d 1473 if (!rc) {
9c19a7d0 1474 /* done with this task */
d355e57d 1475 task->last_xfer = jiffies;
d355e57d 1476 }
659743b0 1477 /* regular RX path uses back_lock */
72b97402 1478 spin_lock(&conn->session->back_lock);
5923d64b
MC
1479 if (rc && task->state == ISCSI_TASK_RUNNING) {
1480 /*
1481 * get an extra ref that is released next time we access it
1482 * as conn->task above.
1483 */
1484 __iscsi_get_task(task);
1485 conn->task = task;
1486 }
1487
d355e57d 1488 __iscsi_put_task(task);
72b97402 1489 spin_unlock(&conn->session->back_lock);
77a23c21
MC
1490 return rc;
1491}
1492
843c0a8a 1493/**
9c19a7d0
MC
1494 * iscsi_requeue_task - requeue task to run from session workqueue
1495 * @task: task to requeue
843c0a8a 1496 *
5923d64b 1497 * Callers must have taken a ref to the task that is going to be requeued.
843c0a8a 1498 */
9c19a7d0 1499void iscsi_requeue_task(struct iscsi_task *task)
843c0a8a 1500{
9c19a7d0 1501 struct iscsi_conn *conn = task->conn;
843c0a8a 1502
3bbaaad9
MC
1503 /*
1504 * this may be on the requeue list already if the xmit_task callout
1505 * is handling the r2ts while we are adding new ones
1506 */
5923d64b
MC
1507 spin_lock_bh(&conn->session->frwd_lock);
1508 if (list_empty(&task->running)) {
3bbaaad9 1509 list_add_tail(&task->running, &conn->requeue);
5923d64b
MC
1510 } else {
1511 /*
1512 * Don't need the extra ref since it's already requeued and
1513 * has a ref.
1514 */
1515 iscsi_put_task(task);
1516 }
32ae763e 1517 iscsi_conn_queue_work(conn);
5923d64b 1518 spin_unlock_bh(&conn->session->frwd_lock);
843c0a8a 1519}
9c19a7d0 1520EXPORT_SYMBOL_GPL(iscsi_requeue_task);
843c0a8a 1521
7996a778
MC
1522/**
1523 * iscsi_data_xmit - xmit any command into the scheduled connection
1524 * @conn: iscsi connection
1525 *
1526 * Notes:
1527 * The function can return -EAGAIN in which case the caller must
1528 * re-schedule it again later or recover. '0' return code means
1529 * successful xmit.
1530 **/
1531static int iscsi_data_xmit(struct iscsi_conn *conn)
1532{
5d12c05e 1533 struct iscsi_task *task;
3219e529 1534 int rc = 0;
7996a778 1535
659743b0 1536 spin_lock_bh(&conn->session->frwd_lock);
70b31c15 1537 if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) {
1b2c7af8 1538 ISCSI_DBG_SESSION(conn->session, "Tx suspended!\n");
659743b0 1539 spin_unlock_bh(&conn->session->frwd_lock);
3219e529 1540 return -ENODATA;
7996a778 1541 }
7996a778 1542
9c19a7d0 1543 if (conn->task) {
5923d64b 1544 rc = iscsi_xmit_task(conn, conn->task, false);
3219e529 1545 if (rc)
70b31c15 1546 goto done;
7996a778
MC
1547 }
1548
77a23c21
MC
1549 /*
1550 * process mgmt pdus like nops before commands since we should
1551 * only have one nop-out as a ping from us and targets should not
1552 * overflow us with nop-ins
1553 */
1554check_mgmt:
843c0a8a 1555 while (!list_empty(&conn->mgmtqueue)) {
5923d64b
MC
1556 task = list_entry(conn->mgmtqueue.next, struct iscsi_task,
1557 running);
1558 list_del_init(&task->running);
1559 if (iscsi_prep_mgmt_task(conn, task)) {
659743b0
SP
1560 /* regular RX path uses back_lock */
1561 spin_lock_bh(&conn->session->back_lock);
5923d64b 1562 __iscsi_put_task(task);
659743b0 1563 spin_unlock_bh(&conn->session->back_lock);
b3a7ea8d
MC
1564 continue;
1565 }
5923d64b 1566 rc = iscsi_xmit_task(conn, task, false);
77a23c21 1567 if (rc)
70b31c15 1568 goto done;
7996a778
MC
1569 }
1570
843c0a8a 1571 /* process pending command queue */
3bbaaad9 1572 while (!list_empty(&conn->cmdqueue)) {
5923d64b
MC
1573 task = list_entry(conn->cmdqueue.next, struct iscsi_task,
1574 running);
1575 list_del_init(&task->running);
b3a7ea8d 1576 if (conn->session->state == ISCSI_STATE_LOGGING_OUT) {
5923d64b 1577 fail_scsi_task(task, DID_IMM_RETRY);
b3a7ea8d
MC
1578 continue;
1579 }
5923d64b 1580 rc = iscsi_prep_scsi_cmd_pdu(task);
577577da 1581 if (rc) {
d28d48c6 1582 if (rc == -ENOMEM || rc == -EACCES)
5923d64b 1583 fail_scsi_task(task, DID_IMM_RETRY);
d28d48c6 1584 else
5923d64b 1585 fail_scsi_task(task, DID_ABORT);
004d6530
BH
1586 continue;
1587 }
5923d64b 1588 rc = iscsi_xmit_task(conn, task, false);
77a23c21 1589 if (rc)
70b31c15 1590 goto done;
77a23c21 1591 /*
9c19a7d0 1592 * we could continuously get new task requests so
77a23c21
MC
1593 * we need to check the mgmt queue for nops that need to
1594 * be sent to aviod starvation
1595 */
843c0a8a
MC
1596 if (!list_empty(&conn->mgmtqueue))
1597 goto check_mgmt;
1598 }
1599
1600 while (!list_empty(&conn->requeue)) {
b3a7ea8d
MC
1601 /*
1602 * we always do fastlogout - conn stop code will clean up.
1603 */
1604 if (conn->session->state == ISCSI_STATE_LOGGING_OUT)
1605 break;
1606
5d12c05e
MC
1607 task = list_entry(conn->requeue.next, struct iscsi_task,
1608 running);
5923d64b 1609
5d12c05e
MC
1610 if (iscsi_check_tmf_restrictions(task, ISCSI_OP_SCSI_DATA_OUT))
1611 break;
1612
5923d64b
MC
1613 list_del_init(&task->running);
1614 rc = iscsi_xmit_task(conn, task, true);
843c0a8a 1615 if (rc)
70b31c15 1616 goto done;
843c0a8a 1617 if (!list_empty(&conn->mgmtqueue))
77a23c21 1618 goto check_mgmt;
7996a778 1619 }
659743b0 1620 spin_unlock_bh(&conn->session->frwd_lock);
3219e529 1621 return -ENODATA;
7996a778 1622
70b31c15 1623done:
659743b0 1624 spin_unlock_bh(&conn->session->frwd_lock);
3219e529 1625 return rc;
7996a778
MC
1626}
1627
c4028958 1628static void iscsi_xmitworker(struct work_struct *work)
7996a778 1629{
c4028958
DH
1630 struct iscsi_conn *conn =
1631 container_of(work, struct iscsi_conn, xmitwork);
3219e529 1632 int rc;
7996a778
MC
1633 /*
1634 * serialize Xmit worker on a per-connection basis.
1635 */
3219e529
MC
1636 do {
1637 rc = iscsi_data_xmit(conn);
1638 } while (rc >= 0 || rc == -EAGAIN);
7996a778
MC
1639}
1640
577577da
MC
1641static inline struct iscsi_task *iscsi_alloc_task(struct iscsi_conn *conn,
1642 struct scsi_cmnd *sc)
1643{
1644 struct iscsi_task *task;
1645
7acd72eb 1646 if (!kfifo_out(&conn->session->cmdpool.queue,
577577da
MC
1647 (void *) &task, sizeof(void *)))
1648 return NULL;
1649
1650 sc->SCp.phase = conn->session->age;
1651 sc->SCp.ptr = (char *) task;
1652
6dc618cd 1653 refcount_set(&task->refcount, 1);
577577da
MC
1654 task->state = ISCSI_TASK_PENDING;
1655 task->conn = conn;
1656 task->sc = sc;
d355e57d
MC
1657 task->have_checked_conn = false;
1658 task->last_timeout = jiffies;
1659 task->last_xfer = jiffies;
55e51eda 1660 task->protected = false;
577577da
MC
1661 INIT_LIST_HEAD(&task->running);
1662 return task;
1663}
1664
7996a778
MC
1665enum {
1666 FAILURE_BAD_HOST = 1,
1667 FAILURE_SESSION_FAILED,
1668 FAILURE_SESSION_FREED,
1669 FAILURE_WINDOW_CLOSED,
60ecebf5 1670 FAILURE_OOM,
7996a778 1671 FAILURE_SESSION_TERMINATE,
656cffc9 1672 FAILURE_SESSION_IN_RECOVERY,
7996a778 1673 FAILURE_SESSION_RECOVERY_TIMEOUT,
b3a7ea8d 1674 FAILURE_SESSION_LOGGING_OUT,
6eabafbe 1675 FAILURE_SESSION_NOT_READY,
7996a778
MC
1676};
1677
f41d4721 1678int iscsi_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *sc)
7996a778 1679{
75613521 1680 struct iscsi_cls_session *cls_session;
1336aed1 1681 struct iscsi_host *ihost;
7996a778
MC
1682 int reason = 0;
1683 struct iscsi_session *session;
1684 struct iscsi_conn *conn;
9c19a7d0 1685 struct iscsi_task *task = NULL;
7996a778 1686
7996a778 1687 sc->result = 0;
f47f2cf5 1688 sc->SCp.ptr = NULL;
7996a778 1689
1336aed1 1690 ihost = shost_priv(host);
7996a778 1691
75613521
MC
1692 cls_session = starget_to_session(scsi_target(sc->device));
1693 session = cls_session->dd_data;
659743b0 1694 spin_lock_bh(&session->frwd_lock);
7996a778 1695
75613521 1696 reason = iscsi_session_chkready(cls_session);
6eabafbe
MC
1697 if (reason) {
1698 sc->result = reason;
1699 goto fault;
1700 }
1701
301e0f7e 1702 if (session->state != ISCSI_STATE_LOGGED_IN) {
656cffc9
MC
1703 /*
1704 * to handle the race between when we set the recovery state
1705 * and block the session we requeue here (commands could
1706 * be entering our queuecommand while a block is starting
1707 * up because the block code is not locked)
1708 */
9000bcd6 1709 switch (session->state) {
301e0f7e 1710 case ISCSI_STATE_FAILED:
d7549412
RDT
1711 /*
1712 * cmds should fail during shutdown, if the session
1713 * state is bad, allowing completion to happen
1714 */
1715 if (unlikely(system_state != SYSTEM_RUNNING)) {
1716 reason = FAILURE_SESSION_FAILED;
1717 sc->result = DID_NO_CONNECT << 16;
1718 break;
1719 }
df561f66 1720 fallthrough;
9000bcd6 1721 case ISCSI_STATE_IN_RECOVERY:
656cffc9 1722 reason = FAILURE_SESSION_IN_RECOVERY;
301e0f7e
MC
1723 sc->result = DID_IMM_RETRY << 16;
1724 break;
9000bcd6
MC
1725 case ISCSI_STATE_LOGGING_OUT:
1726 reason = FAILURE_SESSION_LOGGING_OUT;
301e0f7e
MC
1727 sc->result = DID_IMM_RETRY << 16;
1728 break;
b3a7ea8d 1729 case ISCSI_STATE_RECOVERY_FAILED:
656cffc9 1730 reason = FAILURE_SESSION_RECOVERY_TIMEOUT;
56d7fcfa 1731 sc->result = DID_TRANSPORT_FAILFAST << 16;
b3a7ea8d
MC
1732 break;
1733 case ISCSI_STATE_TERMINATE:
656cffc9 1734 reason = FAILURE_SESSION_TERMINATE;
6eabafbe 1735 sc->result = DID_NO_CONNECT << 16;
b3a7ea8d 1736 break;
b3a7ea8d 1737 default:
656cffc9 1738 reason = FAILURE_SESSION_FREED;
6eabafbe 1739 sc->result = DID_NO_CONNECT << 16;
b3a7ea8d 1740 }
7996a778
MC
1741 goto fault;
1742 }
1743
7996a778 1744 conn = session->leadconn;
98644047
MC
1745 if (!conn) {
1746 reason = FAILURE_SESSION_FREED;
6eabafbe 1747 sc->result = DID_NO_CONNECT << 16;
98644047
MC
1748 goto fault;
1749 }
7996a778 1750
661134ad
MC
1751 if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) {
1752 reason = FAILURE_SESSION_IN_RECOVERY;
eef9ffdf 1753 sc->result = DID_REQUEUE << 16;
661134ad
MC
1754 goto fault;
1755 }
1756
77a23c21
MC
1757 if (iscsi_check_cmdsn_window_closed(conn)) {
1758 reason = FAILURE_WINDOW_CLOSED;
1759 goto reject;
1760 }
1761
577577da
MC
1762 task = iscsi_alloc_task(conn, sc);
1763 if (!task) {
60ecebf5
MC
1764 reason = FAILURE_OOM;
1765 goto reject;
1766 }
7996a778 1767
1336aed1 1768 if (!ihost->workq) {
577577da
MC
1769 reason = iscsi_prep_scsi_cmd_pdu(task);
1770 if (reason) {
5d12c05e 1771 if (reason == -ENOMEM || reason == -EACCES) {
577577da
MC
1772 reason = FAILURE_OOM;
1773 goto prepd_reject;
1774 } else {
1775 sc->result = DID_ABORT << 16;
1776 goto prepd_fault;
1777 }
052d0144 1778 }
9c19a7d0 1779 if (session->tt->xmit_task(task)) {
d3305f34 1780 session->cmdsn--;
052d0144 1781 reason = FAILURE_SESSION_NOT_READY;
577577da 1782 goto prepd_reject;
052d0144 1783 }
3bbaaad9
MC
1784 } else {
1785 list_add_tail(&task->running, &conn->cmdqueue);
32ae763e 1786 iscsi_conn_queue_work(conn);
3bbaaad9 1787 }
052d0144
MC
1788
1789 session->queued_cmdsn++;
659743b0 1790 spin_unlock_bh(&session->frwd_lock);
7996a778
MC
1791 return 0;
1792
577577da 1793prepd_reject:
a656183e 1794 spin_lock_bh(&session->back_lock);
f41d4721 1795 iscsi_complete_task(task, ISCSI_TASK_REQUEUE_SCSIQ);
a656183e 1796 spin_unlock_bh(&session->back_lock);
7996a778 1797reject:
659743b0 1798 spin_unlock_bh(&session->frwd_lock);
1b2c7af8
MC
1799 ISCSI_DBG_SESSION(session, "cmd 0x%x rejected (%d)\n",
1800 sc->cmnd[0], reason);
d6d13ee1 1801 return SCSI_MLQUEUE_TARGET_BUSY;
7996a778 1802
577577da 1803prepd_fault:
a656183e 1804 spin_lock_bh(&session->back_lock);
f41d4721 1805 iscsi_complete_task(task, ISCSI_TASK_REQUEUE_SCSIQ);
a656183e 1806 spin_unlock_bh(&session->back_lock);
7996a778 1807fault:
659743b0 1808 spin_unlock_bh(&session->frwd_lock);
1b2c7af8
MC
1809 ISCSI_DBG_SESSION(session, "iscsi: cmd 0x%x is not queued (%d)\n",
1810 sc->cmnd[0], reason);
ae3d56d8 1811 scsi_set_resid(sc, scsi_bufflen(sc));
f41d4721 1812 sc->scsi_done(sc);
7996a778
MC
1813 return 0;
1814}
1815EXPORT_SYMBOL_GPL(iscsi_queuecommand);
1816
6b5d6c44
MC
1817int iscsi_target_alloc(struct scsi_target *starget)
1818{
1819 struct iscsi_cls_session *cls_session = starget_to_session(starget);
1820 struct iscsi_session *session = cls_session->dd_data;
1821
1822 starget->can_queue = session->scsi_cmds_max;
1823 return 0;
1824}
1825EXPORT_SYMBOL_GPL(iscsi_target_alloc);
1826
2c4b9637 1827static void iscsi_tmf_timedout(struct timer_list *t)
7996a778 1828{
2c4b9637 1829 struct iscsi_conn *conn = from_timer(conn, t, tmf_timer);
7996a778
MC
1830 struct iscsi_session *session = conn->session;
1831
659743b0 1832 spin_lock(&session->frwd_lock);
843c0a8a
MC
1833 if (conn->tmf_state == TMF_QUEUED) {
1834 conn->tmf_state = TMF_TIMEDOUT;
bd2199d4 1835 ISCSI_DBG_EH(session, "tmf timedout\n");
7996a778
MC
1836 /* unblock eh_abort() */
1837 wake_up(&conn->ehwait);
1838 }
659743b0 1839 spin_unlock(&session->frwd_lock);
7996a778
MC
1840}
1841
9c19a7d0 1842static int iscsi_exec_task_mgmt_fn(struct iscsi_conn *conn,
f6d5180c
MC
1843 struct iscsi_tm *hdr, int age,
1844 int timeout)
1360c58a 1845 __must_hold(&session->frwd_lock)
7996a778 1846{
7996a778 1847 struct iscsi_session *session = conn->session;
9c19a7d0 1848 struct iscsi_task *task;
7996a778 1849
9c19a7d0 1850 task = __iscsi_conn_send_pdu(conn, (struct iscsi_hdr *)hdr,
843c0a8a 1851 NULL, 0);
9c19a7d0 1852 if (!task) {
659743b0 1853 spin_unlock_bh(&session->frwd_lock);
df4da5cd 1854 iscsi_conn_printk(KERN_ERR, conn, "Could not send TMF.\n");
7996a778 1855 iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
659743b0 1856 spin_lock_bh(&session->frwd_lock);
77a23c21 1857 return -EPERM;
7996a778 1858 }
843c0a8a 1859 conn->tmfcmd_pdus_cnt++;
f6d5180c 1860 conn->tmf_timer.expires = timeout * HZ + jiffies;
843c0a8a 1861 add_timer(&conn->tmf_timer);
bd2199d4 1862 ISCSI_DBG_EH(session, "tmf set timeout\n");
7996a778 1863
659743b0 1864 spin_unlock_bh(&session->frwd_lock);
6724add1 1865 mutex_unlock(&session->eh_mutex);
7996a778
MC
1866
1867 /*
1868 * block eh thread until:
1869 *
843c0a8a
MC
1870 * 1) tmf response
1871 * 2) tmf timeout
7996a778
MC
1872 * 3) session is terminated or restarted or userspace has
1873 * given up on recovery
1874 */
843c0a8a 1875 wait_event_interruptible(conn->ehwait, age != session->age ||
7996a778 1876 session->state != ISCSI_STATE_LOGGED_IN ||
843c0a8a 1877 conn->tmf_state != TMF_QUEUED);
7996a778
MC
1878 if (signal_pending(current))
1879 flush_signals(current);
843c0a8a
MC
1880 del_timer_sync(&conn->tmf_timer);
1881
6724add1 1882 mutex_lock(&session->eh_mutex);
659743b0 1883 spin_lock_bh(&session->frwd_lock);
9c19a7d0 1884 /* if the session drops it will clean up the task */
843c0a8a
MC
1885 if (age != session->age ||
1886 session->state != ISCSI_STATE_LOGGED_IN)
1887 return -ENOTCONN;
7996a778
MC
1888 return 0;
1889}
1890
843c0a8a 1891/*
14936b1e 1892 * Fail commands. session frwd lock held and xmit thread flushed.
843c0a8a 1893 */
9cb78c16 1894static void fail_scsi_tasks(struct iscsi_conn *conn, u64 lun, int error)
843c0a8a 1895{
14936b1e 1896 struct iscsi_session *session = conn->session;
3bbaaad9
MC
1897 struct iscsi_task *task;
1898 int i;
843c0a8a 1899
14936b1e
MC
1900 spin_lock_bh(&session->back_lock);
1901 for (i = 0; i < session->cmds_max; i++) {
1902 task = session->cmds[i];
3bbaaad9
MC
1903 if (!task->sc || task->state == ISCSI_TASK_FREE)
1904 continue;
843c0a8a 1905
3bbaaad9
MC
1906 if (lun != -1 && lun != task->sc->device->lun)
1907 continue;
843c0a8a 1908
14936b1e
MC
1909 __iscsi_get_task(task);
1910 spin_unlock_bh(&session->back_lock);
1911
1912 ISCSI_DBG_SESSION(session,
3bbaaad9
MC
1913 "failing sc %p itt 0x%x state %d\n",
1914 task->sc, task->itt, task->state);
b3cd5050 1915 fail_scsi_task(task, error);
14936b1e
MC
1916
1917 spin_unlock_bh(&session->frwd_lock);
1918 iscsi_put_task(task);
1919 spin_lock_bh(&session->frwd_lock);
1920
1921 spin_lock_bh(&session->back_lock);
843c0a8a 1922 }
14936b1e
MC
1923
1924 spin_unlock_bh(&session->back_lock);
843c0a8a
MC
1925}
1926
661134ad
MC
1927/**
1928 * iscsi_suspend_queue - suspend iscsi_queuecommand
1929 * @conn: iscsi conn to stop queueing IO on
1930 *
659743b0 1931 * This grabs the session frwd_lock to make sure no one is in
661134ad
MC
1932 * xmit_task/queuecommand, and then sets suspend to prevent
1933 * new commands from being queued. This only needs to be called
1934 * by offload drivers that need to sync a path like ep disconnect
1935 * with the iscsi_queuecommand/xmit_task. To start IO again libiscsi
1936 * will call iscsi_start_tx and iscsi_unblock_session when in FFP.
1937 */
1938void iscsi_suspend_queue(struct iscsi_conn *conn)
1939{
659743b0 1940 spin_lock_bh(&conn->session->frwd_lock);
661134ad 1941 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx);
659743b0 1942 spin_unlock_bh(&conn->session->frwd_lock);
661134ad
MC
1943}
1944EXPORT_SYMBOL_GPL(iscsi_suspend_queue);
1945
1946/**
1947 * iscsi_suspend_tx - suspend iscsi_data_xmit
1948 * @conn: iscsi conn tp stop processing IO on.
1949 *
1950 * This function sets the suspend bit to prevent iscsi_data_xmit
1951 * from sending new IO, and if work is queued on the xmit thread
1952 * it will wait for it to be completed.
1953 */
b40977d9 1954void iscsi_suspend_tx(struct iscsi_conn *conn)
6724add1 1955{
32ae763e
MC
1956 struct Scsi_Host *shost = conn->session->host;
1957 struct iscsi_host *ihost = shost_priv(shost);
1958
6724add1 1959 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx);
1336aed1 1960 if (ihost->workq)
32ae763e 1961 flush_workqueue(ihost->workq);
6724add1 1962}
b40977d9 1963EXPORT_SYMBOL_GPL(iscsi_suspend_tx);
6724add1
MC
1964
1965static void iscsi_start_tx(struct iscsi_conn *conn)
1966{
1967 clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx);
1336aed1 1968 iscsi_conn_queue_work(conn);
6724add1
MC
1969}
1970
4c48a829
MC
1971/*
1972 * We want to make sure a ping is in flight. It has timed out.
1973 * And we are not busy processing a pdu that is making
1974 * progress but got started before the ping and is taking a while
1975 * to complete so the ping is just stuck behind it in a queue.
1976 */
1977static int iscsi_has_ping_timed_out(struct iscsi_conn *conn)
1978{
fe0a8a95 1979 if (READ_ONCE(conn->ping_task) &&
4c48a829
MC
1980 time_before_eq(conn->last_recv + (conn->recv_timeout * HZ) +
1981 (conn->ping_timeout * HZ), jiffies))
1982 return 1;
1983 else
1984 return 0;
1985}
1986
b6a05c82 1987enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
f6d5180c 1988{
6600593c 1989 enum blk_eh_timer_return rc = BLK_EH_DONE;
92ed4d69 1990 struct iscsi_task *task = NULL, *running_task;
f6d5180c
MC
1991 struct iscsi_cls_session *cls_session;
1992 struct iscsi_session *session;
1993 struct iscsi_conn *conn;
92ed4d69 1994 int i;
f6d5180c 1995
d355e57d 1996 cls_session = starget_to_session(scsi_target(sc->device));
75613521 1997 session = cls_session->dd_data;
f6d5180c 1998
bd2199d4 1999 ISCSI_DBG_EH(session, "scsi cmd %p timedout\n", sc);
f6d5180c 2000
5480e299 2001 spin_lock_bh(&session->frwd_lock);
14936b1e 2002 spin_lock(&session->back_lock);
e3d338a5
MC
2003 task = (struct iscsi_task *)sc->SCp.ptr;
2004 if (!task) {
2005 /*
2006 * Raced with completion. Blk layer has taken ownership
2007 * so let timeout code complete it now.
2008 */
adb2b769 2009 rc = BLK_EH_DONE;
14936b1e 2010 spin_unlock(&session->back_lock);
e3d338a5
MC
2011 goto done;
2012 }
14936b1e
MC
2013 __iscsi_get_task(task);
2014 spin_unlock(&session->back_lock);
e3d338a5 2015
f6d5180c 2016 if (session->state != ISCSI_STATE_LOGGED_IN) {
d7549412
RDT
2017 /*
2018 * During shutdown, if session is prematurely disconnected,
2019 * recovery won't happen and there will be hung cmds. Not
2020 * handling cmds would trigger EH, also bad in this case.
2021 * Instead, handle cmd, allow completion to happen and let
2022 * upper layer to deal with the result.
2023 */
2024 if (unlikely(system_state != SYSTEM_RUNNING)) {
2025 sc->result = DID_NO_CONNECT << 16;
2026 ISCSI_DBG_EH(session, "sc on shutdown, handled\n");
adb2b769 2027 rc = BLK_EH_DONE;
d7549412
RDT
2028 goto done;
2029 }
f6d5180c
MC
2030 /*
2031 * We are probably in the middle of iscsi recovery so let
2032 * that complete and handle the error.
2033 */
242f9dcb 2034 rc = BLK_EH_RESET_TIMER;
f6d5180c
MC
2035 goto done;
2036 }
2037
2038 conn = session->leadconn;
2039 if (!conn) {
2040 /* In the middle of shuting down */
242f9dcb 2041 rc = BLK_EH_RESET_TIMER;
f6d5180c
MC
2042 goto done;
2043 }
2044
d355e57d
MC
2045 /*
2046 * If we have sent (at least queued to the network layer) a pdu or
2047 * recvd one for the task since the last timeout ask for
2048 * more time. If on the next timeout we have not made progress
2049 * we can check if it is the task or connection when we send the
2050 * nop as a ping.
2051 */
92ed4d69 2052 if (time_after(task->last_xfer, task->last_timeout)) {
bd2199d4
EZ
2053 ISCSI_DBG_EH(session, "Command making progress. Asking "
2054 "scsi-ml for more time to complete. "
92ed4d69 2055 "Last data xfer at %lu. Last timeout was at "
bd2199d4 2056 "%lu\n.", task->last_xfer, task->last_timeout);
d355e57d
MC
2057 task->have_checked_conn = false;
2058 rc = BLK_EH_RESET_TIMER;
2059 goto done;
2060 }
2061
f6d5180c
MC
2062 if (!conn->recv_timeout && !conn->ping_timeout)
2063 goto done;
2064 /*
2065 * if the ping timedout then we are in the middle of cleaning up
2066 * and can let the iscsi eh handle it
2067 */
4c48a829 2068 if (iscsi_has_ping_timed_out(conn)) {
242f9dcb 2069 rc = BLK_EH_RESET_TIMER;
4c48a829
MC
2070 goto done;
2071 }
d355e57d 2072
14936b1e 2073 spin_lock(&session->back_lock);
92ed4d69
MC
2074 for (i = 0; i < conn->session->cmds_max; i++) {
2075 running_task = conn->session->cmds[i];
2076 if (!running_task->sc || running_task == task ||
2077 running_task->state != ISCSI_TASK_RUNNING)
2078 continue;
2079
2080 /*
2081 * Only check if cmds started before this one have made
2082 * progress, or this could never fail
2083 */
2084 if (time_after(running_task->sc->jiffies_at_alloc,
2085 task->sc->jiffies_at_alloc))
2086 continue;
2087
2088 if (time_after(running_task->last_xfer, task->last_timeout)) {
2089 /*
2090 * This task has not made progress, but a task
2091 * started before us has transferred data since
2092 * we started/last-checked. We could be queueing
2093 * too many tasks or the LU is bad.
2094 *
2095 * If the device is bad the cmds ahead of us on
2096 * other devs will complete, and this loop will
2097 * eventually fail starting the scsi eh.
2098 */
2099 ISCSI_DBG_EH(session, "Command has not made progress "
2100 "but commands ahead of it have. "
2101 "Asking scsi-ml for more time to "
2102 "complete. Our last xfer vs running task "
2103 "last xfer %lu/%lu. Last check %lu.\n",
2104 task->last_xfer, running_task->last_xfer,
2105 task->last_timeout);
14936b1e 2106 spin_unlock(&session->back_lock);
92ed4d69
MC
2107 rc = BLK_EH_RESET_TIMER;
2108 goto done;
2109 }
2110 }
14936b1e 2111 spin_unlock(&session->back_lock);
92ed4d69 2112
d355e57d
MC
2113 /* Assumes nop timeout is shorter than scsi cmd timeout */
2114 if (task->have_checked_conn)
2115 goto done;
2116
f6d5180c 2117 /*
d355e57d
MC
2118 * Checking the transport already or nop from a cmd timeout still
2119 * running
f6d5180c 2120 */
fe0a8a95 2121 if (READ_ONCE(conn->ping_task)) {
d355e57d 2122 task->have_checked_conn = true;
242f9dcb 2123 rc = BLK_EH_RESET_TIMER;
4c48a829
MC
2124 goto done;
2125 }
2126
d355e57d
MC
2127 /* Make sure there is a transport check done */
2128 iscsi_send_nopout(conn, NULL);
2129 task->have_checked_conn = true;
2130 rc = BLK_EH_RESET_TIMER;
2131
f6d5180c 2132done:
5480e299 2133 spin_unlock_bh(&session->frwd_lock);
14936b1e
MC
2134
2135 if (task) {
2136 task->last_timeout = jiffies;
2137 iscsi_put_task(task);
2138 }
bd2199d4 2139 ISCSI_DBG_EH(session, "return %s\n", rc == BLK_EH_RESET_TIMER ?
d7549412 2140 "timer reset" : "shutdown or nh");
f6d5180c
MC
2141 return rc;
2142}
b6a05c82 2143EXPORT_SYMBOL_GPL(iscsi_eh_cmd_timed_out);
f6d5180c 2144
2c4b9637 2145static void iscsi_check_transport_timeouts(struct timer_list *t)
f6d5180c 2146{
2c4b9637 2147 struct iscsi_conn *conn = from_timer(conn, t, transport_timer);
f6d5180c 2148 struct iscsi_session *session = conn->session;
4cf10435 2149 unsigned long recv_timeout, next_timeout = 0, last_recv;
f6d5180c 2150
659743b0 2151 spin_lock(&session->frwd_lock);
f6d5180c
MC
2152 if (session->state != ISCSI_STATE_LOGGED_IN)
2153 goto done;
2154
4cf10435
MC
2155 recv_timeout = conn->recv_timeout;
2156 if (!recv_timeout)
f6d5180c
MC
2157 goto done;
2158
4cf10435 2159 recv_timeout *= HZ;
f6d5180c 2160 last_recv = conn->last_recv;
4c48a829
MC
2161
2162 if (iscsi_has_ping_timed_out(conn)) {
322d739d 2163 iscsi_conn_printk(KERN_ERR, conn, "ping timeout of %d secs "
4c48a829
MC
2164 "expired, recv timeout %d, last rx %lu, "
2165 "last ping %lu, now %lu\n",
2166 conn->ping_timeout, conn->recv_timeout,
2167 last_recv, conn->last_ping, jiffies);
659743b0 2168 spin_unlock(&session->frwd_lock);
09ff742c 2169 iscsi_conn_failure(conn, ISCSI_ERR_NOP_TIMEDOUT);
f6d5180c
MC
2170 return;
2171 }
2172
4cf10435 2173 if (time_before_eq(last_recv + recv_timeout, jiffies)) {
c8611f97 2174 /* send a ping to try to provoke some traffic */
1b2c7af8 2175 ISCSI_DBG_CONN(conn, "Sending nopout as ping\n");
52f5664a
AN
2176 if (iscsi_send_nopout(conn, NULL))
2177 next_timeout = jiffies + (1 * HZ);
2178 else
2179 next_timeout = conn->last_ping + (conn->ping_timeout * HZ);
ad294e9c 2180 } else
4cf10435 2181 next_timeout = last_recv + recv_timeout;
f6d5180c 2182
1b2c7af8 2183 ISCSI_DBG_CONN(conn, "Setting next tmo %lu\n", next_timeout);
ad294e9c 2184 mod_timer(&conn->transport_timer, next_timeout);
f6d5180c 2185done:
659743b0 2186 spin_unlock(&session->frwd_lock);
f6d5180c
MC
2187}
2188
891e2639
MC
2189/**
2190 * iscsi_conn_unbind - prevent queueing to conn.
2191 * @cls_conn: iscsi conn ep is bound to.
2192 * @is_active: is the conn in use for boot or is this for EH/termination
2193 *
2194 * This must be called by drivers implementing the ep_disconnect callout.
2195 * It disables queueing to the connection from libiscsi in preparation for
2196 * an ep_disconnect call.
2197 */
2198void iscsi_conn_unbind(struct iscsi_cls_conn *cls_conn, bool is_active)
2199{
2200 struct iscsi_session *session;
2201 struct iscsi_conn *conn;
2202
2203 if (!cls_conn)
2204 return;
2205
2206 conn = cls_conn->dd_data;
2207 session = conn->session;
2208 /*
2209 * Wait for iscsi_eh calls to exit. We don't wait for the tmf to
2210 * complete or timeout. The caller just wants to know what's running
2211 * is everything that needs to be cleaned up, and no cmds will be
2212 * queued.
2213 */
2214 mutex_lock(&session->eh_mutex);
2215
2216 iscsi_suspend_queue(conn);
2217 iscsi_suspend_tx(conn);
2218
2219 spin_lock_bh(&session->frwd_lock);
2220 if (!is_active) {
2221 /*
2222 * if logout timed out before userspace could even send a PDU
2223 * the state might still be in ISCSI_STATE_LOGGED_IN and
2224 * allowing new cmds and TMFs.
2225 */
2226 if (session->state == ISCSI_STATE_LOGGED_IN)
2227 iscsi_set_conn_failed(conn);
2228 }
2229 spin_unlock_bh(&session->frwd_lock);
2230 mutex_unlock(&session->eh_mutex);
2231}
2232EXPORT_SYMBOL_GPL(iscsi_conn_unbind);
2233
9c19a7d0 2234static void iscsi_prep_abort_task_pdu(struct iscsi_task *task,
843c0a8a
MC
2235 struct iscsi_tm *hdr)
2236{
2237 memset(hdr, 0, sizeof(*hdr));
2238 hdr->opcode = ISCSI_OP_SCSI_TMFUNC | ISCSI_OP_IMMEDIATE;
2239 hdr->flags = ISCSI_TM_FUNC_ABORT_TASK & ISCSI_FLAG_TM_FUNC_MASK;
2240 hdr->flags |= ISCSI_FLAG_CMD_FINAL;
55bdabdf 2241 hdr->lun = task->lun;
577577da
MC
2242 hdr->rtt = task->hdr_itt;
2243 hdr->refcmdsn = task->cmdsn;
843c0a8a
MC
2244}
2245
7996a778
MC
2246int iscsi_eh_abort(struct scsi_cmnd *sc)
2247{
75613521
MC
2248 struct iscsi_cls_session *cls_session;
2249 struct iscsi_session *session;
f47f2cf5 2250 struct iscsi_conn *conn;
9c19a7d0 2251 struct iscsi_task *task;
843c0a8a 2252 struct iscsi_tm *hdr;
e9e410e8 2253 int age;
7996a778 2254
75613521
MC
2255 cls_session = starget_to_session(scsi_target(sc->device));
2256 session = cls_session->dd_data;
2257
bd2199d4 2258 ISCSI_DBG_EH(session, "aborting sc %p\n", sc);
4421c9eb 2259
6724add1 2260 mutex_lock(&session->eh_mutex);
659743b0 2261 spin_lock_bh(&session->frwd_lock);
f47f2cf5
MC
2262 /*
2263 * if session was ISCSI_STATE_IN_RECOVERY then we may not have
2264 * got the command.
2265 */
2266 if (!sc->SCp.ptr) {
bd2199d4
EZ
2267 ISCSI_DBG_EH(session, "sc never reached iscsi layer or "
2268 "it completed.\n");
659743b0 2269 spin_unlock_bh(&session->frwd_lock);
6724add1 2270 mutex_unlock(&session->eh_mutex);
f47f2cf5
MC
2271 return SUCCESS;
2272 }
2273
7996a778
MC
2274 /*
2275 * If we are not logged in or we have started a new session
2276 * then let the host reset code handle this
2277 */
843c0a8a
MC
2278 if (!session->leadconn || session->state != ISCSI_STATE_LOGGED_IN ||
2279 sc->SCp.phase != session->age) {
659743b0 2280 spin_unlock_bh(&session->frwd_lock);
843c0a8a 2281 mutex_unlock(&session->eh_mutex);
bd2199d4 2282 ISCSI_DBG_EH(session, "failing abort due to dropped "
4421c9eb 2283 "session.\n");
843c0a8a
MC
2284 return FAILED;
2285 }
2286
2287 conn = session->leadconn;
2288 conn->eh_abort_cnt++;
2289 age = session->age;
2290
14936b1e 2291 spin_lock(&session->back_lock);
9c19a7d0 2292 task = (struct iscsi_task *)sc->SCp.ptr;
14936b1e
MC
2293 if (!task || !task->sc) {
2294 /* task completed before time out */
bd2199d4 2295 ISCSI_DBG_EH(session, "sc completed while abort in progress\n");
14936b1e
MC
2296
2297 spin_unlock(&session->back_lock);
2298 spin_unlock_bh(&session->frwd_lock);
2299 mutex_unlock(&session->eh_mutex);
2300 return SUCCESS;
7ea8b828 2301 }
14936b1e
MC
2302 ISCSI_DBG_EH(session, "aborting [sc %p itt 0x%x]\n", sc, task->itt);
2303 __iscsi_get_task(task);
2304 spin_unlock(&session->back_lock);
7996a778 2305
9c19a7d0 2306 if (task->state == ISCSI_TASK_PENDING) {
b3cd5050 2307 fail_scsi_task(task, DID_ABORT);
77a23c21
MC
2308 goto success;
2309 }
7996a778 2310
843c0a8a
MC
2311 /* only have one tmf outstanding at a time */
2312 if (conn->tmf_state != TMF_INITIAL)
7996a778 2313 goto failed;
843c0a8a 2314 conn->tmf_state = TMF_QUEUED;
7996a778 2315
843c0a8a 2316 hdr = &conn->tmhdr;
9c19a7d0 2317 iscsi_prep_abort_task_pdu(task, hdr);
843c0a8a 2318
e9e410e8 2319 if (iscsi_exec_task_mgmt_fn(conn, hdr, age, session->abort_timeout))
843c0a8a 2320 goto failed;
843c0a8a
MC
2321
2322 switch (conn->tmf_state) {
2323 case TMF_SUCCESS:
659743b0 2324 spin_unlock_bh(&session->frwd_lock);
913e5bf4
MC
2325 /*
2326 * stop tx side incase the target had sent a abort rsp but
2327 * the initiator was still writing out data.
2328 */
6724add1 2329 iscsi_suspend_tx(conn);
77a23c21 2330 /*
913e5bf4
MC
2331 * we do not stop the recv side because targets have been
2332 * good and have never sent us a successful tmf response
2333 * then sent more data for the cmd.
77a23c21 2334 */
659743b0 2335 spin_lock_bh(&session->frwd_lock);
b3cd5050 2336 fail_scsi_task(task, DID_ABORT);
843c0a8a 2337 conn->tmf_state = TMF_INITIAL;
5d12c05e 2338 memset(hdr, 0, sizeof(*hdr));
659743b0 2339 spin_unlock_bh(&session->frwd_lock);
6724add1 2340 iscsi_start_tx(conn);
77a23c21 2341 goto success_unlocked;
843c0a8a 2342 case TMF_TIMEDOUT:
659743b0 2343 spin_unlock_bh(&session->frwd_lock);
df4da5cd 2344 iscsi_conn_failure(conn, ISCSI_ERR_SCSI_EH_SESSION_RST);
843c0a8a
MC
2345 goto failed_unlocked;
2346 case TMF_NOT_FOUND:
2347 if (!sc->SCp.ptr) {
2348 conn->tmf_state = TMF_INITIAL;
5d12c05e 2349 memset(hdr, 0, sizeof(*hdr));
9c19a7d0 2350 /* task completed before tmf abort response */
bd2199d4
EZ
2351 ISCSI_DBG_EH(session, "sc completed while abort in "
2352 "progress\n");
77a23c21 2353 goto success;
7ea8b828 2354 }
df561f66 2355 fallthrough;
7ea8b828 2356 default:
843c0a8a
MC
2357 conn->tmf_state = TMF_INITIAL;
2358 goto failed;
7996a778
MC
2359 }
2360
77a23c21 2361success:
659743b0 2362 spin_unlock_bh(&session->frwd_lock);
77a23c21 2363success_unlocked:
bd2199d4
EZ
2364 ISCSI_DBG_EH(session, "abort success [sc %p itt 0x%x]\n",
2365 sc, task->itt);
14936b1e 2366 iscsi_put_task(task);
6724add1 2367 mutex_unlock(&session->eh_mutex);
7996a778
MC
2368 return SUCCESS;
2369
2370failed:
659743b0 2371 spin_unlock_bh(&session->frwd_lock);
77a23c21 2372failed_unlocked:
bd2199d4
EZ
2373 ISCSI_DBG_EH(session, "abort failed [sc %p itt 0x%x]\n", sc,
2374 task ? task->itt : 0);
14936b1e 2375 iscsi_put_task(task);
6724add1 2376 mutex_unlock(&session->eh_mutex);
7996a778
MC
2377 return FAILED;
2378}
2379EXPORT_SYMBOL_GPL(iscsi_eh_abort);
2380
843c0a8a
MC
2381static void iscsi_prep_lun_reset_pdu(struct scsi_cmnd *sc, struct iscsi_tm *hdr)
2382{
2383 memset(hdr, 0, sizeof(*hdr));
2384 hdr->opcode = ISCSI_OP_SCSI_TMFUNC | ISCSI_OP_IMMEDIATE;
2385 hdr->flags = ISCSI_TM_FUNC_LOGICAL_UNIT_RESET & ISCSI_FLAG_TM_FUNC_MASK;
2386 hdr->flags |= ISCSI_FLAG_CMD_FINAL;
55bdabdf 2387 int_to_scsilun(sc->device->lun, &hdr->lun);
f6d5180c 2388 hdr->rtt = RESERVED_ITT;
843c0a8a
MC
2389}
2390
2391int iscsi_eh_device_reset(struct scsi_cmnd *sc)
2392{
75613521
MC
2393 struct iscsi_cls_session *cls_session;
2394 struct iscsi_session *session;
843c0a8a
MC
2395 struct iscsi_conn *conn;
2396 struct iscsi_tm *hdr;
2397 int rc = FAILED;
2398
75613521
MC
2399 cls_session = starget_to_session(scsi_target(sc->device));
2400 session = cls_session->dd_data;
2401
9cb78c16
HR
2402 ISCSI_DBG_EH(session, "LU Reset [sc %p lun %llu]\n", sc,
2403 sc->device->lun);
843c0a8a
MC
2404
2405 mutex_lock(&session->eh_mutex);
659743b0 2406 spin_lock_bh(&session->frwd_lock);
843c0a8a
MC
2407 /*
2408 * Just check if we are not logged in. We cannot check for
2409 * the phase because the reset could come from a ioctl.
2410 */
2411 if (!session->leadconn || session->state != ISCSI_STATE_LOGGED_IN)
2412 goto unlock;
2413 conn = session->leadconn;
2414
2415 /* only have one tmf outstanding at a time */
2416 if (conn->tmf_state != TMF_INITIAL)
2417 goto unlock;
2418 conn->tmf_state = TMF_QUEUED;
2419
2420 hdr = &conn->tmhdr;
2421 iscsi_prep_lun_reset_pdu(sc, hdr);
2422
9c19a7d0 2423 if (iscsi_exec_task_mgmt_fn(conn, hdr, session->age,
f6d5180c 2424 session->lu_reset_timeout)) {
843c0a8a
MC
2425 rc = FAILED;
2426 goto unlock;
2427 }
2428
2429 switch (conn->tmf_state) {
2430 case TMF_SUCCESS:
2431 break;
2432 case TMF_TIMEDOUT:
659743b0 2433 spin_unlock_bh(&session->frwd_lock);
df4da5cd 2434 iscsi_conn_failure(conn, ISCSI_ERR_SCSI_EH_SESSION_RST);
843c0a8a
MC
2435 goto done;
2436 default:
2437 conn->tmf_state = TMF_INITIAL;
2438 goto unlock;
2439 }
2440
2441 rc = SUCCESS;
659743b0 2442 spin_unlock_bh(&session->frwd_lock);
843c0a8a
MC
2443
2444 iscsi_suspend_tx(conn);
913e5bf4 2445
659743b0 2446 spin_lock_bh(&session->frwd_lock);
5d12c05e 2447 memset(hdr, 0, sizeof(*hdr));
3bbaaad9 2448 fail_scsi_tasks(conn, sc->device->lun, DID_ERROR);
843c0a8a 2449 conn->tmf_state = TMF_INITIAL;
659743b0 2450 spin_unlock_bh(&session->frwd_lock);
843c0a8a
MC
2451
2452 iscsi_start_tx(conn);
2453 goto done;
2454
2455unlock:
659743b0 2456 spin_unlock_bh(&session->frwd_lock);
843c0a8a 2457done:
bd2199d4
EZ
2458 ISCSI_DBG_EH(session, "dev reset result = %s\n",
2459 rc == SUCCESS ? "SUCCESS" : "FAILED");
843c0a8a
MC
2460 mutex_unlock(&session->eh_mutex);
2461 return rc;
2462}
2463EXPORT_SYMBOL_GPL(iscsi_eh_device_reset);
2464
3fe5ae8b
MC
2465void iscsi_session_recovery_timedout(struct iscsi_cls_session *cls_session)
2466{
2467 struct iscsi_session *session = cls_session->dd_data;
2468
659743b0 2469 spin_lock_bh(&session->frwd_lock);
3fe5ae8b
MC
2470 if (session->state != ISCSI_STATE_LOGGED_IN) {
2471 session->state = ISCSI_STATE_RECOVERY_FAILED;
2472 if (session->leadconn)
2473 wake_up(&session->leadconn->ehwait);
2474 }
659743b0 2475 spin_unlock_bh(&session->frwd_lock);
3fe5ae8b
MC
2476}
2477EXPORT_SYMBOL_GPL(iscsi_session_recovery_timedout);
2478
2479/**
2480 * iscsi_eh_session_reset - drop session and attempt relogin
2481 * @sc: scsi command
2482 *
2483 * This function will wait for a relogin, session termination from
2484 * userspace, or a recovery/replacement timeout.
2485 */
309ce156 2486int iscsi_eh_session_reset(struct scsi_cmnd *sc)
3fe5ae8b
MC
2487{
2488 struct iscsi_cls_session *cls_session;
2489 struct iscsi_session *session;
2490 struct iscsi_conn *conn;
2491
2492 cls_session = starget_to_session(scsi_target(sc->device));
2493 session = cls_session->dd_data;
2494 conn = session->leadconn;
2495
2496 mutex_lock(&session->eh_mutex);
659743b0 2497 spin_lock_bh(&session->frwd_lock);
3fe5ae8b
MC
2498 if (session->state == ISCSI_STATE_TERMINATE) {
2499failed:
2500 ISCSI_DBG_EH(session,
2501 "failing session reset: Could not log back into "
5db6dd14
FH
2502 "%s [age %d]\n", session->targetname,
2503 session->age);
659743b0 2504 spin_unlock_bh(&session->frwd_lock);
3fe5ae8b
MC
2505 mutex_unlock(&session->eh_mutex);
2506 return FAILED;
2507 }
2508
659743b0 2509 spin_unlock_bh(&session->frwd_lock);
3fe5ae8b
MC
2510 mutex_unlock(&session->eh_mutex);
2511 /*
2512 * we drop the lock here but the leadconn cannot be destoyed while
2513 * we are in the scsi eh
2514 */
df4da5cd 2515 iscsi_conn_failure(conn, ISCSI_ERR_SCSI_EH_SESSION_RST);
3fe5ae8b
MC
2516
2517 ISCSI_DBG_EH(session, "wait for relogin\n");
2518 wait_event_interruptible(conn->ehwait,
2519 session->state == ISCSI_STATE_TERMINATE ||
2520 session->state == ISCSI_STATE_LOGGED_IN ||
2521 session->state == ISCSI_STATE_RECOVERY_FAILED);
2522 if (signal_pending(current))
2523 flush_signals(current);
2524
2525 mutex_lock(&session->eh_mutex);
659743b0 2526 spin_lock_bh(&session->frwd_lock);
3fe5ae8b
MC
2527 if (session->state == ISCSI_STATE_LOGGED_IN) {
2528 ISCSI_DBG_EH(session,
2529 "session reset succeeded for %s,%s\n",
2530 session->targetname, conn->persistent_address);
2531 } else
2532 goto failed;
659743b0 2533 spin_unlock_bh(&session->frwd_lock);
3fe5ae8b
MC
2534 mutex_unlock(&session->eh_mutex);
2535 return SUCCESS;
2536}
309ce156 2537EXPORT_SYMBOL_GPL(iscsi_eh_session_reset);
3fe5ae8b
MC
2538
2539static void iscsi_prep_tgt_reset_pdu(struct scsi_cmnd *sc, struct iscsi_tm *hdr)
2540{
2541 memset(hdr, 0, sizeof(*hdr));
2542 hdr->opcode = ISCSI_OP_SCSI_TMFUNC | ISCSI_OP_IMMEDIATE;
2543 hdr->flags = ISCSI_TM_FUNC_TARGET_WARM_RESET & ISCSI_FLAG_TM_FUNC_MASK;
2544 hdr->flags |= ISCSI_FLAG_CMD_FINAL;
2545 hdr->rtt = RESERVED_ITT;
2546}
2547
2548/**
2549 * iscsi_eh_target_reset - reset target
2550 * @sc: scsi command
2551 *
309ce156 2552 * This will attempt to send a warm target reset.
3fe5ae8b 2553 */
3907adf6 2554static int iscsi_eh_target_reset(struct scsi_cmnd *sc)
3fe5ae8b
MC
2555{
2556 struct iscsi_cls_session *cls_session;
2557 struct iscsi_session *session;
2558 struct iscsi_conn *conn;
2559 struct iscsi_tm *hdr;
2560 int rc = FAILED;
2561
2562 cls_session = starget_to_session(scsi_target(sc->device));
2563 session = cls_session->dd_data;
2564
2565 ISCSI_DBG_EH(session, "tgt Reset [sc %p tgt %s]\n", sc,
2566 session->targetname);
2567
2568 mutex_lock(&session->eh_mutex);
659743b0 2569 spin_lock_bh(&session->frwd_lock);
3fe5ae8b
MC
2570 /*
2571 * Just check if we are not logged in. We cannot check for
2572 * the phase because the reset could come from a ioctl.
2573 */
2574 if (!session->leadconn || session->state != ISCSI_STATE_LOGGED_IN)
2575 goto unlock;
2576 conn = session->leadconn;
2577
2578 /* only have one tmf outstanding at a time */
2579 if (conn->tmf_state != TMF_INITIAL)
2580 goto unlock;
2581 conn->tmf_state = TMF_QUEUED;
2582
2583 hdr = &conn->tmhdr;
2584 iscsi_prep_tgt_reset_pdu(sc, hdr);
2585
2586 if (iscsi_exec_task_mgmt_fn(conn, hdr, session->age,
2587 session->tgt_reset_timeout)) {
2588 rc = FAILED;
2589 goto unlock;
2590 }
2591
2592 switch (conn->tmf_state) {
2593 case TMF_SUCCESS:
2594 break;
2595 case TMF_TIMEDOUT:
659743b0 2596 spin_unlock_bh(&session->frwd_lock);
df4da5cd 2597 iscsi_conn_failure(conn, ISCSI_ERR_SCSI_EH_SESSION_RST);
3fe5ae8b
MC
2598 goto done;
2599 default:
2600 conn->tmf_state = TMF_INITIAL;
2601 goto unlock;
2602 }
2603
2604 rc = SUCCESS;
659743b0 2605 spin_unlock_bh(&session->frwd_lock);
3fe5ae8b
MC
2606
2607 iscsi_suspend_tx(conn);
2608
659743b0 2609 spin_lock_bh(&session->frwd_lock);
3fe5ae8b
MC
2610 memset(hdr, 0, sizeof(*hdr));
2611 fail_scsi_tasks(conn, -1, DID_ERROR);
2612 conn->tmf_state = TMF_INITIAL;
659743b0 2613 spin_unlock_bh(&session->frwd_lock);
3fe5ae8b
MC
2614
2615 iscsi_start_tx(conn);
2616 goto done;
2617
2618unlock:
659743b0 2619 spin_unlock_bh(&session->frwd_lock);
3fe5ae8b
MC
2620done:
2621 ISCSI_DBG_EH(session, "tgt %s reset result = %s\n", session->targetname,
2622 rc == SUCCESS ? "SUCCESS" : "FAILED");
2623 mutex_unlock(&session->eh_mutex);
309ce156
JK
2624 return rc;
2625}
3fe5ae8b 2626
309ce156
JK
2627/**
2628 * iscsi_eh_recover_target - reset target and possibly the session
2629 * @sc: scsi command
2630 *
2631 * This will attempt to send a warm target reset. If that fails,
2632 * we will escalate to ERL0 session recovery.
2633 */
2634int iscsi_eh_recover_target(struct scsi_cmnd *sc)
2635{
2636 int rc;
2637
2638 rc = iscsi_eh_target_reset(sc);
3fe5ae8b
MC
2639 if (rc == FAILED)
2640 rc = iscsi_eh_session_reset(sc);
2641 return rc;
2642}
309ce156 2643EXPORT_SYMBOL_GPL(iscsi_eh_recover_target);
3fe5ae8b 2644
6320377f
OK
2645/*
2646 * Pre-allocate a pool of @max items of @item_size. By default, the pool
2647 * should be accessed via kfifo_{get,put} on q->queue.
2648 * Optionally, the caller can obtain the array of object pointers
2649 * by passing in a non-NULL @items pointer
2650 */
7996a778 2651int
6320377f 2652iscsi_pool_init(struct iscsi_pool *q, int max, void ***items, int item_size)
7996a778 2653{
6320377f 2654 int i, num_arrays = 1;
7996a778 2655
6320377f 2656 memset(q, 0, sizeof(*q));
7996a778
MC
2657
2658 q->max = max;
6320377f
OK
2659
2660 /* If the user passed an items pointer, he wants a copy of
2661 * the array. */
2662 if (items)
2663 num_arrays++;
778e1cdd 2664 q->pool = kvcalloc(num_arrays * max, sizeof(void *), GFP_KERNEL);
6320377f 2665 if (q->pool == NULL)
f474a37b 2666 return -ENOMEM;
7996a778 2667
c1e13f25 2668 kfifo_init(&q->queue, (void*)q->pool, max * sizeof(void*));
7996a778
MC
2669
2670 for (i = 0; i < max; i++) {
6320377f 2671 q->pool[i] = kzalloc(item_size, GFP_KERNEL);
7996a778 2672 if (q->pool[i] == NULL) {
6320377f
OK
2673 q->max = i;
2674 goto enomem;
7996a778 2675 }
7acd72eb 2676 kfifo_in(&q->queue, (void*)&q->pool[i], sizeof(void*));
7996a778 2677 }
6320377f
OK
2678
2679 if (items) {
2680 *items = q->pool + max;
2681 memcpy(*items, q->pool, max * sizeof(void *));
2682 }
2683
7996a778 2684 return 0;
6320377f
OK
2685
2686enomem:
2687 iscsi_pool_free(q);
2688 return -ENOMEM;
7996a778
MC
2689}
2690EXPORT_SYMBOL_GPL(iscsi_pool_init);
2691
6320377f 2692void iscsi_pool_free(struct iscsi_pool *q)
7996a778
MC
2693{
2694 int i;
2695
2696 for (i = 0; i < q->max; i++)
6320377f 2697 kfree(q->pool[i]);
bfcc62ed 2698 kvfree(q->pool);
7996a778
MC
2699}
2700EXPORT_SYMBOL_GPL(iscsi_pool_free);
2701
b4046922
MC
2702int iscsi_host_get_max_scsi_cmds(struct Scsi_Host *shost,
2703 uint16_t requested_cmds_max)
2704{
2705 int scsi_cmds, total_cmds = requested_cmds_max;
2706
2707check:
2708 if (!total_cmds)
2709 total_cmds = ISCSI_DEF_XMIT_CMDS_MAX;
2710 /*
2711 * The iscsi layer needs some tasks for nop handling and tmfs,
2712 * so the cmds_max must at least be greater than ISCSI_MGMT_CMDS_MAX
2713 * + 1 command for scsi IO.
2714 */
2715 if (total_cmds < ISCSI_TOTAL_CMDS_MIN) {
2716 printk(KERN_ERR "iscsi: invalid max cmds of %d. Must be a power of two that is at least %d.\n",
2717 total_cmds, ISCSI_TOTAL_CMDS_MIN);
2718 return -EINVAL;
2719 }
2720
2721 if (total_cmds > ISCSI_TOTAL_CMDS_MAX) {
2722 printk(KERN_INFO "iscsi: invalid max cmds of %d. Must be a power of 2 less than or equal to %d. Using %d.\n",
2723 requested_cmds_max, ISCSI_TOTAL_CMDS_MAX,
2724 ISCSI_TOTAL_CMDS_MAX);
2725 total_cmds = ISCSI_TOTAL_CMDS_MAX;
2726 }
2727
2728 if (!is_power_of_2(total_cmds)) {
2729 total_cmds = rounddown_pow_of_two(total_cmds);
2730 if (total_cmds < ISCSI_TOTAL_CMDS_MIN) {
2731 printk(KERN_ERR "iscsi: invalid max cmds of %d. Must be a power of 2 greater than %d.\n", requested_cmds_max, ISCSI_TOTAL_CMDS_MIN);
2732 return -EINVAL;
2733 }
2734
2735 printk(KERN_INFO "iscsi: invalid max cmds %d. Must be a power of 2. Rounding max cmds down to %d.\n",
2736 requested_cmds_max, total_cmds);
2737 }
2738
2739 scsi_cmds = total_cmds - ISCSI_MGMT_CMDS_MAX;
2740 if (shost->can_queue && scsi_cmds > shost->can_queue) {
2741 total_cmds = shost->can_queue;
2742
2743 printk(KERN_INFO "iscsi: requested max cmds %u is higher than driver limit. Using driver limit %u\n",
2744 requested_cmds_max, shost->can_queue);
2745 goto check;
2746 }
2747
2748 return scsi_cmds;
2749}
2750EXPORT_SYMBOL_GPL(iscsi_host_get_max_scsi_cmds);
2751
a4804cd6
MC
2752/**
2753 * iscsi_host_add - add host to system
2754 * @shost: scsi host
2755 * @pdev: parent device
2756 *
2757 * This should be called by partial offload and software iscsi drivers
2758 * to add a host to the system.
2759 */
2760int iscsi_host_add(struct Scsi_Host *shost, struct device *pdev)
2761{
8e9a20ce
MC
2762 if (!shost->can_queue)
2763 shost->can_queue = ISCSI_DEF_XMIT_CMDS_MAX;
2764
4d108350
MC
2765 if (!shost->cmd_per_lun)
2766 shost->cmd_per_lun = ISCSI_DEF_CMD_PER_LUN;
2767
a4804cd6
MC
2768 return scsi_add_host(shost, pdev);
2769}
2770EXPORT_SYMBOL_GPL(iscsi_host_add);
2771
2772/**
2773 * iscsi_host_alloc - allocate a host and driver data
2774 * @sht: scsi host template
2775 * @dd_data_size: driver host data size
32ae763e 2776 * @xmit_can_sleep: bool indicating if LLD will queue IO from a work queue
a4804cd6
MC
2777 *
2778 * This should be called by partial offload and software iscsi drivers.
2779 * To access the driver specific memory use the iscsi_host_priv() macro.
2780 */
2781struct Scsi_Host *iscsi_host_alloc(struct scsi_host_template *sht,
4d108350 2782 int dd_data_size, bool xmit_can_sleep)
75613521 2783{
a4804cd6 2784 struct Scsi_Host *shost;
e5bd7b54 2785 struct iscsi_host *ihost;
a4804cd6
MC
2786
2787 shost = scsi_host_alloc(sht, sizeof(struct iscsi_host) + dd_data_size);
2788 if (!shost)
2789 return NULL;
e5bd7b54 2790 ihost = shost_priv(shost);
32ae763e
MC
2791
2792 if (xmit_can_sleep) {
2793 snprintf(ihost->workq_name, sizeof(ihost->workq_name),
2794 "iscsi_q_%d", shost->host_no);
3ce41966
BL
2795 ihost->workq = alloc_workqueue("%s",
2796 WQ_SYSFS | __WQ_LEGACY | WQ_MEM_RECLAIM | WQ_UNBOUND,
1a982620 2797 1, ihost->workq_name);
32ae763e
MC
2798 if (!ihost->workq)
2799 goto free_host;
2800 }
2801
e5bd7b54
MC
2802 spin_lock_init(&ihost->lock);
2803 ihost->state = ISCSI_HOST_SETUP;
2804 ihost->num_sessions = 0;
2805 init_waitqueue_head(&ihost->session_removal_wq);
a4804cd6 2806 return shost;
32ae763e
MC
2807
2808free_host:
2809 scsi_host_put(shost);
2810 return NULL;
a4804cd6
MC
2811}
2812EXPORT_SYMBOL_GPL(iscsi_host_alloc);
2813
e5bd7b54
MC
2814static void iscsi_notify_host_removed(struct iscsi_cls_session *cls_session)
2815{
40a06e75 2816 iscsi_session_failure(cls_session->dd_data, ISCSI_ERR_INVALID_HOST);
e5bd7b54
MC
2817}
2818
a4804cd6
MC
2819/**
2820 * iscsi_host_remove - remove host and sessions
2821 * @shost: scsi host
2822 *
e5bd7b54
MC
2823 * If there are any sessions left, this will initiate the removal and wait
2824 * for the completion.
a4804cd6
MC
2825 */
2826void iscsi_host_remove(struct Scsi_Host *shost)
2827{
e5bd7b54
MC
2828 struct iscsi_host *ihost = shost_priv(shost);
2829 unsigned long flags;
2830
2831 spin_lock_irqsave(&ihost->lock, flags);
2832 ihost->state = ISCSI_HOST_REMOVED;
2833 spin_unlock_irqrestore(&ihost->lock, flags);
2834
2835 iscsi_host_for_each_session(shost, iscsi_notify_host_removed);
2836 wait_event_interruptible(ihost->session_removal_wq,
2837 ihost->num_sessions == 0);
2838 if (signal_pending(current))
2839 flush_signals(current);
2840
a4804cd6 2841 scsi_remove_host(shost);
75613521 2842}
a4804cd6 2843EXPORT_SYMBOL_GPL(iscsi_host_remove);
7996a778 2844
a4804cd6 2845void iscsi_host_free(struct Scsi_Host *shost)
75613521
MC
2846{
2847 struct iscsi_host *ihost = shost_priv(shost);
7996a778 2848
c435f0a9
MC
2849 if (ihost->workq)
2850 destroy_workqueue(ihost->workq);
2851
75613521
MC
2852 kfree(ihost->netdev);
2853 kfree(ihost->hwaddress);
2854 kfree(ihost->initiatorname);
a4804cd6 2855 scsi_host_put(shost);
75613521 2856}
a4804cd6 2857EXPORT_SYMBOL_GPL(iscsi_host_free);
7996a778 2858
e5bd7b54
MC
2859static void iscsi_host_dec_session_cnt(struct Scsi_Host *shost)
2860{
2861 struct iscsi_host *ihost = shost_priv(shost);
2862 unsigned long flags;
2863
2864 shost = scsi_host_get(shost);
2865 if (!shost) {
2866 printk(KERN_ERR "Invalid state. Cannot notify host removal "
2867 "of session teardown event because host already "
2868 "removed.\n");
2869 return;
2870 }
2871
2872 spin_lock_irqsave(&ihost->lock, flags);
2873 ihost->num_sessions--;
2874 if (ihost->num_sessions == 0)
2875 wake_up(&ihost->session_removal_wq);
2876 spin_unlock_irqrestore(&ihost->lock, flags);
2877 scsi_host_put(shost);
2878}
2879
7996a778
MC
2880/**
2881 * iscsi_session_setup - create iscsi cls session and host and session
7996a778 2882 * @iscsit: iscsi transport template
75613521
MC
2883 * @shost: scsi host
2884 * @cmds_max: session can queue
ccd4a430 2885 * @dd_size: private driver data size, added to session allocation size
9c19a7d0 2886 * @cmd_task_size: LLD task private data size
7996a778 2887 * @initial_cmdsn: initial CmdSN
ccd4a430 2888 * @id: target ID to add to this session
7996a778
MC
2889 *
2890 * This can be used by software iscsi_transports that allocate
2891 * a session per scsi host.
3cf7b233
MC
2892 *
2893 * Callers should set cmds_max to the largest total numer (mgmt + scsi) of
2894 * tasks they support. The iscsi layer reserves ISCSI_MGMT_CMDS_MAX tasks
2895 * for nop handling and login/logout requests.
75613521 2896 */
7996a778 2897struct iscsi_cls_session *
75613521 2898iscsi_session_setup(struct iscsi_transport *iscsit, struct Scsi_Host *shost,
b8b9e1b8 2899 uint16_t cmds_max, int dd_size, int cmd_task_size,
7970634b 2900 uint32_t initial_cmdsn, unsigned int id)
7996a778 2901{
e5bd7b54 2902 struct iscsi_host *ihost = shost_priv(shost);
7996a778
MC
2903 struct iscsi_session *session;
2904 struct iscsi_cls_session *cls_session;
b4046922 2905 int cmd_i, scsi_cmds;
e5bd7b54
MC
2906 unsigned long flags;
2907
2908 spin_lock_irqsave(&ihost->lock, flags);
2909 if (ihost->state == ISCSI_HOST_REMOVED) {
2910 spin_unlock_irqrestore(&ihost->lock, flags);
2911 return NULL;
2912 }
2913 ihost->num_sessions++;
2914 spin_unlock_irqrestore(&ihost->lock, flags);
8e9a20ce 2915
b4046922
MC
2916 scsi_cmds = iscsi_host_get_max_scsi_cmds(shost, cmds_max);
2917 if (scsi_cmds < 0)
e5bd7b54 2918 goto dec_session_count;
1548271e 2919
5d91e209 2920 cls_session = iscsi_alloc_session(shost, iscsit,
b8b9e1b8
JK
2921 sizeof(struct iscsi_session) +
2922 dd_size);
75613521 2923 if (!cls_session)
e5bd7b54 2924 goto dec_session_count;
75613521
MC
2925 session = cls_session->dd_data;
2926 session->cls_session = cls_session;
7996a778
MC
2927 session->host = shost;
2928 session->state = ISCSI_STATE_FREE;
f6d5180c 2929 session->fast_abort = 1;
3fe5ae8b 2930 session->tgt_reset_timeout = 30;
4cd49ea1
MC
2931 session->lu_reset_timeout = 15;
2932 session->abort_timeout = 10;
3cf7b233 2933 session->scsi_cmds_max = scsi_cmds;
b4046922 2934 session->cmds_max = scsi_cmds + ISCSI_MGMT_CMDS_MAX;
e0726407 2935 session->queued_cmdsn = session->cmdsn = initial_cmdsn;
7996a778
MC
2936 session->exp_cmdsn = initial_cmdsn + 1;
2937 session->max_cmdsn = initial_cmdsn + 1;
2938 session->max_r2t = 1;
2939 session->tt = iscsit;
b8b9e1b8 2940 session->dd_data = cls_session->dd_data + sizeof(*session);
659743b0 2941
6724add1 2942 mutex_init(&session->eh_mutex);
659743b0
SP
2943 spin_lock_init(&session->frwd_lock);
2944 spin_lock_init(&session->back_lock);
7996a778
MC
2945
2946 /* initialize SCSI PDU commands pool */
2947 if (iscsi_pool_init(&session->cmdpool, session->cmds_max,
2948 (void***)&session->cmds,
9c19a7d0 2949 cmd_task_size + sizeof(struct iscsi_task)))
7996a778
MC
2950 goto cmdpool_alloc_fail;
2951
2952 /* pre-format cmds pool with ITT */
2953 for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++) {
9c19a7d0 2954 struct iscsi_task *task = session->cmds[cmd_i];
7996a778 2955
9c19a7d0
MC
2956 if (cmd_task_size)
2957 task->dd_data = &task[1];
2958 task->itt = cmd_i;
3bbaaad9 2959 task->state = ISCSI_TASK_FREE;
9c19a7d0 2960 INIT_LIST_HEAD(&task->running);
7996a778
MC
2961 }
2962
f53a88da 2963 if (!try_module_get(iscsit->owner))
75613521 2964 goto module_get_fail;
7996a778 2965
7970634b 2966 if (iscsi_add_session(cls_session, id))
75613521 2967 goto cls_session_fail;
e5bd7b54 2968
7996a778
MC
2969 return cls_session;
2970
2971cls_session_fail:
75613521
MC
2972 module_put(iscsit->owner);
2973module_get_fail:
6320377f 2974 iscsi_pool_free(&session->cmdpool);
7996a778 2975cmdpool_alloc_fail:
75613521 2976 iscsi_free_session(cls_session);
e5bd7b54
MC
2977dec_session_count:
2978 iscsi_host_dec_session_cnt(shost);
7996a778
MC
2979 return NULL;
2980}
2981EXPORT_SYMBOL_GPL(iscsi_session_setup);
2982
2983/**
2984 * iscsi_session_teardown - destroy session, host, and cls_session
75613521 2985 * @cls_session: iscsi session
75613521 2986 */
7996a778
MC
2987void iscsi_session_teardown(struct iscsi_cls_session *cls_session)
2988{
75613521 2989 struct iscsi_session *session = cls_session->dd_data;
63f75cc8 2990 struct module *owner = cls_session->transport->owner;
e5bd7b54 2991 struct Scsi_Host *shost = session->host;
7996a778 2992
6320377f 2993 iscsi_pool_free(&session->cmdpool);
7996a778 2994
9e10b512
KK
2995 iscsi_remove_session(cls_session);
2996
b2c64167
MC
2997 kfree(session->password);
2998 kfree(session->password_in);
2999 kfree(session->username);
3000 kfree(session->username_in);
f3ff0c36 3001 kfree(session->targetname);
3c5c4801 3002 kfree(session->targetalias);
88dfd340 3003 kfree(session->initiatorname);
3b9373e9
EW
3004 kfree(session->boot_root);
3005 kfree(session->boot_nic);
3006 kfree(session->boot_target);
88dfd340 3007 kfree(session->ifacename);
f8525eb4
AC
3008 kfree(session->portal_type);
3009 kfree(session->discovery_parent_type);
f3ff0c36 3010
9e10b512
KK
3011 iscsi_free_session(cls_session);
3012
e5bd7b54 3013 iscsi_host_dec_session_cnt(shost);
63f75cc8 3014 module_put(owner);
7996a778
MC
3015}
3016EXPORT_SYMBOL_GPL(iscsi_session_teardown);
3017
3018/**
3019 * iscsi_conn_setup - create iscsi_cls_conn and iscsi_conn
3020 * @cls_session: iscsi_cls_session
5d91e209 3021 * @dd_size: private driver data size
7996a778 3022 * @conn_idx: cid
5d91e209 3023 */
7996a778 3024struct iscsi_cls_conn *
5d91e209
MC
3025iscsi_conn_setup(struct iscsi_cls_session *cls_session, int dd_size,
3026 uint32_t conn_idx)
7996a778 3027{
75613521 3028 struct iscsi_session *session = cls_session->dd_data;
7996a778
MC
3029 struct iscsi_conn *conn;
3030 struct iscsi_cls_conn *cls_conn;
d36ab6f3 3031 char *data;
7996a778 3032
5d91e209
MC
3033 cls_conn = iscsi_create_conn(cls_session, sizeof(*conn) + dd_size,
3034 conn_idx);
7996a778
MC
3035 if (!cls_conn)
3036 return NULL;
3037 conn = cls_conn->dd_data;
5d91e209 3038 memset(conn, 0, sizeof(*conn) + dd_size);
7996a778 3039
5d91e209 3040 conn->dd_data = cls_conn->dd_data + sizeof(*conn);
7996a778
MC
3041 conn->session = session;
3042 conn->cls_conn = cls_conn;
3043 conn->c_stage = ISCSI_CONN_INITIAL_STAGE;
3044 conn->id = conn_idx;
3045 conn->exp_statsn = 0;
843c0a8a 3046 conn->tmf_state = TMF_INITIAL;
f6d5180c 3047
2c4b9637 3048 timer_setup(&conn->transport_timer, iscsi_check_transport_timeouts, 0);
f6d5180c 3049
843c0a8a 3050 INIT_LIST_HEAD(&conn->mgmtqueue);
3bbaaad9 3051 INIT_LIST_HEAD(&conn->cmdqueue);
843c0a8a 3052 INIT_LIST_HEAD(&conn->requeue);
c4028958 3053 INIT_WORK(&conn->xmitwork, iscsi_xmitworker);
7996a778 3054
9c19a7d0 3055 /* allocate login_task used for the login/text sequences */
659743b0 3056 spin_lock_bh(&session->frwd_lock);
7acd72eb 3057 if (!kfifo_out(&session->cmdpool.queue,
9c19a7d0 3058 (void*)&conn->login_task,
7996a778 3059 sizeof(void*))) {
659743b0 3060 spin_unlock_bh(&session->frwd_lock);
9c19a7d0 3061 goto login_task_alloc_fail;
7996a778 3062 }
659743b0 3063 spin_unlock_bh(&session->frwd_lock);
7996a778 3064
cfeb2cf9
MC
3065 data = (char *) __get_free_pages(GFP_KERNEL,
3066 get_order(ISCSI_DEF_MAX_RECV_SEG_LEN));
d36ab6f3 3067 if (!data)
9c19a7d0
MC
3068 goto login_task_data_alloc_fail;
3069 conn->login_task->data = conn->data = data;
d36ab6f3 3070
2c4b9637 3071 timer_setup(&conn->tmf_timer, iscsi_tmf_timedout, 0);
7996a778
MC
3072 init_waitqueue_head(&conn->ehwait);
3073
3074 return cls_conn;
3075
9c19a7d0 3076login_task_data_alloc_fail:
7acd72eb 3077 kfifo_in(&session->cmdpool.queue, (void*)&conn->login_task,
d36ab6f3 3078 sizeof(void*));
9c19a7d0 3079login_task_alloc_fail:
7996a778
MC
3080 iscsi_destroy_conn(cls_conn);
3081 return NULL;
3082}
3083EXPORT_SYMBOL_GPL(iscsi_conn_setup);
3084
3085/**
3086 * iscsi_conn_teardown - teardown iscsi connection
ccd4a430 3087 * @cls_conn: iscsi class connection
7996a778
MC
3088 *
3089 * TODO: we may need to make this into a two step process
3090 * like scsi-mls remove + put host
3091 */
3092void iscsi_conn_teardown(struct iscsi_cls_conn *cls_conn)
3093{
3094 struct iscsi_conn *conn = cls_conn->dd_data;
3095 struct iscsi_session *session = conn->session;
7996a778 3096
f6d5180c
MC
3097 del_timer_sync(&conn->transport_timer);
3098
660d0831 3099 mutex_lock(&session->eh_mutex);
659743b0 3100 spin_lock_bh(&session->frwd_lock);
7996a778
MC
3101 conn->c_stage = ISCSI_CONN_CLEANUP_WAIT;
3102 if (session->leadconn == conn) {
3103 /*
3104 * leading connection? then give up on recovery.
3105 */
3106 session->state = ISCSI_STATE_TERMINATE;
3107 wake_up(&conn->ehwait);
3108 }
659743b0 3109 spin_unlock_bh(&session->frwd_lock);
7996a778 3110
779ea120 3111 /* flush queued up work because we free the connection below */
843c0a8a 3112 iscsi_suspend_tx(conn);
779ea120 3113
659743b0 3114 spin_lock_bh(&session->frwd_lock);
cfeb2cf9
MC
3115 free_pages((unsigned long) conn->data,
3116 get_order(ISCSI_DEF_MAX_RECV_SEG_LEN));
f3ff0c36 3117 kfree(conn->persistent_address);
ae56ff40 3118 kfree(conn->local_ipaddr);
659743b0
SP
3119 /* regular RX path uses back_lock */
3120 spin_lock_bh(&session->back_lock);
7acd72eb 3121 kfifo_in(&session->cmdpool.queue, (void*)&conn->login_task,
7996a778 3122 sizeof(void*));
659743b0 3123 spin_unlock_bh(&session->back_lock);
e0726407 3124 if (session->leadconn == conn)
7996a778 3125 session->leadconn = NULL;
659743b0 3126 spin_unlock_bh(&session->frwd_lock);
660d0831 3127 mutex_unlock(&session->eh_mutex);
7996a778 3128
7996a778
MC
3129 iscsi_destroy_conn(cls_conn);
3130}
3131EXPORT_SYMBOL_GPL(iscsi_conn_teardown);
3132
3133int iscsi_conn_start(struct iscsi_cls_conn *cls_conn)
3134{
3135 struct iscsi_conn *conn = cls_conn->dd_data;
3136 struct iscsi_session *session = conn->session;
3137
ffd0436e 3138 if (!session) {
322d739d
MC
3139 iscsi_conn_printk(KERN_ERR, conn,
3140 "can't start unbound connection\n");
7996a778
MC
3141 return -EPERM;
3142 }
3143
db98ccde
MC
3144 if ((session->imm_data_en || !session->initial_r2t_en) &&
3145 session->first_burst > session->max_burst) {
322d739d
MC
3146 iscsi_conn_printk(KERN_INFO, conn, "invalid burst lengths: "
3147 "first_burst %d max_burst %d\n",
3148 session->first_burst, session->max_burst);
ffd0436e
MC
3149 return -EINVAL;
3150 }
3151
f6d5180c 3152 if (conn->ping_timeout && !conn->recv_timeout) {
322d739d
MC
3153 iscsi_conn_printk(KERN_ERR, conn, "invalid recv timeout of "
3154 "zero. Using 5 seconds\n.");
f6d5180c
MC
3155 conn->recv_timeout = 5;
3156 }
3157
3158 if (conn->recv_timeout && !conn->ping_timeout) {
322d739d
MC
3159 iscsi_conn_printk(KERN_ERR, conn, "invalid ping timeout of "
3160 "zero. Using 5 seconds.\n");
f6d5180c
MC
3161 conn->ping_timeout = 5;
3162 }
3163
659743b0 3164 spin_lock_bh(&session->frwd_lock);
7996a778
MC
3165 conn->c_stage = ISCSI_CONN_STARTED;
3166 session->state = ISCSI_STATE_LOGGED_IN;
e0726407 3167 session->queued_cmdsn = session->cmdsn;
7996a778 3168
f6d5180c
MC
3169 conn->last_recv = jiffies;
3170 conn->last_ping = jiffies;
3171 if (conn->recv_timeout && conn->ping_timeout)
3172 mod_timer(&conn->transport_timer,
3173 jiffies + (conn->recv_timeout * HZ));
3174
7996a778
MC
3175 switch(conn->stop_stage) {
3176 case STOP_CONN_RECOVER:
3177 /*
3178 * unblock eh_abort() if it is blocked. re-try all
3179 * commands after successful recovery
3180 */
7996a778 3181 conn->stop_stage = 0;
843c0a8a 3182 conn->tmf_state = TMF_INITIAL;
7996a778 3183 session->age++;
8b1d0343
MC
3184 if (session->age == 16)
3185 session->age = 0;
6eabafbe 3186 break;
7996a778 3187 case STOP_CONN_TERM:
7996a778 3188 conn->stop_stage = 0;
7996a778
MC
3189 break;
3190 default:
3191 break;
3192 }
659743b0 3193 spin_unlock_bh(&session->frwd_lock);
7996a778 3194
75613521 3195 iscsi_unblock_session(session->cls_session);
6eabafbe 3196 wake_up(&conn->ehwait);
7996a778
MC
3197 return 0;
3198}
3199EXPORT_SYMBOL_GPL(iscsi_conn_start);
3200
3201static void
3bbaaad9 3202fail_mgmt_tasks(struct iscsi_session *session, struct iscsi_conn *conn)
7996a778 3203{
3bbaaad9 3204 struct iscsi_task *task;
b3cd5050 3205 int i, state;
7996a778 3206
3bbaaad9
MC
3207 for (i = 0; i < conn->session->cmds_max; i++) {
3208 task = conn->session->cmds[i];
3209 if (task->sc)
3210 continue;
7996a778 3211
3bbaaad9
MC
3212 if (task->state == ISCSI_TASK_FREE)
3213 continue;
7996a778 3214
3bbaaad9
MC
3215 ISCSI_DBG_SESSION(conn->session,
3216 "failing mgmt itt 0x%x state %d\n",
3217 task->itt, task->state);
5923d64b
MC
3218
3219 spin_lock_bh(&session->back_lock);
3220 if (cleanup_queued_task(task)) {
3221 spin_unlock_bh(&session->back_lock);
3222 continue;
3223 }
3224
b3cd5050
MC
3225 state = ISCSI_TASK_ABRT_SESS_RECOV;
3226 if (task->state == ISCSI_TASK_PENDING)
3227 state = ISCSI_TASK_COMPLETED;
3228 iscsi_complete_task(task, state);
a656183e 3229 spin_unlock_bh(&session->back_lock);
3bbaaad9 3230 }
7996a778
MC
3231}
3232
0dcf8feb 3233void iscsi_conn_stop(struct iscsi_cls_conn *cls_conn, int flag)
7996a778 3234{
0dcf8feb
MC
3235 struct iscsi_conn *conn = cls_conn->dd_data;
3236 struct iscsi_session *session = conn->session;
ed2abc7f
MC
3237 int old_stop_stage;
3238
6724add1 3239 mutex_lock(&session->eh_mutex);
659743b0 3240 spin_lock_bh(&session->frwd_lock);
ed2abc7f 3241 if (conn->stop_stage == STOP_CONN_TERM) {
659743b0 3242 spin_unlock_bh(&session->frwd_lock);
6724add1
MC
3243 mutex_unlock(&session->eh_mutex);
3244 return;
3245 }
3246
ed2abc7f
MC
3247 /*
3248 * When this is called for the in_login state, we only want to clean
9c19a7d0 3249 * up the login task and connection. We do not need to block and set
67a61114 3250 * the recovery state again
ed2abc7f 3251 */
67a61114
MC
3252 if (flag == STOP_CONN_TERM)
3253 session->state = ISCSI_STATE_TERMINATE;
3254 else if (conn->stop_stage != STOP_CONN_RECOVER)
3255 session->state = ISCSI_STATE_IN_RECOVERY;
4ae0a6c1
MC
3256
3257 old_stop_stage = conn->stop_stage;
3258 conn->stop_stage = flag;
659743b0 3259 spin_unlock_bh(&session->frwd_lock);
ed2abc7f 3260
26013ad4
MC
3261 del_timer_sync(&conn->transport_timer);
3262 iscsi_suspend_tx(conn);
3263
659743b0 3264 spin_lock_bh(&session->frwd_lock);
67a61114 3265 conn->c_stage = ISCSI_CONN_STOPPED;
659743b0 3266 spin_unlock_bh(&session->frwd_lock);
6724add1 3267
7996a778
MC
3268 /*
3269 * for connection level recovery we should not calculate
3270 * header digest. conn->hdr_size used for optimization
3271 * in hdr_extract() and will be re-negotiated at
3272 * set_param() time.
3273 */
3274 if (flag == STOP_CONN_RECOVER) {
3275 conn->hdrdgst_en = 0;
3276 conn->datadgst_en = 0;
656cffc9 3277 if (session->state == ISCSI_STATE_IN_RECOVERY &&
67a61114 3278 old_stop_stage != STOP_CONN_RECOVER) {
1b2c7af8 3279 ISCSI_DBG_SESSION(session, "blocking session\n");
75613521 3280 iscsi_block_session(session->cls_session);
67a61114 3281 }
7996a778 3282 }
656cffc9 3283
656cffc9
MC
3284 /*
3285 * flush queues.
3286 */
659743b0 3287 spin_lock_bh(&session->frwd_lock);
b3cd5050 3288 fail_scsi_tasks(conn, -1, DID_TRANSPORT_DISRUPTED);
3bbaaad9 3289 fail_mgmt_tasks(session, conn);
5d12c05e 3290 memset(&conn->tmhdr, 0, sizeof(conn->tmhdr));
659743b0 3291 spin_unlock_bh(&session->frwd_lock);
6724add1 3292 mutex_unlock(&session->eh_mutex);
7996a778 3293}
7996a778
MC
3294EXPORT_SYMBOL_GPL(iscsi_conn_stop);
3295
3296int iscsi_conn_bind(struct iscsi_cls_session *cls_session,
3297 struct iscsi_cls_conn *cls_conn, int is_leading)
3298{
75613521 3299 struct iscsi_session *session = cls_session->dd_data;
98644047 3300 struct iscsi_conn *conn = cls_conn->dd_data;
7996a778 3301
659743b0 3302 spin_lock_bh(&session->frwd_lock);
7996a778
MC
3303 if (is_leading)
3304 session->leadconn = conn;
659743b0 3305 spin_unlock_bh(&session->frwd_lock);
7996a778 3306
c8447e4c
MC
3307 /*
3308 * The target could have reduced it's window size between logins, so
3309 * we have to reset max/exp cmdsn so we can see the new values.
3310 */
3311 spin_lock_bh(&session->back_lock);
3312 session->max_cmdsn = session->exp_cmdsn = session->cmdsn + 1;
3313 spin_unlock_bh(&session->back_lock);
7996a778
MC
3314 /*
3315 * Unblock xmitworker(), Login Phase will pass through.
3316 */
3317 clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx);
3318 clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx);
3319 return 0;
3320}
3321EXPORT_SYMBOL_GPL(iscsi_conn_bind);
3322
adaf6990 3323int iscsi_switch_str_param(char **param, char *new_val_buf)
5700b1af
MC
3324{
3325 char *new_val;
3326
3327 if (*param) {
3328 if (!strcmp(*param, new_val_buf))
3329 return 0;
3330 }
3331
3332 new_val = kstrdup(new_val_buf, GFP_NOIO);
3333 if (!new_val)
3334 return -ENOMEM;
3335
3336 kfree(*param);
3337 *param = new_val;
3338 return 0;
3339}
adaf6990 3340EXPORT_SYMBOL_GPL(iscsi_switch_str_param);
a54a52ca
MC
3341
3342int iscsi_set_param(struct iscsi_cls_conn *cls_conn,
3343 enum iscsi_param param, char *buf, int buflen)
3344{
3345 struct iscsi_conn *conn = cls_conn->dd_data;
3346 struct iscsi_session *session = conn->session;
6a06a4b8 3347 int val;
a54a52ca
MC
3348
3349 switch(param) {
843c0a8a
MC
3350 case ISCSI_PARAM_FAST_ABORT:
3351 sscanf(buf, "%d", &session->fast_abort);
3352 break;
f6d5180c
MC
3353 case ISCSI_PARAM_ABORT_TMO:
3354 sscanf(buf, "%d", &session->abort_timeout);
3355 break;
3356 case ISCSI_PARAM_LU_RESET_TMO:
3357 sscanf(buf, "%d", &session->lu_reset_timeout);
3358 break;
3fe5ae8b
MC
3359 case ISCSI_PARAM_TGT_RESET_TMO:
3360 sscanf(buf, "%d", &session->tgt_reset_timeout);
3361 break;
f6d5180c
MC
3362 case ISCSI_PARAM_PING_TMO:
3363 sscanf(buf, "%d", &conn->ping_timeout);
3364 break;
3365 case ISCSI_PARAM_RECV_TMO:
3366 sscanf(buf, "%d", &conn->recv_timeout);
3367 break;
a54a52ca
MC
3368 case ISCSI_PARAM_MAX_RECV_DLENGTH:
3369 sscanf(buf, "%d", &conn->max_recv_dlength);
3370 break;
3371 case ISCSI_PARAM_MAX_XMIT_DLENGTH:
3372 sscanf(buf, "%d", &conn->max_xmit_dlength);
3373 break;
3374 case ISCSI_PARAM_HDRDGST_EN:
3375 sscanf(buf, "%d", &conn->hdrdgst_en);
3376 break;
3377 case ISCSI_PARAM_DATADGST_EN:
3378 sscanf(buf, "%d", &conn->datadgst_en);
3379 break;
3380 case ISCSI_PARAM_INITIAL_R2T_EN:
3381 sscanf(buf, "%d", &session->initial_r2t_en);
3382 break;
3383 case ISCSI_PARAM_MAX_R2T:
1304be5f 3384 sscanf(buf, "%hu", &session->max_r2t);
a54a52ca
MC
3385 break;
3386 case ISCSI_PARAM_IMM_DATA_EN:
3387 sscanf(buf, "%d", &session->imm_data_en);
3388 break;
3389 case ISCSI_PARAM_FIRST_BURST:
3390 sscanf(buf, "%d", &session->first_burst);
3391 break;
3392 case ISCSI_PARAM_MAX_BURST:
3393 sscanf(buf, "%d", &session->max_burst);
3394 break;
3395 case ISCSI_PARAM_PDU_INORDER_EN:
3396 sscanf(buf, "%d", &session->pdu_inorder_en);
3397 break;
3398 case ISCSI_PARAM_DATASEQ_INORDER_EN:
3399 sscanf(buf, "%d", &session->dataseq_inorder_en);
3400 break;
3401 case ISCSI_PARAM_ERL:
3402 sscanf(buf, "%d", &session->erl);
3403 break;
a54a52ca
MC
3404 case ISCSI_PARAM_EXP_STATSN:
3405 sscanf(buf, "%u", &conn->exp_statsn);
3406 break;
b2c64167 3407 case ISCSI_PARAM_USERNAME:
5700b1af 3408 return iscsi_switch_str_param(&session->username, buf);
b2c64167 3409 case ISCSI_PARAM_USERNAME_IN:
5700b1af 3410 return iscsi_switch_str_param(&session->username_in, buf);
b2c64167 3411 case ISCSI_PARAM_PASSWORD:
5700b1af 3412 return iscsi_switch_str_param(&session->password, buf);
b2c64167 3413 case ISCSI_PARAM_PASSWORD_IN:
5700b1af 3414 return iscsi_switch_str_param(&session->password_in, buf);
a54a52ca 3415 case ISCSI_PARAM_TARGET_NAME:
5700b1af 3416 return iscsi_switch_str_param(&session->targetname, buf);
3c5c4801
VC
3417 case ISCSI_PARAM_TARGET_ALIAS:
3418 return iscsi_switch_str_param(&session->targetalias, buf);
a54a52ca
MC
3419 case ISCSI_PARAM_TPGT:
3420 sscanf(buf, "%d", &session->tpgt);
3421 break;
3422 case ISCSI_PARAM_PERSISTENT_PORT:
3423 sscanf(buf, "%d", &conn->persistent_port);
3424 break;
3425 case ISCSI_PARAM_PERSISTENT_ADDRESS:
5700b1af 3426 return iscsi_switch_str_param(&conn->persistent_address, buf);
88dfd340 3427 case ISCSI_PARAM_IFACE_NAME:
5700b1af 3428 return iscsi_switch_str_param(&session->ifacename, buf);
88dfd340 3429 case ISCSI_PARAM_INITIATOR_NAME:
5700b1af 3430 return iscsi_switch_str_param(&session->initiatorname, buf);
3b9373e9
EW
3431 case ISCSI_PARAM_BOOT_ROOT:
3432 return iscsi_switch_str_param(&session->boot_root, buf);
3433 case ISCSI_PARAM_BOOT_NIC:
3434 return iscsi_switch_str_param(&session->boot_nic, buf);
3435 case ISCSI_PARAM_BOOT_TARGET:
3436 return iscsi_switch_str_param(&session->boot_target, buf);
f8525eb4
AC
3437 case ISCSI_PARAM_PORTAL_TYPE:
3438 return iscsi_switch_str_param(&session->portal_type, buf);
3439 case ISCSI_PARAM_DISCOVERY_PARENT_TYPE:
3440 return iscsi_switch_str_param(&session->discovery_parent_type,
3441 buf);
6a06a4b8
OG
3442 case ISCSI_PARAM_DISCOVERY_SESS:
3443 sscanf(buf, "%d", &val);
3444 session->discovery_sess = !!val;
3445 break;
ae56ff40
AC
3446 case ISCSI_PARAM_LOCAL_IPADDR:
3447 return iscsi_switch_str_param(&conn->local_ipaddr, buf);
a54a52ca
MC
3448 default:
3449 return -ENOSYS;
3450 }
3451
3452 return 0;
3453}
3454EXPORT_SYMBOL_GPL(iscsi_set_param);
3455
3456int iscsi_session_get_param(struct iscsi_cls_session *cls_session,
3457 enum iscsi_param param, char *buf)
3458{
75613521 3459 struct iscsi_session *session = cls_session->dd_data;
a54a52ca
MC
3460 int len;
3461
3462 switch(param) {
843c0a8a 3463 case ISCSI_PARAM_FAST_ABORT:
ec98ea70 3464 len = sysfs_emit(buf, "%d\n", session->fast_abort);
843c0a8a 3465 break;
f6d5180c 3466 case ISCSI_PARAM_ABORT_TMO:
ec98ea70 3467 len = sysfs_emit(buf, "%d\n", session->abort_timeout);
f6d5180c
MC
3468 break;
3469 case ISCSI_PARAM_LU_RESET_TMO:
ec98ea70 3470 len = sysfs_emit(buf, "%d\n", session->lu_reset_timeout);
f6d5180c 3471 break;
3fe5ae8b 3472 case ISCSI_PARAM_TGT_RESET_TMO:
ec98ea70 3473 len = sysfs_emit(buf, "%d\n", session->tgt_reset_timeout);
3fe5ae8b 3474 break;
a54a52ca 3475 case ISCSI_PARAM_INITIAL_R2T_EN:
ec98ea70 3476 len = sysfs_emit(buf, "%d\n", session->initial_r2t_en);
a54a52ca
MC
3477 break;
3478 case ISCSI_PARAM_MAX_R2T:
ec98ea70 3479 len = sysfs_emit(buf, "%hu\n", session->max_r2t);
a54a52ca
MC
3480 break;
3481 case ISCSI_PARAM_IMM_DATA_EN:
ec98ea70 3482 len = sysfs_emit(buf, "%d\n", session->imm_data_en);
a54a52ca
MC
3483 break;
3484 case ISCSI_PARAM_FIRST_BURST:
ec98ea70 3485 len = sysfs_emit(buf, "%u\n", session->first_burst);
a54a52ca
MC
3486 break;
3487 case ISCSI_PARAM_MAX_BURST:
ec98ea70 3488 len = sysfs_emit(buf, "%u\n", session->max_burst);
a54a52ca
MC
3489 break;
3490 case ISCSI_PARAM_PDU_INORDER_EN:
ec98ea70 3491 len = sysfs_emit(buf, "%d\n", session->pdu_inorder_en);
a54a52ca
MC
3492 break;
3493 case ISCSI_PARAM_DATASEQ_INORDER_EN:
ec98ea70 3494 len = sysfs_emit(buf, "%d\n", session->dataseq_inorder_en);
a54a52ca 3495 break;
5f09e1f3 3496 case ISCSI_PARAM_DEF_TASKMGMT_TMO:
ec98ea70 3497 len = sysfs_emit(buf, "%d\n", session->def_taskmgmt_tmo);
5f09e1f3 3498 break;
a54a52ca 3499 case ISCSI_PARAM_ERL:
ec98ea70 3500 len = sysfs_emit(buf, "%d\n", session->erl);
a54a52ca
MC
3501 break;
3502 case ISCSI_PARAM_TARGET_NAME:
ec98ea70 3503 len = sysfs_emit(buf, "%s\n", session->targetname);
a54a52ca 3504 break;
3c5c4801 3505 case ISCSI_PARAM_TARGET_ALIAS:
ec98ea70 3506 len = sysfs_emit(buf, "%s\n", session->targetalias);
3c5c4801 3507 break;
a54a52ca 3508 case ISCSI_PARAM_TPGT:
ec98ea70 3509 len = sysfs_emit(buf, "%d\n", session->tpgt);
a54a52ca 3510 break;
b2c64167 3511 case ISCSI_PARAM_USERNAME:
ec98ea70 3512 len = sysfs_emit(buf, "%s\n", session->username);
b2c64167
MC
3513 break;
3514 case ISCSI_PARAM_USERNAME_IN:
ec98ea70 3515 len = sysfs_emit(buf, "%s\n", session->username_in);
b2c64167
MC
3516 break;
3517 case ISCSI_PARAM_PASSWORD:
ec98ea70 3518 len = sysfs_emit(buf, "%s\n", session->password);
b2c64167
MC
3519 break;
3520 case ISCSI_PARAM_PASSWORD_IN:
ec98ea70 3521 len = sysfs_emit(buf, "%s\n", session->password_in);
b2c64167 3522 break;
88dfd340 3523 case ISCSI_PARAM_IFACE_NAME:
ec98ea70 3524 len = sysfs_emit(buf, "%s\n", session->ifacename);
88dfd340
MC
3525 break;
3526 case ISCSI_PARAM_INITIATOR_NAME:
ec98ea70 3527 len = sysfs_emit(buf, "%s\n", session->initiatorname);
88dfd340 3528 break;
3b9373e9 3529 case ISCSI_PARAM_BOOT_ROOT:
ec98ea70 3530 len = sysfs_emit(buf, "%s\n", session->boot_root);
3b9373e9
EW
3531 break;
3532 case ISCSI_PARAM_BOOT_NIC:
ec98ea70 3533 len = sysfs_emit(buf, "%s\n", session->boot_nic);
3b9373e9
EW
3534 break;
3535 case ISCSI_PARAM_BOOT_TARGET:
ec98ea70 3536 len = sysfs_emit(buf, "%s\n", session->boot_target);
9a2307b1 3537 break;
f8525eb4 3538 case ISCSI_PARAM_AUTO_SND_TGT_DISABLE:
ec98ea70 3539 len = sysfs_emit(buf, "%u\n", session->auto_snd_tgt_disable);
f8525eb4
AC
3540 break;
3541 case ISCSI_PARAM_DISCOVERY_SESS:
ec98ea70 3542 len = sysfs_emit(buf, "%u\n", session->discovery_sess);
f8525eb4
AC
3543 break;
3544 case ISCSI_PARAM_PORTAL_TYPE:
ec98ea70 3545 len = sysfs_emit(buf, "%s\n", session->portal_type);
f8525eb4
AC
3546 break;
3547 case ISCSI_PARAM_CHAP_AUTH_EN:
ec98ea70 3548 len = sysfs_emit(buf, "%u\n", session->chap_auth_en);
f8525eb4
AC
3549 break;
3550 case ISCSI_PARAM_DISCOVERY_LOGOUT_EN:
ec98ea70 3551 len = sysfs_emit(buf, "%u\n", session->discovery_logout_en);
f8525eb4
AC
3552 break;
3553 case ISCSI_PARAM_BIDI_CHAP_EN:
ec98ea70 3554 len = sysfs_emit(buf, "%u\n", session->bidi_chap_en);
f8525eb4
AC
3555 break;
3556 case ISCSI_PARAM_DISCOVERY_AUTH_OPTIONAL:
ec98ea70 3557 len = sysfs_emit(buf, "%u\n", session->discovery_auth_optional);
f8525eb4
AC
3558 break;
3559 case ISCSI_PARAM_DEF_TIME2WAIT:
ec98ea70 3560 len = sysfs_emit(buf, "%d\n", session->time2wait);
f8525eb4
AC
3561 break;
3562 case ISCSI_PARAM_DEF_TIME2RETAIN:
ec98ea70 3563 len = sysfs_emit(buf, "%d\n", session->time2retain);
f8525eb4
AC
3564 break;
3565 case ISCSI_PARAM_TSID:
ec98ea70 3566 len = sysfs_emit(buf, "%u\n", session->tsid);
f8525eb4
AC
3567 break;
3568 case ISCSI_PARAM_ISID:
ec98ea70 3569 len = sysfs_emit(buf, "%02x%02x%02x%02x%02x%02x\n",
f8525eb4
AC
3570 session->isid[0], session->isid[1],
3571 session->isid[2], session->isid[3],
3572 session->isid[4], session->isid[5]);
3573 break;
3574 case ISCSI_PARAM_DISCOVERY_PARENT_IDX:
ec98ea70 3575 len = sysfs_emit(buf, "%u\n", session->discovery_parent_idx);
f8525eb4
AC
3576 break;
3577 case ISCSI_PARAM_DISCOVERY_PARENT_TYPE:
3578 if (session->discovery_parent_type)
ec98ea70 3579 len = sysfs_emit(buf, "%s\n",
f8525eb4
AC
3580 session->discovery_parent_type);
3581 else
ec98ea70 3582 len = sysfs_emit(buf, "\n");
3b9373e9 3583 break;
a54a52ca
MC
3584 default:
3585 return -ENOSYS;
3586 }
3587
3588 return len;
3589}
3590EXPORT_SYMBOL_GPL(iscsi_session_get_param);
3591
00f3708e
MC
3592int iscsi_conn_get_addr_param(struct sockaddr_storage *addr,
3593 enum iscsi_param param, char *buf)
3594{
3595 struct sockaddr_in6 *sin6 = NULL;
3596 struct sockaddr_in *sin = NULL;
3597 int len;
3598
3599 switch (addr->ss_family) {
3600 case AF_INET:
3601 sin = (struct sockaddr_in *)addr;
3602 break;
3603 case AF_INET6:
3604 sin6 = (struct sockaddr_in6 *)addr;
3605 break;
3606 default:
3607 return -EINVAL;
3608 }
3609
3610 switch (param) {
3611 case ISCSI_PARAM_CONN_ADDRESS:
3612 case ISCSI_HOST_PARAM_IPADDRESS:
3613 if (sin)
ec98ea70 3614 len = sysfs_emit(buf, "%pI4\n", &sin->sin_addr.s_addr);
00f3708e 3615 else
ec98ea70 3616 len = sysfs_emit(buf, "%pI6\n", &sin6->sin6_addr);
00f3708e
MC
3617 break;
3618 case ISCSI_PARAM_CONN_PORT:
4bfb8ebf 3619 case ISCSI_PARAM_LOCAL_PORT:
00f3708e 3620 if (sin)
ec98ea70 3621 len = sysfs_emit(buf, "%hu\n", be16_to_cpu(sin->sin_port));
00f3708e 3622 else
ec98ea70 3623 len = sysfs_emit(buf, "%hu\n",
00f3708e
MC
3624 be16_to_cpu(sin6->sin6_port));
3625 break;
3626 default:
3627 return -EINVAL;
3628 }
3629
3630 return len;
3631}
3632EXPORT_SYMBOL_GPL(iscsi_conn_get_addr_param);
3633
a54a52ca
MC
3634int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn,
3635 enum iscsi_param param, char *buf)
3636{
3637 struct iscsi_conn *conn = cls_conn->dd_data;
3638 int len;
3639
3640 switch(param) {
f6d5180c 3641 case ISCSI_PARAM_PING_TMO:
ec98ea70 3642 len = sysfs_emit(buf, "%u\n", conn->ping_timeout);
f6d5180c
MC
3643 break;
3644 case ISCSI_PARAM_RECV_TMO:
ec98ea70 3645 len = sysfs_emit(buf, "%u\n", conn->recv_timeout);
f6d5180c 3646 break;
a54a52ca 3647 case ISCSI_PARAM_MAX_RECV_DLENGTH:
ec98ea70 3648 len = sysfs_emit(buf, "%u\n", conn->max_recv_dlength);
a54a52ca
MC
3649 break;
3650 case ISCSI_PARAM_MAX_XMIT_DLENGTH:
ec98ea70 3651 len = sysfs_emit(buf, "%u\n", conn->max_xmit_dlength);
a54a52ca
MC
3652 break;
3653 case ISCSI_PARAM_HDRDGST_EN:
ec98ea70 3654 len = sysfs_emit(buf, "%d\n", conn->hdrdgst_en);
a54a52ca
MC
3655 break;
3656 case ISCSI_PARAM_DATADGST_EN:
ec98ea70 3657 len = sysfs_emit(buf, "%d\n", conn->datadgst_en);
a54a52ca
MC
3658 break;
3659 case ISCSI_PARAM_IFMARKER_EN:
ec98ea70 3660 len = sysfs_emit(buf, "%d\n", conn->ifmarker_en);
a54a52ca
MC
3661 break;
3662 case ISCSI_PARAM_OFMARKER_EN:
ec98ea70 3663 len = sysfs_emit(buf, "%d\n", conn->ofmarker_en);
a54a52ca
MC
3664 break;
3665 case ISCSI_PARAM_EXP_STATSN:
ec98ea70 3666 len = sysfs_emit(buf, "%u\n", conn->exp_statsn);
a54a52ca
MC
3667 break;
3668 case ISCSI_PARAM_PERSISTENT_PORT:
ec98ea70 3669 len = sysfs_emit(buf, "%d\n", conn->persistent_port);
a54a52ca
MC
3670 break;
3671 case ISCSI_PARAM_PERSISTENT_ADDRESS:
ec98ea70 3672 len = sysfs_emit(buf, "%s\n", conn->persistent_address);
a54a52ca 3673 break;
f8525eb4 3674 case ISCSI_PARAM_STATSN:
ec98ea70 3675 len = sysfs_emit(buf, "%u\n", conn->statsn);
f8525eb4
AC
3676 break;
3677 case ISCSI_PARAM_MAX_SEGMENT_SIZE:
ec98ea70 3678 len = sysfs_emit(buf, "%u\n", conn->max_segment_size);
f8525eb4
AC
3679 break;
3680 case ISCSI_PARAM_KEEPALIVE_TMO:
ec98ea70 3681 len = sysfs_emit(buf, "%u\n", conn->keepalive_tmo);
f8525eb4
AC
3682 break;
3683 case ISCSI_PARAM_LOCAL_PORT:
ec98ea70 3684 len = sysfs_emit(buf, "%u\n", conn->local_port);
f8525eb4
AC
3685 break;
3686 case ISCSI_PARAM_TCP_TIMESTAMP_STAT:
ec98ea70 3687 len = sysfs_emit(buf, "%u\n", conn->tcp_timestamp_stat);
f8525eb4
AC
3688 break;
3689 case ISCSI_PARAM_TCP_NAGLE_DISABLE:
ec98ea70 3690 len = sysfs_emit(buf, "%u\n", conn->tcp_nagle_disable);
f8525eb4
AC
3691 break;
3692 case ISCSI_PARAM_TCP_WSF_DISABLE:
ec98ea70 3693 len = sysfs_emit(buf, "%u\n", conn->tcp_wsf_disable);
f8525eb4
AC
3694 break;
3695 case ISCSI_PARAM_TCP_TIMER_SCALE:
ec98ea70 3696 len = sysfs_emit(buf, "%u\n", conn->tcp_timer_scale);
f8525eb4
AC
3697 break;
3698 case ISCSI_PARAM_TCP_TIMESTAMP_EN:
ec98ea70 3699 len = sysfs_emit(buf, "%u\n", conn->tcp_timestamp_en);
f8525eb4
AC
3700 break;
3701 case ISCSI_PARAM_IP_FRAGMENT_DISABLE:
ec98ea70 3702 len = sysfs_emit(buf, "%u\n", conn->fragment_disable);
f8525eb4
AC
3703 break;
3704 case ISCSI_PARAM_IPV4_TOS:
ec98ea70 3705 len = sysfs_emit(buf, "%u\n", conn->ipv4_tos);
f8525eb4
AC
3706 break;
3707 case ISCSI_PARAM_IPV6_TC:
ec98ea70 3708 len = sysfs_emit(buf, "%u\n", conn->ipv6_traffic_class);
f8525eb4 3709 break;
5f09e1f3 3710 case ISCSI_PARAM_IPV6_FLOW_LABEL:
ec98ea70 3711 len = sysfs_emit(buf, "%u\n", conn->ipv6_flow_label);
5f09e1f3 3712 break;
f8525eb4 3713 case ISCSI_PARAM_IS_FW_ASSIGNED_IPV6:
ec98ea70 3714 len = sysfs_emit(buf, "%u\n", conn->is_fw_assigned_ipv6);
f8525eb4
AC
3715 break;
3716 case ISCSI_PARAM_TCP_XMIT_WSF:
ec98ea70 3717 len = sysfs_emit(buf, "%u\n", conn->tcp_xmit_wsf);
f8525eb4
AC
3718 break;
3719 case ISCSI_PARAM_TCP_RECV_WSF:
ec98ea70 3720 len = sysfs_emit(buf, "%u\n", conn->tcp_recv_wsf);
f8525eb4 3721 break;
ae56ff40 3722 case ISCSI_PARAM_LOCAL_IPADDR:
ec98ea70 3723 len = sysfs_emit(buf, "%s\n", conn->local_ipaddr);
ae56ff40 3724 break;
a54a52ca
MC
3725 default:
3726 return -ENOSYS;
3727 }
3728
3729 return len;
3730}
3731EXPORT_SYMBOL_GPL(iscsi_conn_get_param);
3732
0801c242
MC
3733int iscsi_host_get_param(struct Scsi_Host *shost, enum iscsi_host_param param,
3734 char *buf)
3735{
75613521 3736 struct iscsi_host *ihost = shost_priv(shost);
0801c242
MC
3737 int len;
3738
3739 switch (param) {
d8196ed2 3740 case ISCSI_HOST_PARAM_NETDEV_NAME:
ec98ea70 3741 len = sysfs_emit(buf, "%s\n", ihost->netdev);
d8196ed2 3742 break;
0801c242 3743 case ISCSI_HOST_PARAM_HWADDRESS:
ec98ea70 3744 len = sysfs_emit(buf, "%s\n", ihost->hwaddress);
0801c242 3745 break;
8ad5781a 3746 case ISCSI_HOST_PARAM_INITIATOR_NAME:
ec98ea70 3747 len = sysfs_emit(buf, "%s\n", ihost->initiatorname);
8ad5781a 3748 break;
0801c242
MC
3749 default:
3750 return -ENOSYS;
3751 }
3752
3753 return len;
3754}
3755EXPORT_SYMBOL_GPL(iscsi_host_get_param);
3756
3757int iscsi_host_set_param(struct Scsi_Host *shost, enum iscsi_host_param param,
3758 char *buf, int buflen)
3759{
75613521 3760 struct iscsi_host *ihost = shost_priv(shost);
0801c242
MC
3761
3762 switch (param) {
d8196ed2 3763 case ISCSI_HOST_PARAM_NETDEV_NAME:
5700b1af 3764 return iscsi_switch_str_param(&ihost->netdev, buf);
0801c242 3765 case ISCSI_HOST_PARAM_HWADDRESS:
5700b1af 3766 return iscsi_switch_str_param(&ihost->hwaddress, buf);
8ad5781a 3767 case ISCSI_HOST_PARAM_INITIATOR_NAME:
5700b1af 3768 return iscsi_switch_str_param(&ihost->initiatorname, buf);
0801c242
MC
3769 default:
3770 return -ENOSYS;
3771 }
3772
3773 return 0;
3774}
3775EXPORT_SYMBOL_GPL(iscsi_host_set_param);
3776
7996a778
MC
3777MODULE_AUTHOR("Mike Christie");
3778MODULE_DESCRIPTION("iSCSI library functions");
3779MODULE_LICENSE("GPL");