Lines Matching refs:conn
86 inline void iscsi_conn_queue_work(struct iscsi_conn *conn) in iscsi_conn_queue_work() argument
88 struct Scsi_Host *shost = conn->session->host; in iscsi_conn_queue_work()
92 queue_work(ihost->workq, &conn->xmitwork); in iscsi_conn_queue_work()
137 struct iscsi_conn *conn = task->conn; in iscsi_prep_data_out_pdu() local
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()
160 conn->dataout_pdus_cnt++; in iscsi_prep_data_out_pdu()
210 ISCSI_DBG_SESSION(task->conn->session, in iscsi_prep_ecdb_ahs()
233 struct iscsi_conn *conn = task->conn; in iscsi_check_tmf_restrictions() local
234 struct iscsi_tm *tmf = &conn->tmhdr; in iscsi_check_tmf_restrictions()
237 if (conn->tmf_state == TMF_INITIAL) in iscsi_check_tmf_restrictions()
257 iscsi_conn_printk(KERN_INFO, conn, in iscsi_check_tmf_restrictions()
269 if (conn->session->fast_abort) { in iscsi_check_tmf_restrictions()
270 iscsi_conn_printk(KERN_INFO, conn, in iscsi_check_tmf_restrictions()
287 ISCSI_DBG_SESSION(conn->session, in iscsi_check_tmf_restrictions()
309 struct iscsi_conn *conn = task->conn; in iscsi_prep_scsi_cmd_pdu() local
310 struct iscsi_session *session = conn->session; in iscsi_prep_scsi_cmd_pdu()
321 if (conn->session->tt->alloc_pdu) { in iscsi_prep_scsi_cmd_pdu()
322 rc = conn->session->tt->alloc_pdu(task, ISCSI_OP_SCSI_CMD); in iscsi_prep_scsi_cmd_pdu()
334 task->conn->session->age); in iscsi_prep_scsi_cmd_pdu()
343 hdr->exp_statsn = cpu_to_be32(conn->exp_statsn); in iscsi_prep_scsi_cmd_pdu()
384 conn->max_xmit_dlength); in iscsi_prep_scsi_cmd_pdu()
387 conn->max_xmit_dlength); in iscsi_prep_scsi_cmd_pdu()
398 r2t->exp_statsn = cpu_to_be32(conn->exp_statsn); in iscsi_prep_scsi_cmd_pdu()
428 conn->scsicmd_pdus_cnt++; in iscsi_prep_scsi_cmd_pdu()
432 "write" : "read", conn->id, sc, sc->cmnd[0], in iscsi_prep_scsi_cmd_pdu()
449 struct iscsi_conn *conn = task->conn; in iscsi_free_task() local
450 struct iscsi_session *session = conn->session; in iscsi_free_task()
463 if (conn->login_task == task) in iscsi_free_task()
495 struct iscsi_session *session = task->conn->session; in iscsi_put_task()
513 struct iscsi_conn *conn = task->conn; in iscsi_complete_task() local
515 ISCSI_DBG_SESSION(conn->session, in iscsi_complete_task()
526 spin_lock_bh(&conn->taskqueuelock); in iscsi_complete_task()
531 spin_unlock_bh(&conn->taskqueuelock); in iscsi_complete_task()
533 if (conn->task == task) in iscsi_complete_task()
534 conn->task = NULL; in iscsi_complete_task()
536 if (READ_ONCE(conn->ping_task) == task) in iscsi_complete_task()
537 WRITE_ONCE(conn->ping_task, NULL); in iscsi_complete_task()
557 struct iscsi_conn *conn = task->conn; in iscsi_complete_scsi_task() local
559 ISCSI_DBG_SESSION(conn->session, "[itt 0x%x]\n", task->itt); in iscsi_complete_scsi_task()
561 conn->last_recv = jiffies; in iscsi_complete_scsi_task()
562 __iscsi_update_cmdsn(conn->session, exp_cmdsn, max_cmdsn); in iscsi_complete_scsi_task()
575 struct iscsi_conn *conn = task->conn; in fail_scsi_task() local
593 conn->session->queued_cmdsn--; in fail_scsi_task()
605 spin_lock_bh(&conn->session->back_lock); in fail_scsi_task()
607 spin_unlock_bh(&conn->session->back_lock); in fail_scsi_task()
610 static int iscsi_prep_mgmt_task(struct iscsi_conn *conn, in iscsi_prep_mgmt_task() argument
613 struct iscsi_session *session = conn->session; in iscsi_prep_mgmt_task()
618 if (conn->session->state == ISCSI_STATE_LOGGING_OUT) in iscsi_prep_mgmt_task()
622 nop->exp_statsn = cpu_to_be32(conn->exp_statsn); in iscsi_prep_mgmt_task()
636 if (conn->c_stage == ISCSI_CONN_STARTED && in iscsi_prep_mgmt_task()
657 __iscsi_conn_send_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr, in __iscsi_conn_send_pdu() argument
660 struct iscsi_session *session = conn->session; in __iscsi_conn_send_pdu()
676 if (conn->login_task->state != ISCSI_TASK_FREE) { in __iscsi_conn_send_pdu()
677 iscsi_conn_printk(KERN_ERR, conn, "Login/Text in " in __iscsi_conn_send_pdu()
683 …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()
687 task = conn->login_task; in __iscsi_conn_send_pdu()
693 …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()
697 BUG_ON(conn->c_stage == ISCSI_CONN_INITIAL_STAGE); in __iscsi_conn_send_pdu()
698 BUG_ON(conn->c_stage == ISCSI_CONN_STOPPED); in __iscsi_conn_send_pdu()
710 task->conn = conn; in __iscsi_conn_send_pdu()
721 if (conn->session->tt->alloc_pdu) { in __iscsi_conn_send_pdu()
722 if (conn->session->tt->alloc_pdu(task, hdr->opcode)) { in __iscsi_conn_send_pdu()
723 iscsi_conn_printk(KERN_ERR, conn, "Could not allocate " in __iscsi_conn_send_pdu()
738 task->conn->session->age); in __iscsi_conn_send_pdu()
741 if (unlikely(READ_ONCE(conn->ping_task) == INVALID_SCSI_TASK)) in __iscsi_conn_send_pdu()
742 WRITE_ONCE(conn->ping_task, task); in __iscsi_conn_send_pdu()
745 if (iscsi_prep_mgmt_task(conn, task)) in __iscsi_conn_send_pdu()
751 spin_lock_bh(&conn->taskqueuelock); in __iscsi_conn_send_pdu()
752 list_add_tail(&task->running, &conn->mgmtqueue); in __iscsi_conn_send_pdu()
753 spin_unlock_bh(&conn->taskqueuelock); in __iscsi_conn_send_pdu()
754 iscsi_conn_queue_work(conn); in __iscsi_conn_send_pdu()
770 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_conn_send_pdu() local
771 struct iscsi_session *session = conn->session; in iscsi_conn_send_pdu()
775 if (!__iscsi_conn_send_pdu(conn, hdr, data, data_size)) in iscsi_conn_send_pdu()
793 static void iscsi_scsi_cmd_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr, in iscsi_scsi_cmd_rsp() argument
798 struct iscsi_session *session = conn->session; in iscsi_scsi_cmd_rsp()
802 conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1; in iscsi_scsi_cmd_rsp()
840 iscsi_conn_printk(KERN_ERR, conn, in iscsi_scsi_cmd_rsp()
878 conn->scsirsp_pdus_cnt++; in iscsi_scsi_cmd_rsp()
892 iscsi_data_in_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr, in iscsi_data_in_rsp() argument
901 iscsi_update_cmdsn(conn->session, (struct iscsi_nopin *)hdr); in iscsi_data_in_rsp()
903 conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1; in iscsi_data_in_rsp()
916 ISCSI_DBG_SESSION(conn->session, "data in with status done " in iscsi_data_in_rsp()
919 conn->scsirsp_pdus_cnt++; in iscsi_data_in_rsp()
923 static void iscsi_tmf_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr) in iscsi_tmf_rsp() argument
927 conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; in iscsi_tmf_rsp()
928 conn->tmfrsp_pdus_cnt++; in iscsi_tmf_rsp()
930 if (conn->tmf_state != TMF_QUEUED) in iscsi_tmf_rsp()
934 conn->tmf_state = TMF_SUCCESS; in iscsi_tmf_rsp()
936 conn->tmf_state = TMF_NOT_FOUND; in iscsi_tmf_rsp()
938 conn->tmf_state = TMF_FAILED; in iscsi_tmf_rsp()
939 wake_up(&conn->ehwait); in iscsi_tmf_rsp()
942 static int iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr) in iscsi_send_nopout() argument
948 if (READ_ONCE(conn->ping_task)) in iscsi_send_nopout()
950 WRITE_ONCE(conn->ping_task, INVALID_SCSI_TASK); in iscsi_send_nopout()
964 task = __iscsi_conn_send_pdu(conn, (struct iscsi_hdr *)&hdr, NULL, 0); in iscsi_send_nopout()
967 WRITE_ONCE(conn->ping_task, NULL); in iscsi_send_nopout()
968 iscsi_conn_printk(KERN_ERR, conn, "Could not send nopout\n"); in iscsi_send_nopout()
972 conn->last_ping = jiffies; in iscsi_send_nopout()
991 struct iscsi_conn *conn = task->conn; in iscsi_nop_out_rsp() local
994 if (READ_ONCE(conn->ping_task) != task) { in iscsi_nop_out_rsp()
999 if (iscsi_recv_pdu(conn->cls_conn, (struct iscsi_hdr *)nop, in iscsi_nop_out_rsp()
1003 mod_timer(&conn->transport_timer, jiffies + conn->recv_timeout); in iscsi_nop_out_rsp()
1008 static int iscsi_handle_reject(struct iscsi_conn *conn, struct iscsi_hdr *hdr, in iscsi_handle_reject() argument
1015 conn->exp_statsn = be32_to_cpu(reject->statsn) + 1; in iscsi_handle_reject()
1019 iscsi_conn_printk(KERN_ERR, conn, "Cannot handle rejected " in iscsi_handle_reject()
1030 iscsi_conn_printk(KERN_ERR, conn, in iscsi_handle_reject()
1036 iscsi_conn_printk(KERN_ERR, conn, in iscsi_handle_reject()
1057 spin_unlock(&conn->session->back_lock); in iscsi_handle_reject()
1058 spin_lock(&conn->session->frwd_lock); in iscsi_handle_reject()
1059 iscsi_send_nopout(conn, in iscsi_handle_reject()
1061 spin_unlock(&conn->session->frwd_lock); in iscsi_handle_reject()
1062 spin_lock(&conn->session->back_lock); in iscsi_handle_reject()
1069 task = iscsi_itt_to_task(conn, rejected_pdu.itt); in iscsi_handle_reject()
1071 iscsi_conn_printk(KERN_ERR, conn, in iscsi_handle_reject()
1082 iscsi_conn_printk(KERN_ERR, conn, in iscsi_handle_reject()
1101 struct iscsi_task *iscsi_itt_to_task(struct iscsi_conn *conn, itt_t itt) in iscsi_itt_to_task() argument
1103 struct iscsi_session *session = conn->session; in iscsi_itt_to_task()
1110 session->tt->parse_pdu_itt(conn, itt, &i, NULL); in iscsi_itt_to_task()
1131 int __iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr, in __iscsi_complete_pdu() argument
1134 struct iscsi_session *session = conn->session; in __iscsi_complete_pdu()
1139 conn->last_recv = jiffies; in __iscsi_complete_pdu()
1140 rc = iscsi_verify_itt(conn, hdr->itt); in __iscsi_complete_pdu()
1150 opcode, conn->id, itt, datalen); in __iscsi_complete_pdu()
1168 iscsi_send_nopout(conn, (struct iscsi_nopin*)hdr); in __iscsi_complete_pdu()
1173 rc = iscsi_handle_reject(conn, hdr, data, datalen); in __iscsi_complete_pdu()
1176 conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; in __iscsi_complete_pdu()
1177 if (iscsi_recv_pdu(conn->cls_conn, hdr, data, datalen)) in __iscsi_complete_pdu()
1190 task = iscsi_itt_to_ctask(conn, hdr->itt); in __iscsi_complete_pdu()
1205 task = iscsi_itt_to_task(conn, hdr->itt); in __iscsi_complete_pdu()
1215 iscsi_scsi_cmd_rsp(conn, hdr, task, data, datalen); in __iscsi_complete_pdu()
1218 iscsi_data_in_rsp(conn, hdr, task); in __iscsi_complete_pdu()
1226 conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; in __iscsi_complete_pdu()
1243 iscsi_tmf_rsp(conn, hdr); in __iscsi_complete_pdu()
1252 conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; in __iscsi_complete_pdu()
1265 if (iscsi_recv_pdu(conn->cls_conn, hdr, data, datalen)) in __iscsi_complete_pdu()
1272 int iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr, in iscsi_complete_pdu() argument
1277 spin_lock(&conn->session->back_lock); in iscsi_complete_pdu()
1278 rc = __iscsi_complete_pdu(conn, hdr, data, datalen); in iscsi_complete_pdu()
1279 spin_unlock(&conn->session->back_lock); in iscsi_complete_pdu()
1284 int iscsi_verify_itt(struct iscsi_conn *conn, itt_t itt) in iscsi_verify_itt() argument
1286 struct iscsi_session *session = conn->session; in iscsi_verify_itt()
1293 session->tt->parse_pdu_itt(conn, itt, &i, &age); in iscsi_verify_itt()
1300 iscsi_conn_printk(KERN_ERR, conn, in iscsi_verify_itt()
1307 iscsi_conn_printk(KERN_ERR, conn, in iscsi_verify_itt()
1325 struct iscsi_task *iscsi_itt_to_ctask(struct iscsi_conn *conn, itt_t itt) in iscsi_itt_to_ctask() argument
1329 if (iscsi_verify_itt(conn, itt)) in iscsi_itt_to_ctask()
1332 task = iscsi_itt_to_task(conn, itt); in iscsi_itt_to_ctask()
1336 if (task->sc->SCp.phase != conn->session->age) { in iscsi_itt_to_ctask()
1337 iscsi_session_printk(KERN_ERR, conn->session, in iscsi_itt_to_ctask()
1339 task->sc->SCp.phase, conn->session->age); in iscsi_itt_to_ctask()
1350 struct iscsi_conn *conn; in iscsi_session_failure() local
1354 conn = session->leadconn; in iscsi_session_failure()
1355 if (session->state == ISCSI_STATE_TERMINATE || !conn) { in iscsi_session_failure()
1360 dev = get_device(&conn->cls_conn->dev); in iscsi_session_failure()
1370 iscsi_conn_error_event(conn->cls_conn, err); in iscsi_session_failure()
1372 iscsi_conn_failure(conn, err); in iscsi_session_failure()
1377 void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err) in iscsi_conn_failure() argument
1379 struct iscsi_session *session = conn->session; in iscsi_conn_failure()
1387 if (conn->stop_stage == 0) in iscsi_conn_failure()
1391 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); in iscsi_conn_failure()
1392 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx); in iscsi_conn_failure()
1393 iscsi_conn_error_event(conn->cls_conn, err); in iscsi_conn_failure()
1397 static int iscsi_check_cmdsn_window_closed(struct iscsi_conn *conn) in iscsi_check_cmdsn_window_closed() argument
1399 struct iscsi_session *session = conn->session; in iscsi_check_cmdsn_window_closed()
1414 static int iscsi_xmit_task(struct iscsi_conn *conn) in iscsi_xmit_task() argument
1416 struct iscsi_task *task = conn->task; in iscsi_xmit_task()
1419 if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) in iscsi_xmit_task()
1422 spin_lock_bh(&conn->session->back_lock); in iscsi_xmit_task()
1423 if (conn->task == NULL) { in iscsi_xmit_task()
1424 spin_unlock_bh(&conn->session->back_lock); in iscsi_xmit_task()
1428 spin_unlock_bh(&conn->session->back_lock); in iscsi_xmit_task()
1429 spin_unlock_bh(&conn->session->frwd_lock); in iscsi_xmit_task()
1430 rc = conn->session->tt->xmit_task(task); in iscsi_xmit_task()
1431 spin_lock_bh(&conn->session->frwd_lock); in iscsi_xmit_task()
1435 conn->task = NULL; in iscsi_xmit_task()
1438 spin_lock(&conn->session->back_lock); in iscsi_xmit_task()
1440 spin_unlock(&conn->session->back_lock); in iscsi_xmit_task()
1454 struct iscsi_conn *conn = task->conn; in iscsi_requeue_task() local
1460 spin_lock_bh(&conn->taskqueuelock); in iscsi_requeue_task()
1462 list_add_tail(&task->running, &conn->requeue); in iscsi_requeue_task()
1463 spin_unlock_bh(&conn->taskqueuelock); in iscsi_requeue_task()
1464 iscsi_conn_queue_work(conn); in iscsi_requeue_task()
1477 static int iscsi_data_xmit(struct iscsi_conn *conn) in iscsi_data_xmit() argument
1482 spin_lock_bh(&conn->session->frwd_lock); in iscsi_data_xmit()
1483 if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) { in iscsi_data_xmit()
1484 ISCSI_DBG_SESSION(conn->session, "Tx suspended!\n"); in iscsi_data_xmit()
1485 spin_unlock_bh(&conn->session->frwd_lock); in iscsi_data_xmit()
1489 if (conn->task) { in iscsi_data_xmit()
1490 rc = iscsi_xmit_task(conn); in iscsi_data_xmit()
1500 spin_lock_bh(&conn->taskqueuelock); in iscsi_data_xmit()
1502 while (!list_empty(&conn->mgmtqueue)) { in iscsi_data_xmit()
1503 conn->task = list_entry(conn->mgmtqueue.next, in iscsi_data_xmit()
1505 list_del_init(&conn->task->running); in iscsi_data_xmit()
1506 spin_unlock_bh(&conn->taskqueuelock); in iscsi_data_xmit()
1507 if (iscsi_prep_mgmt_task(conn, conn->task)) { in iscsi_data_xmit()
1509 spin_lock_bh(&conn->session->back_lock); in iscsi_data_xmit()
1510 __iscsi_put_task(conn->task); in iscsi_data_xmit()
1511 spin_unlock_bh(&conn->session->back_lock); in iscsi_data_xmit()
1512 conn->task = NULL; in iscsi_data_xmit()
1513 spin_lock_bh(&conn->taskqueuelock); in iscsi_data_xmit()
1516 rc = iscsi_xmit_task(conn); in iscsi_data_xmit()
1519 spin_lock_bh(&conn->taskqueuelock); in iscsi_data_xmit()
1523 while (!list_empty(&conn->cmdqueue)) { in iscsi_data_xmit()
1524 conn->task = list_entry(conn->cmdqueue.next, struct iscsi_task, in iscsi_data_xmit()
1526 list_del_init(&conn->task->running); in iscsi_data_xmit()
1527 spin_unlock_bh(&conn->taskqueuelock); in iscsi_data_xmit()
1528 if (conn->session->state == ISCSI_STATE_LOGGING_OUT) { in iscsi_data_xmit()
1529 fail_scsi_task(conn->task, DID_IMM_RETRY); in iscsi_data_xmit()
1530 spin_lock_bh(&conn->taskqueuelock); in iscsi_data_xmit()
1533 rc = iscsi_prep_scsi_cmd_pdu(conn->task); in iscsi_data_xmit()
1536 spin_lock_bh(&conn->taskqueuelock); in iscsi_data_xmit()
1537 list_add_tail(&conn->task->running, in iscsi_data_xmit()
1538 &conn->cmdqueue); in iscsi_data_xmit()
1539 conn->task = NULL; in iscsi_data_xmit()
1540 spin_unlock_bh(&conn->taskqueuelock); in iscsi_data_xmit()
1543 fail_scsi_task(conn->task, DID_ABORT); in iscsi_data_xmit()
1544 spin_lock_bh(&conn->taskqueuelock); in iscsi_data_xmit()
1547 rc = iscsi_xmit_task(conn); in iscsi_data_xmit()
1555 spin_lock_bh(&conn->taskqueuelock); in iscsi_data_xmit()
1556 if (!list_empty(&conn->mgmtqueue)) in iscsi_data_xmit()
1560 while (!list_empty(&conn->requeue)) { in iscsi_data_xmit()
1564 if (conn->session->state == ISCSI_STATE_LOGGING_OUT) in iscsi_data_xmit()
1567 task = list_entry(conn->requeue.next, struct iscsi_task, in iscsi_data_xmit()
1572 conn->task = task; in iscsi_data_xmit()
1573 list_del_init(&conn->task->running); in iscsi_data_xmit()
1574 conn->task->state = ISCSI_TASK_RUNNING; in iscsi_data_xmit()
1575 spin_unlock_bh(&conn->taskqueuelock); in iscsi_data_xmit()
1576 rc = iscsi_xmit_task(conn); in iscsi_data_xmit()
1579 spin_lock_bh(&conn->taskqueuelock); in iscsi_data_xmit()
1580 if (!list_empty(&conn->mgmtqueue)) in iscsi_data_xmit()
1583 spin_unlock_bh(&conn->taskqueuelock); in iscsi_data_xmit()
1584 spin_unlock_bh(&conn->session->frwd_lock); in iscsi_data_xmit()
1588 spin_unlock_bh(&conn->session->frwd_lock); in iscsi_data_xmit()
1594 struct iscsi_conn *conn = in iscsi_xmitworker() local
1601 rc = iscsi_data_xmit(conn); in iscsi_xmitworker()
1605 static inline struct iscsi_task *iscsi_alloc_task(struct iscsi_conn *conn, in iscsi_alloc_task() argument
1610 if (!kfifo_out(&conn->session->cmdpool.queue, in iscsi_alloc_task()
1614 sc->SCp.phase = conn->session->age; in iscsi_alloc_task()
1619 task->conn = conn; in iscsi_alloc_task()
1648 struct iscsi_conn *conn; in iscsi_queuecommand() local
1708 conn = session->leadconn; in iscsi_queuecommand()
1709 if (!conn) { in iscsi_queuecommand()
1715 if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) { in iscsi_queuecommand()
1721 if (iscsi_check_cmdsn_window_closed(conn)) { in iscsi_queuecommand()
1726 task = iscsi_alloc_task(conn, sc); in iscsi_queuecommand()
1749 spin_lock_bh(&conn->taskqueuelock); in iscsi_queuecommand()
1750 list_add_tail(&task->running, &conn->cmdqueue); in iscsi_queuecommand()
1751 spin_unlock_bh(&conn->taskqueuelock); in iscsi_queuecommand()
1752 iscsi_conn_queue_work(conn); in iscsi_queuecommand()
1795 struct iscsi_conn *conn = from_timer(conn, t, tmf_timer); in iscsi_tmf_timedout() local
1796 struct iscsi_session *session = conn->session; in iscsi_tmf_timedout()
1799 if (conn->tmf_state == TMF_QUEUED) { in iscsi_tmf_timedout()
1800 conn->tmf_state = TMF_TIMEDOUT; in iscsi_tmf_timedout()
1803 wake_up(&conn->ehwait); in iscsi_tmf_timedout()
1808 static int iscsi_exec_task_mgmt_fn(struct iscsi_conn *conn, in iscsi_exec_task_mgmt_fn() argument
1813 struct iscsi_session *session = conn->session; in iscsi_exec_task_mgmt_fn()
1816 task = __iscsi_conn_send_pdu(conn, (struct iscsi_hdr *)hdr, in iscsi_exec_task_mgmt_fn()
1820 iscsi_conn_printk(KERN_ERR, conn, "Could not send TMF.\n"); in iscsi_exec_task_mgmt_fn()
1821 iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); in iscsi_exec_task_mgmt_fn()
1825 conn->tmfcmd_pdus_cnt++; in iscsi_exec_task_mgmt_fn()
1826 conn->tmf_timer.expires = timeout * HZ + jiffies; in iscsi_exec_task_mgmt_fn()
1827 add_timer(&conn->tmf_timer); in iscsi_exec_task_mgmt_fn()
1841 wait_event_interruptible(conn->ehwait, age != session->age || in iscsi_exec_task_mgmt_fn()
1843 conn->tmf_state != TMF_QUEUED); in iscsi_exec_task_mgmt_fn()
1846 del_timer_sync(&conn->tmf_timer); in iscsi_exec_task_mgmt_fn()
1861 static void fail_scsi_tasks(struct iscsi_conn *conn, u64 lun, int error) in fail_scsi_tasks() argument
1866 for (i = 0; i < conn->session->cmds_max; i++) { in fail_scsi_tasks()
1867 task = conn->session->cmds[i]; in fail_scsi_tasks()
1874 ISCSI_DBG_SESSION(conn->session, in fail_scsi_tasks()
1892 void iscsi_suspend_queue(struct iscsi_conn *conn) in iscsi_suspend_queue() argument
1894 spin_lock_bh(&conn->session->frwd_lock); in iscsi_suspend_queue()
1895 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); in iscsi_suspend_queue()
1896 spin_unlock_bh(&conn->session->frwd_lock); in iscsi_suspend_queue()
1908 void iscsi_suspend_tx(struct iscsi_conn *conn) in iscsi_suspend_tx() argument
1910 struct Scsi_Host *shost = conn->session->host; in iscsi_suspend_tx()
1913 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); in iscsi_suspend_tx()
1919 static void iscsi_start_tx(struct iscsi_conn *conn) in iscsi_start_tx() argument
1921 clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); in iscsi_start_tx()
1922 iscsi_conn_queue_work(conn); in iscsi_start_tx()
1931 static int iscsi_has_ping_timed_out(struct iscsi_conn *conn) in iscsi_has_ping_timed_out() argument
1933 if (READ_ONCE(conn->ping_task) && in iscsi_has_ping_timed_out()
1934 time_before_eq(conn->last_recv + (conn->recv_timeout * HZ) + in iscsi_has_ping_timed_out()
1935 (conn->ping_timeout * HZ), jiffies)) in iscsi_has_ping_timed_out()
1947 struct iscsi_conn *conn; in iscsi_eh_cmd_timed_out() local
1988 conn = session->leadconn; in iscsi_eh_cmd_timed_out()
1989 if (!conn) { in iscsi_eh_cmd_timed_out()
2012 if (!conn->recv_timeout && !conn->ping_timeout) in iscsi_eh_cmd_timed_out()
2018 if (iscsi_has_ping_timed_out(conn)) { in iscsi_eh_cmd_timed_out()
2023 for (i = 0; i < conn->session->cmds_max; i++) { in iscsi_eh_cmd_timed_out()
2024 running_task = conn->session->cmds[i]; in iscsi_eh_cmd_timed_out()
2068 if (READ_ONCE(conn->ping_task)) { in iscsi_eh_cmd_timed_out()
2075 iscsi_send_nopout(conn, NULL); in iscsi_eh_cmd_timed_out()
2091 struct iscsi_conn *conn = from_timer(conn, t, transport_timer); in iscsi_check_transport_timeouts() local
2092 struct iscsi_session *session = conn->session; in iscsi_check_transport_timeouts()
2099 recv_timeout = conn->recv_timeout; in iscsi_check_transport_timeouts()
2104 last_recv = conn->last_recv; in iscsi_check_transport_timeouts()
2106 if (iscsi_has_ping_timed_out(conn)) { in iscsi_check_transport_timeouts()
2107 iscsi_conn_printk(KERN_ERR, conn, "ping timeout of %d secs " in iscsi_check_transport_timeouts()
2110 conn->ping_timeout, conn->recv_timeout, in iscsi_check_transport_timeouts()
2111 last_recv, conn->last_ping, jiffies); in iscsi_check_transport_timeouts()
2113 iscsi_conn_failure(conn, ISCSI_ERR_NOP_TIMEDOUT); in iscsi_check_transport_timeouts()
2119 ISCSI_DBG_CONN(conn, "Sending nopout as ping\n"); in iscsi_check_transport_timeouts()
2120 if (iscsi_send_nopout(conn, NULL)) in iscsi_check_transport_timeouts()
2123 next_timeout = conn->last_ping + (conn->ping_timeout * HZ); in iscsi_check_transport_timeouts()
2127 ISCSI_DBG_CONN(conn, "Setting next tmo %lu\n", next_timeout); in iscsi_check_transport_timeouts()
2128 mod_timer(&conn->transport_timer, next_timeout); in iscsi_check_transport_timeouts()
2149 struct iscsi_conn *conn; in iscsi_eh_abort() local
2186 conn = session->leadconn; in iscsi_eh_abort()
2187 conn->eh_abort_cnt++; in iscsi_eh_abort()
2206 if (conn->tmf_state != TMF_INITIAL) in iscsi_eh_abort()
2208 conn->tmf_state = TMF_QUEUED; in iscsi_eh_abort()
2210 hdr = &conn->tmhdr; in iscsi_eh_abort()
2213 if (iscsi_exec_task_mgmt_fn(conn, hdr, age, session->abort_timeout)) in iscsi_eh_abort()
2216 switch (conn->tmf_state) { in iscsi_eh_abort()
2223 iscsi_suspend_tx(conn); in iscsi_eh_abort()
2231 conn->tmf_state = TMF_INITIAL; in iscsi_eh_abort()
2234 iscsi_start_tx(conn); in iscsi_eh_abort()
2238 iscsi_conn_failure(conn, ISCSI_ERR_SCSI_EH_SESSION_RST); in iscsi_eh_abort()
2242 conn->tmf_state = TMF_INITIAL; in iscsi_eh_abort()
2251 conn->tmf_state = TMF_INITIAL; in iscsi_eh_abort()
2287 struct iscsi_conn *conn; in iscsi_eh_device_reset() local
2305 conn = session->leadconn; in iscsi_eh_device_reset()
2308 if (conn->tmf_state != TMF_INITIAL) in iscsi_eh_device_reset()
2310 conn->tmf_state = TMF_QUEUED; in iscsi_eh_device_reset()
2312 hdr = &conn->tmhdr; in iscsi_eh_device_reset()
2315 if (iscsi_exec_task_mgmt_fn(conn, hdr, session->age, in iscsi_eh_device_reset()
2321 switch (conn->tmf_state) { in iscsi_eh_device_reset()
2326 iscsi_conn_failure(conn, ISCSI_ERR_SCSI_EH_SESSION_RST); in iscsi_eh_device_reset()
2329 conn->tmf_state = TMF_INITIAL; in iscsi_eh_device_reset()
2336 iscsi_suspend_tx(conn); in iscsi_eh_device_reset()
2340 fail_scsi_tasks(conn, sc->device->lun, DID_ERROR); in iscsi_eh_device_reset()
2341 conn->tmf_state = TMF_INITIAL; in iscsi_eh_device_reset()
2344 iscsi_start_tx(conn); in iscsi_eh_device_reset()
2382 struct iscsi_conn *conn; in iscsi_eh_session_reset() local
2386 conn = session->leadconn; in iscsi_eh_session_reset()
2407 iscsi_conn_failure(conn, ISCSI_ERR_SCSI_EH_SESSION_RST); in iscsi_eh_session_reset()
2410 wait_event_interruptible(conn->ehwait, in iscsi_eh_session_reset()
2422 session->targetname, conn->persistent_address); in iscsi_eh_session_reset()
2450 struct iscsi_conn *conn; in iscsi_eh_target_reset() local
2468 conn = session->leadconn; in iscsi_eh_target_reset()
2471 if (conn->tmf_state != TMF_INITIAL) in iscsi_eh_target_reset()
2473 conn->tmf_state = TMF_QUEUED; in iscsi_eh_target_reset()
2475 hdr = &conn->tmhdr; in iscsi_eh_target_reset()
2478 if (iscsi_exec_task_mgmt_fn(conn, hdr, session->age, in iscsi_eh_target_reset()
2484 switch (conn->tmf_state) { in iscsi_eh_target_reset()
2489 iscsi_conn_failure(conn, ISCSI_ERR_SCSI_EH_SESSION_RST); in iscsi_eh_target_reset()
2492 conn->tmf_state = TMF_INITIAL; in iscsi_eh_target_reset()
2499 iscsi_suspend_tx(conn); in iscsi_eh_target_reset()
2503 fail_scsi_tasks(conn, -1, DID_ERROR); in iscsi_eh_target_reset()
2504 conn->tmf_state = TMF_INITIAL; in iscsi_eh_target_reset()
2507 iscsi_start_tx(conn); in iscsi_eh_target_reset()
2898 struct iscsi_conn *conn; in iscsi_conn_setup() local
2902 cls_conn = iscsi_create_conn(cls_session, sizeof(*conn) + dd_size, in iscsi_conn_setup()
2906 conn = cls_conn->dd_data; in iscsi_conn_setup()
2907 memset(conn, 0, sizeof(*conn) + dd_size); in iscsi_conn_setup()
2909 conn->dd_data = cls_conn->dd_data + sizeof(*conn); in iscsi_conn_setup()
2910 conn->session = session; in iscsi_conn_setup()
2911 conn->cls_conn = cls_conn; in iscsi_conn_setup()
2912 conn->c_stage = ISCSI_CONN_INITIAL_STAGE; in iscsi_conn_setup()
2913 conn->id = conn_idx; in iscsi_conn_setup()
2914 conn->exp_statsn = 0; in iscsi_conn_setup()
2915 conn->tmf_state = TMF_INITIAL; in iscsi_conn_setup()
2917 timer_setup(&conn->transport_timer, iscsi_check_transport_timeouts, 0); in iscsi_conn_setup()
2919 INIT_LIST_HEAD(&conn->mgmtqueue); in iscsi_conn_setup()
2920 INIT_LIST_HEAD(&conn->cmdqueue); in iscsi_conn_setup()
2921 INIT_LIST_HEAD(&conn->requeue); in iscsi_conn_setup()
2922 spin_lock_init(&conn->taskqueuelock); in iscsi_conn_setup()
2923 INIT_WORK(&conn->xmitwork, iscsi_xmitworker); in iscsi_conn_setup()
2928 (void*)&conn->login_task, in iscsi_conn_setup()
2939 conn->login_task->data = conn->data = data; in iscsi_conn_setup()
2941 timer_setup(&conn->tmf_timer, iscsi_tmf_timedout, 0); in iscsi_conn_setup()
2942 init_waitqueue_head(&conn->ehwait); in iscsi_conn_setup()
2947 kfifo_in(&session->cmdpool.queue, (void*)&conn->login_task, in iscsi_conn_setup()
2964 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_conn_teardown() local
2965 struct iscsi_session *session = conn->session; in iscsi_conn_teardown()
2967 del_timer_sync(&conn->transport_timer); in iscsi_conn_teardown()
2971 conn->c_stage = ISCSI_CONN_CLEANUP_WAIT; in iscsi_conn_teardown()
2972 if (session->leadconn == conn) { in iscsi_conn_teardown()
2977 wake_up(&conn->ehwait); in iscsi_conn_teardown()
2982 iscsi_suspend_tx(conn); in iscsi_conn_teardown()
2985 free_pages((unsigned long) conn->data, in iscsi_conn_teardown()
2987 kfree(conn->persistent_address); in iscsi_conn_teardown()
2988 kfree(conn->local_ipaddr); in iscsi_conn_teardown()
2991 kfifo_in(&session->cmdpool.queue, (void*)&conn->login_task, in iscsi_conn_teardown()
2994 if (session->leadconn == conn) in iscsi_conn_teardown()
3005 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_conn_start() local
3006 struct iscsi_session *session = conn->session; in iscsi_conn_start()
3009 iscsi_conn_printk(KERN_ERR, conn, in iscsi_conn_start()
3016 iscsi_conn_printk(KERN_INFO, conn, "invalid burst lengths: " in iscsi_conn_start()
3022 if (conn->ping_timeout && !conn->recv_timeout) { in iscsi_conn_start()
3023 iscsi_conn_printk(KERN_ERR, conn, "invalid recv timeout of " in iscsi_conn_start()
3025 conn->recv_timeout = 5; in iscsi_conn_start()
3028 if (conn->recv_timeout && !conn->ping_timeout) { in iscsi_conn_start()
3029 iscsi_conn_printk(KERN_ERR, conn, "invalid ping timeout of " in iscsi_conn_start()
3031 conn->ping_timeout = 5; in iscsi_conn_start()
3035 conn->c_stage = ISCSI_CONN_STARTED; in iscsi_conn_start()
3039 conn->last_recv = jiffies; in iscsi_conn_start()
3040 conn->last_ping = jiffies; in iscsi_conn_start()
3041 if (conn->recv_timeout && conn->ping_timeout) in iscsi_conn_start()
3042 mod_timer(&conn->transport_timer, in iscsi_conn_start()
3043 jiffies + (conn->recv_timeout * HZ)); in iscsi_conn_start()
3045 switch(conn->stop_stage) { in iscsi_conn_start()
3051 conn->stop_stage = 0; in iscsi_conn_start()
3052 conn->tmf_state = TMF_INITIAL; in iscsi_conn_start()
3058 conn->stop_stage = 0; in iscsi_conn_start()
3066 wake_up(&conn->ehwait); in iscsi_conn_start()
3072 fail_mgmt_tasks(struct iscsi_session *session, struct iscsi_conn *conn) in fail_mgmt_tasks() argument
3077 for (i = 0; i < conn->session->cmds_max; i++) { in fail_mgmt_tasks()
3078 task = conn->session->cmds[i]; in fail_mgmt_tasks()
3085 ISCSI_DBG_SESSION(conn->session, in fail_mgmt_tasks()
3098 struct iscsi_conn *conn, int flag) in iscsi_start_session_recovery() argument
3104 if (conn->stop_stage == STOP_CONN_TERM) { in iscsi_start_session_recovery()
3117 else if (conn->stop_stage != STOP_CONN_RECOVER) in iscsi_start_session_recovery()
3120 old_stop_stage = conn->stop_stage; in iscsi_start_session_recovery()
3121 conn->stop_stage = flag; in iscsi_start_session_recovery()
3124 del_timer_sync(&conn->transport_timer); in iscsi_start_session_recovery()
3125 iscsi_suspend_tx(conn); in iscsi_start_session_recovery()
3128 conn->c_stage = ISCSI_CONN_STOPPED; in iscsi_start_session_recovery()
3138 conn->hdrdgst_en = 0; in iscsi_start_session_recovery()
3139 conn->datadgst_en = 0; in iscsi_start_session_recovery()
3151 fail_scsi_tasks(conn, -1, DID_TRANSPORT_DISRUPTED); in iscsi_start_session_recovery()
3152 fail_mgmt_tasks(session, conn); in iscsi_start_session_recovery()
3153 memset(&conn->tmhdr, 0, sizeof(conn->tmhdr)); in iscsi_start_session_recovery()
3160 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_conn_stop() local
3161 struct iscsi_session *session = conn->session; in iscsi_conn_stop()
3171 iscsi_conn_printk(KERN_ERR, conn, in iscsi_conn_stop()
3176 iscsi_start_session_recovery(session, conn, flag); in iscsi_conn_stop()
3184 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_conn_bind() local
3188 session->leadconn = conn; in iscsi_conn_bind()
3194 clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx); in iscsi_conn_bind()
3195 clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); in iscsi_conn_bind()
3222 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_set_param() local
3223 struct iscsi_session *session = conn->session; in iscsi_set_param()
3240 sscanf(buf, "%d", &conn->ping_timeout); in iscsi_set_param()
3243 sscanf(buf, "%d", &conn->recv_timeout); in iscsi_set_param()
3246 sscanf(buf, "%d", &conn->max_recv_dlength); in iscsi_set_param()
3249 sscanf(buf, "%d", &conn->max_xmit_dlength); in iscsi_set_param()
3252 sscanf(buf, "%d", &conn->hdrdgst_en); in iscsi_set_param()
3255 sscanf(buf, "%d", &conn->datadgst_en); in iscsi_set_param()
3282 sscanf(buf, "%u", &conn->exp_statsn); in iscsi_set_param()
3300 sscanf(buf, "%d", &conn->persistent_port); in iscsi_set_param()
3303 return iscsi_switch_str_param(&conn->persistent_address, buf); in iscsi_set_param()
3324 return iscsi_switch_str_param(&conn->local_ipaddr, buf); in iscsi_set_param()
3514 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_conn_get_param() local
3519 len = sprintf(buf, "%u\n", conn->ping_timeout); in iscsi_conn_get_param()
3522 len = sprintf(buf, "%u\n", conn->recv_timeout); in iscsi_conn_get_param()
3525 len = sprintf(buf, "%u\n", conn->max_recv_dlength); in iscsi_conn_get_param()
3528 len = sprintf(buf, "%u\n", conn->max_xmit_dlength); in iscsi_conn_get_param()
3531 len = sprintf(buf, "%d\n", conn->hdrdgst_en); in iscsi_conn_get_param()
3534 len = sprintf(buf, "%d\n", conn->datadgst_en); in iscsi_conn_get_param()
3537 len = sprintf(buf, "%d\n", conn->ifmarker_en); in iscsi_conn_get_param()
3540 len = sprintf(buf, "%d\n", conn->ofmarker_en); in iscsi_conn_get_param()
3543 len = sprintf(buf, "%u\n", conn->exp_statsn); in iscsi_conn_get_param()
3546 len = sprintf(buf, "%d\n", conn->persistent_port); in iscsi_conn_get_param()
3549 len = sprintf(buf, "%s\n", conn->persistent_address); in iscsi_conn_get_param()
3552 len = sprintf(buf, "%u\n", conn->statsn); in iscsi_conn_get_param()
3555 len = sprintf(buf, "%u\n", conn->max_segment_size); in iscsi_conn_get_param()
3558 len = sprintf(buf, "%u\n", conn->keepalive_tmo); in iscsi_conn_get_param()
3561 len = sprintf(buf, "%u\n", conn->local_port); in iscsi_conn_get_param()
3564 len = sprintf(buf, "%u\n", conn->tcp_timestamp_stat); in iscsi_conn_get_param()
3567 len = sprintf(buf, "%u\n", conn->tcp_nagle_disable); in iscsi_conn_get_param()
3570 len = sprintf(buf, "%u\n", conn->tcp_wsf_disable); in iscsi_conn_get_param()
3573 len = sprintf(buf, "%u\n", conn->tcp_timer_scale); in iscsi_conn_get_param()
3576 len = sprintf(buf, "%u\n", conn->tcp_timestamp_en); in iscsi_conn_get_param()
3579 len = sprintf(buf, "%u\n", conn->fragment_disable); in iscsi_conn_get_param()
3582 len = sprintf(buf, "%u\n", conn->ipv4_tos); in iscsi_conn_get_param()
3585 len = sprintf(buf, "%u\n", conn->ipv6_traffic_class); in iscsi_conn_get_param()
3588 len = sprintf(buf, "%u\n", conn->ipv6_flow_label); in iscsi_conn_get_param()
3591 len = sprintf(buf, "%u\n", conn->is_fw_assigned_ipv6); in iscsi_conn_get_param()
3594 len = sprintf(buf, "%u\n", conn->tcp_xmit_wsf); in iscsi_conn_get_param()
3597 len = sprintf(buf, "%u\n", conn->tcp_recv_wsf); in iscsi_conn_get_param()
3600 len = sprintf(buf, "%s\n", conn->local_ipaddr); in iscsi_conn_get_param()