• Home
  • Raw
  • Download

Lines Matching +full:max +full:- +full:reason

1 // SPDX-License-Identifier: GPL-2.0-or-later
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
60 &(_conn)->cls_conn->dev, \
71 &(_session)->cls_session->dev, \
82 &(_session)->cls_session->dev, \
88 struct Scsi_Host *shost = conn->session->host; in iscsi_conn_queue_work()
91 if (ihost->workq) in iscsi_conn_queue_work()
92 queue_work(ihost->workq, &conn->xmitwork); in iscsi_conn_queue_work()
101 * max sequence numbers in __iscsi_update_cmdsn()
103 if (iscsi_sna_lt(max_cmdsn, exp_cmdsn - 1)) in __iscsi_update_cmdsn()
106 if (exp_cmdsn != session->exp_cmdsn && in __iscsi_update_cmdsn()
107 !iscsi_sna_lt(exp_cmdsn, session->exp_cmdsn)) in __iscsi_update_cmdsn()
108 session->exp_cmdsn = exp_cmdsn; in __iscsi_update_cmdsn()
110 if (max_cmdsn != session->max_cmdsn && in __iscsi_update_cmdsn()
111 !iscsi_sna_lt(max_cmdsn, session->max_cmdsn)) in __iscsi_update_cmdsn()
112 session->max_cmdsn = max_cmdsn; in __iscsi_update_cmdsn()
117 __iscsi_update_cmdsn(session, be32_to_cpu(hdr->exp_cmdsn), in iscsi_update_cmdsn()
118 be32_to_cpu(hdr->max_cmdsn)); in iscsi_update_cmdsn()
123 * iscsi_prep_data_out_pdu - initialize Data-Out
129 * Initialize Data-Out within this R2T sequence and finds
137 struct iscsi_conn *conn = task->conn; in iscsi_prep_data_out_pdu()
138 unsigned int left = r2t->data_length - r2t->sent; in iscsi_prep_data_out_pdu()
140 task->hdr_len = sizeof(struct iscsi_data); in iscsi_prep_data_out_pdu()
143 hdr->ttt = r2t->ttt; in iscsi_prep_data_out_pdu()
144 hdr->datasn = cpu_to_be32(r2t->datasn); in iscsi_prep_data_out_pdu()
145 r2t->datasn++; in iscsi_prep_data_out_pdu()
146 hdr->opcode = ISCSI_OP_SCSI_DATA_OUT; in iscsi_prep_data_out_pdu()
147 hdr->lun = task->lun; in iscsi_prep_data_out_pdu()
148 hdr->itt = task->hdr_itt; in iscsi_prep_data_out_pdu()
149 hdr->exp_statsn = r2t->exp_statsn; in iscsi_prep_data_out_pdu()
150 hdr->offset = cpu_to_be32(r2t->data_offset + r2t->sent); in iscsi_prep_data_out_pdu()
151 if (left > conn->max_xmit_dlength) { in iscsi_prep_data_out_pdu()
152 hton24(hdr->dlength, conn->max_xmit_dlength); in iscsi_prep_data_out_pdu()
153 r2t->data_count = conn->max_xmit_dlength; in iscsi_prep_data_out_pdu()
154 hdr->flags = 0; in iscsi_prep_data_out_pdu()
156 hton24(hdr->dlength, left); in iscsi_prep_data_out_pdu()
157 r2t->data_count = left; in iscsi_prep_data_out_pdu()
158 hdr->flags = ISCSI_FLAG_CMD_FINAL; in iscsi_prep_data_out_pdu()
160 conn->dataout_pdus_cnt++; in iscsi_prep_data_out_pdu()
166 unsigned exp_len = task->hdr_len + len; in iscsi_add_hdr()
168 if (exp_len > task->hdr_max) { in iscsi_add_hdr()
170 return -EINVAL; in iscsi_add_hdr()
173 WARN_ON(len & (ISCSI_PAD_LEN - 1)); /* caller must pad the AHS */ in iscsi_add_hdr()
174 task->hdr_len = exp_len; in iscsi_add_hdr()
183 struct scsi_cmnd *cmd = task->sc; in iscsi_prep_ecdb_ahs()
190 rlen = cmd->cmd_len - ISCSI_CDB_SIZE; in iscsi_prep_ecdb_ahs()
192 BUG_ON(rlen > sizeof(ecdb_ahdr->ecdb)); in iscsi_prep_ecdb_ahs()
193 ahslength = rlen + sizeof(ecdb_ahdr->reserved); in iscsi_prep_ecdb_ahs()
197 rc = iscsi_add_hdr(task, sizeof(ecdb_ahdr->ahslength) + in iscsi_prep_ecdb_ahs()
198 sizeof(ecdb_ahdr->ahstype) + ahslength + pad_len); in iscsi_prep_ecdb_ahs()
203 memset(&ecdb_ahdr->ecdb[rlen], 0, pad_len); in iscsi_prep_ecdb_ahs()
205 ecdb_ahdr->ahslength = cpu_to_be16(ahslength); in iscsi_prep_ecdb_ahs()
206 ecdb_ahdr->ahstype = ISCSI_AHSTYPE_CDB; in iscsi_prep_ecdb_ahs()
207 ecdb_ahdr->reserved = 0; in iscsi_prep_ecdb_ahs()
208 memcpy(ecdb_ahdr->ecdb, cmd->cmnd + ISCSI_CDB_SIZE, rlen); in iscsi_prep_ecdb_ahs()
210 ISCSI_DBG_SESSION(task->conn->session, in iscsi_prep_ecdb_ahs()
213 "%u\n", cmd->cmd_len, rlen, pad_len, ahslength, in iscsi_prep_ecdb_ahs()
214 task->hdr_len); in iscsi_prep_ecdb_ahs()
219 * iscsi_check_tmf_restrictions - check if a task is affected by TMF
229 * so we have to send all outstanding Data-Out PDUs to the target.
233 struct iscsi_session *session = task->conn->session; in iscsi_check_tmf_restrictions()
234 struct iscsi_tm *tmf = &session->tmhdr; in iscsi_check_tmf_restrictions()
237 if (session->tmf_state == TMF_INITIAL) in iscsi_check_tmf_restrictions()
240 if ((tmf->opcode & ISCSI_OPCODE_MASK) != ISCSI_OP_SCSI_TMFUNC) in iscsi_check_tmf_restrictions()
248 hdr_lun = scsilun_to_int(&tmf->lun); in iscsi_check_tmf_restrictions()
249 if (hdr_lun != task->sc->device->lun) in iscsi_check_tmf_restrictions()
259 opcode, task->itt, task->hdr_itt); in iscsi_check_tmf_restrictions()
260 return -EACCES; in iscsi_check_tmf_restrictions()
263 * And also all data-out PDUs in response to R2T in iscsi_check_tmf_restrictions()
266 if (session->fast_abort) { in iscsi_check_tmf_restrictions()
269 opcode, task->itt, task->hdr_itt); in iscsi_check_tmf_restrictions()
270 return -EACCES; in iscsi_check_tmf_restrictions()
278 * we will only hit this for data-outs in iscsi_check_tmf_restrictions()
281 task->hdr_itt == tmf->rtt) { in iscsi_check_tmf_restrictions()
284 "data-out due to abort task in " in iscsi_check_tmf_restrictions()
285 "progress\n", task->itt, in iscsi_check_tmf_restrictions()
286 task->hdr_itt); in iscsi_check_tmf_restrictions()
287 return -EACCES; in iscsi_check_tmf_restrictions()
296 * iscsi_prep_scsi_cmd_pdu - prep iscsi scsi cmd pdu
304 struct iscsi_conn *conn = task->conn; in iscsi_prep_scsi_cmd_pdu()
305 struct iscsi_session *session = conn->session; in iscsi_prep_scsi_cmd_pdu()
306 struct scsi_cmnd *sc = task->sc; in iscsi_prep_scsi_cmd_pdu()
316 if (conn->session->tt->alloc_pdu) { in iscsi_prep_scsi_cmd_pdu()
317 rc = conn->session->tt->alloc_pdu(task, ISCSI_OP_SCSI_CMD); in iscsi_prep_scsi_cmd_pdu()
321 hdr = (struct iscsi_scsi_req *)task->hdr; in iscsi_prep_scsi_cmd_pdu()
322 itt = hdr->itt; in iscsi_prep_scsi_cmd_pdu()
325 if (session->tt->parse_pdu_itt) in iscsi_prep_scsi_cmd_pdu()
326 hdr->itt = task->hdr_itt = itt; in iscsi_prep_scsi_cmd_pdu()
328 hdr->itt = task->hdr_itt = build_itt(task->itt, in iscsi_prep_scsi_cmd_pdu()
329 task->conn->session->age); in iscsi_prep_scsi_cmd_pdu()
330 task->hdr_len = 0; in iscsi_prep_scsi_cmd_pdu()
334 hdr->opcode = ISCSI_OP_SCSI_CMD; in iscsi_prep_scsi_cmd_pdu()
335 hdr->flags = ISCSI_ATTR_SIMPLE; in iscsi_prep_scsi_cmd_pdu()
336 int_to_scsilun(sc->device->lun, &hdr->lun); in iscsi_prep_scsi_cmd_pdu()
337 task->lun = hdr->lun; in iscsi_prep_scsi_cmd_pdu()
338 hdr->exp_statsn = cpu_to_be32(conn->exp_statsn); in iscsi_prep_scsi_cmd_pdu()
339 cmd_len = sc->cmd_len; in iscsi_prep_scsi_cmd_pdu()
341 memset(&hdr->cdb[cmd_len], 0, ISCSI_CDB_SIZE - cmd_len); in iscsi_prep_scsi_cmd_pdu()
348 memcpy(hdr->cdb, sc->cmnd, cmd_len); in iscsi_prep_scsi_cmd_pdu()
350 task->imm_count = 0; in iscsi_prep_scsi_cmd_pdu()
352 task->protected = true; in iscsi_prep_scsi_cmd_pdu()
355 hdr->data_length = cpu_to_be32(transfer_length); in iscsi_prep_scsi_cmd_pdu()
356 if (sc->sc_data_direction == DMA_TO_DEVICE) { in iscsi_prep_scsi_cmd_pdu()
357 struct iscsi_r2t_info *r2t = &task->unsol_r2t; in iscsi_prep_scsi_cmd_pdu()
359 hdr->flags |= ISCSI_FLAG_CMD_WRITE; in iscsi_prep_scsi_cmd_pdu()
366 * unsol_count bytes(as Data-Out) to be sent in iscsi_prep_scsi_cmd_pdu()
372 * pad_count bytes to be sent as zero-padding in iscsi_prep_scsi_cmd_pdu()
376 if (session->imm_data_en) { in iscsi_prep_scsi_cmd_pdu()
377 if (transfer_length >= session->first_burst) in iscsi_prep_scsi_cmd_pdu()
378 task->imm_count = min(session->first_burst, in iscsi_prep_scsi_cmd_pdu()
379 conn->max_xmit_dlength); in iscsi_prep_scsi_cmd_pdu()
381 task->imm_count = min(transfer_length, in iscsi_prep_scsi_cmd_pdu()
382 conn->max_xmit_dlength); in iscsi_prep_scsi_cmd_pdu()
383 hton24(hdr->dlength, task->imm_count); in iscsi_prep_scsi_cmd_pdu()
385 zero_data(hdr->dlength); in iscsi_prep_scsi_cmd_pdu()
387 if (!session->initial_r2t_en) { in iscsi_prep_scsi_cmd_pdu()
388 r2t->data_length = min(session->first_burst, in iscsi_prep_scsi_cmd_pdu()
389 transfer_length) - in iscsi_prep_scsi_cmd_pdu()
390 task->imm_count; in iscsi_prep_scsi_cmd_pdu()
391 r2t->data_offset = task->imm_count; in iscsi_prep_scsi_cmd_pdu()
392 r2t->ttt = cpu_to_be32(ISCSI_RESERVED_TAG); in iscsi_prep_scsi_cmd_pdu()
393 r2t->exp_statsn = cpu_to_be32(conn->exp_statsn); in iscsi_prep_scsi_cmd_pdu()
396 if (!task->unsol_r2t.data_length) in iscsi_prep_scsi_cmd_pdu()
397 /* No unsolicit Data-Out's */ in iscsi_prep_scsi_cmd_pdu()
398 hdr->flags |= ISCSI_FLAG_CMD_FINAL; in iscsi_prep_scsi_cmd_pdu()
400 hdr->flags |= ISCSI_FLAG_CMD_FINAL; in iscsi_prep_scsi_cmd_pdu()
401 zero_data(hdr->dlength); in iscsi_prep_scsi_cmd_pdu()
403 if (sc->sc_data_direction == DMA_FROM_DEVICE) in iscsi_prep_scsi_cmd_pdu()
404 hdr->flags |= ISCSI_FLAG_CMD_READ; in iscsi_prep_scsi_cmd_pdu()
408 hdrlength = task->hdr_len - sizeof(*hdr); in iscsi_prep_scsi_cmd_pdu()
410 WARN_ON(hdrlength & (ISCSI_PAD_LEN-1)); in iscsi_prep_scsi_cmd_pdu()
414 hdr->hlength = hdrlength & 0xFF; in iscsi_prep_scsi_cmd_pdu()
415 hdr->cmdsn = task->cmdsn = cpu_to_be32(session->cmdsn); in iscsi_prep_scsi_cmd_pdu()
417 if (session->tt->init_task && session->tt->init_task(task)) in iscsi_prep_scsi_cmd_pdu()
418 return -EIO; in iscsi_prep_scsi_cmd_pdu()
420 task->state = ISCSI_TASK_RUNNING; in iscsi_prep_scsi_cmd_pdu()
421 session->cmdsn++; in iscsi_prep_scsi_cmd_pdu()
423 conn->scsicmd_pdus_cnt++; in iscsi_prep_scsi_cmd_pdu()
426 sc->sc_data_direction == DMA_TO_DEVICE ? in iscsi_prep_scsi_cmd_pdu()
427 "write" : "read", conn->id, sc, sc->cmnd[0], in iscsi_prep_scsi_cmd_pdu()
428 task->itt, transfer_length, in iscsi_prep_scsi_cmd_pdu()
429 session->cmdsn, in iscsi_prep_scsi_cmd_pdu()
430 session->max_cmdsn - session->exp_cmdsn + 1); in iscsi_prep_scsi_cmd_pdu()
435 * iscsi_free_task - free a task
439 * This function returns the scsi command to scsi-ml or cleans
444 struct iscsi_conn *conn = task->conn; in iscsi_free_task()
445 struct iscsi_session *session = conn->session; in iscsi_free_task()
446 struct scsi_cmnd *sc = task->sc; in iscsi_free_task()
447 int oldstate = task->state; in iscsi_free_task()
450 task->itt, task->state, task->sc); in iscsi_free_task()
452 session->tt->cleanup_task(task); in iscsi_free_task()
453 task->state = ISCSI_TASK_FREE; in iscsi_free_task()
454 task->sc = NULL; in iscsi_free_task()
458 if (conn->login_task == task) in iscsi_free_task()
461 kfifo_in(&session->cmdpool.queue, (void*)&task, sizeof(void*)); in iscsi_free_task()
465 sc->SCp.ptr = NULL; in iscsi_free_task()
468 * it will decide how to return sc to scsi-ml. in iscsi_free_task()
471 sc->scsi_done(sc); in iscsi_free_task()
477 refcount_inc(&task->refcount); in __iscsi_get_task()
483 if (refcount_dec_and_test(&task->refcount)) in __iscsi_put_task()
490 struct iscsi_session *session = task->conn->session; in iscsi_put_task()
493 spin_lock_bh(&session->back_lock); in iscsi_put_task()
495 spin_unlock_bh(&session->back_lock); in iscsi_put_task()
500 * iscsi_complete_task - finish a task
508 struct iscsi_conn *conn = task->conn; in iscsi_complete_task()
510 ISCSI_DBG_SESSION(conn->session, in iscsi_complete_task()
512 task->itt, task->state, task->sc); in iscsi_complete_task()
513 if (task->state == ISCSI_TASK_COMPLETED || in iscsi_complete_task()
514 task->state == ISCSI_TASK_ABRT_TMF || in iscsi_complete_task()
515 task->state == ISCSI_TASK_ABRT_SESS_RECOV || in iscsi_complete_task()
516 task->state == ISCSI_TASK_REQUEUE_SCSIQ) in iscsi_complete_task()
518 WARN_ON_ONCE(task->state == ISCSI_TASK_FREE); in iscsi_complete_task()
519 task->state = state; in iscsi_complete_task()
521 if (READ_ONCE(conn->ping_task) == task) in iscsi_complete_task()
522 WRITE_ONCE(conn->ping_task, NULL); in iscsi_complete_task()
529 * iscsi_complete_scsi_task - finish scsi task normally
532 * @max_cmdsn: max cmd sn in cpu format
542 struct iscsi_conn *conn = task->conn; in iscsi_complete_scsi_task()
544 ISCSI_DBG_SESSION(conn->session, "[itt 0x%x]\n", task->itt); in iscsi_complete_scsi_task()
546 conn->last_recv = jiffies; in iscsi_complete_scsi_task()
547 __iscsi_update_cmdsn(conn->session, exp_cmdsn, max_cmdsn); in iscsi_complete_scsi_task()
557 struct iscsi_conn *conn = task->conn; in cleanup_queued_task()
561 if (task->state == ISCSI_TASK_COMPLETED) in cleanup_queued_task()
564 if (!list_empty(&task->running)) { in cleanup_queued_task()
565 list_del_init(&task->running); in cleanup_queued_task()
571 if (task->state == ISCSI_TASK_RUNNING || in cleanup_queued_task()
572 task->state == ISCSI_TASK_COMPLETED) in cleanup_queued_task()
576 if (conn->task == task) { in cleanup_queued_task()
577 conn->task = NULL; in cleanup_queued_task()
590 struct iscsi_conn *conn = task->conn; in fail_scsi_task()
594 spin_lock_bh(&conn->session->back_lock); in fail_scsi_task()
596 spin_unlock_bh(&conn->session->back_lock); in fail_scsi_task()
600 if (task->state == ISCSI_TASK_PENDING) { in fail_scsi_task()
605 conn->session->queued_cmdsn--; in fail_scsi_task()
613 sc = task->sc; in fail_scsi_task()
614 sc->result = err << 16; in fail_scsi_task()
617 spin_unlock_bh(&conn->session->back_lock); in fail_scsi_task()
623 struct iscsi_session *session = conn->session; in iscsi_prep_mgmt_task()
624 struct iscsi_hdr *hdr = task->hdr; in iscsi_prep_mgmt_task()
626 uint8_t opcode = hdr->opcode & ISCSI_OPCODE_MASK; in iscsi_prep_mgmt_task()
628 if (conn->session->state == ISCSI_STATE_LOGGING_OUT) in iscsi_prep_mgmt_task()
629 return -ENOTCONN; in iscsi_prep_mgmt_task()
632 nop->exp_statsn = cpu_to_be32(conn->exp_statsn); in iscsi_prep_mgmt_task()
634 * pre-format CmdSN for outgoing PDU. in iscsi_prep_mgmt_task()
636 nop->cmdsn = cpu_to_be32(session->cmdsn); in iscsi_prep_mgmt_task()
637 if (hdr->itt != RESERVED_ITT) { in iscsi_prep_mgmt_task()
640 * If we start to send tmfs or nops as non-immediate then in iscsi_prep_mgmt_task()
646 if (conn->c_stage == ISCSI_CONN_STARTED && in iscsi_prep_mgmt_task()
647 !(hdr->opcode & ISCSI_OP_IMMEDIATE)) { in iscsi_prep_mgmt_task()
648 session->queued_cmdsn++; in iscsi_prep_mgmt_task()
649 session->cmdsn++; in iscsi_prep_mgmt_task()
653 if (session->tt->init_task && session->tt->init_task(task)) in iscsi_prep_mgmt_task()
654 return -EIO; in iscsi_prep_mgmt_task()
656 if ((hdr->opcode & ISCSI_OPCODE_MASK) == ISCSI_OP_LOGOUT) in iscsi_prep_mgmt_task()
657 session->state = ISCSI_STATE_LOGGING_OUT; in iscsi_prep_mgmt_task()
659 task->state = ISCSI_TASK_RUNNING; in iscsi_prep_mgmt_task()
660 ISCSI_DBG_SESSION(session, "mgmtpdu [op 0x%x hdr->itt 0x%x " in iscsi_prep_mgmt_task()
661 "datalen %d]\n", hdr->opcode & ISCSI_OPCODE_MASK, in iscsi_prep_mgmt_task()
662 hdr->itt, task->data_count); in iscsi_prep_mgmt_task()
670 struct iscsi_session *session = conn->session; in __iscsi_conn_send_pdu()
671 struct iscsi_host *ihost = shost_priv(session->host); in __iscsi_conn_send_pdu()
672 uint8_t opcode = hdr->opcode & ISCSI_OPCODE_MASK; in __iscsi_conn_send_pdu()
676 if (session->state == ISCSI_STATE_TERMINATE) in __iscsi_conn_send_pdu()
682 * request-followed-by-response sequence. in __iscsi_conn_send_pdu()
686 if (conn->login_task->state != ISCSI_TASK_FREE) { in __iscsi_conn_send_pdu()
693 …iscsi_conn_printk(KERN_ERR, conn, "Invalid buffer len of %u for login task. Max len is %u\n", data… in __iscsi_conn_send_pdu()
697 task = conn->login_task; in __iscsi_conn_send_pdu()
699 if (session->state != ISCSI_STATE_LOGGED_IN) in __iscsi_conn_send_pdu()
707 BUG_ON(conn->c_stage == ISCSI_CONN_INITIAL_STAGE); in __iscsi_conn_send_pdu()
708 BUG_ON(conn->c_stage == ISCSI_CONN_STOPPED); in __iscsi_conn_send_pdu()
710 if (!kfifo_out(&session->cmdpool.queue, in __iscsi_conn_send_pdu()
719 refcount_set(&task->refcount, 1); in __iscsi_conn_send_pdu()
720 task->conn = conn; in __iscsi_conn_send_pdu()
721 task->sc = NULL; in __iscsi_conn_send_pdu()
722 INIT_LIST_HEAD(&task->running); in __iscsi_conn_send_pdu()
723 task->state = ISCSI_TASK_PENDING; in __iscsi_conn_send_pdu()
726 memcpy(task->data, data, data_size); in __iscsi_conn_send_pdu()
727 task->data_count = data_size; in __iscsi_conn_send_pdu()
729 task->data_count = 0; in __iscsi_conn_send_pdu()
731 if (conn->session->tt->alloc_pdu) { in __iscsi_conn_send_pdu()
732 if (conn->session->tt->alloc_pdu(task, hdr->opcode)) { in __iscsi_conn_send_pdu()
739 itt = task->hdr->itt; in __iscsi_conn_send_pdu()
740 task->hdr_len = sizeof(struct iscsi_hdr); in __iscsi_conn_send_pdu()
741 memcpy(task->hdr, hdr, sizeof(struct iscsi_hdr)); in __iscsi_conn_send_pdu()
743 if (hdr->itt != RESERVED_ITT) { in __iscsi_conn_send_pdu()
744 if (session->tt->parse_pdu_itt) in __iscsi_conn_send_pdu()
745 task->hdr->itt = itt; in __iscsi_conn_send_pdu()
747 task->hdr->itt = build_itt(task->itt, in __iscsi_conn_send_pdu()
748 task->conn->session->age); in __iscsi_conn_send_pdu()
751 if (unlikely(READ_ONCE(conn->ping_task) == INVALID_SCSI_TASK)) in __iscsi_conn_send_pdu()
752 WRITE_ONCE(conn->ping_task, task); in __iscsi_conn_send_pdu()
754 if (!ihost->workq) { in __iscsi_conn_send_pdu()
758 if (session->tt->xmit_task(task)) in __iscsi_conn_send_pdu()
761 list_add_tail(&task->running, &conn->mgmtqueue); in __iscsi_conn_send_pdu()
769 spin_lock(&session->back_lock); in __iscsi_conn_send_pdu()
771 spin_unlock(&session->back_lock); in __iscsi_conn_send_pdu()
778 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_conn_send_pdu()
779 struct iscsi_session *session = conn->session; in iscsi_conn_send_pdu()
782 spin_lock_bh(&session->frwd_lock); in iscsi_conn_send_pdu()
784 err = -EPERM; in iscsi_conn_send_pdu()
785 spin_unlock_bh(&session->frwd_lock); in iscsi_conn_send_pdu()
791 * iscsi_cmd_rsp - SCSI Command Response processing
806 struct iscsi_session *session = conn->session; in iscsi_scsi_cmd_rsp()
807 struct scsi_cmnd *sc = task->sc; in iscsi_scsi_cmd_rsp()
810 conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1; in iscsi_scsi_cmd_rsp()
812 sc->result = (DID_OK << 16) | rhdr->cmd_status; in iscsi_scsi_cmd_rsp()
814 if (task->protected) { in iscsi_scsi_cmd_rsp()
820 * callback but still published T10-PI support to scsi-mid in iscsi_scsi_cmd_rsp()
823 BUG_ON(!session->tt->check_protection); in iscsi_scsi_cmd_rsp()
825 ascq = session->tt->check_protection(task, &sector); in iscsi_scsi_cmd_rsp()
827 sc->result = DRIVER_SENSE << 24 | in iscsi_scsi_cmd_rsp()
829 scsi_build_sense_buffer(1, sc->sense_buffer, in iscsi_scsi_cmd_rsp()
831 scsi_set_sense_information(sc->sense_buffer, in iscsi_scsi_cmd_rsp()
838 if (rhdr->response != ISCSI_STATUS_CMD_COMPLETED) { in iscsi_scsi_cmd_rsp()
839 sc->result = DID_ERROR << 16; in iscsi_scsi_cmd_rsp()
843 if (rhdr->cmd_status == SAM_STAT_CHECK_CONDITION) { in iscsi_scsi_cmd_rsp()
851 sc->result = DID_BAD_TARGET << 16; in iscsi_scsi_cmd_rsp()
859 memcpy(sc->sense_buffer, data + 2, in iscsi_scsi_cmd_rsp()
866 if (rhdr->flags & (ISCSI_FLAG_CMD_BIDI_UNDERFLOW | in iscsi_scsi_cmd_rsp()
868 sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status; in iscsi_scsi_cmd_rsp()
871 if (rhdr->flags & (ISCSI_FLAG_CMD_UNDERFLOW | in iscsi_scsi_cmd_rsp()
873 int res_count = be32_to_cpu(rhdr->residual_count); in iscsi_scsi_cmd_rsp()
876 (rhdr->flags & ISCSI_FLAG_CMD_OVERFLOW || in iscsi_scsi_cmd_rsp()
878 /* write side for bidi or uni-io set_resid */ in iscsi_scsi_cmd_rsp()
881 sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status; in iscsi_scsi_cmd_rsp()
885 sc, sc->result, task->itt); in iscsi_scsi_cmd_rsp()
886 conn->scsirsp_pdus_cnt++; in iscsi_scsi_cmd_rsp()
891 * iscsi_data_in_rsp - SCSI Data-In Response processing
904 struct scsi_cmnd *sc = task->sc; in iscsi_data_in_rsp()
906 if (!(rhdr->flags & ISCSI_FLAG_DATA_STATUS)) in iscsi_data_in_rsp()
909 iscsi_update_cmdsn(conn->session, (struct iscsi_nopin *)hdr); in iscsi_data_in_rsp()
910 sc->result = (DID_OK << 16) | rhdr->cmd_status; in iscsi_data_in_rsp()
911 conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1; in iscsi_data_in_rsp()
912 if (rhdr->flags & (ISCSI_FLAG_DATA_UNDERFLOW | in iscsi_data_in_rsp()
914 int res_count = be32_to_cpu(rhdr->residual_count); in iscsi_data_in_rsp()
917 (rhdr->flags & ISCSI_FLAG_CMD_OVERFLOW || in iscsi_data_in_rsp()
918 res_count <= sc->sdb.length)) in iscsi_data_in_rsp()
921 sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status; in iscsi_data_in_rsp()
924 ISCSI_DBG_SESSION(conn->session, "data in with status done " in iscsi_data_in_rsp()
926 sc, sc->result, task->itt); in iscsi_data_in_rsp()
927 conn->scsirsp_pdus_cnt++; in iscsi_data_in_rsp()
934 struct iscsi_session *session = conn->session; in iscsi_tmf_rsp()
936 conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; in iscsi_tmf_rsp()
937 conn->tmfrsp_pdus_cnt++; in iscsi_tmf_rsp()
939 if (session->tmf_state != TMF_QUEUED) in iscsi_tmf_rsp()
942 if (tmf->response == ISCSI_TMF_RSP_COMPLETE) in iscsi_tmf_rsp()
943 session->tmf_state = TMF_SUCCESS; in iscsi_tmf_rsp()
944 else if (tmf->response == ISCSI_TMF_RSP_NO_TASK) in iscsi_tmf_rsp()
945 session->tmf_state = TMF_NOT_FOUND; in iscsi_tmf_rsp()
947 session->tmf_state = TMF_FAILED; in iscsi_tmf_rsp()
948 wake_up(&session->ehwait); in iscsi_tmf_rsp()
957 if (READ_ONCE(conn->ping_task)) in iscsi_send_nopout()
958 return -EINVAL; in iscsi_send_nopout()
959 WRITE_ONCE(conn->ping_task, INVALID_SCSI_TASK); in iscsi_send_nopout()
967 hdr.lun = rhdr->lun; in iscsi_send_nopout()
968 hdr.ttt = rhdr->ttt; in iscsi_send_nopout()
976 WRITE_ONCE(conn->ping_task, NULL); in iscsi_send_nopout()
978 return -EIO; in iscsi_send_nopout()
981 conn->last_ping = jiffies; in iscsi_send_nopout()
988 * iscsi_nop_out_rsp - SCSI NOP Response processing
1000 struct iscsi_conn *conn = task->conn; in iscsi_nop_out_rsp()
1003 if (READ_ONCE(conn->ping_task) != task) { in iscsi_nop_out_rsp()
1008 if (iscsi_recv_pdu(conn->cls_conn, (struct iscsi_hdr *)nop, in iscsi_nop_out_rsp()
1012 mod_timer(&conn->transport_timer, jiffies + conn->recv_timeout); in iscsi_nop_out_rsp()
1024 conn->exp_statsn = be32_to_cpu(reject->statsn) + 1; in iscsi_handle_reject()
1026 if (ntoh24(reject->dlength) > datalen || in iscsi_handle_reject()
1027 ntoh24(reject->dlength) < sizeof(struct iscsi_hdr)) { in iscsi_handle_reject()
1030 "%u, datalen %d\n", ntoh24(reject->dlength), in iscsi_handle_reject()
1037 switch (reject->reason) { in iscsi_handle_reject()
1054 * For nops-outs, we could have sent more than one if in iscsi_handle_reject()
1055 * the target is sending us lots of nop-ins in iscsi_handle_reject()
1062 * nop-out in response to target's nop-out rejected. in iscsi_handle_reject()
1066 spin_unlock(&conn->session->back_lock); in iscsi_handle_reject()
1067 spin_lock(&conn->session->frwd_lock); in iscsi_handle_reject()
1070 spin_unlock(&conn->session->frwd_lock); in iscsi_handle_reject()
1071 spin_lock(&conn->session->back_lock); in iscsi_handle_reject()
1092 "pdu (op 0x%x itt 0x%x) rejected. Reason " in iscsi_handle_reject()
1094 rejected_pdu.itt, reject->reason); in iscsi_handle_reject()
1101 * iscsi_itt_to_task - look up task by itt
1112 struct iscsi_session *session = conn->session; in iscsi_itt_to_task()
1118 if (session->tt->parse_pdu_itt) in iscsi_itt_to_task()
1119 session->tt->parse_pdu_itt(conn, itt, &i, NULL); in iscsi_itt_to_task()
1122 if (i >= session->cmds_max) in iscsi_itt_to_task()
1125 return session->cmds[i]; in iscsi_itt_to_task()
1130 * __iscsi_complete_pdu - complete pdu
1143 struct iscsi_session *session = conn->session; in __iscsi_complete_pdu()
1144 int opcode = hdr->opcode & ISCSI_OPCODE_MASK, rc = 0; in __iscsi_complete_pdu()
1148 conn->last_recv = jiffies; in __iscsi_complete_pdu()
1149 rc = iscsi_verify_itt(conn, hdr->itt); in __iscsi_complete_pdu()
1153 if (hdr->itt != RESERVED_ITT) in __iscsi_complete_pdu()
1154 itt = get_itt(hdr->itt); in __iscsi_complete_pdu()
1159 opcode, conn->id, itt, datalen); in __iscsi_complete_pdu()
1171 if (hdr->ttt == cpu_to_be32(ISCSI_RESERVED_TAG)) in __iscsi_complete_pdu()
1175 spin_unlock(&session->back_lock); in __iscsi_complete_pdu()
1176 spin_lock(&session->frwd_lock); in __iscsi_complete_pdu()
1178 spin_unlock(&session->frwd_lock); in __iscsi_complete_pdu()
1179 spin_lock(&session->back_lock); in __iscsi_complete_pdu()
1185 conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; in __iscsi_complete_pdu()
1186 if (iscsi_recv_pdu(conn->cls_conn, hdr, data, datalen)) in __iscsi_complete_pdu()
1199 task = iscsi_itt_to_ctask(conn, hdr->itt); in __iscsi_complete_pdu()
1202 task->last_xfer = jiffies; in __iscsi_complete_pdu()
1214 task = iscsi_itt_to_task(conn, hdr->itt); in __iscsi_complete_pdu()
1235 conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; in __iscsi_complete_pdu()
1257 if (hdr->ttt != cpu_to_be32(ISCSI_RESERVED_TAG) || datalen) { in __iscsi_complete_pdu()
1261 conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; in __iscsi_complete_pdu()
1274 if (iscsi_recv_pdu(conn->cls_conn, hdr, data, datalen)) in __iscsi_complete_pdu()
1286 spin_lock(&conn->session->back_lock); in iscsi_complete_pdu()
1288 spin_unlock(&conn->session->back_lock); in iscsi_complete_pdu()
1295 struct iscsi_session *session = conn->session; in iscsi_verify_itt()
1301 if (session->tt->parse_pdu_itt) in iscsi_verify_itt()
1302 session->tt->parse_pdu_itt(conn, itt, &i, &age); in iscsi_verify_itt()
1308 if (age != session->age) { in iscsi_verify_itt()
1311 (__force u32)itt, session->age); in iscsi_verify_itt()
1315 if (i >= session->cmds_max) { in iscsi_verify_itt()
1317 "received invalid itt index %u (max cmds " in iscsi_verify_itt()
1318 "%u.\n", i, session->cmds_max); in iscsi_verify_itt()
1326 * iscsi_itt_to_ctask - look up ctask by itt
1342 if (!task || !task->sc) in iscsi_itt_to_ctask()
1345 if (task->sc->SCp.phase != conn->session->age) { in iscsi_itt_to_ctask()
1346 iscsi_session_printk(KERN_ERR, conn->session, in iscsi_itt_to_ctask()
1348 task->sc->SCp.phase, conn->session->age); in iscsi_itt_to_ctask()
1361 spin_lock_bh(&session->frwd_lock); in iscsi_session_failure()
1362 conn = session->leadconn; in iscsi_session_failure()
1363 if (session->state == ISCSI_STATE_TERMINATE || !conn) { in iscsi_session_failure()
1364 spin_unlock_bh(&session->frwd_lock); in iscsi_session_failure()
1368 iscsi_get_conn(conn->cls_conn); in iscsi_session_failure()
1369 spin_unlock_bh(&session->frwd_lock); in iscsi_session_failure()
1376 iscsi_conn_error_event(conn->cls_conn, err); in iscsi_session_failure()
1379 iscsi_put_conn(conn->cls_conn); in iscsi_session_failure()
1385 struct iscsi_session *session = conn->session; in iscsi_set_conn_failed()
1387 if (session->state == ISCSI_STATE_FAILED) in iscsi_set_conn_failed()
1390 if (conn->stop_stage == 0) in iscsi_set_conn_failed()
1391 session->state = ISCSI_STATE_FAILED; in iscsi_set_conn_failed()
1393 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); in iscsi_set_conn_failed()
1394 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx); in iscsi_set_conn_failed()
1400 struct iscsi_session *session = conn->session; in iscsi_conn_failure()
1403 spin_lock_bh(&session->frwd_lock); in iscsi_conn_failure()
1405 spin_unlock_bh(&session->frwd_lock); in iscsi_conn_failure()
1408 iscsi_conn_error_event(conn->cls_conn, err); in iscsi_conn_failure()
1414 struct iscsi_session *session = conn->session; in iscsi_check_cmdsn_window_closed()
1417 * Check for iSCSI window and take care of CmdSN wrap-around in iscsi_check_cmdsn_window_closed()
1419 if (!iscsi_sna_lte(session->queued_cmdsn, session->max_cmdsn)) { in iscsi_check_cmdsn_window_closed()
1422 session->exp_cmdsn, session->max_cmdsn, in iscsi_check_cmdsn_window_closed()
1423 session->cmdsn, session->queued_cmdsn); in iscsi_check_cmdsn_window_closed()
1424 return -ENOSPC; in iscsi_check_cmdsn_window_closed()
1434 spin_lock_bh(&conn->session->back_lock); in iscsi_xmit_task()
1436 if (!conn->task) { in iscsi_xmit_task()
1441 conn->task = NULL; in iscsi_xmit_task()
1455 if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) { in iscsi_xmit_task()
1460 conn->task = task; in iscsi_xmit_task()
1461 spin_unlock_bh(&conn->session->back_lock); in iscsi_xmit_task()
1462 return -ENODATA; in iscsi_xmit_task()
1464 spin_unlock_bh(&conn->session->back_lock); in iscsi_xmit_task()
1466 spin_unlock_bh(&conn->session->frwd_lock); in iscsi_xmit_task()
1467 rc = conn->session->tt->xmit_task(task); in iscsi_xmit_task()
1468 spin_lock_bh(&conn->session->frwd_lock); in iscsi_xmit_task()
1471 task->last_xfer = jiffies; in iscsi_xmit_task()
1474 spin_lock(&conn->session->back_lock); in iscsi_xmit_task()
1475 if (rc && task->state == ISCSI_TASK_RUNNING) { in iscsi_xmit_task()
1478 * as conn->task above. in iscsi_xmit_task()
1481 conn->task = task; in iscsi_xmit_task()
1485 spin_unlock(&conn->session->back_lock); in iscsi_xmit_task()
1490 * iscsi_requeue_task - requeue task to run from session workqueue
1497 struct iscsi_conn *conn = task->conn; in iscsi_requeue_task()
1503 spin_lock_bh(&conn->session->frwd_lock); in iscsi_requeue_task()
1504 if (list_empty(&task->running)) { in iscsi_requeue_task()
1505 list_add_tail(&task->running, &conn->requeue); in iscsi_requeue_task()
1514 spin_unlock_bh(&conn->session->frwd_lock); in iscsi_requeue_task()
1519 * iscsi_data_xmit - xmit any command into the scheduled connection
1523 * The function can return -EAGAIN in which case the caller must
1524 * re-schedule it again later or recover. '0' return code means
1532 spin_lock_bh(&conn->session->frwd_lock); in iscsi_data_xmit()
1533 if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) { in iscsi_data_xmit()
1534 ISCSI_DBG_SESSION(conn->session, "Tx suspended!\n"); in iscsi_data_xmit()
1535 spin_unlock_bh(&conn->session->frwd_lock); in iscsi_data_xmit()
1536 return -ENODATA; in iscsi_data_xmit()
1539 if (conn->task) { in iscsi_data_xmit()
1540 rc = iscsi_xmit_task(conn, conn->task, false); in iscsi_data_xmit()
1547 * only have one nop-out as a ping from us and targets should not in iscsi_data_xmit()
1548 * overflow us with nop-ins in iscsi_data_xmit()
1551 while (!list_empty(&conn->mgmtqueue)) { in iscsi_data_xmit()
1552 task = list_entry(conn->mgmtqueue.next, struct iscsi_task, in iscsi_data_xmit()
1554 list_del_init(&task->running); in iscsi_data_xmit()
1557 spin_lock_bh(&conn->session->back_lock); in iscsi_data_xmit()
1559 spin_unlock_bh(&conn->session->back_lock); in iscsi_data_xmit()
1568 while (!list_empty(&conn->cmdqueue)) { in iscsi_data_xmit()
1569 task = list_entry(conn->cmdqueue.next, struct iscsi_task, in iscsi_data_xmit()
1571 list_del_init(&task->running); in iscsi_data_xmit()
1572 if (conn->session->state == ISCSI_STATE_LOGGING_OUT) { in iscsi_data_xmit()
1578 if (rc == -ENOMEM || rc == -EACCES) in iscsi_data_xmit()
1592 if (!list_empty(&conn->mgmtqueue)) in iscsi_data_xmit()
1596 while (!list_empty(&conn->requeue)) { in iscsi_data_xmit()
1598 * we always do fastlogout - conn stop code will clean up. in iscsi_data_xmit()
1600 if (conn->session->state == ISCSI_STATE_LOGGING_OUT) in iscsi_data_xmit()
1603 task = list_entry(conn->requeue.next, struct iscsi_task, in iscsi_data_xmit()
1609 list_del_init(&task->running); in iscsi_data_xmit()
1613 if (!list_empty(&conn->mgmtqueue)) in iscsi_data_xmit()
1616 spin_unlock_bh(&conn->session->frwd_lock); in iscsi_data_xmit()
1617 return -ENODATA; in iscsi_data_xmit()
1620 spin_unlock_bh(&conn->session->frwd_lock); in iscsi_data_xmit()
1630 * serialize Xmit worker on a per-connection basis. in iscsi_xmitworker()
1634 } while (rc >= 0 || rc == -EAGAIN); in iscsi_xmitworker()
1642 if (!kfifo_out(&conn->session->cmdpool.queue, in iscsi_alloc_task()
1646 sc->SCp.phase = conn->session->age; in iscsi_alloc_task()
1647 sc->SCp.ptr = (char *) task; in iscsi_alloc_task()
1649 refcount_set(&task->refcount, 1); in iscsi_alloc_task()
1650 task->state = ISCSI_TASK_PENDING; in iscsi_alloc_task()
1651 task->conn = conn; in iscsi_alloc_task()
1652 task->sc = sc; in iscsi_alloc_task()
1653 task->have_checked_conn = false; in iscsi_alloc_task()
1654 task->last_timeout = jiffies; in iscsi_alloc_task()
1655 task->last_xfer = jiffies; in iscsi_alloc_task()
1656 task->protected = false; in iscsi_alloc_task()
1657 INIT_LIST_HEAD(&task->running); in iscsi_alloc_task()
1678 int reason = 0; in iscsi_queuecommand() local
1683 sc->result = 0; in iscsi_queuecommand()
1684 sc->SCp.ptr = NULL; in iscsi_queuecommand()
1688 cls_session = starget_to_session(scsi_target(sc->device)); in iscsi_queuecommand()
1689 session = cls_session->dd_data; in iscsi_queuecommand()
1690 spin_lock_bh(&session->frwd_lock); in iscsi_queuecommand()
1692 reason = iscsi_session_chkready(cls_session); in iscsi_queuecommand()
1693 if (reason) { in iscsi_queuecommand()
1694 sc->result = reason; in iscsi_queuecommand()
1698 if (session->state != ISCSI_STATE_LOGGED_IN) { in iscsi_queuecommand()
1705 switch (session->state) { in iscsi_queuecommand()
1712 reason = FAILURE_SESSION_FAILED; in iscsi_queuecommand()
1713 sc->result = DID_NO_CONNECT << 16; in iscsi_queuecommand()
1718 reason = FAILURE_SESSION_IN_RECOVERY; in iscsi_queuecommand()
1719 sc->result = DID_IMM_RETRY << 16; in iscsi_queuecommand()
1722 reason = FAILURE_SESSION_LOGGING_OUT; in iscsi_queuecommand()
1723 sc->result = DID_IMM_RETRY << 16; in iscsi_queuecommand()
1726 reason = FAILURE_SESSION_RECOVERY_TIMEOUT; in iscsi_queuecommand()
1727 sc->result = DID_TRANSPORT_FAILFAST << 16; in iscsi_queuecommand()
1730 reason = FAILURE_SESSION_TERMINATE; in iscsi_queuecommand()
1731 sc->result = DID_NO_CONNECT << 16; in iscsi_queuecommand()
1734 reason = FAILURE_SESSION_FREED; in iscsi_queuecommand()
1735 sc->result = DID_NO_CONNECT << 16; in iscsi_queuecommand()
1740 conn = session->leadconn; in iscsi_queuecommand()
1742 reason = FAILURE_SESSION_FREED; in iscsi_queuecommand()
1743 sc->result = DID_NO_CONNECT << 16; in iscsi_queuecommand()
1747 if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) { in iscsi_queuecommand()
1748 reason = FAILURE_SESSION_IN_RECOVERY; in iscsi_queuecommand()
1749 sc->result = DID_REQUEUE << 16; in iscsi_queuecommand()
1754 reason = FAILURE_WINDOW_CLOSED; in iscsi_queuecommand()
1760 reason = FAILURE_OOM; in iscsi_queuecommand()
1764 if (!ihost->workq) { in iscsi_queuecommand()
1765 reason = iscsi_prep_scsi_cmd_pdu(task); in iscsi_queuecommand()
1766 if (reason) { in iscsi_queuecommand()
1767 if (reason == -ENOMEM || reason == -EACCES) { in iscsi_queuecommand()
1768 reason = FAILURE_OOM; in iscsi_queuecommand()
1771 sc->result = DID_ABORT << 16; in iscsi_queuecommand()
1775 if (session->tt->xmit_task(task)) { in iscsi_queuecommand()
1776 session->cmdsn--; in iscsi_queuecommand()
1777 reason = FAILURE_SESSION_NOT_READY; in iscsi_queuecommand()
1781 list_add_tail(&task->running, &conn->cmdqueue); in iscsi_queuecommand()
1785 session->queued_cmdsn++; in iscsi_queuecommand()
1786 spin_unlock_bh(&session->frwd_lock); in iscsi_queuecommand()
1790 spin_lock_bh(&session->back_lock); in iscsi_queuecommand()
1792 spin_unlock_bh(&session->back_lock); in iscsi_queuecommand()
1794 spin_unlock_bh(&session->frwd_lock); in iscsi_queuecommand()
1796 sc->cmnd[0], reason); in iscsi_queuecommand()
1800 spin_lock_bh(&session->back_lock); in iscsi_queuecommand()
1802 spin_unlock_bh(&session->back_lock); in iscsi_queuecommand()
1804 spin_unlock_bh(&session->frwd_lock); in iscsi_queuecommand()
1806 sc->cmnd[0], reason); in iscsi_queuecommand()
1808 sc->scsi_done(sc); in iscsi_queuecommand()
1816 struct iscsi_session *session = cls_session->dd_data; in iscsi_target_alloc()
1818 starget->can_queue = session->scsi_cmds_max; in iscsi_target_alloc()
1827 spin_lock(&session->frwd_lock); in iscsi_tmf_timedout()
1828 if (session->tmf_state == TMF_QUEUED) { in iscsi_tmf_timedout()
1829 session->tmf_state = TMF_TIMEDOUT; in iscsi_tmf_timedout()
1832 wake_up(&session->ehwait); in iscsi_tmf_timedout()
1834 spin_unlock(&session->frwd_lock); in iscsi_tmf_timedout()
1840 __must_hold(&session->frwd_lock) in iscsi_exec_task_mgmt_fn()
1842 struct iscsi_session *session = conn->session; in iscsi_exec_task_mgmt_fn()
1848 spin_unlock_bh(&session->frwd_lock); in iscsi_exec_task_mgmt_fn()
1851 spin_lock_bh(&session->frwd_lock); in iscsi_exec_task_mgmt_fn()
1852 return -EPERM; in iscsi_exec_task_mgmt_fn()
1854 conn->tmfcmd_pdus_cnt++; in iscsi_exec_task_mgmt_fn()
1855 session->tmf_timer.expires = timeout * HZ + jiffies; in iscsi_exec_task_mgmt_fn()
1856 add_timer(&session->tmf_timer); in iscsi_exec_task_mgmt_fn()
1859 spin_unlock_bh(&session->frwd_lock); in iscsi_exec_task_mgmt_fn()
1860 mutex_unlock(&session->eh_mutex); in iscsi_exec_task_mgmt_fn()
1870 wait_event_interruptible(session->ehwait, age != session->age || in iscsi_exec_task_mgmt_fn()
1871 session->state != ISCSI_STATE_LOGGED_IN || in iscsi_exec_task_mgmt_fn()
1872 session->tmf_state != TMF_QUEUED); in iscsi_exec_task_mgmt_fn()
1875 del_timer_sync(&session->tmf_timer); in iscsi_exec_task_mgmt_fn()
1877 mutex_lock(&session->eh_mutex); in iscsi_exec_task_mgmt_fn()
1878 spin_lock_bh(&session->frwd_lock); in iscsi_exec_task_mgmt_fn()
1880 if (age != session->age || in iscsi_exec_task_mgmt_fn()
1881 session->state != ISCSI_STATE_LOGGED_IN) in iscsi_exec_task_mgmt_fn()
1882 return -ENOTCONN; in iscsi_exec_task_mgmt_fn()
1891 struct iscsi_session *session = conn->session; in fail_scsi_tasks()
1895 spin_lock_bh(&session->back_lock); in fail_scsi_tasks()
1896 for (i = 0; i < session->cmds_max; i++) { in fail_scsi_tasks()
1897 task = session->cmds[i]; in fail_scsi_tasks()
1898 if (!task->sc || task->state == ISCSI_TASK_FREE) in fail_scsi_tasks()
1901 if (lun != -1 && lun != task->sc->device->lun) in fail_scsi_tasks()
1905 spin_unlock_bh(&session->back_lock); in fail_scsi_tasks()
1909 task->sc, task->itt, task->state); in fail_scsi_tasks()
1912 spin_unlock_bh(&session->frwd_lock); in fail_scsi_tasks()
1914 spin_lock_bh(&session->frwd_lock); in fail_scsi_tasks()
1916 spin_lock_bh(&session->back_lock); in fail_scsi_tasks()
1919 spin_unlock_bh(&session->back_lock); in fail_scsi_tasks()
1923 * iscsi_suspend_queue - suspend iscsi_queuecommand
1935 spin_lock_bh(&conn->session->frwd_lock); in iscsi_suspend_queue()
1936 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); in iscsi_suspend_queue()
1937 spin_unlock_bh(&conn->session->frwd_lock); in iscsi_suspend_queue()
1942 * iscsi_suspend_tx - suspend iscsi_data_xmit
1951 struct Scsi_Host *shost = conn->session->host; in iscsi_suspend_tx()
1954 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); in iscsi_suspend_tx()
1955 if (ihost->workq) in iscsi_suspend_tx()
1956 flush_workqueue(ihost->workq); in iscsi_suspend_tx()
1962 clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); in iscsi_start_tx()
1974 if (READ_ONCE(conn->ping_task) && in iscsi_has_ping_timed_out()
1975 time_before_eq(conn->last_recv + (conn->recv_timeout * HZ) + in iscsi_has_ping_timed_out()
1976 (conn->ping_timeout * HZ), jiffies)) in iscsi_has_ping_timed_out()
1991 cls_session = starget_to_session(scsi_target(sc->device)); in iscsi_eh_cmd_timed_out()
1992 session = cls_session->dd_data; in iscsi_eh_cmd_timed_out()
1996 spin_lock_bh(&session->frwd_lock); in iscsi_eh_cmd_timed_out()
1997 spin_lock(&session->back_lock); in iscsi_eh_cmd_timed_out()
1998 task = (struct iscsi_task *)sc->SCp.ptr; in iscsi_eh_cmd_timed_out()
2005 spin_unlock(&session->back_lock); in iscsi_eh_cmd_timed_out()
2009 spin_unlock(&session->back_lock); in iscsi_eh_cmd_timed_out()
2011 if (session->state != ISCSI_STATE_LOGGED_IN) { in iscsi_eh_cmd_timed_out()
2020 sc->result = DID_NO_CONNECT << 16; in iscsi_eh_cmd_timed_out()
2033 conn = session->leadconn; in iscsi_eh_cmd_timed_out()
2047 if (time_after(task->last_xfer, task->last_timeout)) { in iscsi_eh_cmd_timed_out()
2049 "scsi-ml for more time to complete. " in iscsi_eh_cmd_timed_out()
2051 "%lu\n.", task->last_xfer, task->last_timeout); in iscsi_eh_cmd_timed_out()
2052 task->have_checked_conn = false; in iscsi_eh_cmd_timed_out()
2057 if (!conn->recv_timeout && !conn->ping_timeout) in iscsi_eh_cmd_timed_out()
2068 spin_lock(&session->back_lock); in iscsi_eh_cmd_timed_out()
2069 for (i = 0; i < conn->session->cmds_max; i++) { in iscsi_eh_cmd_timed_out()
2070 running_task = conn->session->cmds[i]; in iscsi_eh_cmd_timed_out()
2071 if (!running_task->sc || running_task == task || in iscsi_eh_cmd_timed_out()
2072 running_task->state != ISCSI_TASK_RUNNING) in iscsi_eh_cmd_timed_out()
2079 if (time_after(running_task->sc->jiffies_at_alloc, in iscsi_eh_cmd_timed_out()
2080 task->sc->jiffies_at_alloc)) in iscsi_eh_cmd_timed_out()
2083 if (time_after(running_task->last_xfer, task->last_timeout)) { in iscsi_eh_cmd_timed_out()
2087 * we started/last-checked. We could be queueing in iscsi_eh_cmd_timed_out()
2096 "Asking scsi-ml for more time to " in iscsi_eh_cmd_timed_out()
2099 task->last_xfer, running_task->last_xfer, in iscsi_eh_cmd_timed_out()
2100 task->last_timeout); in iscsi_eh_cmd_timed_out()
2101 spin_unlock(&session->back_lock); in iscsi_eh_cmd_timed_out()
2106 spin_unlock(&session->back_lock); in iscsi_eh_cmd_timed_out()
2109 if (task->have_checked_conn) in iscsi_eh_cmd_timed_out()
2116 if (READ_ONCE(conn->ping_task)) { in iscsi_eh_cmd_timed_out()
2117 task->have_checked_conn = true; in iscsi_eh_cmd_timed_out()
2124 task->have_checked_conn = true; in iscsi_eh_cmd_timed_out()
2128 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_cmd_timed_out()
2131 task->last_timeout = jiffies; in iscsi_eh_cmd_timed_out()
2143 struct iscsi_session *session = conn->session; in iscsi_check_transport_timeouts()
2146 spin_lock(&session->frwd_lock); in iscsi_check_transport_timeouts()
2147 if (session->state != ISCSI_STATE_LOGGED_IN) in iscsi_check_transport_timeouts()
2150 recv_timeout = conn->recv_timeout; in iscsi_check_transport_timeouts()
2155 last_recv = conn->last_recv; in iscsi_check_transport_timeouts()
2161 conn->ping_timeout, conn->recv_timeout, in iscsi_check_transport_timeouts()
2162 last_recv, conn->last_ping, jiffies); in iscsi_check_transport_timeouts()
2163 spin_unlock(&session->frwd_lock); in iscsi_check_transport_timeouts()
2174 next_timeout = conn->last_ping + (conn->ping_timeout * HZ); in iscsi_check_transport_timeouts()
2179 mod_timer(&conn->transport_timer, next_timeout); in iscsi_check_transport_timeouts()
2181 spin_unlock(&session->frwd_lock); in iscsi_check_transport_timeouts()
2185 * iscsi_conn_unbind - prevent queueing to conn.
2201 conn = cls_conn->dd_data; in iscsi_conn_unbind()
2202 session = conn->session; in iscsi_conn_unbind()
2209 mutex_lock(&session->eh_mutex); in iscsi_conn_unbind()
2214 spin_lock_bh(&session->frwd_lock); in iscsi_conn_unbind()
2221 if (session->state == ISCSI_STATE_LOGGED_IN) in iscsi_conn_unbind()
2224 spin_unlock_bh(&session->frwd_lock); in iscsi_conn_unbind()
2225 mutex_unlock(&session->eh_mutex); in iscsi_conn_unbind()
2233 hdr->opcode = ISCSI_OP_SCSI_TMFUNC | ISCSI_OP_IMMEDIATE; in iscsi_prep_abort_task_pdu()
2234 hdr->flags = ISCSI_TM_FUNC_ABORT_TASK & ISCSI_FLAG_TM_FUNC_MASK; in iscsi_prep_abort_task_pdu()
2235 hdr->flags |= ISCSI_FLAG_CMD_FINAL; in iscsi_prep_abort_task_pdu()
2236 hdr->lun = task->lun; in iscsi_prep_abort_task_pdu()
2237 hdr->rtt = task->hdr_itt; in iscsi_prep_abort_task_pdu()
2238 hdr->refcmdsn = task->cmdsn; in iscsi_prep_abort_task_pdu()
2250 cls_session = starget_to_session(scsi_target(sc->device)); in iscsi_eh_abort()
2251 session = cls_session->dd_data; in iscsi_eh_abort()
2255 mutex_lock(&session->eh_mutex); in iscsi_eh_abort()
2256 spin_lock_bh(&session->frwd_lock); in iscsi_eh_abort()
2261 if (!sc->SCp.ptr) { in iscsi_eh_abort()
2264 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_abort()
2265 mutex_unlock(&session->eh_mutex); in iscsi_eh_abort()
2273 if (!session->leadconn || session->state != ISCSI_STATE_LOGGED_IN || in iscsi_eh_abort()
2274 sc->SCp.phase != session->age) { in iscsi_eh_abort()
2275 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_abort()
2276 mutex_unlock(&session->eh_mutex); in iscsi_eh_abort()
2282 conn = session->leadconn; in iscsi_eh_abort()
2283 conn->eh_abort_cnt++; in iscsi_eh_abort()
2284 age = session->age; in iscsi_eh_abort()
2286 spin_lock(&session->back_lock); in iscsi_eh_abort()
2287 task = (struct iscsi_task *)sc->SCp.ptr; in iscsi_eh_abort()
2288 if (!task || !task->sc) { in iscsi_eh_abort()
2292 spin_unlock(&session->back_lock); in iscsi_eh_abort()
2293 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_abort()
2294 mutex_unlock(&session->eh_mutex); in iscsi_eh_abort()
2297 ISCSI_DBG_EH(session, "aborting [sc %p itt 0x%x]\n", sc, task->itt); in iscsi_eh_abort()
2299 spin_unlock(&session->back_lock); in iscsi_eh_abort()
2301 if (task->state == ISCSI_TASK_PENDING) { in iscsi_eh_abort()
2307 if (session->tmf_state != TMF_INITIAL) in iscsi_eh_abort()
2309 session->tmf_state = TMF_QUEUED; in iscsi_eh_abort()
2311 hdr = &session->tmhdr; in iscsi_eh_abort()
2314 if (iscsi_exec_task_mgmt_fn(conn, hdr, age, session->abort_timeout)) in iscsi_eh_abort()
2317 switch (session->tmf_state) { in iscsi_eh_abort()
2319 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_abort()
2330 spin_lock_bh(&session->frwd_lock); in iscsi_eh_abort()
2332 session->tmf_state = TMF_INITIAL; in iscsi_eh_abort()
2334 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_abort()
2338 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_abort()
2342 if (!sc->SCp.ptr) { in iscsi_eh_abort()
2343 session->tmf_state = TMF_INITIAL; in iscsi_eh_abort()
2352 session->tmf_state = TMF_INITIAL; in iscsi_eh_abort()
2357 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_abort()
2360 sc, task->itt); in iscsi_eh_abort()
2362 mutex_unlock(&session->eh_mutex); in iscsi_eh_abort()
2366 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_abort()
2369 task ? task->itt : 0); in iscsi_eh_abort()
2371 mutex_unlock(&session->eh_mutex); in iscsi_eh_abort()
2379 hdr->opcode = ISCSI_OP_SCSI_TMFUNC | ISCSI_OP_IMMEDIATE; in iscsi_prep_lun_reset_pdu()
2380 hdr->flags = ISCSI_TM_FUNC_LOGICAL_UNIT_RESET & ISCSI_FLAG_TM_FUNC_MASK; in iscsi_prep_lun_reset_pdu()
2381 hdr->flags |= ISCSI_FLAG_CMD_FINAL; in iscsi_prep_lun_reset_pdu()
2382 int_to_scsilun(sc->device->lun, &hdr->lun); in iscsi_prep_lun_reset_pdu()
2383 hdr->rtt = RESERVED_ITT; in iscsi_prep_lun_reset_pdu()
2394 cls_session = starget_to_session(scsi_target(sc->device)); in iscsi_eh_device_reset()
2395 session = cls_session->dd_data; in iscsi_eh_device_reset()
2398 sc->device->lun); in iscsi_eh_device_reset()
2400 mutex_lock(&session->eh_mutex); in iscsi_eh_device_reset()
2401 spin_lock_bh(&session->frwd_lock); in iscsi_eh_device_reset()
2406 if (!session->leadconn || session->state != ISCSI_STATE_LOGGED_IN) in iscsi_eh_device_reset()
2408 conn = session->leadconn; in iscsi_eh_device_reset()
2411 if (session->tmf_state != TMF_INITIAL) in iscsi_eh_device_reset()
2413 session->tmf_state = TMF_QUEUED; in iscsi_eh_device_reset()
2415 hdr = &session->tmhdr; in iscsi_eh_device_reset()
2418 if (iscsi_exec_task_mgmt_fn(conn, hdr, session->age, in iscsi_eh_device_reset()
2419 session->lu_reset_timeout)) { in iscsi_eh_device_reset()
2424 switch (session->tmf_state) { in iscsi_eh_device_reset()
2428 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_device_reset()
2432 session->tmf_state = TMF_INITIAL; in iscsi_eh_device_reset()
2437 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_device_reset()
2441 spin_lock_bh(&session->frwd_lock); in iscsi_eh_device_reset()
2443 fail_scsi_tasks(conn, sc->device->lun, DID_ERROR); in iscsi_eh_device_reset()
2444 session->tmf_state = TMF_INITIAL; in iscsi_eh_device_reset()
2445 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_device_reset()
2451 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_device_reset()
2455 mutex_unlock(&session->eh_mutex); in iscsi_eh_device_reset()
2462 struct iscsi_session *session = cls_session->dd_data; in iscsi_session_recovery_timedout()
2464 spin_lock_bh(&session->frwd_lock); in iscsi_session_recovery_timedout()
2465 if (session->state != ISCSI_STATE_LOGGED_IN) { in iscsi_session_recovery_timedout()
2466 session->state = ISCSI_STATE_RECOVERY_FAILED; in iscsi_session_recovery_timedout()
2467 wake_up(&session->ehwait); in iscsi_session_recovery_timedout()
2469 spin_unlock_bh(&session->frwd_lock); in iscsi_session_recovery_timedout()
2474 * iscsi_eh_session_reset - drop session and attempt relogin
2486 cls_session = starget_to_session(scsi_target(sc->device)); in iscsi_eh_session_reset()
2487 session = cls_session->dd_data; in iscsi_eh_session_reset()
2488 conn = session->leadconn; in iscsi_eh_session_reset()
2490 mutex_lock(&session->eh_mutex); in iscsi_eh_session_reset()
2491 spin_lock_bh(&session->frwd_lock); in iscsi_eh_session_reset()
2492 if (session->state == ISCSI_STATE_TERMINATE) { in iscsi_eh_session_reset()
2496 "%s [age %d]\n", session->targetname, in iscsi_eh_session_reset()
2497 session->age); in iscsi_eh_session_reset()
2498 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_session_reset()
2499 mutex_unlock(&session->eh_mutex); in iscsi_eh_session_reset()
2503 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_session_reset()
2504 mutex_unlock(&session->eh_mutex); in iscsi_eh_session_reset()
2512 wait_event_interruptible(session->ehwait, in iscsi_eh_session_reset()
2513 session->state == ISCSI_STATE_TERMINATE || in iscsi_eh_session_reset()
2514 session->state == ISCSI_STATE_LOGGED_IN || in iscsi_eh_session_reset()
2515 session->state == ISCSI_STATE_RECOVERY_FAILED); in iscsi_eh_session_reset()
2519 mutex_lock(&session->eh_mutex); in iscsi_eh_session_reset()
2520 spin_lock_bh(&session->frwd_lock); in iscsi_eh_session_reset()
2521 if (session->state == ISCSI_STATE_LOGGED_IN) { in iscsi_eh_session_reset()
2524 session->targetname, conn->persistent_address); in iscsi_eh_session_reset()
2527 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_session_reset()
2528 mutex_unlock(&session->eh_mutex); in iscsi_eh_session_reset()
2536 hdr->opcode = ISCSI_OP_SCSI_TMFUNC | ISCSI_OP_IMMEDIATE; in iscsi_prep_tgt_reset_pdu()
2537 hdr->flags = ISCSI_TM_FUNC_TARGET_WARM_RESET & ISCSI_FLAG_TM_FUNC_MASK; in iscsi_prep_tgt_reset_pdu()
2538 hdr->flags |= ISCSI_FLAG_CMD_FINAL; in iscsi_prep_tgt_reset_pdu()
2539 hdr->rtt = RESERVED_ITT; in iscsi_prep_tgt_reset_pdu()
2543 * iscsi_eh_target_reset - reset target
2556 cls_session = starget_to_session(scsi_target(sc->device)); in iscsi_eh_target_reset()
2557 session = cls_session->dd_data; in iscsi_eh_target_reset()
2560 session->targetname); in iscsi_eh_target_reset()
2562 mutex_lock(&session->eh_mutex); in iscsi_eh_target_reset()
2563 spin_lock_bh(&session->frwd_lock); in iscsi_eh_target_reset()
2568 if (!session->leadconn || session->state != ISCSI_STATE_LOGGED_IN) in iscsi_eh_target_reset()
2570 conn = session->leadconn; in iscsi_eh_target_reset()
2573 if (session->tmf_state != TMF_INITIAL) in iscsi_eh_target_reset()
2575 session->tmf_state = TMF_QUEUED; in iscsi_eh_target_reset()
2577 hdr = &session->tmhdr; in iscsi_eh_target_reset()
2580 if (iscsi_exec_task_mgmt_fn(conn, hdr, session->age, in iscsi_eh_target_reset()
2581 session->tgt_reset_timeout)) { in iscsi_eh_target_reset()
2586 switch (session->tmf_state) { in iscsi_eh_target_reset()
2590 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_target_reset()
2594 session->tmf_state = TMF_INITIAL; in iscsi_eh_target_reset()
2599 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_target_reset()
2603 spin_lock_bh(&session->frwd_lock); in iscsi_eh_target_reset()
2605 fail_scsi_tasks(conn, -1, DID_ERROR); in iscsi_eh_target_reset()
2606 session->tmf_state = TMF_INITIAL; in iscsi_eh_target_reset()
2607 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_target_reset()
2613 spin_unlock_bh(&session->frwd_lock); in iscsi_eh_target_reset()
2615 ISCSI_DBG_EH(session, "tgt %s reset result = %s\n", session->targetname, in iscsi_eh_target_reset()
2617 mutex_unlock(&session->eh_mutex); in iscsi_eh_target_reset()
2622 * iscsi_eh_recover_target - reset target and possibly the session
2640 * Pre-allocate a pool of @max items of @item_size. By default, the pool
2641 * should be accessed via kfifo_{get,put} on q->queue.
2643 * by passing in a non-NULL @items pointer
2646 iscsi_pool_init(struct iscsi_pool *q, int max, void ***items, int item_size) in iscsi_pool_init() argument
2652 q->max = max; in iscsi_pool_init()
2658 q->pool = kvcalloc(num_arrays * max, sizeof(void *), GFP_KERNEL); in iscsi_pool_init()
2659 if (q->pool == NULL) in iscsi_pool_init()
2660 return -ENOMEM; in iscsi_pool_init()
2662 kfifo_init(&q->queue, (void*)q->pool, max * sizeof(void*)); in iscsi_pool_init()
2664 for (i = 0; i < max; i++) { in iscsi_pool_init()
2665 q->pool[i] = kzalloc(item_size, GFP_KERNEL); in iscsi_pool_init()
2666 if (q->pool[i] == NULL) { in iscsi_pool_init()
2667 q->max = i; in iscsi_pool_init()
2670 kfifo_in(&q->queue, (void*)&q->pool[i], sizeof(void*)); in iscsi_pool_init()
2674 *items = q->pool + max; in iscsi_pool_init()
2675 memcpy(*items, q->pool, max * sizeof(void *)); in iscsi_pool_init()
2682 return -ENOMEM; in iscsi_pool_init()
2690 for (i = 0; i < q->max; i++) in iscsi_pool_free()
2691 kfree(q->pool[i]); in iscsi_pool_free()
2692 kvfree(q->pool); in iscsi_pool_free()
2710 printk(KERN_ERR "iscsi: invalid max cmds of %d. Must be a power of two that is at least %d.\n", in iscsi_host_get_max_scsi_cmds()
2712 return -EINVAL; in iscsi_host_get_max_scsi_cmds()
2716 …printk(KERN_INFO "iscsi: invalid max cmds of %d. Must be a power of 2 less than or equal to %d. Us… in iscsi_host_get_max_scsi_cmds()
2725 …printk(KERN_ERR "iscsi: invalid max cmds of %d. Must be a power of 2 greater than %d.\n", requeste… in iscsi_host_get_max_scsi_cmds()
2726 return -EINVAL; in iscsi_host_get_max_scsi_cmds()
2729 …printk(KERN_INFO "iscsi: invalid max cmds %d. Must be a power of 2. Rounding max cmds down to %d.\… in iscsi_host_get_max_scsi_cmds()
2733 scsi_cmds = total_cmds - ISCSI_MGMT_CMDS_MAX; in iscsi_host_get_max_scsi_cmds()
2734 if (shost->can_queue && scsi_cmds > shost->can_queue) { in iscsi_host_get_max_scsi_cmds()
2735 total_cmds = shost->can_queue; in iscsi_host_get_max_scsi_cmds()
2737 …printk(KERN_INFO "iscsi: requested max cmds %u is higher than driver limit. Using driver limit %u\… in iscsi_host_get_max_scsi_cmds()
2738 requested_cmds_max, shost->can_queue); in iscsi_host_get_max_scsi_cmds()
2747 * iscsi_host_add - add host to system
2756 if (!shost->can_queue) in iscsi_host_add()
2757 shost->can_queue = ISCSI_DEF_XMIT_CMDS_MAX; in iscsi_host_add()
2759 if (!shost->cmd_per_lun) in iscsi_host_add()
2760 shost->cmd_per_lun = ISCSI_DEF_CMD_PER_LUN; in iscsi_host_add()
2767 * iscsi_host_alloc - allocate a host and driver data
2787 snprintf(ihost->workq_name, sizeof(ihost->workq_name), in iscsi_host_alloc()
2788 "iscsi_q_%d", shost->host_no); in iscsi_host_alloc()
2789 ihost->workq = alloc_workqueue("%s", in iscsi_host_alloc()
2791 1, ihost->workq_name); in iscsi_host_alloc()
2792 if (!ihost->workq) in iscsi_host_alloc()
2796 spin_lock_init(&ihost->lock); in iscsi_host_alloc()
2797 ihost->state = ISCSI_HOST_SETUP; in iscsi_host_alloc()
2798 ihost->num_sessions = 0; in iscsi_host_alloc()
2799 init_waitqueue_head(&ihost->session_removal_wq); in iscsi_host_alloc()
2810 iscsi_session_failure(cls_session->dd_data, ISCSI_ERR_INVALID_HOST); in iscsi_notify_host_removed()
2814 * iscsi_host_remove - remove host and sessions
2825 spin_lock_irqsave(&ihost->lock, flags); in iscsi_host_remove()
2826 ihost->state = ISCSI_HOST_REMOVED; in iscsi_host_remove()
2827 spin_unlock_irqrestore(&ihost->lock, flags); in iscsi_host_remove()
2830 wait_event_interruptible(ihost->session_removal_wq, in iscsi_host_remove()
2831 ihost->num_sessions == 0); in iscsi_host_remove()
2843 if (ihost->workq) in iscsi_host_free()
2844 destroy_workqueue(ihost->workq); in iscsi_host_free()
2846 kfree(ihost->netdev); in iscsi_host_free()
2847 kfree(ihost->hwaddress); in iscsi_host_free()
2848 kfree(ihost->initiatorname); in iscsi_host_free()
2866 spin_lock_irqsave(&ihost->lock, flags); in iscsi_host_dec_session_cnt()
2867 ihost->num_sessions--; in iscsi_host_dec_session_cnt()
2868 if (ihost->num_sessions == 0) in iscsi_host_dec_session_cnt()
2869 wake_up(&ihost->session_removal_wq); in iscsi_host_dec_session_cnt()
2870 spin_unlock_irqrestore(&ihost->lock, flags); in iscsi_host_dec_session_cnt()
2875 * iscsi_session_setup - create iscsi cls session and host and session
2902 spin_lock_irqsave(&ihost->lock, flags); in iscsi_session_setup()
2903 if (ihost->state == ISCSI_HOST_REMOVED) { in iscsi_session_setup()
2904 spin_unlock_irqrestore(&ihost->lock, flags); in iscsi_session_setup()
2907 ihost->num_sessions++; in iscsi_session_setup()
2908 spin_unlock_irqrestore(&ihost->lock, flags); in iscsi_session_setup()
2919 session = cls_session->dd_data; in iscsi_session_setup()
2920 session->cls_session = cls_session; in iscsi_session_setup()
2921 session->host = shost; in iscsi_session_setup()
2922 session->state = ISCSI_STATE_FREE; in iscsi_session_setup()
2923 session->fast_abort = 1; in iscsi_session_setup()
2924 session->tgt_reset_timeout = 30; in iscsi_session_setup()
2925 session->lu_reset_timeout = 15; in iscsi_session_setup()
2926 session->abort_timeout = 10; in iscsi_session_setup()
2927 session->scsi_cmds_max = scsi_cmds; in iscsi_session_setup()
2928 session->cmds_max = scsi_cmds + ISCSI_MGMT_CMDS_MAX; in iscsi_session_setup()
2929 session->queued_cmdsn = session->cmdsn = initial_cmdsn; in iscsi_session_setup()
2930 session->exp_cmdsn = initial_cmdsn + 1; in iscsi_session_setup()
2931 session->max_cmdsn = initial_cmdsn + 1; in iscsi_session_setup()
2932 session->max_r2t = 1; in iscsi_session_setup()
2933 session->tt = iscsit; in iscsi_session_setup()
2934 session->dd_data = cls_session->dd_data + sizeof(*session); in iscsi_session_setup()
2936 session->tmf_state = TMF_INITIAL; in iscsi_session_setup()
2937 timer_setup(&session->tmf_timer, iscsi_tmf_timedout, 0); in iscsi_session_setup()
2938 mutex_init(&session->eh_mutex); in iscsi_session_setup()
2940 spin_lock_init(&session->frwd_lock); in iscsi_session_setup()
2941 spin_lock_init(&session->back_lock); in iscsi_session_setup()
2944 if (iscsi_pool_init(&session->cmdpool, session->cmds_max, in iscsi_session_setup()
2945 (void***)&session->cmds, in iscsi_session_setup()
2949 /* pre-format cmds pool with ITT */ in iscsi_session_setup()
2950 for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++) { in iscsi_session_setup()
2951 struct iscsi_task *task = session->cmds[cmd_i]; in iscsi_session_setup()
2954 task->dd_data = &task[1]; in iscsi_session_setup()
2955 task->itt = cmd_i; in iscsi_session_setup()
2956 task->state = ISCSI_TASK_FREE; in iscsi_session_setup()
2957 INIT_LIST_HEAD(&task->running); in iscsi_session_setup()
2960 if (!try_module_get(iscsit->owner)) in iscsi_session_setup()
2969 module_put(iscsit->owner); in iscsi_session_setup()
2971 iscsi_pool_free(&session->cmdpool); in iscsi_session_setup()
2981 * iscsi_session_teardown - destroy session, host, and cls_session
2986 struct iscsi_session *session = cls_session->dd_data; in iscsi_session_teardown()
2987 struct module *owner = cls_session->transport->owner; in iscsi_session_teardown()
2988 struct Scsi_Host *shost = session->host; in iscsi_session_teardown()
2990 iscsi_pool_free(&session->cmdpool); in iscsi_session_teardown()
2994 kfree(session->password); in iscsi_session_teardown()
2995 kfree(session->password_in); in iscsi_session_teardown()
2996 kfree(session->username); in iscsi_session_teardown()
2997 kfree(session->username_in); in iscsi_session_teardown()
2998 kfree(session->targetname); in iscsi_session_teardown()
2999 kfree(session->targetalias); in iscsi_session_teardown()
3000 kfree(session->initiatorname); in iscsi_session_teardown()
3001 kfree(session->boot_root); in iscsi_session_teardown()
3002 kfree(session->boot_nic); in iscsi_session_teardown()
3003 kfree(session->boot_target); in iscsi_session_teardown()
3004 kfree(session->ifacename); in iscsi_session_teardown()
3005 kfree(session->portal_type); in iscsi_session_teardown()
3006 kfree(session->discovery_parent_type); in iscsi_session_teardown()
3016 * iscsi_conn_setup - create iscsi_cls_conn and iscsi_conn
3025 struct iscsi_session *session = cls_session->dd_data; in iscsi_conn_setup()
3034 conn = cls_conn->dd_data; in iscsi_conn_setup()
3037 conn->dd_data = cls_conn->dd_data + sizeof(*conn); in iscsi_conn_setup()
3038 conn->session = session; in iscsi_conn_setup()
3039 conn->cls_conn = cls_conn; in iscsi_conn_setup()
3040 conn->c_stage = ISCSI_CONN_INITIAL_STAGE; in iscsi_conn_setup()
3041 conn->id = conn_idx; in iscsi_conn_setup()
3042 conn->exp_statsn = 0; in iscsi_conn_setup()
3044 timer_setup(&conn->transport_timer, iscsi_check_transport_timeouts, 0); in iscsi_conn_setup()
3046 INIT_LIST_HEAD(&conn->mgmtqueue); in iscsi_conn_setup()
3047 INIT_LIST_HEAD(&conn->cmdqueue); in iscsi_conn_setup()
3048 INIT_LIST_HEAD(&conn->requeue); in iscsi_conn_setup()
3049 INIT_WORK(&conn->xmitwork, iscsi_xmitworker); in iscsi_conn_setup()
3052 spin_lock_bh(&session->frwd_lock); in iscsi_conn_setup()
3053 if (!kfifo_out(&session->cmdpool.queue, in iscsi_conn_setup()
3054 (void*)&conn->login_task, in iscsi_conn_setup()
3056 spin_unlock_bh(&session->frwd_lock); in iscsi_conn_setup()
3059 spin_unlock_bh(&session->frwd_lock); in iscsi_conn_setup()
3065 conn->login_task->data = conn->data = data; in iscsi_conn_setup()
3067 init_waitqueue_head(&session->ehwait); in iscsi_conn_setup()
3072 kfifo_in(&session->cmdpool.queue, (void*)&conn->login_task, in iscsi_conn_setup()
3081 * iscsi_conn_teardown - teardown iscsi connection
3085 * like scsi-mls remove + put host
3089 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_conn_teardown()
3090 struct iscsi_session *session = conn->session; in iscsi_conn_teardown()
3091 char *tmp_persistent_address = conn->persistent_address; in iscsi_conn_teardown()
3092 char *tmp_local_ipaddr = conn->local_ipaddr; in iscsi_conn_teardown()
3094 del_timer_sync(&conn->transport_timer); in iscsi_conn_teardown()
3096 mutex_lock(&session->eh_mutex); in iscsi_conn_teardown()
3097 spin_lock_bh(&session->frwd_lock); in iscsi_conn_teardown()
3098 conn->c_stage = ISCSI_CONN_CLEANUP_WAIT; in iscsi_conn_teardown()
3099 if (session->leadconn == conn) { in iscsi_conn_teardown()
3103 session->state = ISCSI_STATE_TERMINATE; in iscsi_conn_teardown()
3104 wake_up(&session->ehwait); in iscsi_conn_teardown()
3106 spin_unlock_bh(&session->frwd_lock); in iscsi_conn_teardown()
3111 spin_lock_bh(&session->frwd_lock); in iscsi_conn_teardown()
3112 free_pages((unsigned long) conn->data, in iscsi_conn_teardown()
3115 spin_lock_bh(&session->back_lock); in iscsi_conn_teardown()
3116 kfifo_in(&session->cmdpool.queue, (void*)&conn->login_task, in iscsi_conn_teardown()
3118 spin_unlock_bh(&session->back_lock); in iscsi_conn_teardown()
3119 if (session->leadconn == conn) in iscsi_conn_teardown()
3120 session->leadconn = NULL; in iscsi_conn_teardown()
3121 spin_unlock_bh(&session->frwd_lock); in iscsi_conn_teardown()
3122 mutex_unlock(&session->eh_mutex); in iscsi_conn_teardown()
3132 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_conn_start()
3133 struct iscsi_session *session = conn->session; in iscsi_conn_start()
3138 return -EPERM; in iscsi_conn_start()
3141 if ((session->imm_data_en || !session->initial_r2t_en) && in iscsi_conn_start()
3142 session->first_burst > session->max_burst) { in iscsi_conn_start()
3145 session->first_burst, session->max_burst); in iscsi_conn_start()
3146 return -EINVAL; in iscsi_conn_start()
3149 if (conn->ping_timeout && !conn->recv_timeout) { in iscsi_conn_start()
3152 conn->recv_timeout = 5; in iscsi_conn_start()
3155 if (conn->recv_timeout && !conn->ping_timeout) { in iscsi_conn_start()
3158 conn->ping_timeout = 5; in iscsi_conn_start()
3161 spin_lock_bh(&session->frwd_lock); in iscsi_conn_start()
3162 conn->c_stage = ISCSI_CONN_STARTED; in iscsi_conn_start()
3163 session->state = ISCSI_STATE_LOGGED_IN; in iscsi_conn_start()
3164 session->queued_cmdsn = session->cmdsn; in iscsi_conn_start()
3166 conn->last_recv = jiffies; in iscsi_conn_start()
3167 conn->last_ping = jiffies; in iscsi_conn_start()
3168 if (conn->recv_timeout && conn->ping_timeout) in iscsi_conn_start()
3169 mod_timer(&conn->transport_timer, in iscsi_conn_start()
3170 jiffies + (conn->recv_timeout * HZ)); in iscsi_conn_start()
3172 switch(conn->stop_stage) { in iscsi_conn_start()
3175 * unblock eh_abort() if it is blocked. re-try all in iscsi_conn_start()
3178 conn->stop_stage = 0; in iscsi_conn_start()
3179 session->tmf_state = TMF_INITIAL; in iscsi_conn_start()
3180 session->age++; in iscsi_conn_start()
3181 if (session->age == 16) in iscsi_conn_start()
3182 session->age = 0; in iscsi_conn_start()
3185 conn->stop_stage = 0; in iscsi_conn_start()
3190 spin_unlock_bh(&session->frwd_lock); in iscsi_conn_start()
3192 iscsi_unblock_session(session->cls_session); in iscsi_conn_start()
3193 wake_up(&session->ehwait); in iscsi_conn_start()
3204 for (i = 0; i < conn->session->cmds_max; i++) { in fail_mgmt_tasks()
3205 task = conn->session->cmds[i]; in fail_mgmt_tasks()
3206 if (task->sc) in fail_mgmt_tasks()
3209 if (task->state == ISCSI_TASK_FREE) in fail_mgmt_tasks()
3212 ISCSI_DBG_SESSION(conn->session, in fail_mgmt_tasks()
3214 task->itt, task->state); in fail_mgmt_tasks()
3216 spin_lock_bh(&session->back_lock); in fail_mgmt_tasks()
3218 spin_unlock_bh(&session->back_lock); in fail_mgmt_tasks()
3223 if (task->state == ISCSI_TASK_PENDING) in fail_mgmt_tasks()
3226 spin_unlock_bh(&session->back_lock); in fail_mgmt_tasks()
3232 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_conn_stop()
3233 struct iscsi_session *session = conn->session; in iscsi_conn_stop()
3236 mutex_lock(&session->eh_mutex); in iscsi_conn_stop()
3237 spin_lock_bh(&session->frwd_lock); in iscsi_conn_stop()
3238 if (conn->stop_stage == STOP_CONN_TERM) { in iscsi_conn_stop()
3239 spin_unlock_bh(&session->frwd_lock); in iscsi_conn_stop()
3240 mutex_unlock(&session->eh_mutex); in iscsi_conn_stop()
3250 session->state = ISCSI_STATE_TERMINATE; in iscsi_conn_stop()
3251 else if (conn->stop_stage != STOP_CONN_RECOVER) in iscsi_conn_stop()
3252 session->state = ISCSI_STATE_IN_RECOVERY; in iscsi_conn_stop()
3254 old_stop_stage = conn->stop_stage; in iscsi_conn_stop()
3255 conn->stop_stage = flag; in iscsi_conn_stop()
3256 spin_unlock_bh(&session->frwd_lock); in iscsi_conn_stop()
3258 del_timer_sync(&conn->transport_timer); in iscsi_conn_stop()
3261 spin_lock_bh(&session->frwd_lock); in iscsi_conn_stop()
3262 conn->c_stage = ISCSI_CONN_STOPPED; in iscsi_conn_stop()
3263 spin_unlock_bh(&session->frwd_lock); in iscsi_conn_stop()
3267 * header digest. conn->hdr_size used for optimization in iscsi_conn_stop()
3268 * in hdr_extract() and will be re-negotiated at in iscsi_conn_stop()
3272 conn->hdrdgst_en = 0; in iscsi_conn_stop()
3273 conn->datadgst_en = 0; in iscsi_conn_stop()
3274 if (session->state == ISCSI_STATE_IN_RECOVERY && in iscsi_conn_stop()
3277 iscsi_block_session(session->cls_session); in iscsi_conn_stop()
3284 spin_lock_bh(&session->frwd_lock); in iscsi_conn_stop()
3285 fail_scsi_tasks(conn, -1, DID_TRANSPORT_DISRUPTED); in iscsi_conn_stop()
3287 memset(&session->tmhdr, 0, sizeof(session->tmhdr)); in iscsi_conn_stop()
3288 spin_unlock_bh(&session->frwd_lock); in iscsi_conn_stop()
3289 mutex_unlock(&session->eh_mutex); in iscsi_conn_stop()
3296 struct iscsi_session *session = cls_session->dd_data; in iscsi_conn_bind()
3297 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_conn_bind()
3299 spin_lock_bh(&session->frwd_lock); in iscsi_conn_bind()
3301 session->leadconn = conn; in iscsi_conn_bind()
3302 spin_unlock_bh(&session->frwd_lock); in iscsi_conn_bind()
3306 * we have to reset max/exp cmdsn so we can see the new values. in iscsi_conn_bind()
3308 spin_lock_bh(&session->back_lock); in iscsi_conn_bind()
3309 session->max_cmdsn = session->exp_cmdsn = session->cmdsn + 1; in iscsi_conn_bind()
3310 spin_unlock_bh(&session->back_lock); in iscsi_conn_bind()
3314 clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx); in iscsi_conn_bind()
3315 clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); in iscsi_conn_bind()
3331 return -ENOMEM; in iscsi_switch_str_param()
3342 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_set_param()
3343 struct iscsi_session *session = conn->session; in iscsi_set_param()
3348 sscanf(buf, "%d", &session->fast_abort); in iscsi_set_param()
3351 sscanf(buf, "%d", &session->abort_timeout); in iscsi_set_param()
3354 sscanf(buf, "%d", &session->lu_reset_timeout); in iscsi_set_param()
3357 sscanf(buf, "%d", &session->tgt_reset_timeout); in iscsi_set_param()
3360 sscanf(buf, "%d", &conn->ping_timeout); in iscsi_set_param()
3363 sscanf(buf, "%d", &conn->recv_timeout); in iscsi_set_param()
3366 sscanf(buf, "%d", &conn->max_recv_dlength); in iscsi_set_param()
3369 sscanf(buf, "%d", &conn->max_xmit_dlength); in iscsi_set_param()
3372 sscanf(buf, "%d", &conn->hdrdgst_en); in iscsi_set_param()
3375 sscanf(buf, "%d", &conn->datadgst_en); in iscsi_set_param()
3378 sscanf(buf, "%d", &session->initial_r2t_en); in iscsi_set_param()
3381 sscanf(buf, "%hu", &session->max_r2t); in iscsi_set_param()
3384 sscanf(buf, "%d", &session->imm_data_en); in iscsi_set_param()
3387 sscanf(buf, "%d", &session->first_burst); in iscsi_set_param()
3390 sscanf(buf, "%d", &session->max_burst); in iscsi_set_param()
3393 sscanf(buf, "%d", &session->pdu_inorder_en); in iscsi_set_param()
3396 sscanf(buf, "%d", &session->dataseq_inorder_en); in iscsi_set_param()
3399 sscanf(buf, "%d", &session->erl); in iscsi_set_param()
3402 sscanf(buf, "%u", &conn->exp_statsn); in iscsi_set_param()
3405 return iscsi_switch_str_param(&session->username, buf); in iscsi_set_param()
3407 return iscsi_switch_str_param(&session->username_in, buf); in iscsi_set_param()
3409 return iscsi_switch_str_param(&session->password, buf); in iscsi_set_param()
3411 return iscsi_switch_str_param(&session->password_in, buf); in iscsi_set_param()
3413 return iscsi_switch_str_param(&session->targetname, buf); in iscsi_set_param()
3415 return iscsi_switch_str_param(&session->targetalias, buf); in iscsi_set_param()
3417 sscanf(buf, "%d", &session->tpgt); in iscsi_set_param()
3420 sscanf(buf, "%d", &conn->persistent_port); in iscsi_set_param()
3423 return iscsi_switch_str_param(&conn->persistent_address, buf); in iscsi_set_param()
3425 return iscsi_switch_str_param(&session->ifacename, buf); in iscsi_set_param()
3427 return iscsi_switch_str_param(&session->initiatorname, buf); in iscsi_set_param()
3429 return iscsi_switch_str_param(&session->boot_root, buf); in iscsi_set_param()
3431 return iscsi_switch_str_param(&session->boot_nic, buf); in iscsi_set_param()
3433 return iscsi_switch_str_param(&session->boot_target, buf); in iscsi_set_param()
3435 return iscsi_switch_str_param(&session->portal_type, buf); in iscsi_set_param()
3437 return iscsi_switch_str_param(&session->discovery_parent_type, in iscsi_set_param()
3441 session->discovery_sess = !!val; in iscsi_set_param()
3444 return iscsi_switch_str_param(&conn->local_ipaddr, buf); in iscsi_set_param()
3446 return -ENOSYS; in iscsi_set_param()
3456 struct iscsi_session *session = cls_session->dd_data; in iscsi_session_get_param()
3461 len = sysfs_emit(buf, "%d\n", session->fast_abort); in iscsi_session_get_param()
3464 len = sysfs_emit(buf, "%d\n", session->abort_timeout); in iscsi_session_get_param()
3467 len = sysfs_emit(buf, "%d\n", session->lu_reset_timeout); in iscsi_session_get_param()
3470 len = sysfs_emit(buf, "%d\n", session->tgt_reset_timeout); in iscsi_session_get_param()
3473 len = sysfs_emit(buf, "%d\n", session->initial_r2t_en); in iscsi_session_get_param()
3476 len = sysfs_emit(buf, "%hu\n", session->max_r2t); in iscsi_session_get_param()
3479 len = sysfs_emit(buf, "%d\n", session->imm_data_en); in iscsi_session_get_param()
3482 len = sysfs_emit(buf, "%u\n", session->first_burst); in iscsi_session_get_param()
3485 len = sysfs_emit(buf, "%u\n", session->max_burst); in iscsi_session_get_param()
3488 len = sysfs_emit(buf, "%d\n", session->pdu_inorder_en); in iscsi_session_get_param()
3491 len = sysfs_emit(buf, "%d\n", session->dataseq_inorder_en); in iscsi_session_get_param()
3494 len = sysfs_emit(buf, "%d\n", session->def_taskmgmt_tmo); in iscsi_session_get_param()
3497 len = sysfs_emit(buf, "%d\n", session->erl); in iscsi_session_get_param()
3500 len = sysfs_emit(buf, "%s\n", session->targetname); in iscsi_session_get_param()
3503 len = sysfs_emit(buf, "%s\n", session->targetalias); in iscsi_session_get_param()
3506 len = sysfs_emit(buf, "%d\n", session->tpgt); in iscsi_session_get_param()
3509 len = sysfs_emit(buf, "%s\n", session->username); in iscsi_session_get_param()
3512 len = sysfs_emit(buf, "%s\n", session->username_in); in iscsi_session_get_param()
3515 len = sysfs_emit(buf, "%s\n", session->password); in iscsi_session_get_param()
3518 len = sysfs_emit(buf, "%s\n", session->password_in); in iscsi_session_get_param()
3521 len = sysfs_emit(buf, "%s\n", session->ifacename); in iscsi_session_get_param()
3524 len = sysfs_emit(buf, "%s\n", session->initiatorname); in iscsi_session_get_param()
3527 len = sysfs_emit(buf, "%s\n", session->boot_root); in iscsi_session_get_param()
3530 len = sysfs_emit(buf, "%s\n", session->boot_nic); in iscsi_session_get_param()
3533 len = sysfs_emit(buf, "%s\n", session->boot_target); in iscsi_session_get_param()
3536 len = sysfs_emit(buf, "%u\n", session->auto_snd_tgt_disable); in iscsi_session_get_param()
3539 len = sysfs_emit(buf, "%u\n", session->discovery_sess); in iscsi_session_get_param()
3542 len = sysfs_emit(buf, "%s\n", session->portal_type); in iscsi_session_get_param()
3545 len = sysfs_emit(buf, "%u\n", session->chap_auth_en); in iscsi_session_get_param()
3548 len = sysfs_emit(buf, "%u\n", session->discovery_logout_en); in iscsi_session_get_param()
3551 len = sysfs_emit(buf, "%u\n", session->bidi_chap_en); in iscsi_session_get_param()
3554 len = sysfs_emit(buf, "%u\n", session->discovery_auth_optional); in iscsi_session_get_param()
3557 len = sysfs_emit(buf, "%d\n", session->time2wait); in iscsi_session_get_param()
3560 len = sysfs_emit(buf, "%d\n", session->time2retain); in iscsi_session_get_param()
3563 len = sysfs_emit(buf, "%u\n", session->tsid); in iscsi_session_get_param()
3567 session->isid[0], session->isid[1], in iscsi_session_get_param()
3568 session->isid[2], session->isid[3], in iscsi_session_get_param()
3569 session->isid[4], session->isid[5]); in iscsi_session_get_param()
3572 len = sysfs_emit(buf, "%u\n", session->discovery_parent_idx); in iscsi_session_get_param()
3575 if (session->discovery_parent_type) in iscsi_session_get_param()
3577 session->discovery_parent_type); in iscsi_session_get_param()
3582 return -ENOSYS; in iscsi_session_get_param()
3596 switch (addr->ss_family) { in iscsi_conn_get_addr_param()
3604 return -EINVAL; in iscsi_conn_get_addr_param()
3611 len = sysfs_emit(buf, "%pI4\n", &sin->sin_addr.s_addr); in iscsi_conn_get_addr_param()
3613 len = sysfs_emit(buf, "%pI6\n", &sin6->sin6_addr); in iscsi_conn_get_addr_param()
3618 len = sysfs_emit(buf, "%hu\n", be16_to_cpu(sin->sin_port)); in iscsi_conn_get_addr_param()
3621 be16_to_cpu(sin6->sin6_port)); in iscsi_conn_get_addr_param()
3624 return -EINVAL; in iscsi_conn_get_addr_param()
3634 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_conn_get_param()
3639 len = sysfs_emit(buf, "%u\n", conn->ping_timeout); in iscsi_conn_get_param()
3642 len = sysfs_emit(buf, "%u\n", conn->recv_timeout); in iscsi_conn_get_param()
3645 len = sysfs_emit(buf, "%u\n", conn->max_recv_dlength); in iscsi_conn_get_param()
3648 len = sysfs_emit(buf, "%u\n", conn->max_xmit_dlength); in iscsi_conn_get_param()
3651 len = sysfs_emit(buf, "%d\n", conn->hdrdgst_en); in iscsi_conn_get_param()
3654 len = sysfs_emit(buf, "%d\n", conn->datadgst_en); in iscsi_conn_get_param()
3657 len = sysfs_emit(buf, "%d\n", conn->ifmarker_en); in iscsi_conn_get_param()
3660 len = sysfs_emit(buf, "%d\n", conn->ofmarker_en); in iscsi_conn_get_param()
3663 len = sysfs_emit(buf, "%u\n", conn->exp_statsn); in iscsi_conn_get_param()
3666 len = sysfs_emit(buf, "%d\n", conn->persistent_port); in iscsi_conn_get_param()
3669 len = sysfs_emit(buf, "%s\n", conn->persistent_address); in iscsi_conn_get_param()
3672 len = sysfs_emit(buf, "%u\n", conn->statsn); in iscsi_conn_get_param()
3675 len = sysfs_emit(buf, "%u\n", conn->max_segment_size); in iscsi_conn_get_param()
3678 len = sysfs_emit(buf, "%u\n", conn->keepalive_tmo); in iscsi_conn_get_param()
3681 len = sysfs_emit(buf, "%u\n", conn->local_port); in iscsi_conn_get_param()
3684 len = sysfs_emit(buf, "%u\n", conn->tcp_timestamp_stat); in iscsi_conn_get_param()
3687 len = sysfs_emit(buf, "%u\n", conn->tcp_nagle_disable); in iscsi_conn_get_param()
3690 len = sysfs_emit(buf, "%u\n", conn->tcp_wsf_disable); in iscsi_conn_get_param()
3693 len = sysfs_emit(buf, "%u\n", conn->tcp_timer_scale); in iscsi_conn_get_param()
3696 len = sysfs_emit(buf, "%u\n", conn->tcp_timestamp_en); in iscsi_conn_get_param()
3699 len = sysfs_emit(buf, "%u\n", conn->fragment_disable); in iscsi_conn_get_param()
3702 len = sysfs_emit(buf, "%u\n", conn->ipv4_tos); in iscsi_conn_get_param()
3705 len = sysfs_emit(buf, "%u\n", conn->ipv6_traffic_class); in iscsi_conn_get_param()
3708 len = sysfs_emit(buf, "%u\n", conn->ipv6_flow_label); in iscsi_conn_get_param()
3711 len = sysfs_emit(buf, "%u\n", conn->is_fw_assigned_ipv6); in iscsi_conn_get_param()
3714 len = sysfs_emit(buf, "%u\n", conn->tcp_xmit_wsf); in iscsi_conn_get_param()
3717 len = sysfs_emit(buf, "%u\n", conn->tcp_recv_wsf); in iscsi_conn_get_param()
3720 len = sysfs_emit(buf, "%s\n", conn->local_ipaddr); in iscsi_conn_get_param()
3723 return -ENOSYS; in iscsi_conn_get_param()
3738 len = sysfs_emit(buf, "%s\n", ihost->netdev); in iscsi_host_get_param()
3741 len = sysfs_emit(buf, "%s\n", ihost->hwaddress); in iscsi_host_get_param()
3744 len = sysfs_emit(buf, "%s\n", ihost->initiatorname); in iscsi_host_get_param()
3747 return -ENOSYS; in iscsi_host_get_param()
3761 return iscsi_switch_str_param(&ihost->netdev, buf); in iscsi_host_set_param()
3763 return iscsi_switch_str_param(&ihost->hwaddress, buf); in iscsi_host_set_param()
3765 return iscsi_switch_str_param(&ihost->initiatorname, buf); in iscsi_host_set_param()
3767 return -ENOSYS; in iscsi_host_set_param()