Lines Matching refs:task
136 void iscsi_prep_data_out_pdu(struct iscsi_task *task, struct iscsi_r2t_info *r2t, in iscsi_prep_data_out_pdu() argument
139 struct iscsi_conn *conn = task->conn; in iscsi_prep_data_out_pdu()
142 task->hdr_len = sizeof(struct iscsi_data); in iscsi_prep_data_out_pdu()
149 hdr->lun = task->lun; in iscsi_prep_data_out_pdu()
150 hdr->itt = task->hdr_itt; in iscsi_prep_data_out_pdu()
166 static int iscsi_add_hdr(struct iscsi_task *task, unsigned len) in iscsi_add_hdr() argument
168 unsigned exp_len = task->hdr_len + len; in iscsi_add_hdr()
170 if (exp_len > task->hdr_max) { in iscsi_add_hdr()
176 task->hdr_len = exp_len; in iscsi_add_hdr()
183 static int iscsi_prep_ecdb_ahs(struct iscsi_task *task) in iscsi_prep_ecdb_ahs() argument
185 struct scsi_cmnd *cmd = task->sc; in iscsi_prep_ecdb_ahs()
191 ecdb_ahdr = iscsi_next_hdr(task); in iscsi_prep_ecdb_ahs()
199 rc = iscsi_add_hdr(task, sizeof(ecdb_ahdr->ahslength) + in iscsi_prep_ecdb_ahs()
212 ISCSI_DBG_SESSION(task->conn->session, in iscsi_prep_ecdb_ahs()
216 task->hdr_len); in iscsi_prep_ecdb_ahs()
220 static int iscsi_prep_bidi_ahs(struct iscsi_task *task) in iscsi_prep_bidi_ahs() argument
222 struct scsi_cmnd *sc = task->sc; in iscsi_prep_bidi_ahs()
226 rlen_ahdr = iscsi_next_hdr(task); in iscsi_prep_bidi_ahs()
227 rc = iscsi_add_hdr(task, sizeof(*rlen_ahdr)); in iscsi_prep_bidi_ahs()
238 ISCSI_DBG_SESSION(task->conn->session, in iscsi_prep_bidi_ahs()
259 static int iscsi_check_tmf_restrictions(struct iscsi_task *task, int opcode) in iscsi_check_tmf_restrictions() argument
261 struct iscsi_conn *conn = task->conn; in iscsi_check_tmf_restrictions()
277 if (hdr_lun != task->sc->device->lun) in iscsi_check_tmf_restrictions()
289 task->hdr->opcode, opcode, in iscsi_check_tmf_restrictions()
290 task->itt, task->hdr_itt); in iscsi_check_tmf_restrictions()
301 task->hdr->opcode, opcode, in iscsi_check_tmf_restrictions()
302 task->itt, task->hdr_itt); in iscsi_check_tmf_restrictions()
314 task->hdr_itt == tmf->rtt) { in iscsi_check_tmf_restrictions()
318 "progress\n", task->itt, in iscsi_check_tmf_restrictions()
319 task->hdr_itt); in iscsi_check_tmf_restrictions()
335 static int iscsi_prep_scsi_cmd_pdu(struct iscsi_task *task) in iscsi_prep_scsi_cmd_pdu() argument
337 struct iscsi_conn *conn = task->conn; in iscsi_prep_scsi_cmd_pdu()
339 struct scsi_cmnd *sc = task->sc; in iscsi_prep_scsi_cmd_pdu()
345 rc = iscsi_check_tmf_restrictions(task, ISCSI_OP_SCSI_CMD); in iscsi_prep_scsi_cmd_pdu()
350 rc = conn->session->tt->alloc_pdu(task, ISCSI_OP_SCSI_CMD); in iscsi_prep_scsi_cmd_pdu()
354 hdr = (struct iscsi_scsi_req *)task->hdr; in iscsi_prep_scsi_cmd_pdu()
359 hdr->itt = task->hdr_itt = itt; in iscsi_prep_scsi_cmd_pdu()
361 hdr->itt = task->hdr_itt = build_itt(task->itt, in iscsi_prep_scsi_cmd_pdu()
362 task->conn->session->age); in iscsi_prep_scsi_cmd_pdu()
363 task->hdr_len = 0; in iscsi_prep_scsi_cmd_pdu()
364 rc = iscsi_add_hdr(task, sizeof(*hdr)); in iscsi_prep_scsi_cmd_pdu()
370 task->lun = hdr->lun; in iscsi_prep_scsi_cmd_pdu()
376 rc = iscsi_prep_ecdb_ahs(task); in iscsi_prep_scsi_cmd_pdu()
383 task->imm_count = 0; in iscsi_prep_scsi_cmd_pdu()
386 rc = iscsi_prep_bidi_ahs(task); in iscsi_prep_scsi_cmd_pdu()
392 task->protected = true; in iscsi_prep_scsi_cmd_pdu()
397 struct iscsi_r2t_info *r2t = &task->unsol_r2t; in iscsi_prep_scsi_cmd_pdu()
418 task->imm_count = min(session->first_burst, in iscsi_prep_scsi_cmd_pdu()
421 task->imm_count = min(transfer_length, in iscsi_prep_scsi_cmd_pdu()
423 hton24(hdr->dlength, task->imm_count); in iscsi_prep_scsi_cmd_pdu()
430 task->imm_count; in iscsi_prep_scsi_cmd_pdu()
431 r2t->data_offset = task->imm_count; in iscsi_prep_scsi_cmd_pdu()
436 if (!task->unsol_r2t.data_length) in iscsi_prep_scsi_cmd_pdu()
448 hdrlength = task->hdr_len - sizeof(*hdr); in iscsi_prep_scsi_cmd_pdu()
455 hdr->cmdsn = task->cmdsn = cpu_to_be32(session->cmdsn); in iscsi_prep_scsi_cmd_pdu()
457 if (session->tt->init_task && session->tt->init_task(task)) in iscsi_prep_scsi_cmd_pdu()
460 task->state = ISCSI_TASK_RUNNING; in iscsi_prep_scsi_cmd_pdu()
469 task->itt, transfer_length, in iscsi_prep_scsi_cmd_pdu()
484 static void iscsi_free_task(struct iscsi_task *task) in iscsi_free_task() argument
486 struct iscsi_conn *conn = task->conn; in iscsi_free_task()
488 struct scsi_cmnd *sc = task->sc; in iscsi_free_task()
489 int oldstate = task->state; in iscsi_free_task()
492 task->itt, task->state, task->sc); in iscsi_free_task()
494 session->tt->cleanup_task(task); in iscsi_free_task()
495 task->state = ISCSI_TASK_FREE; in iscsi_free_task()
496 task->sc = NULL; in iscsi_free_task()
500 if (conn->login_task == task) in iscsi_free_task()
503 kfifo_in(&session->cmdpool.queue, (void*)&task, sizeof(void*)); in iscsi_free_task()
517 void __iscsi_get_task(struct iscsi_task *task) in __iscsi_get_task() argument
519 atomic_inc(&task->refcount); in __iscsi_get_task()
523 void __iscsi_put_task(struct iscsi_task *task) in __iscsi_put_task() argument
525 if (atomic_dec_and_test(&task->refcount)) in __iscsi_put_task()
526 iscsi_free_task(task); in __iscsi_put_task()
530 void iscsi_put_task(struct iscsi_task *task) in iscsi_put_task() argument
532 struct iscsi_session *session = task->conn->session; in iscsi_put_task()
536 __iscsi_put_task(task); in iscsi_put_task()
548 static void iscsi_complete_task(struct iscsi_task *task, int state) in iscsi_complete_task() argument
550 struct iscsi_conn *conn = task->conn; in iscsi_complete_task()
554 task->itt, task->state, task->sc); in iscsi_complete_task()
555 if (task->state == ISCSI_TASK_COMPLETED || in iscsi_complete_task()
556 task->state == ISCSI_TASK_ABRT_TMF || in iscsi_complete_task()
557 task->state == ISCSI_TASK_ABRT_SESS_RECOV || in iscsi_complete_task()
558 task->state == ISCSI_TASK_REQUEUE_SCSIQ) in iscsi_complete_task()
560 WARN_ON_ONCE(task->state == ISCSI_TASK_FREE); in iscsi_complete_task()
561 task->state = state; in iscsi_complete_task()
563 if (!list_empty(&task->running)) in iscsi_complete_task()
564 list_del_init(&task->running); 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()
573 __iscsi_put_task(task); in iscsi_complete_task()
587 void iscsi_complete_scsi_task(struct iscsi_task *task, in iscsi_complete_scsi_task() argument
590 struct iscsi_conn *conn = task->conn; in iscsi_complete_scsi_task()
592 ISCSI_DBG_SESSION(conn->session, "[itt 0x%x]\n", task->itt); in iscsi_complete_scsi_task()
596 iscsi_complete_task(task, ISCSI_TASK_COMPLETED); in iscsi_complete_scsi_task()
606 static void fail_scsi_task(struct iscsi_task *task, int err) in fail_scsi_task() argument
608 struct iscsi_conn *conn = task->conn; in fail_scsi_task()
617 sc = task->sc; in fail_scsi_task()
621 if (task->state == ISCSI_TASK_PENDING) { in fail_scsi_task()
644 iscsi_complete_task(task, state); in fail_scsi_task()
649 struct iscsi_task *task) in iscsi_prep_mgmt_task() argument
652 struct iscsi_hdr *hdr = task->hdr; in iscsi_prep_mgmt_task()
681 if (session->tt->init_task && session->tt->init_task(task)) in iscsi_prep_mgmt_task()
687 task->state = ISCSI_TASK_RUNNING; in iscsi_prep_mgmt_task()
690 hdr->itt, task->data_count); in iscsi_prep_mgmt_task()
701 struct iscsi_task *task; in __iscsi_conn_send_pdu() local
725 task = conn->login_task; in __iscsi_conn_send_pdu()
739 (void*)&task, sizeof(void*))) in __iscsi_conn_send_pdu()
747 atomic_set(&task->refcount, 1); in __iscsi_conn_send_pdu()
748 task->conn = conn; in __iscsi_conn_send_pdu()
749 task->sc = NULL; in __iscsi_conn_send_pdu()
750 INIT_LIST_HEAD(&task->running); in __iscsi_conn_send_pdu()
751 task->state = ISCSI_TASK_PENDING; in __iscsi_conn_send_pdu()
754 memcpy(task->data, data, data_size); in __iscsi_conn_send_pdu()
755 task->data_count = data_size; in __iscsi_conn_send_pdu()
757 task->data_count = 0; in __iscsi_conn_send_pdu()
760 if (conn->session->tt->alloc_pdu(task, hdr->opcode)) { in __iscsi_conn_send_pdu()
767 itt = task->hdr->itt; in __iscsi_conn_send_pdu()
768 task->hdr_len = sizeof(struct iscsi_hdr); in __iscsi_conn_send_pdu()
769 memcpy(task->hdr, hdr, sizeof(struct iscsi_hdr)); in __iscsi_conn_send_pdu()
773 task->hdr->itt = itt; in __iscsi_conn_send_pdu()
775 task->hdr->itt = build_itt(task->itt, 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()
783 if (session->tt->xmit_task(task)) in __iscsi_conn_send_pdu()
786 list_add_tail(&task->running, &conn->mgmtqueue); in __iscsi_conn_send_pdu()
790 return task; in __iscsi_conn_send_pdu()
795 __iscsi_put_task(task); in __iscsi_conn_send_pdu()
827 struct iscsi_task *task, char *data, in iscsi_scsi_cmd_rsp() argument
832 struct scsi_cmnd *sc = task->sc; in iscsi_scsi_cmd_rsp()
839 if (task->protected) { in iscsi_scsi_cmd_rsp()
850 ascq = session->tt->check_protection(task, §or); in iscsi_scsi_cmd_rsp()
920 sc, sc->result, task->itt); in iscsi_scsi_cmd_rsp()
922 iscsi_complete_task(task, ISCSI_TASK_COMPLETED); in iscsi_scsi_cmd_rsp()
933 struct iscsi_task *task) in iscsi_data_in_rsp() argument
936 struct scsi_cmnd *sc = task->sc; in iscsi_data_in_rsp()
958 sc, sc->result, task->itt); in iscsi_data_in_rsp()
960 iscsi_complete_task(task, ISCSI_TASK_COMPLETED); in iscsi_data_in_rsp()
985 struct iscsi_task *task; in iscsi_send_nopout() local
1001 task = __iscsi_conn_send_pdu(conn, (struct iscsi_hdr *)&hdr, NULL, 0); in iscsi_send_nopout()
1002 if (!task) in iscsi_send_nopout()
1006 conn->ping_task = task; in iscsi_send_nopout()
1011 static int iscsi_nop_out_rsp(struct iscsi_task *task, in iscsi_nop_out_rsp() argument
1014 struct iscsi_conn *conn = task->conn; in iscsi_nop_out_rsp()
1017 if (conn->ping_task != task) { in iscsi_nop_out_rsp()
1027 iscsi_complete_task(task, ISCSI_TASK_COMPLETED); in iscsi_nop_out_rsp()
1087 struct iscsi_task *task; in iscsi_handle_reject() local
1092 task = iscsi_itt_to_task(conn, rejected_pdu.itt); in iscsi_handle_reject()
1093 if (!task) { in iscsi_handle_reject()
1099 rc = iscsi_nop_out_rsp(task, in iscsi_handle_reject()
1159 struct iscsi_task *task; in __iscsi_complete_pdu() local
1213 task = iscsi_itt_to_ctask(conn, hdr->itt); in __iscsi_complete_pdu()
1214 if (!task) in __iscsi_complete_pdu()
1216 task->last_xfer = jiffies; in __iscsi_complete_pdu()
1228 task = iscsi_itt_to_task(conn, hdr->itt); in __iscsi_complete_pdu()
1229 if (!task) 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()
1267 iscsi_complete_task(task, ISCSI_TASK_COMPLETED); in __iscsi_complete_pdu()
1277 rc = iscsi_nop_out_rsp(task, (struct iscsi_nopin*)hdr, in __iscsi_complete_pdu()
1290 iscsi_complete_task(task, ISCSI_TASK_COMPLETED); in __iscsi_complete_pdu()
1350 struct iscsi_task *task; in iscsi_itt_to_ctask() local
1355 task = iscsi_itt_to_task(conn, itt); in iscsi_itt_to_ctask()
1356 if (!task || !task->sc) in iscsi_itt_to_ctask()
1359 if (task->sc->SCp.phase != conn->session->age) { in iscsi_itt_to_ctask()
1362 task->sc->SCp.phase, conn->session->age); in iscsi_itt_to_ctask()
1366 return task; in iscsi_itt_to_ctask()
1439 struct iscsi_task *task = conn->task; in iscsi_xmit_task() local
1445 __iscsi_get_task(task); in iscsi_xmit_task()
1447 rc = conn->session->tt->xmit_task(task); in iscsi_xmit_task()
1451 task->last_xfer = jiffies; in iscsi_xmit_task()
1452 conn->task = NULL; in iscsi_xmit_task()
1456 __iscsi_put_task(task); in iscsi_xmit_task()
1469 void iscsi_requeue_task(struct iscsi_task *task) in iscsi_requeue_task() argument
1471 struct iscsi_conn *conn = task->conn; in iscsi_requeue_task()
1477 if (list_empty(&task->running)) in iscsi_requeue_task()
1478 list_add_tail(&task->running, &conn->requeue); in iscsi_requeue_task()
1494 struct iscsi_task *task; in iscsi_data_xmit() local
1504 if (conn->task) { 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()
1523 __iscsi_put_task(conn->task); in iscsi_data_xmit()
1525 conn->task = NULL; 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()
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()
1547 conn->task = NULL; in iscsi_data_xmit()
1550 fail_scsi_task(conn->task, DID_ABORT); in iscsi_data_xmit()
1572 task = list_entry(conn->requeue.next, struct iscsi_task, in iscsi_data_xmit()
1574 if (iscsi_check_tmf_restrictions(task, ISCSI_OP_SCSI_DATA_OUT)) 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()
1610 struct iscsi_task *task; in iscsi_alloc_task() local
1613 (void *) &task, sizeof(void *))) in iscsi_alloc_task()
1617 sc->SCp.ptr = (char *) task; in iscsi_alloc_task()
1619 atomic_set(&task->refcount, 1); in iscsi_alloc_task()
1620 task->state = ISCSI_TASK_PENDING; in iscsi_alloc_task()
1621 task->conn = conn; in iscsi_alloc_task()
1622 task->sc = sc; in iscsi_alloc_task()
1623 task->have_checked_conn = false; in iscsi_alloc_task()
1624 task->last_timeout = jiffies; in iscsi_alloc_task()
1625 task->last_xfer = jiffies; in iscsi_alloc_task()
1626 task->protected = false; in iscsi_alloc_task()
1627 INIT_LIST_HEAD(&task->running); in iscsi_alloc_task()
1628 return task; in iscsi_alloc_task()
1651 struct iscsi_task *task = NULL; in iscsi_queuecommand() local
1718 task = iscsi_alloc_task(conn, sc); in iscsi_queuecommand()
1719 if (!task) { in iscsi_queuecommand()
1725 reason = iscsi_prep_scsi_cmd_pdu(task); in iscsi_queuecommand()
1735 if (session->tt->xmit_task(task)) { in iscsi_queuecommand()
1741 list_add_tail(&task->running, &conn->cmdqueue); in iscsi_queuecommand()
1750 iscsi_complete_task(task, ISCSI_TASK_REQUEUE_SCSIQ); in iscsi_queuecommand()
1758 iscsi_complete_task(task, ISCSI_TASK_REQUEUE_SCSIQ); in iscsi_queuecommand()
1804 struct iscsi_task *task; in iscsi_exec_task_mgmt_fn() local
1806 task = __iscsi_conn_send_pdu(conn, (struct iscsi_hdr *)hdr, in iscsi_exec_task_mgmt_fn()
1808 if (!task) { in iscsi_exec_task_mgmt_fn()
1855 struct iscsi_task *task; in fail_scsi_tasks() local
1859 task = conn->session->cmds[i]; in fail_scsi_tasks()
1860 if (!task->sc || task->state == ISCSI_TASK_FREE) in fail_scsi_tasks()
1863 if (lun != -1 && lun != task->sc->device->lun) in fail_scsi_tasks()
1868 task->sc, task->itt, task->state); in fail_scsi_tasks()
1869 fail_scsi_task(task, error); in fail_scsi_tasks()
1936 struct iscsi_task *task = NULL, *running_task; in iscsi_eh_cmd_timed_out() local
1948 task = (struct iscsi_task *)sc->SCp.ptr; in iscsi_eh_cmd_timed_out()
1949 if (!task) { in iscsi_eh_cmd_timed_out()
1981 if (time_after(task->last_xfer, task->last_timeout)) { in iscsi_eh_cmd_timed_out()
1985 "%lu\n.", task->last_xfer, task->last_timeout); in iscsi_eh_cmd_timed_out()
1986 task->have_checked_conn = false; in iscsi_eh_cmd_timed_out()
2004 if (!running_task->sc || running_task == task || in iscsi_eh_cmd_timed_out()
2013 task->sc->jiffies_at_alloc)) in iscsi_eh_cmd_timed_out()
2016 if (time_after(running_task->last_xfer, task->last_timeout)) { in iscsi_eh_cmd_timed_out()
2032 task->last_xfer, running_task->last_xfer, in iscsi_eh_cmd_timed_out()
2033 task->last_timeout); in iscsi_eh_cmd_timed_out()
2040 if (task->have_checked_conn) in iscsi_eh_cmd_timed_out()
2048 task->have_checked_conn = true; in iscsi_eh_cmd_timed_out()
2055 task->have_checked_conn = true; in iscsi_eh_cmd_timed_out()
2059 if (task) in iscsi_eh_cmd_timed_out()
2060 task->last_timeout = jiffies; in iscsi_eh_cmd_timed_out()
2109 static void iscsi_prep_abort_task_pdu(struct iscsi_task *task, in iscsi_prep_abort_task_pdu() argument
2116 hdr->lun = task->lun; in iscsi_prep_abort_task_pdu()
2117 hdr->rtt = task->hdr_itt; in iscsi_prep_abort_task_pdu()
2118 hdr->refcmdsn = task->cmdsn; in iscsi_prep_abort_task_pdu()
2126 struct iscsi_task *task; in iscsi_eh_abort() local
2166 task = (struct iscsi_task *)sc->SCp.ptr; in iscsi_eh_abort()
2168 sc, task->itt); in iscsi_eh_abort()
2171 if (!task->sc) { in iscsi_eh_abort()
2176 if (task->state == ISCSI_TASK_PENDING) { in iscsi_eh_abort()
2177 fail_scsi_task(task, DID_ABORT); in iscsi_eh_abort()
2187 iscsi_prep_abort_task_pdu(task, hdr); in iscsi_eh_abort()
2208 fail_scsi_task(task, DID_ABORT); in iscsi_eh_abort()
2237 sc, task->itt); in iscsi_eh_abort()
2245 task ? task->itt : 0); in iscsi_eh_abort()
2800 struct iscsi_task *task = session->cmds[cmd_i]; in iscsi_session_setup() local
2803 task->dd_data = &task[1]; in iscsi_session_setup()
2804 task->itt = cmd_i; in iscsi_session_setup()
2805 task->state = ISCSI_TASK_FREE; in iscsi_session_setup()
2806 INIT_LIST_HEAD(&task->running); in iscsi_session_setup()
3052 struct iscsi_task *task; in fail_mgmt_tasks() local
3056 task = conn->session->cmds[i]; in fail_mgmt_tasks()
3057 if (task->sc) in fail_mgmt_tasks()
3060 if (task->state == ISCSI_TASK_FREE) in fail_mgmt_tasks()
3065 task->itt, task->state); in fail_mgmt_tasks()
3067 if (task->state == ISCSI_TASK_PENDING) in fail_mgmt_tasks()
3069 iscsi_complete_task(task, state); in fail_mgmt_tasks()