Lines Matching refs:conn

88 inline void iscsi_conn_queue_work(struct iscsi_conn *conn)  in iscsi_conn_queue_work()  argument
90 struct Scsi_Host *shost = conn->session->host; in iscsi_conn_queue_work()
94 queue_work(ihost->workq, &conn->xmitwork); in iscsi_conn_queue_work()
139 struct iscsi_conn *conn = task->conn; in iscsi_prep_data_out_pdu() local
153 if (left > conn->max_xmit_dlength) { in iscsi_prep_data_out_pdu()
154 hton24(hdr->dlength, conn->max_xmit_dlength); in iscsi_prep_data_out_pdu()
155 r2t->data_count = conn->max_xmit_dlength; in iscsi_prep_data_out_pdu()
162 conn->dataout_pdus_cnt++; in iscsi_prep_data_out_pdu()
212 ISCSI_DBG_SESSION(task->conn->session, in iscsi_prep_ecdb_ahs()
238 ISCSI_DBG_SESSION(task->conn->session, in iscsi_prep_bidi_ahs()
261 struct iscsi_conn *conn = task->conn; in iscsi_check_tmf_restrictions() local
262 struct iscsi_tm *tmf = &conn->tmhdr; in iscsi_check_tmf_restrictions()
265 if (conn->tmf_state == TMF_INITIAL) in iscsi_check_tmf_restrictions()
285 iscsi_conn_printk(KERN_INFO, conn, in iscsi_check_tmf_restrictions()
297 if (conn->session->fast_abort) { in iscsi_check_tmf_restrictions()
298 iscsi_conn_printk(KERN_INFO, conn, in iscsi_check_tmf_restrictions()
315 ISCSI_DBG_SESSION(conn->session, in iscsi_check_tmf_restrictions()
337 struct iscsi_conn *conn = task->conn; in iscsi_prep_scsi_cmd_pdu() local
338 struct iscsi_session *session = conn->session; in iscsi_prep_scsi_cmd_pdu()
349 if (conn->session->tt->alloc_pdu) { in iscsi_prep_scsi_cmd_pdu()
350 rc = conn->session->tt->alloc_pdu(task, ISCSI_OP_SCSI_CMD); in iscsi_prep_scsi_cmd_pdu()
362 task->conn->session->age); in iscsi_prep_scsi_cmd_pdu()
371 hdr->exp_statsn = cpu_to_be32(conn->exp_statsn); in iscsi_prep_scsi_cmd_pdu()
419 conn->max_xmit_dlength); in iscsi_prep_scsi_cmd_pdu()
422 conn->max_xmit_dlength); in iscsi_prep_scsi_cmd_pdu()
433 r2t->exp_statsn = cpu_to_be32(conn->exp_statsn); in iscsi_prep_scsi_cmd_pdu()
463 conn->scsicmd_pdus_cnt++; in iscsi_prep_scsi_cmd_pdu()
468 "write" : "read", conn->id, sc, sc->cmnd[0], in iscsi_prep_scsi_cmd_pdu()
486 struct iscsi_conn *conn = task->conn; in iscsi_free_task() local
487 struct iscsi_session *session = conn->session; in iscsi_free_task()
500 if (conn->login_task == task) in iscsi_free_task()
532 struct iscsi_session *session = task->conn->session; in iscsi_put_task()
550 struct iscsi_conn *conn = task->conn; in iscsi_complete_task() local
552 ISCSI_DBG_SESSION(conn->session, in iscsi_complete_task()
566 if (conn->task == task) in iscsi_complete_task()
567 conn->task = NULL; in iscsi_complete_task()
569 if (conn->ping_task == task) in iscsi_complete_task()
570 conn->ping_task = NULL; in iscsi_complete_task()
590 struct iscsi_conn *conn = task->conn; in iscsi_complete_scsi_task() local
592 ISCSI_DBG_SESSION(conn->session, "[itt 0x%x]\n", task->itt); in iscsi_complete_scsi_task()
594 conn->last_recv = jiffies; in iscsi_complete_scsi_task()
595 __iscsi_update_cmdsn(conn->session, exp_cmdsn, max_cmdsn); in iscsi_complete_scsi_task()
608 struct iscsi_conn *conn = task->conn; in fail_scsi_task() local
626 conn->session->queued_cmdsn--; in fail_scsi_task()
643 spin_lock_bh(&conn->session->back_lock); in fail_scsi_task()
645 spin_unlock_bh(&conn->session->back_lock); in fail_scsi_task()
648 static int iscsi_prep_mgmt_task(struct iscsi_conn *conn, in iscsi_prep_mgmt_task() argument
651 struct iscsi_session *session = conn->session; in iscsi_prep_mgmt_task()
656 if (conn->session->state == ISCSI_STATE_LOGGING_OUT) in iscsi_prep_mgmt_task()
660 nop->exp_statsn = cpu_to_be32(conn->exp_statsn); in iscsi_prep_mgmt_task()
674 if (conn->c_stage == ISCSI_CONN_STARTED && in iscsi_prep_mgmt_task()
695 __iscsi_conn_send_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr, in __iscsi_conn_send_pdu() argument
698 struct iscsi_session *session = conn->session; in __iscsi_conn_send_pdu()
714 if (conn->login_task->state != ISCSI_TASK_FREE) { in __iscsi_conn_send_pdu()
715 iscsi_conn_printk(KERN_ERR, conn, "Login/Text in " in __iscsi_conn_send_pdu()
721 …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()
725 task = conn->login_task; in __iscsi_conn_send_pdu()
731 …iscsi_conn_printk(KERN_ERR, conn, "Can not send data buffer of len %u for op 0x%x\n", data_size, o… in __iscsi_conn_send_pdu()
735 BUG_ON(conn->c_stage == ISCSI_CONN_INITIAL_STAGE); in __iscsi_conn_send_pdu()
736 BUG_ON(conn->c_stage == ISCSI_CONN_STOPPED); in __iscsi_conn_send_pdu()
748 task->conn = conn; in __iscsi_conn_send_pdu()
759 if (conn->session->tt->alloc_pdu) { in __iscsi_conn_send_pdu()
760 if (conn->session->tt->alloc_pdu(task, hdr->opcode)) { in __iscsi_conn_send_pdu()
761 iscsi_conn_printk(KERN_ERR, conn, "Could not allocate " in __iscsi_conn_send_pdu()
776 task->conn->session->age); in __iscsi_conn_send_pdu()
780 if (iscsi_prep_mgmt_task(conn, task)) in __iscsi_conn_send_pdu()
786 list_add_tail(&task->running, &conn->mgmtqueue); in __iscsi_conn_send_pdu()
787 iscsi_conn_queue_work(conn); in __iscsi_conn_send_pdu()
803 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_conn_send_pdu() local
804 struct iscsi_session *session = conn->session; in iscsi_conn_send_pdu()
808 if (!__iscsi_conn_send_pdu(conn, hdr, data, data_size)) in iscsi_conn_send_pdu()
826 static void iscsi_scsi_cmd_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr, in iscsi_scsi_cmd_rsp() argument
831 struct iscsi_session *session = conn->session; in iscsi_scsi_cmd_rsp()
835 conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1; in iscsi_scsi_cmd_rsp()
876 iscsi_conn_printk(KERN_ERR, conn, in iscsi_scsi_cmd_rsp()
921 conn->scsirsp_pdus_cnt++; in iscsi_scsi_cmd_rsp()
932 iscsi_data_in_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr, in iscsi_data_in_rsp() argument
941 iscsi_update_cmdsn(conn->session, (struct iscsi_nopin *)hdr); in iscsi_data_in_rsp()
943 conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1; in iscsi_data_in_rsp()
956 ISCSI_DBG_SESSION(conn->session, "data in with status done " in iscsi_data_in_rsp()
959 conn->scsirsp_pdus_cnt++; in iscsi_data_in_rsp()
963 static void iscsi_tmf_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr) in iscsi_tmf_rsp() argument
967 conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; in iscsi_tmf_rsp()
968 conn->tmfrsp_pdus_cnt++; in iscsi_tmf_rsp()
970 if (conn->tmf_state != TMF_QUEUED) in iscsi_tmf_rsp()
974 conn->tmf_state = TMF_SUCCESS; in iscsi_tmf_rsp()
976 conn->tmf_state = TMF_NOT_FOUND; in iscsi_tmf_rsp()
978 conn->tmf_state = TMF_FAILED; in iscsi_tmf_rsp()
979 wake_up(&conn->ehwait); in iscsi_tmf_rsp()
982 static void iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr) in iscsi_send_nopout() argument
987 if (!rhdr && conn->ping_task) in iscsi_send_nopout()
1001 task = __iscsi_conn_send_pdu(conn, (struct iscsi_hdr *)&hdr, NULL, 0); in iscsi_send_nopout()
1003 iscsi_conn_printk(KERN_ERR, conn, "Could not send nopout\n"); in iscsi_send_nopout()
1006 conn->ping_task = task; in iscsi_send_nopout()
1007 conn->last_ping = jiffies; in iscsi_send_nopout()
1014 struct iscsi_conn *conn = task->conn; in iscsi_nop_out_rsp() local
1017 if (conn->ping_task != task) { in iscsi_nop_out_rsp()
1022 if (iscsi_recv_pdu(conn->cls_conn, (struct iscsi_hdr *)nop, in iscsi_nop_out_rsp()
1026 mod_timer(&conn->transport_timer, jiffies + conn->recv_timeout); in iscsi_nop_out_rsp()
1031 static int iscsi_handle_reject(struct iscsi_conn *conn, struct iscsi_hdr *hdr, in iscsi_handle_reject() argument
1038 conn->exp_statsn = be32_to_cpu(reject->statsn) + 1; in iscsi_handle_reject()
1042 iscsi_conn_printk(KERN_ERR, conn, "Cannot handle rejected " in iscsi_handle_reject()
1053 iscsi_conn_printk(KERN_ERR, conn, in iscsi_handle_reject()
1059 iscsi_conn_printk(KERN_ERR, conn, in iscsi_handle_reject()
1080 spin_unlock(&conn->session->back_lock); in iscsi_handle_reject()
1081 spin_lock(&conn->session->frwd_lock); in iscsi_handle_reject()
1082 iscsi_send_nopout(conn, in iscsi_handle_reject()
1084 spin_unlock(&conn->session->frwd_lock); in iscsi_handle_reject()
1085 spin_lock(&conn->session->back_lock); in iscsi_handle_reject()
1092 task = iscsi_itt_to_task(conn, rejected_pdu.itt); in iscsi_handle_reject()
1094 iscsi_conn_printk(KERN_ERR, conn, in iscsi_handle_reject()
1105 iscsi_conn_printk(KERN_ERR, conn, in iscsi_handle_reject()
1124 struct iscsi_task *iscsi_itt_to_task(struct iscsi_conn *conn, itt_t itt) in iscsi_itt_to_task() argument
1126 struct iscsi_session *session = conn->session; in iscsi_itt_to_task()
1133 session->tt->parse_pdu_itt(conn, itt, &i, NULL); in iscsi_itt_to_task()
1154 int __iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr, in __iscsi_complete_pdu() argument
1157 struct iscsi_session *session = conn->session; in __iscsi_complete_pdu()
1162 conn->last_recv = jiffies; in __iscsi_complete_pdu()
1163 rc = iscsi_verify_itt(conn, hdr->itt); in __iscsi_complete_pdu()
1173 opcode, conn->id, itt, datalen); in __iscsi_complete_pdu()
1191 iscsi_send_nopout(conn, (struct iscsi_nopin*)hdr); in __iscsi_complete_pdu()
1196 rc = iscsi_handle_reject(conn, hdr, data, datalen); in __iscsi_complete_pdu()
1199 conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; in __iscsi_complete_pdu()
1200 if (iscsi_recv_pdu(conn->cls_conn, hdr, data, datalen)) in __iscsi_complete_pdu()
1213 task = iscsi_itt_to_ctask(conn, hdr->itt); in __iscsi_complete_pdu()
1228 task = iscsi_itt_to_task(conn, hdr->itt); in __iscsi_complete_pdu()
1238 iscsi_scsi_cmd_rsp(conn, hdr, task, data, datalen); in __iscsi_complete_pdu()
1241 iscsi_data_in_rsp(conn, hdr, task); in __iscsi_complete_pdu()
1249 conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; in __iscsi_complete_pdu()
1266 iscsi_tmf_rsp(conn, hdr); in __iscsi_complete_pdu()
1275 conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; in __iscsi_complete_pdu()
1288 if (iscsi_recv_pdu(conn->cls_conn, hdr, data, datalen)) in __iscsi_complete_pdu()
1295 int iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr, in iscsi_complete_pdu() argument
1300 spin_lock(&conn->session->back_lock); in iscsi_complete_pdu()
1301 rc = __iscsi_complete_pdu(conn, hdr, data, datalen); in iscsi_complete_pdu()
1302 spin_unlock(&conn->session->back_lock); in iscsi_complete_pdu()
1307 int iscsi_verify_itt(struct iscsi_conn *conn, itt_t itt) in iscsi_verify_itt() argument
1309 struct iscsi_session *session = conn->session; in iscsi_verify_itt()
1316 session->tt->parse_pdu_itt(conn, itt, &i, &age); in iscsi_verify_itt()
1323 iscsi_conn_printk(KERN_ERR, conn, in iscsi_verify_itt()
1330 iscsi_conn_printk(KERN_ERR, conn, in iscsi_verify_itt()
1348 struct iscsi_task *iscsi_itt_to_ctask(struct iscsi_conn *conn, itt_t itt) in iscsi_itt_to_ctask() argument
1352 if (iscsi_verify_itt(conn, itt)) in iscsi_itt_to_ctask()
1355 task = iscsi_itt_to_task(conn, itt); in iscsi_itt_to_ctask()
1359 if (task->sc->SCp.phase != conn->session->age) { in iscsi_itt_to_ctask()
1360 iscsi_session_printk(KERN_ERR, conn->session, in iscsi_itt_to_ctask()
1362 task->sc->SCp.phase, conn->session->age); in iscsi_itt_to_ctask()
1373 struct iscsi_conn *conn; in iscsi_session_failure() local
1377 conn = session->leadconn; in iscsi_session_failure()
1378 if (session->state == ISCSI_STATE_TERMINATE || !conn) { in iscsi_session_failure()
1383 dev = get_device(&conn->cls_conn->dev); in iscsi_session_failure()
1393 iscsi_conn_error_event(conn->cls_conn, err); in iscsi_session_failure()
1395 iscsi_conn_failure(conn, err); in iscsi_session_failure()
1400 void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err) in iscsi_conn_failure() argument
1402 struct iscsi_session *session = conn->session; in iscsi_conn_failure()
1410 if (conn->stop_stage == 0) in iscsi_conn_failure()
1414 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); in iscsi_conn_failure()
1415 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx); in iscsi_conn_failure()
1416 iscsi_conn_error_event(conn->cls_conn, err); in iscsi_conn_failure()
1420 static int iscsi_check_cmdsn_window_closed(struct iscsi_conn *conn) in iscsi_check_cmdsn_window_closed() argument
1422 struct iscsi_session *session = conn->session; in iscsi_check_cmdsn_window_closed()
1437 static int iscsi_xmit_task(struct iscsi_conn *conn) in iscsi_xmit_task() argument
1439 struct iscsi_task *task = conn->task; in iscsi_xmit_task()
1442 if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) in iscsi_xmit_task()
1446 spin_unlock_bh(&conn->session->frwd_lock); in iscsi_xmit_task()
1447 rc = conn->session->tt->xmit_task(task); in iscsi_xmit_task()
1448 spin_lock_bh(&conn->session->frwd_lock); in iscsi_xmit_task()
1452 conn->task = NULL; in iscsi_xmit_task()
1455 spin_lock(&conn->session->back_lock); in iscsi_xmit_task()
1457 spin_unlock(&conn->session->back_lock); in iscsi_xmit_task()
1471 struct iscsi_conn *conn = task->conn; in iscsi_requeue_task() local
1478 list_add_tail(&task->running, &conn->requeue); in iscsi_requeue_task()
1479 iscsi_conn_queue_work(conn); in iscsi_requeue_task()
1492 static int iscsi_data_xmit(struct iscsi_conn *conn) in iscsi_data_xmit() argument
1497 spin_lock_bh(&conn->session->frwd_lock); in iscsi_data_xmit()
1498 if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) { in iscsi_data_xmit()
1499 ISCSI_DBG_SESSION(conn->session, "Tx suspended!\n"); in iscsi_data_xmit()
1500 spin_unlock_bh(&conn->session->frwd_lock); in iscsi_data_xmit()
1504 if (conn->task) { in iscsi_data_xmit()
1505 rc = iscsi_xmit_task(conn); in iscsi_data_xmit()
1516 while (!list_empty(&conn->mgmtqueue)) { in iscsi_data_xmit()
1517 conn->task = list_entry(conn->mgmtqueue.next, in iscsi_data_xmit()
1519 list_del_init(&conn->task->running); in iscsi_data_xmit()
1520 if (iscsi_prep_mgmt_task(conn, conn->task)) { in iscsi_data_xmit()
1522 spin_lock_bh(&conn->session->back_lock); in iscsi_data_xmit()
1523 __iscsi_put_task(conn->task); in iscsi_data_xmit()
1524 spin_unlock_bh(&conn->session->back_lock); in iscsi_data_xmit()
1525 conn->task = NULL; in iscsi_data_xmit()
1528 rc = iscsi_xmit_task(conn); in iscsi_data_xmit()
1534 while (!list_empty(&conn->cmdqueue)) { in iscsi_data_xmit()
1535 conn->task = list_entry(conn->cmdqueue.next, struct iscsi_task, in iscsi_data_xmit()
1537 list_del_init(&conn->task->running); in iscsi_data_xmit()
1538 if (conn->session->state == ISCSI_STATE_LOGGING_OUT) { in iscsi_data_xmit()
1539 fail_scsi_task(conn->task, DID_IMM_RETRY); in iscsi_data_xmit()
1542 rc = iscsi_prep_scsi_cmd_pdu(conn->task); in iscsi_data_xmit()
1545 list_add_tail(&conn->task->running, in iscsi_data_xmit()
1546 &conn->cmdqueue); in iscsi_data_xmit()
1547 conn->task = NULL; in iscsi_data_xmit()
1550 fail_scsi_task(conn->task, DID_ABORT); in iscsi_data_xmit()
1553 rc = iscsi_xmit_task(conn); in iscsi_data_xmit()
1561 if (!list_empty(&conn->mgmtqueue)) in iscsi_data_xmit()
1565 while (!list_empty(&conn->requeue)) { in iscsi_data_xmit()
1569 if (conn->session->state == ISCSI_STATE_LOGGING_OUT) in iscsi_data_xmit()
1572 task = list_entry(conn->requeue.next, struct iscsi_task, in iscsi_data_xmit()
1577 conn->task = task; in iscsi_data_xmit()
1578 list_del_init(&conn->task->running); in iscsi_data_xmit()
1579 conn->task->state = ISCSI_TASK_RUNNING; in iscsi_data_xmit()
1580 rc = iscsi_xmit_task(conn); in iscsi_data_xmit()
1583 if (!list_empty(&conn->mgmtqueue)) in iscsi_data_xmit()
1586 spin_unlock_bh(&conn->session->frwd_lock); in iscsi_data_xmit()
1590 spin_unlock_bh(&conn->session->frwd_lock); in iscsi_data_xmit()
1596 struct iscsi_conn *conn = in iscsi_xmitworker() local
1603 rc = iscsi_data_xmit(conn); in iscsi_xmitworker()
1607 static inline struct iscsi_task *iscsi_alloc_task(struct iscsi_conn *conn, in iscsi_alloc_task() argument
1612 if (!kfifo_out(&conn->session->cmdpool.queue, in iscsi_alloc_task()
1616 sc->SCp.phase = conn->session->age; in iscsi_alloc_task()
1621 task->conn = conn; in iscsi_alloc_task()
1650 struct iscsi_conn *conn; in iscsi_queuecommand() local
1700 conn = session->leadconn; in iscsi_queuecommand()
1701 if (!conn) { in iscsi_queuecommand()
1707 if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) { in iscsi_queuecommand()
1713 if (iscsi_check_cmdsn_window_closed(conn)) { in iscsi_queuecommand()
1718 task = iscsi_alloc_task(conn, sc); in iscsi_queuecommand()
1741 list_add_tail(&task->running, &conn->cmdqueue); in iscsi_queuecommand()
1742 iscsi_conn_queue_work(conn); in iscsi_queuecommand()
1786 struct iscsi_conn *conn = (struct iscsi_conn *)data; in iscsi_tmf_timedout() local
1787 struct iscsi_session *session = conn->session; in iscsi_tmf_timedout()
1790 if (conn->tmf_state == TMF_QUEUED) { in iscsi_tmf_timedout()
1791 conn->tmf_state = TMF_TIMEDOUT; in iscsi_tmf_timedout()
1794 wake_up(&conn->ehwait); in iscsi_tmf_timedout()
1799 static int iscsi_exec_task_mgmt_fn(struct iscsi_conn *conn, in iscsi_exec_task_mgmt_fn() argument
1803 struct iscsi_session *session = conn->session; in iscsi_exec_task_mgmt_fn()
1806 task = __iscsi_conn_send_pdu(conn, (struct iscsi_hdr *)hdr, in iscsi_exec_task_mgmt_fn()
1810 iscsi_conn_printk(KERN_ERR, conn, "Could not send TMF.\n"); in iscsi_exec_task_mgmt_fn()
1811 iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); in iscsi_exec_task_mgmt_fn()
1815 conn->tmfcmd_pdus_cnt++; in iscsi_exec_task_mgmt_fn()
1816 conn->tmf_timer.expires = timeout * HZ + jiffies; in iscsi_exec_task_mgmt_fn()
1817 conn->tmf_timer.function = iscsi_tmf_timedout; in iscsi_exec_task_mgmt_fn()
1818 conn->tmf_timer.data = (unsigned long)conn; in iscsi_exec_task_mgmt_fn()
1819 add_timer(&conn->tmf_timer); in iscsi_exec_task_mgmt_fn()
1833 wait_event_interruptible(conn->ehwait, age != session->age || in iscsi_exec_task_mgmt_fn()
1835 conn->tmf_state != TMF_QUEUED); in iscsi_exec_task_mgmt_fn()
1838 del_timer_sync(&conn->tmf_timer); in iscsi_exec_task_mgmt_fn()
1853 static void fail_scsi_tasks(struct iscsi_conn *conn, u64 lun, int error) in fail_scsi_tasks() argument
1858 for (i = 0; i < conn->session->cmds_max; i++) { in fail_scsi_tasks()
1859 task = conn->session->cmds[i]; in fail_scsi_tasks()
1866 ISCSI_DBG_SESSION(conn->session, in fail_scsi_tasks()
1884 void iscsi_suspend_queue(struct iscsi_conn *conn) in iscsi_suspend_queue() argument
1886 spin_lock_bh(&conn->session->frwd_lock); in iscsi_suspend_queue()
1887 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); in iscsi_suspend_queue()
1888 spin_unlock_bh(&conn->session->frwd_lock); in iscsi_suspend_queue()
1900 void iscsi_suspend_tx(struct iscsi_conn *conn) in iscsi_suspend_tx() argument
1902 struct Scsi_Host *shost = conn->session->host; in iscsi_suspend_tx()
1905 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); in iscsi_suspend_tx()
1911 static void iscsi_start_tx(struct iscsi_conn *conn) in iscsi_start_tx() argument
1913 clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); in iscsi_start_tx()
1914 iscsi_conn_queue_work(conn); in iscsi_start_tx()
1923 static int iscsi_has_ping_timed_out(struct iscsi_conn *conn) in iscsi_has_ping_timed_out() argument
1925 if (conn->ping_task && in iscsi_has_ping_timed_out()
1926 time_before_eq(conn->last_recv + (conn->recv_timeout * HZ) + in iscsi_has_ping_timed_out()
1927 (conn->ping_timeout * HZ), jiffies)) in iscsi_has_ping_timed_out()
1939 struct iscsi_conn *conn; in iscsi_eh_cmd_timed_out() local
1967 conn = session->leadconn; in iscsi_eh_cmd_timed_out()
1968 if (!conn) { in iscsi_eh_cmd_timed_out()
1991 if (!conn->recv_timeout && !conn->ping_timeout) in iscsi_eh_cmd_timed_out()
1997 if (iscsi_has_ping_timed_out(conn)) { in iscsi_eh_cmd_timed_out()
2002 for (i = 0; i < conn->session->cmds_max; i++) { in iscsi_eh_cmd_timed_out()
2003 running_task = conn->session->cmds[i]; in iscsi_eh_cmd_timed_out()
2047 if (conn->ping_task) { in iscsi_eh_cmd_timed_out()
2054 iscsi_send_nopout(conn, NULL); in iscsi_eh_cmd_timed_out()
2069 struct iscsi_conn *conn = (struct iscsi_conn *)data; in iscsi_check_transport_timeouts() local
2070 struct iscsi_session *session = conn->session; in iscsi_check_transport_timeouts()
2077 recv_timeout = conn->recv_timeout; in iscsi_check_transport_timeouts()
2082 last_recv = conn->last_recv; in iscsi_check_transport_timeouts()
2084 if (iscsi_has_ping_timed_out(conn)) { in iscsi_check_transport_timeouts()
2085 iscsi_conn_printk(KERN_ERR, conn, "ping timeout of %d secs " in iscsi_check_transport_timeouts()
2088 conn->ping_timeout, conn->recv_timeout, in iscsi_check_transport_timeouts()
2089 last_recv, conn->last_ping, jiffies); in iscsi_check_transport_timeouts()
2091 iscsi_conn_failure(conn, ISCSI_ERR_NOP_TIMEDOUT); in iscsi_check_transport_timeouts()
2097 ISCSI_DBG_CONN(conn, "Sending nopout as ping\n"); in iscsi_check_transport_timeouts()
2098 iscsi_send_nopout(conn, NULL); in iscsi_check_transport_timeouts()
2099 next_timeout = conn->last_ping + (conn->ping_timeout * HZ); in iscsi_check_transport_timeouts()
2103 ISCSI_DBG_CONN(conn, "Setting next tmo %lu\n", next_timeout); in iscsi_check_transport_timeouts()
2104 mod_timer(&conn->transport_timer, next_timeout); in iscsi_check_transport_timeouts()
2125 struct iscsi_conn *conn; in iscsi_eh_abort() local
2162 conn = session->leadconn; in iscsi_eh_abort()
2163 conn->eh_abort_cnt++; in iscsi_eh_abort()
2182 if (conn->tmf_state != TMF_INITIAL) in iscsi_eh_abort()
2184 conn->tmf_state = TMF_QUEUED; in iscsi_eh_abort()
2186 hdr = &conn->tmhdr; in iscsi_eh_abort()
2189 if (iscsi_exec_task_mgmt_fn(conn, hdr, age, session->abort_timeout)) { in iscsi_eh_abort()
2194 switch (conn->tmf_state) { in iscsi_eh_abort()
2201 iscsi_suspend_tx(conn); in iscsi_eh_abort()
2209 conn->tmf_state = TMF_INITIAL; in iscsi_eh_abort()
2212 iscsi_start_tx(conn); in iscsi_eh_abort()
2216 iscsi_conn_failure(conn, ISCSI_ERR_SCSI_EH_SESSION_RST); in iscsi_eh_abort()
2220 conn->tmf_state = TMF_INITIAL; in iscsi_eh_abort()
2229 conn->tmf_state = TMF_INITIAL; in iscsi_eh_abort()
2265 struct iscsi_conn *conn; in iscsi_eh_device_reset() local
2283 conn = session->leadconn; in iscsi_eh_device_reset()
2286 if (conn->tmf_state != TMF_INITIAL) in iscsi_eh_device_reset()
2288 conn->tmf_state = TMF_QUEUED; in iscsi_eh_device_reset()
2290 hdr = &conn->tmhdr; in iscsi_eh_device_reset()
2293 if (iscsi_exec_task_mgmt_fn(conn, hdr, session->age, in iscsi_eh_device_reset()
2299 switch (conn->tmf_state) { in iscsi_eh_device_reset()
2304 iscsi_conn_failure(conn, ISCSI_ERR_SCSI_EH_SESSION_RST); in iscsi_eh_device_reset()
2307 conn->tmf_state = TMF_INITIAL; in iscsi_eh_device_reset()
2314 iscsi_suspend_tx(conn); in iscsi_eh_device_reset()
2318 fail_scsi_tasks(conn, sc->device->lun, DID_ERROR); in iscsi_eh_device_reset()
2319 conn->tmf_state = TMF_INITIAL; in iscsi_eh_device_reset()
2322 iscsi_start_tx(conn); in iscsi_eh_device_reset()
2360 struct iscsi_conn *conn; in iscsi_eh_session_reset() local
2364 conn = session->leadconn; in iscsi_eh_session_reset()
2373 conn->persistent_address, session->age); in iscsi_eh_session_reset()
2385 iscsi_conn_failure(conn, ISCSI_ERR_SCSI_EH_SESSION_RST); in iscsi_eh_session_reset()
2388 wait_event_interruptible(conn->ehwait, in iscsi_eh_session_reset()
2400 session->targetname, conn->persistent_address); in iscsi_eh_session_reset()
2428 struct iscsi_conn *conn; in iscsi_eh_target_reset() local
2446 conn = session->leadconn; in iscsi_eh_target_reset()
2449 if (conn->tmf_state != TMF_INITIAL) in iscsi_eh_target_reset()
2451 conn->tmf_state = TMF_QUEUED; in iscsi_eh_target_reset()
2453 hdr = &conn->tmhdr; in iscsi_eh_target_reset()
2456 if (iscsi_exec_task_mgmt_fn(conn, hdr, session->age, in iscsi_eh_target_reset()
2462 switch (conn->tmf_state) { in iscsi_eh_target_reset()
2467 iscsi_conn_failure(conn, ISCSI_ERR_SCSI_EH_SESSION_RST); in iscsi_eh_target_reset()
2470 conn->tmf_state = TMF_INITIAL; in iscsi_eh_target_reset()
2477 iscsi_suspend_tx(conn); in iscsi_eh_target_reset()
2481 fail_scsi_tasks(conn, -1, DID_ERROR); in iscsi_eh_target_reset()
2482 conn->tmf_state = TMF_INITIAL; in iscsi_eh_target_reset()
2485 iscsi_start_tx(conn); in iscsi_eh_target_reset()
2875 struct iscsi_conn *conn; in iscsi_conn_setup() local
2879 cls_conn = iscsi_create_conn(cls_session, sizeof(*conn) + dd_size, in iscsi_conn_setup()
2883 conn = cls_conn->dd_data; in iscsi_conn_setup()
2884 memset(conn, 0, sizeof(*conn) + dd_size); in iscsi_conn_setup()
2886 conn->dd_data = cls_conn->dd_data + sizeof(*conn); in iscsi_conn_setup()
2887 conn->session = session; in iscsi_conn_setup()
2888 conn->cls_conn = cls_conn; in iscsi_conn_setup()
2889 conn->c_stage = ISCSI_CONN_INITIAL_STAGE; in iscsi_conn_setup()
2890 conn->id = conn_idx; in iscsi_conn_setup()
2891 conn->exp_statsn = 0; in iscsi_conn_setup()
2892 conn->tmf_state = TMF_INITIAL; in iscsi_conn_setup()
2894 init_timer(&conn->transport_timer); in iscsi_conn_setup()
2895 conn->transport_timer.data = (unsigned long)conn; in iscsi_conn_setup()
2896 conn->transport_timer.function = iscsi_check_transport_timeouts; in iscsi_conn_setup()
2898 INIT_LIST_HEAD(&conn->mgmtqueue); in iscsi_conn_setup()
2899 INIT_LIST_HEAD(&conn->cmdqueue); in iscsi_conn_setup()
2900 INIT_LIST_HEAD(&conn->requeue); in iscsi_conn_setup()
2901 INIT_WORK(&conn->xmitwork, iscsi_xmitworker); in iscsi_conn_setup()
2906 (void*)&conn->login_task, in iscsi_conn_setup()
2917 conn->login_task->data = conn->data = data; in iscsi_conn_setup()
2919 init_timer(&conn->tmf_timer); in iscsi_conn_setup()
2920 init_waitqueue_head(&conn->ehwait); in iscsi_conn_setup()
2925 kfifo_in(&session->cmdpool.queue, (void*)&conn->login_task, in iscsi_conn_setup()
2942 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_conn_teardown() local
2943 struct iscsi_session *session = conn->session; in iscsi_conn_teardown()
2945 del_timer_sync(&conn->transport_timer); in iscsi_conn_teardown()
2949 conn->c_stage = ISCSI_CONN_CLEANUP_WAIT; in iscsi_conn_teardown()
2950 if (session->leadconn == conn) { in iscsi_conn_teardown()
2955 wake_up(&conn->ehwait); in iscsi_conn_teardown()
2960 iscsi_suspend_tx(conn); in iscsi_conn_teardown()
2963 free_pages((unsigned long) conn->data, in iscsi_conn_teardown()
2965 kfree(conn->persistent_address); in iscsi_conn_teardown()
2966 kfree(conn->local_ipaddr); in iscsi_conn_teardown()
2969 kfifo_in(&session->cmdpool.queue, (void*)&conn->login_task, in iscsi_conn_teardown()
2972 if (session->leadconn == conn) in iscsi_conn_teardown()
2983 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_conn_start() local
2984 struct iscsi_session *session = conn->session; in iscsi_conn_start()
2987 iscsi_conn_printk(KERN_ERR, conn, in iscsi_conn_start()
2994 iscsi_conn_printk(KERN_INFO, conn, "invalid burst lengths: " in iscsi_conn_start()
3000 if (conn->ping_timeout && !conn->recv_timeout) { in iscsi_conn_start()
3001 iscsi_conn_printk(KERN_ERR, conn, "invalid recv timeout of " in iscsi_conn_start()
3003 conn->recv_timeout = 5; in iscsi_conn_start()
3006 if (conn->recv_timeout && !conn->ping_timeout) { in iscsi_conn_start()
3007 iscsi_conn_printk(KERN_ERR, conn, "invalid ping timeout of " in iscsi_conn_start()
3009 conn->ping_timeout = 5; in iscsi_conn_start()
3013 conn->c_stage = ISCSI_CONN_STARTED; in iscsi_conn_start()
3017 conn->last_recv = jiffies; in iscsi_conn_start()
3018 conn->last_ping = jiffies; in iscsi_conn_start()
3019 if (conn->recv_timeout && conn->ping_timeout) in iscsi_conn_start()
3020 mod_timer(&conn->transport_timer, in iscsi_conn_start()
3021 jiffies + (conn->recv_timeout * HZ)); in iscsi_conn_start()
3023 switch(conn->stop_stage) { in iscsi_conn_start()
3029 conn->stop_stage = 0; in iscsi_conn_start()
3030 conn->tmf_state = TMF_INITIAL; in iscsi_conn_start()
3036 conn->stop_stage = 0; in iscsi_conn_start()
3044 wake_up(&conn->ehwait); in iscsi_conn_start()
3050 fail_mgmt_tasks(struct iscsi_session *session, struct iscsi_conn *conn) in fail_mgmt_tasks() argument
3055 for (i = 0; i < conn->session->cmds_max; i++) { in fail_mgmt_tasks()
3056 task = conn->session->cmds[i]; in fail_mgmt_tasks()
3063 ISCSI_DBG_SESSION(conn->session, in fail_mgmt_tasks()
3075 struct iscsi_conn *conn, int flag) in iscsi_start_session_recovery() argument
3081 if (conn->stop_stage == STOP_CONN_TERM) { in iscsi_start_session_recovery()
3094 else if (conn->stop_stage != STOP_CONN_RECOVER) in iscsi_start_session_recovery()
3097 old_stop_stage = conn->stop_stage; in iscsi_start_session_recovery()
3098 conn->stop_stage = flag; in iscsi_start_session_recovery()
3101 del_timer_sync(&conn->transport_timer); in iscsi_start_session_recovery()
3102 iscsi_suspend_tx(conn); in iscsi_start_session_recovery()
3105 conn->c_stage = ISCSI_CONN_STOPPED; in iscsi_start_session_recovery()
3115 conn->hdrdgst_en = 0; in iscsi_start_session_recovery()
3116 conn->datadgst_en = 0; in iscsi_start_session_recovery()
3128 fail_scsi_tasks(conn, -1, DID_TRANSPORT_DISRUPTED); in iscsi_start_session_recovery()
3129 fail_mgmt_tasks(session, conn); in iscsi_start_session_recovery()
3130 memset(&conn->tmhdr, 0, sizeof(conn->tmhdr)); in iscsi_start_session_recovery()
3137 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_conn_stop() local
3138 struct iscsi_session *session = conn->session; in iscsi_conn_stop()
3143 iscsi_start_session_recovery(session, conn, flag); in iscsi_conn_stop()
3146 iscsi_conn_printk(KERN_ERR, conn, in iscsi_conn_stop()
3156 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_conn_bind() local
3160 session->leadconn = conn; in iscsi_conn_bind()
3166 clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx); in iscsi_conn_bind()
3167 clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); in iscsi_conn_bind()
3194 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_set_param() local
3195 struct iscsi_session *session = conn->session; in iscsi_set_param()
3212 sscanf(buf, "%d", &conn->ping_timeout); in iscsi_set_param()
3215 sscanf(buf, "%d", &conn->recv_timeout); in iscsi_set_param()
3218 sscanf(buf, "%d", &conn->max_recv_dlength); in iscsi_set_param()
3221 sscanf(buf, "%d", &conn->max_xmit_dlength); in iscsi_set_param()
3224 sscanf(buf, "%d", &conn->hdrdgst_en); in iscsi_set_param()
3227 sscanf(buf, "%d", &conn->datadgst_en); in iscsi_set_param()
3254 sscanf(buf, "%u", &conn->exp_statsn); in iscsi_set_param()
3272 sscanf(buf, "%d", &conn->persistent_port); in iscsi_set_param()
3275 return iscsi_switch_str_param(&conn->persistent_address, buf); in iscsi_set_param()
3296 return iscsi_switch_str_param(&conn->local_ipaddr, buf); in iscsi_set_param()
3486 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_conn_get_param() local
3491 len = sprintf(buf, "%u\n", conn->ping_timeout); in iscsi_conn_get_param()
3494 len = sprintf(buf, "%u\n", conn->recv_timeout); in iscsi_conn_get_param()
3497 len = sprintf(buf, "%u\n", conn->max_recv_dlength); in iscsi_conn_get_param()
3500 len = sprintf(buf, "%u\n", conn->max_xmit_dlength); in iscsi_conn_get_param()
3503 len = sprintf(buf, "%d\n", conn->hdrdgst_en); in iscsi_conn_get_param()
3506 len = sprintf(buf, "%d\n", conn->datadgst_en); in iscsi_conn_get_param()
3509 len = sprintf(buf, "%d\n", conn->ifmarker_en); in iscsi_conn_get_param()
3512 len = sprintf(buf, "%d\n", conn->ofmarker_en); in iscsi_conn_get_param()
3515 len = sprintf(buf, "%u\n", conn->exp_statsn); in iscsi_conn_get_param()
3518 len = sprintf(buf, "%d\n", conn->persistent_port); in iscsi_conn_get_param()
3521 len = sprintf(buf, "%s\n", conn->persistent_address); in iscsi_conn_get_param()
3524 len = sprintf(buf, "%u\n", conn->statsn); in iscsi_conn_get_param()
3527 len = sprintf(buf, "%u\n", conn->max_segment_size); in iscsi_conn_get_param()
3530 len = sprintf(buf, "%u\n", conn->keepalive_tmo); in iscsi_conn_get_param()
3533 len = sprintf(buf, "%u\n", conn->local_port); in iscsi_conn_get_param()
3536 len = sprintf(buf, "%u\n", conn->tcp_timestamp_stat); in iscsi_conn_get_param()
3539 len = sprintf(buf, "%u\n", conn->tcp_nagle_disable); in iscsi_conn_get_param()
3542 len = sprintf(buf, "%u\n", conn->tcp_wsf_disable); in iscsi_conn_get_param()
3545 len = sprintf(buf, "%u\n", conn->tcp_timer_scale); in iscsi_conn_get_param()
3548 len = sprintf(buf, "%u\n", conn->tcp_timestamp_en); in iscsi_conn_get_param()
3551 len = sprintf(buf, "%u\n", conn->fragment_disable); in iscsi_conn_get_param()
3554 len = sprintf(buf, "%u\n", conn->ipv4_tos); in iscsi_conn_get_param()
3557 len = sprintf(buf, "%u\n", conn->ipv6_traffic_class); in iscsi_conn_get_param()
3560 len = sprintf(buf, "%u\n", conn->ipv6_flow_label); in iscsi_conn_get_param()
3563 len = sprintf(buf, "%u\n", conn->is_fw_assigned_ipv6); in iscsi_conn_get_param()
3566 len = sprintf(buf, "%u\n", conn->tcp_xmit_wsf); in iscsi_conn_get_param()
3569 len = sprintf(buf, "%u\n", conn->tcp_recv_wsf); in iscsi_conn_get_param()
3572 len = sprintf(buf, "%s\n", conn->local_ipaddr); in iscsi_conn_get_param()