aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target/iscsi
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-03-22 15:38:04 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-03-22 15:38:04 -0400
commit1ab142d499294b844ecc81e8004db4ce029b0b61 (patch)
tree9db85a456d0cba3de8b9bd6671b1b52fa939770c /drivers/target/iscsi
parent267d7b23dd62f6ec55e0fba777e456495c308fc7 (diff)
parent187e70a554e0f0717a65998bc9199945cbbd4692 (diff)
Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending
Pull SCSI target updates from Nicholas Bellinger: "This contains the usual set of updates and bugfixes to target-core + existing fabric module code, along with a handful of the patches destined for v3.3 stable. It also contains the necessary target-core infrastructure pieces required to run using tcm_qla2xxx.ko WWPNs with the new Qlogic Fibre Channel fabric module currently queued in target-pending/for-next-merge, and coming for round 2. The highlights for this series include: - Add target_submit_tmr() helper function for fabric task management (andy) - Convert tcm_fc to use target_submit_tmr() (andy) - Replace target core various cmd flags with a transport state (hch) - Convert loopback to use workqueue submission (hch) - Convert target core to use array_zalloc for tpg_lun_list (joern) - Convert target core to use array_zalloc for device_list (joern) - Add target core support for TMR_ABORT_TASK (nab) - Add target core se_sess->sess_kref + get/put helpers (nab) - Add target core se_node_acl->acl_kref for ->acl_free_comp usage (nab) - Convert iscsi-target to use target_put_session + sess_kref (nab) - Fix tcm_fc fc_exch memory leak in ft_send_resp_status (nab) - Fix ib_srpt srpt_handle_cmd send_ioctx->ioctx_kref leak on exception (nab) - Fix target core up handling of short INQUIRY buffers (roland) - Untangle target-core front-end and back-end meanings of max_sectors attribute (roland) - Set loopback residual field for SCSI commands (roland) - Fix target-core 16-bit target ports for SET TARGET PORT GROUPS emulation (roland) Thanks again to Andy, Christoph, Joern, Roland, and everyone who has contributed this round!" * 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending: (64 commits) ib_srpt: Fix srpt_handle_cmd send_ioctx->ioctx_kref leak on exception loopback: Fix transport_generic_allocate_tasks error handling iscsi-target: remove improper externs iscsi-target: Remove unused variables in iscsi_target_parameters.c target: remove obvious warnings target: Use array_zalloc for device_list target: Use array_zalloc for tpg_lun_list target: Fix sense code for unsupported SERVICE ACTION IN target: Remove hack to make READ CAPACITY(10) lie if thin provisioning is enabled target: Bump core version to v4.1.0-rc2-ml + fabric versions tcm_fc: Fix fc_exch memory leak in ft_send_resp_status target: Drop unused legacy target_core_fabric_ops API callers iscsi-target: Convert to use target_put_session + sess_kref target: Convert se_node_acl->acl_group removal to use ->acl_kref target: Add se_node_acl->acl_kref for ->acl_free_comp usage target: Add se_node_acl->acl_free_comp for NodeACL release path target: Add se_sess->sess_kref + get/put helpers target: Convert session_lock to irqsave target: Fix typo in drivers/target iscsi-target: Fix dynamic -> explict NodeACL pointer reference ...
Diffstat (limited to 'drivers/target/iscsi')
-rw-r--r--drivers/target/iscsi/iscsi_target.c41
-rw-r--r--drivers/target/iscsi/iscsi_target_configfs.c53
-rw-r--r--drivers/target/iscsi/iscsi_target_core.h2
-rw-r--r--drivers/target/iscsi/iscsi_target_device.c19
-rw-r--r--drivers/target/iscsi/iscsi_target_device.h2
-rw-r--r--drivers/target/iscsi/iscsi_target_erl0.c2
-rw-r--r--drivers/target/iscsi/iscsi_target_erl1.c2
-rw-r--r--drivers/target/iscsi/iscsi_target_login.c10
-rw-r--r--drivers/target/iscsi/iscsi_target_nego.c10
-rw-r--r--drivers/target/iscsi/iscsi_target_nodeattrib.c16
-rw-r--r--drivers/target/iscsi/iscsi_target_parameters.c19
-rw-r--r--drivers/target/iscsi/iscsi_target_tmr.c6
-rw-r--r--drivers/target/iscsi/iscsi_target_tq.c6
-rw-r--r--drivers/target/iscsi/iscsi_target_util.c7
14 files changed, 50 insertions, 145 deletions
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
index 1c6f700f5faa..8b1d5e62ed40 100644
--- a/drivers/target/iscsi/iscsi_target.c
+++ b/drivers/target/iscsi/iscsi_target.c
@@ -781,7 +781,7 @@ static int iscsit_alloc_buffs(struct iscsi_cmd *cmd)
781 struct scatterlist *sgl; 781 struct scatterlist *sgl;
782 u32 length = cmd->se_cmd.data_length; 782 u32 length = cmd->se_cmd.data_length;
783 int nents = DIV_ROUND_UP(length, PAGE_SIZE); 783 int nents = DIV_ROUND_UP(length, PAGE_SIZE);
784 int i = 0, ret; 784 int i = 0, j = 0, ret;
785 /* 785 /*
786 * If no SCSI payload is present, allocate the default iovecs used for 786 * If no SCSI payload is present, allocate the default iovecs used for
787 * iSCSI PDU Header 787 * iSCSI PDU Header
@@ -822,17 +822,15 @@ static int iscsit_alloc_buffs(struct iscsi_cmd *cmd)
822 */ 822 */
823 ret = iscsit_allocate_iovecs(cmd); 823 ret = iscsit_allocate_iovecs(cmd);
824 if (ret < 0) 824 if (ret < 0)
825 goto page_alloc_failed; 825 return -ENOMEM;
826 826
827 return 0; 827 return 0;
828 828
829page_alloc_failed: 829page_alloc_failed:
830 while (i >= 0) { 830 while (j < i)
831 __free_page(sg_page(&sgl[i])); 831 __free_page(sg_page(&sgl[j++]));
832 i--; 832
833 } 833 kfree(sgl);
834 kfree(cmd->t_mem_sg);
835 cmd->t_mem_sg = NULL;
836 return -ENOMEM; 834 return -ENOMEM;
837} 835}
838 836
@@ -1007,8 +1005,8 @@ done:
1007 /* 1005 /*
1008 * The CDB is going to an se_device_t. 1006 * The CDB is going to an se_device_t.
1009 */ 1007 */
1010 ret = iscsit_get_lun_for_cmd(cmd, hdr->cdb, 1008 ret = transport_lookup_cmd_lun(&cmd->se_cmd,
1011 get_unaligned_le64(&hdr->lun)); 1009 scsilun_to_int(&hdr->lun));
1012 if (ret < 0) { 1010 if (ret < 0) {
1013 if (cmd->se_cmd.scsi_sense_reason == TCM_NON_EXISTENT_LUN) { 1011 if (cmd->se_cmd.scsi_sense_reason == TCM_NON_EXISTENT_LUN) {
1014 pr_debug("Responding to non-acl'ed," 1012 pr_debug("Responding to non-acl'ed,"
@@ -1364,7 +1362,7 @@ static int iscsit_handle_data_out(struct iscsi_conn *conn, unsigned char *buf)
1364 * outstanding_r2ts reaches zero, go ahead and send the delayed 1362 * outstanding_r2ts reaches zero, go ahead and send the delayed
1365 * TASK_ABORTED status. 1363 * TASK_ABORTED status.
1366 */ 1364 */
1367 if (atomic_read(&se_cmd->t_transport_aborted) != 0) { 1365 if (se_cmd->transport_state & CMD_T_ABORTED) {
1368 if (hdr->flags & ISCSI_FLAG_CMD_FINAL) 1366 if (hdr->flags & ISCSI_FLAG_CMD_FINAL)
1369 if (--cmd->outstanding_r2ts < 1) { 1367 if (--cmd->outstanding_r2ts < 1) {
1370 iscsit_stop_dataout_timer(cmd); 1368 iscsit_stop_dataout_timer(cmd);
@@ -1472,14 +1470,12 @@ static int iscsit_handle_nop_out(
1472 unsigned char *ping_data = NULL; 1470 unsigned char *ping_data = NULL;
1473 int cmdsn_ret, niov = 0, ret = 0, rx_got, rx_size; 1471 int cmdsn_ret, niov = 0, ret = 0, rx_got, rx_size;
1474 u32 checksum, data_crc, padding = 0, payload_length; 1472 u32 checksum, data_crc, padding = 0, payload_length;
1475 u64 lun;
1476 struct iscsi_cmd *cmd = NULL; 1473 struct iscsi_cmd *cmd = NULL;
1477 struct kvec *iov = NULL; 1474 struct kvec *iov = NULL;
1478 struct iscsi_nopout *hdr; 1475 struct iscsi_nopout *hdr;
1479 1476
1480 hdr = (struct iscsi_nopout *) buf; 1477 hdr = (struct iscsi_nopout *) buf;
1481 payload_length = ntoh24(hdr->dlength); 1478 payload_length = ntoh24(hdr->dlength);
1482 lun = get_unaligned_le64(&hdr->lun);
1483 hdr->itt = be32_to_cpu(hdr->itt); 1479 hdr->itt = be32_to_cpu(hdr->itt);
1484 hdr->ttt = be32_to_cpu(hdr->ttt); 1480 hdr->ttt = be32_to_cpu(hdr->ttt);
1485 hdr->cmdsn = be32_to_cpu(hdr->cmdsn); 1481 hdr->cmdsn = be32_to_cpu(hdr->cmdsn);
@@ -1689,13 +1685,11 @@ static int iscsit_handle_task_mgt_cmd(
1689 struct se_tmr_req *se_tmr; 1685 struct se_tmr_req *se_tmr;
1690 struct iscsi_tmr_req *tmr_req; 1686 struct iscsi_tmr_req *tmr_req;
1691 struct iscsi_tm *hdr; 1687 struct iscsi_tm *hdr;
1692 u32 payload_length;
1693 int out_of_order_cmdsn = 0; 1688 int out_of_order_cmdsn = 0;
1694 int ret; 1689 int ret;
1695 u8 function; 1690 u8 function;
1696 1691
1697 hdr = (struct iscsi_tm *) buf; 1692 hdr = (struct iscsi_tm *) buf;
1698 payload_length = ntoh24(hdr->dlength);
1699 hdr->itt = be32_to_cpu(hdr->itt); 1693 hdr->itt = be32_to_cpu(hdr->itt);
1700 hdr->rtt = be32_to_cpu(hdr->rtt); 1694 hdr->rtt = be32_to_cpu(hdr->rtt);
1701 hdr->cmdsn = be32_to_cpu(hdr->cmdsn); 1695 hdr->cmdsn = be32_to_cpu(hdr->cmdsn);
@@ -1747,8 +1741,8 @@ static int iscsit_handle_task_mgt_cmd(
1747 * Locate the struct se_lun for all TMRs not related to ERL=2 TASK_REASSIGN 1741 * Locate the struct se_lun for all TMRs not related to ERL=2 TASK_REASSIGN
1748 */ 1742 */
1749 if (function != ISCSI_TM_FUNC_TASK_REASSIGN) { 1743 if (function != ISCSI_TM_FUNC_TASK_REASSIGN) {
1750 ret = iscsit_get_lun_for_tmr(cmd, 1744 ret = transport_lookup_tmr_lun(&cmd->se_cmd,
1751 get_unaligned_le64(&hdr->lun)); 1745 scsilun_to_int(&hdr->lun));
1752 if (ret < 0) { 1746 if (ret < 0) {
1753 cmd->se_cmd.se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION; 1747 cmd->se_cmd.se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
1754 se_tmr->response = ISCSI_TMF_RSP_NO_LUN; 1748 se_tmr->response = ISCSI_TMF_RSP_NO_LUN;
@@ -2207,14 +2201,10 @@ static int iscsit_handle_snack(
2207 struct iscsi_conn *conn, 2201 struct iscsi_conn *conn,
2208 unsigned char *buf) 2202 unsigned char *buf)
2209{ 2203{
2210 u32 unpacked_lun;
2211 u64 lun;
2212 struct iscsi_snack *hdr; 2204 struct iscsi_snack *hdr;
2213 2205
2214 hdr = (struct iscsi_snack *) buf; 2206 hdr = (struct iscsi_snack *) buf;
2215 hdr->flags &= ~ISCSI_FLAG_CMD_FINAL; 2207 hdr->flags &= ~ISCSI_FLAG_CMD_FINAL;
2216 lun = get_unaligned_le64(&hdr->lun);
2217 unpacked_lun = scsilun_to_int((struct scsi_lun *)&lun);
2218 hdr->itt = be32_to_cpu(hdr->itt); 2208 hdr->itt = be32_to_cpu(hdr->itt);
2219 hdr->ttt = be32_to_cpu(hdr->ttt); 2209 hdr->ttt = be32_to_cpu(hdr->ttt);
2220 hdr->exp_statsn = be32_to_cpu(hdr->exp_statsn); 2210 hdr->exp_statsn = be32_to_cpu(hdr->exp_statsn);
@@ -3514,7 +3504,6 @@ int iscsi_target_tx_thread(void *arg)
3514 struct iscsi_cmd *cmd = NULL; 3504 struct iscsi_cmd *cmd = NULL;
3515 struct iscsi_conn *conn; 3505 struct iscsi_conn *conn;
3516 struct iscsi_queue_req *qr = NULL; 3506 struct iscsi_queue_req *qr = NULL;
3517 struct se_cmd *se_cmd;
3518 struct iscsi_thread_set *ts = arg; 3507 struct iscsi_thread_set *ts = arg;
3519 /* 3508 /*
3520 * Allow ourselves to be interrupted by SIGINT so that a 3509 * Allow ourselves to be interrupted by SIGINT so that a
@@ -3697,8 +3686,6 @@ check_rsp_state:
3697 goto transport_err; 3686 goto transport_err;
3698 } 3687 }
3699 3688
3700 se_cmd = &cmd->se_cmd;
3701
3702 if (map_sg && !conn->conn_ops->IFMarker) { 3689 if (map_sg && !conn->conn_ops->IFMarker) {
3703 if (iscsit_fe_sendpage_sg(cmd, conn) < 0) { 3690 if (iscsit_fe_sendpage_sg(cmd, conn) < 0) {
3704 conn->tx_response_queue = 0; 3691 conn->tx_response_queue = 0;
@@ -4171,7 +4158,7 @@ int iscsit_close_connection(
4171 if (!atomic_read(&sess->session_reinstatement) && 4158 if (!atomic_read(&sess->session_reinstatement) &&
4172 atomic_read(&sess->session_fall_back_to_erl0)) { 4159 atomic_read(&sess->session_fall_back_to_erl0)) {
4173 spin_unlock_bh(&sess->conn_lock); 4160 spin_unlock_bh(&sess->conn_lock);
4174 iscsit_close_session(sess); 4161 target_put_session(sess->se_sess);
4175 4162
4176 return 0; 4163 return 0;
4177 } else if (atomic_read(&sess->session_logout)) { 4164 } else if (atomic_read(&sess->session_logout)) {
@@ -4292,7 +4279,7 @@ static void iscsit_logout_post_handler_closesession(
4292 iscsit_dec_conn_usage_count(conn); 4279 iscsit_dec_conn_usage_count(conn);
4293 iscsit_stop_session(sess, 1, 1); 4280 iscsit_stop_session(sess, 1, 1);
4294 iscsit_dec_session_usage_count(sess); 4281 iscsit_dec_session_usage_count(sess);
4295 iscsit_close_session(sess); 4282 target_put_session(sess->se_sess);
4296} 4283}
4297 4284
4298static void iscsit_logout_post_handler_samecid( 4285static void iscsit_logout_post_handler_samecid(
@@ -4458,7 +4445,7 @@ int iscsit_free_session(struct iscsi_session *sess)
4458 } else 4445 } else
4459 spin_unlock_bh(&sess->conn_lock); 4446 spin_unlock_bh(&sess->conn_lock);
4460 4447
4461 iscsit_close_session(sess); 4448 target_put_session(sess->se_sess);
4462 return 0; 4449 return 0;
4463} 4450}
4464 4451
diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c
index 6b35b37988ed..00c58cc82c85 100644
--- a/drivers/target/iscsi/iscsi_target_configfs.c
+++ b/drivers/target/iscsi/iscsi_target_configfs.c
@@ -812,9 +812,6 @@ static struct se_node_acl *lio_target_make_nodeacl(
812 if (!se_nacl_new) 812 if (!se_nacl_new)
813 return ERR_PTR(-ENOMEM); 813 return ERR_PTR(-ENOMEM);
814 814
815 acl = container_of(se_nacl_new, struct iscsi_node_acl,
816 se_node_acl);
817
818 cmdsn_depth = ISCSI_TPG_ATTRIB(tpg)->default_cmdsn_depth; 815 cmdsn_depth = ISCSI_TPG_ATTRIB(tpg)->default_cmdsn_depth;
819 /* 816 /*
820 * se_nacl_new may be released by core_tpg_add_initiator_node_acl() 817 * se_nacl_new may be released by core_tpg_add_initiator_node_acl()
@@ -825,7 +822,8 @@ static struct se_node_acl *lio_target_make_nodeacl(
825 if (IS_ERR(se_nacl)) 822 if (IS_ERR(se_nacl))
826 return se_nacl; 823 return se_nacl;
827 824
828 stats_cg = &acl->se_node_acl.acl_fabric_stat_group; 825 acl = container_of(se_nacl, struct iscsi_node_acl, se_node_acl);
826 stats_cg = &se_nacl->acl_fabric_stat_group;
829 827
830 stats_cg->default_groups = kzalloc(sizeof(struct config_group) * 2, 828 stats_cg->default_groups = kzalloc(sizeof(struct config_group) * 2,
831 GFP_KERNEL); 829 GFP_KERNEL);
@@ -1505,28 +1503,6 @@ static int iscsi_get_cmd_state(struct se_cmd *se_cmd)
1505 return cmd->i_state; 1503 return cmd->i_state;
1506} 1504}
1507 1505
1508static int iscsi_is_state_remove(struct se_cmd *se_cmd)
1509{
1510 struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
1511
1512 return (cmd->i_state == ISTATE_REMOVE);
1513}
1514
1515static int lio_sess_logged_in(struct se_session *se_sess)
1516{
1517 struct iscsi_session *sess = se_sess->fabric_sess_ptr;
1518 int ret;
1519 /*
1520 * Called with spin_lock_bh(&tpg_lock); and
1521 * spin_lock(&se_tpg->session_lock); held.
1522 */
1523 spin_lock(&sess->conn_lock);
1524 ret = (sess->session_state != TARG_SESS_STATE_LOGGED_IN);
1525 spin_unlock(&sess->conn_lock);
1526
1527 return ret;
1528}
1529
1530static u32 lio_sess_get_index(struct se_session *se_sess) 1506static u32 lio_sess_get_index(struct se_session *se_sess)
1531{ 1507{
1532 struct iscsi_session *sess = se_sess->fabric_sess_ptr; 1508 struct iscsi_session *sess = se_sess->fabric_sess_ptr;
@@ -1700,8 +1676,8 @@ static int lio_tpg_shutdown_session(struct se_session *se_sess)
1700 atomic_set(&sess->session_reinstatement, 1); 1676 atomic_set(&sess->session_reinstatement, 1);
1701 spin_unlock(&sess->conn_lock); 1677 spin_unlock(&sess->conn_lock);
1702 1678
1703 iscsit_inc_session_usage_count(sess);
1704 iscsit_stop_time2retain_timer(sess); 1679 iscsit_stop_time2retain_timer(sess);
1680 iscsit_stop_session(sess, 1, 1);
1705 1681
1706 return 1; 1682 return 1;
1707} 1683}
@@ -1717,28 +1693,9 @@ static void lio_tpg_close_session(struct se_session *se_sess)
1717 * If the iSCSI Session for the iSCSI Initiator Node exists, 1693 * If the iSCSI Session for the iSCSI Initiator Node exists,
1718 * forcefully shutdown the iSCSI NEXUS. 1694 * forcefully shutdown the iSCSI NEXUS.
1719 */ 1695 */
1720 iscsit_stop_session(sess, 1, 1);
1721 iscsit_dec_session_usage_count(sess);
1722 iscsit_close_session(sess); 1696 iscsit_close_session(sess);
1723} 1697}
1724 1698
1725static void lio_tpg_stop_session(
1726 struct se_session *se_sess,
1727 int sess_sleep,
1728 int conn_sleep)
1729{
1730 struct iscsi_session *sess = se_sess->fabric_sess_ptr;
1731
1732 iscsit_stop_session(sess, sess_sleep, conn_sleep);
1733}
1734
1735static void lio_tpg_fall_back_to_erl0(struct se_session *se_sess)
1736{
1737 struct iscsi_session *sess = se_sess->fabric_sess_ptr;
1738
1739 iscsit_fall_back_to_erl0(sess);
1740}
1741
1742static u32 lio_tpg_get_inst_index(struct se_portal_group *se_tpg) 1699static u32 lio_tpg_get_inst_index(struct se_portal_group *se_tpg)
1743{ 1700{
1744 struct iscsi_portal_group *tpg = se_tpg->se_tpg_fabric_ptr; 1701 struct iscsi_portal_group *tpg = se_tpg->se_tpg_fabric_ptr;
@@ -1802,9 +1759,6 @@ int iscsi_target_register_configfs(void)
1802 fabric->tf_ops.release_cmd = &lio_release_cmd; 1759 fabric->tf_ops.release_cmd = &lio_release_cmd;
1803 fabric->tf_ops.shutdown_session = &lio_tpg_shutdown_session; 1760 fabric->tf_ops.shutdown_session = &lio_tpg_shutdown_session;
1804 fabric->tf_ops.close_session = &lio_tpg_close_session; 1761 fabric->tf_ops.close_session = &lio_tpg_close_session;
1805 fabric->tf_ops.stop_session = &lio_tpg_stop_session;
1806 fabric->tf_ops.fall_back_to_erl0 = &lio_tpg_fall_back_to_erl0;
1807 fabric->tf_ops.sess_logged_in = &lio_sess_logged_in;
1808 fabric->tf_ops.sess_get_index = &lio_sess_get_index; 1762 fabric->tf_ops.sess_get_index = &lio_sess_get_index;
1809 fabric->tf_ops.sess_get_initiator_sid = &lio_sess_get_initiator_sid; 1763 fabric->tf_ops.sess_get_initiator_sid = &lio_sess_get_initiator_sid;
1810 fabric->tf_ops.write_pending = &lio_write_pending; 1764 fabric->tf_ops.write_pending = &lio_write_pending;
@@ -1818,7 +1772,6 @@ int iscsi_target_register_configfs(void)
1818 fabric->tf_ops.queue_tm_rsp = &lio_queue_tm_rsp; 1772 fabric->tf_ops.queue_tm_rsp = &lio_queue_tm_rsp;
1819 fabric->tf_ops.set_fabric_sense_len = &lio_set_fabric_sense_len; 1773 fabric->tf_ops.set_fabric_sense_len = &lio_set_fabric_sense_len;
1820 fabric->tf_ops.get_fabric_sense_len = &lio_get_fabric_sense_len; 1774 fabric->tf_ops.get_fabric_sense_len = &lio_get_fabric_sense_len;
1821 fabric->tf_ops.is_state_remove = &iscsi_is_state_remove;
1822 /* 1775 /*
1823 * Setup function pointers for generic logic in target_core_fabric_configfs.c 1776 * Setup function pointers for generic logic in target_core_fabric_configfs.c
1824 */ 1777 */
diff --git a/drivers/target/iscsi/iscsi_target_core.h b/drivers/target/iscsi/iscsi_target_core.h
index 0ec3b77a0c27..2aaee7efa683 100644
--- a/drivers/target/iscsi/iscsi_target_core.h
+++ b/drivers/target/iscsi/iscsi_target_core.h
@@ -9,7 +9,7 @@
9#include <scsi/iscsi_proto.h> 9#include <scsi/iscsi_proto.h>
10#include <target/target_core_base.h> 10#include <target/target_core_base.h>
11 11
12#define ISCSIT_VERSION "v4.1.0-rc1" 12#define ISCSIT_VERSION "v4.1.0-rc2"
13#define ISCSI_MAX_DATASN_MISSING_COUNT 16 13#define ISCSI_MAX_DATASN_MISSING_COUNT 16
14#define ISCSI_TX_THREAD_TCP_TIMEOUT 2 14#define ISCSI_TX_THREAD_TCP_TIMEOUT 2
15#define ISCSI_RX_THREAD_TCP_TIMEOUT 2 15#define ISCSI_RX_THREAD_TCP_TIMEOUT 2
diff --git a/drivers/target/iscsi/iscsi_target_device.c b/drivers/target/iscsi/iscsi_target_device.c
index f63ea35bc4ae..bcc409853a67 100644
--- a/drivers/target/iscsi/iscsi_target_device.c
+++ b/drivers/target/iscsi/iscsi_target_device.c
@@ -28,25 +28,6 @@
28#include "iscsi_target_tpg.h" 28#include "iscsi_target_tpg.h"
29#include "iscsi_target_util.h" 29#include "iscsi_target_util.h"
30 30
31int iscsit_get_lun_for_tmr(
32 struct iscsi_cmd *cmd,
33 u64 lun)
34{
35 u32 unpacked_lun = scsilun_to_int((struct scsi_lun *)&lun);
36
37 return transport_lookup_tmr_lun(&cmd->se_cmd, unpacked_lun);
38}
39
40int iscsit_get_lun_for_cmd(
41 struct iscsi_cmd *cmd,
42 unsigned char *cdb,
43 u64 lun)
44{
45 u32 unpacked_lun = scsilun_to_int((struct scsi_lun *)&lun);
46
47 return transport_lookup_cmd_lun(&cmd->se_cmd, unpacked_lun);
48}
49
50void iscsit_determine_maxcmdsn(struct iscsi_session *sess) 31void iscsit_determine_maxcmdsn(struct iscsi_session *sess)
51{ 32{
52 struct se_node_acl *se_nacl; 33 struct se_node_acl *se_nacl;
diff --git a/drivers/target/iscsi/iscsi_target_device.h b/drivers/target/iscsi/iscsi_target_device.h
index bef1cada15f8..a0e2df9e8090 100644
--- a/drivers/target/iscsi/iscsi_target_device.h
+++ b/drivers/target/iscsi/iscsi_target_device.h
@@ -1,8 +1,6 @@
1#ifndef ISCSI_TARGET_DEVICE_H 1#ifndef ISCSI_TARGET_DEVICE_H
2#define ISCSI_TARGET_DEVICE_H 2#define ISCSI_TARGET_DEVICE_H
3 3
4extern int iscsit_get_lun_for_tmr(struct iscsi_cmd *, u64);
5extern int iscsit_get_lun_for_cmd(struct iscsi_cmd *, unsigned char *, u64);
6extern void iscsit_determine_maxcmdsn(struct iscsi_session *); 4extern void iscsit_determine_maxcmdsn(struct iscsi_session *);
7extern void iscsit_increment_maxcmdsn(struct iscsi_cmd *, struct iscsi_session *); 5extern void iscsit_increment_maxcmdsn(struct iscsi_cmd *, struct iscsi_session *);
8 6
diff --git a/drivers/target/iscsi/iscsi_target_erl0.c b/drivers/target/iscsi/iscsi_target_erl0.c
index 478451167b62..1ab0560b0924 100644
--- a/drivers/target/iscsi/iscsi_target_erl0.c
+++ b/drivers/target/iscsi/iscsi_target_erl0.c
@@ -783,7 +783,7 @@ static void iscsit_handle_time2retain_timeout(unsigned long data)
783 } 783 }
784 784
785 spin_unlock_bh(&se_tpg->session_lock); 785 spin_unlock_bh(&se_tpg->session_lock);
786 iscsit_close_session(sess); 786 target_put_session(sess->se_sess);
787} 787}
788 788
789extern void iscsit_start_time2retain_handler(struct iscsi_session *sess) 789extern void iscsit_start_time2retain_handler(struct iscsi_session *sess)
diff --git a/drivers/target/iscsi/iscsi_target_erl1.c b/drivers/target/iscsi/iscsi_target_erl1.c
index 27901e37c125..006f605edb08 100644
--- a/drivers/target/iscsi/iscsi_target_erl1.c
+++ b/drivers/target/iscsi/iscsi_target_erl1.c
@@ -416,7 +416,7 @@ static int iscsit_handle_recovery_datain(
416 struct iscsi_datain_req *dr; 416 struct iscsi_datain_req *dr;
417 struct se_cmd *se_cmd = &cmd->se_cmd; 417 struct se_cmd *se_cmd = &cmd->se_cmd;
418 418
419 if (!atomic_read(&se_cmd->t_transport_complete)) { 419 if (!(se_cmd->transport_state & CMD_T_COMPLETE)) {
420 pr_err("Ignoring ITT: 0x%08x Data SNACK\n", 420 pr_err("Ignoring ITT: 0x%08x Data SNACK\n",
421 cmd->init_task_tag); 421 cmd->init_task_tag);
422 return 0; 422 return 0;
diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c
index 1ee33a8c3fab..a3656c9903a1 100644
--- a/drivers/target/iscsi/iscsi_target_login.c
+++ b/drivers/target/iscsi/iscsi_target_login.c
@@ -181,14 +181,16 @@ int iscsi_check_for_session_reinstatement(struct iscsi_conn *conn)
181 if (sess->session_state == TARG_SESS_STATE_FAILED) { 181 if (sess->session_state == TARG_SESS_STATE_FAILED) {
182 spin_unlock_bh(&sess->conn_lock); 182 spin_unlock_bh(&sess->conn_lock);
183 iscsit_dec_session_usage_count(sess); 183 iscsit_dec_session_usage_count(sess);
184 return iscsit_close_session(sess); 184 target_put_session(sess->se_sess);
185 return 0;
185 } 186 }
186 spin_unlock_bh(&sess->conn_lock); 187 spin_unlock_bh(&sess->conn_lock);
187 188
188 iscsit_stop_session(sess, 1, 1); 189 iscsit_stop_session(sess, 1, 1);
189 iscsit_dec_session_usage_count(sess); 190 iscsit_dec_session_usage_count(sess);
190 191
191 return iscsit_close_session(sess); 192 target_put_session(sess->se_sess);
193 return 0;
192} 194}
193 195
194static void iscsi_login_set_conn_values( 196static void iscsi_login_set_conn_values(
@@ -881,7 +883,7 @@ fail:
881static int __iscsi_target_login_thread(struct iscsi_np *np) 883static int __iscsi_target_login_thread(struct iscsi_np *np)
882{ 884{
883 u8 buffer[ISCSI_HDR_LEN], iscsi_opcode, zero_tsih = 0; 885 u8 buffer[ISCSI_HDR_LEN], iscsi_opcode, zero_tsih = 0;
884 int err, ret = 0, ip_proto, sock_type, set_sctp_conn_flag, stop; 886 int err, ret = 0, set_sctp_conn_flag, stop;
885 struct iscsi_conn *conn = NULL; 887 struct iscsi_conn *conn = NULL;
886 struct iscsi_login *login; 888 struct iscsi_login *login;
887 struct iscsi_portal_group *tpg = NULL; 889 struct iscsi_portal_group *tpg = NULL;
@@ -894,8 +896,6 @@ static int __iscsi_target_login_thread(struct iscsi_np *np)
894 flush_signals(current); 896 flush_signals(current);
895 set_sctp_conn_flag = 0; 897 set_sctp_conn_flag = 0;
896 sock = np->np_socket; 898 sock = np->np_socket;
897 ip_proto = np->np_ip_proto;
898 sock_type = np->np_sock_type;
899 899
900 spin_lock_bh(&np->np_thread_lock); 900 spin_lock_bh(&np->np_thread_lock);
901 if (np->np_thread_state == ISCSI_NP_THREAD_RESET) { 901 if (np->np_thread_state == ISCSI_NP_THREAD_RESET) {
diff --git a/drivers/target/iscsi/iscsi_target_nego.c b/drivers/target/iscsi/iscsi_target_nego.c
index e89fa7457254..2dba448cac19 100644
--- a/drivers/target/iscsi/iscsi_target_nego.c
+++ b/drivers/target/iscsi/iscsi_target_nego.c
@@ -90,7 +90,7 @@ int extract_param(
90 return -1; 90 return -1;
91 91
92 if (len > max_length) { 92 if (len > max_length) {
93 pr_err("Length of input: %d exeeds max_length:" 93 pr_err("Length of input: %d exceeds max_length:"
94 " %d\n", len, max_length); 94 " %d\n", len, max_length);
95 return -1; 95 return -1;
96 } 96 }
@@ -173,13 +173,11 @@ static int iscsi_target_check_login_request(
173 struct iscsi_conn *conn, 173 struct iscsi_conn *conn,
174 struct iscsi_login *login) 174 struct iscsi_login *login)
175{ 175{
176 int req_csg, req_nsg, rsp_csg, rsp_nsg; 176 int req_csg, req_nsg;
177 u32 payload_length; 177 u32 payload_length;
178 struct iscsi_login_req *login_req; 178 struct iscsi_login_req *login_req;
179 struct iscsi_login_rsp *login_rsp;
180 179
181 login_req = (struct iscsi_login_req *) login->req; 180 login_req = (struct iscsi_login_req *) login->req;
182 login_rsp = (struct iscsi_login_rsp *) login->rsp;
183 payload_length = ntoh24(login_req->dlength); 181 payload_length = ntoh24(login_req->dlength);
184 182
185 switch (login_req->opcode & ISCSI_OPCODE_MASK) { 183 switch (login_req->opcode & ISCSI_OPCODE_MASK) {
@@ -203,9 +201,7 @@ static int iscsi_target_check_login_request(
203 } 201 }
204 202
205 req_csg = (login_req->flags & ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK) >> 2; 203 req_csg = (login_req->flags & ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK) >> 2;
206 rsp_csg = (login_rsp->flags & ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK) >> 2;
207 req_nsg = (login_req->flags & ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK); 204 req_nsg = (login_req->flags & ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK);
208 rsp_nsg = (login_rsp->flags & ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK);
209 205
210 if (req_csg != login->current_stage) { 206 if (req_csg != login->current_stage) {
211 pr_err("Initiator unexpectedly changed login stage" 207 pr_err("Initiator unexpectedly changed login stage"
@@ -753,12 +749,10 @@ static int iscsi_target_locate_portal(
753 struct iscsi_session *sess = conn->sess; 749 struct iscsi_session *sess = conn->sess;
754 struct iscsi_tiqn *tiqn; 750 struct iscsi_tiqn *tiqn;
755 struct iscsi_login_req *login_req; 751 struct iscsi_login_req *login_req;
756 struct iscsi_targ_login_rsp *login_rsp;
757 u32 payload_length; 752 u32 payload_length;
758 int sessiontype = 0, ret = 0; 753 int sessiontype = 0, ret = 0;
759 754
760 login_req = (struct iscsi_login_req *) login->req; 755 login_req = (struct iscsi_login_req *) login->req;
761 login_rsp = (struct iscsi_targ_login_rsp *) login->rsp;
762 payload_length = ntoh24(login_req->dlength); 756 payload_length = ntoh24(login_req->dlength);
763 757
764 login->first_request = 1; 758 login->first_request = 1;
diff --git a/drivers/target/iscsi/iscsi_target_nodeattrib.c b/drivers/target/iscsi/iscsi_target_nodeattrib.c
index b3c699c4fe8c..11dc2936af76 100644
--- a/drivers/target/iscsi/iscsi_target_nodeattrib.c
+++ b/drivers/target/iscsi/iscsi_target_nodeattrib.c
@@ -49,7 +49,7 @@ void iscsit_set_default_node_attribues(
49 a->default_erl = NA_DEFAULT_ERL; 49 a->default_erl = NA_DEFAULT_ERL;
50} 50}
51 51
52extern int iscsit_na_dataout_timeout( 52int iscsit_na_dataout_timeout(
53 struct iscsi_node_acl *acl, 53 struct iscsi_node_acl *acl,
54 u32 dataout_timeout) 54 u32 dataout_timeout)
55{ 55{
@@ -74,7 +74,7 @@ extern int iscsit_na_dataout_timeout(
74 return 0; 74 return 0;
75} 75}
76 76
77extern int iscsit_na_dataout_timeout_retries( 77int iscsit_na_dataout_timeout_retries(
78 struct iscsi_node_acl *acl, 78 struct iscsi_node_acl *acl,
79 u32 dataout_timeout_retries) 79 u32 dataout_timeout_retries)
80{ 80{
@@ -100,7 +100,7 @@ extern int iscsit_na_dataout_timeout_retries(
100 return 0; 100 return 0;
101} 101}
102 102
103extern int iscsit_na_nopin_timeout( 103int iscsit_na_nopin_timeout(
104 struct iscsi_node_acl *acl, 104 struct iscsi_node_acl *acl,
105 u32 nopin_timeout) 105 u32 nopin_timeout)
106{ 106{
@@ -155,7 +155,7 @@ extern int iscsit_na_nopin_timeout(
155 return 0; 155 return 0;
156} 156}
157 157
158extern int iscsit_na_nopin_response_timeout( 158int iscsit_na_nopin_response_timeout(
159 struct iscsi_node_acl *acl, 159 struct iscsi_node_acl *acl,
160 u32 nopin_response_timeout) 160 u32 nopin_response_timeout)
161{ 161{
@@ -181,7 +181,7 @@ extern int iscsit_na_nopin_response_timeout(
181 return 0; 181 return 0;
182} 182}
183 183
184extern int iscsit_na_random_datain_pdu_offsets( 184int iscsit_na_random_datain_pdu_offsets(
185 struct iscsi_node_acl *acl, 185 struct iscsi_node_acl *acl,
186 u32 random_datain_pdu_offsets) 186 u32 random_datain_pdu_offsets)
187{ 187{
@@ -201,7 +201,7 @@ extern int iscsit_na_random_datain_pdu_offsets(
201 return 0; 201 return 0;
202} 202}
203 203
204extern int iscsit_na_random_datain_seq_offsets( 204int iscsit_na_random_datain_seq_offsets(
205 struct iscsi_node_acl *acl, 205 struct iscsi_node_acl *acl,
206 u32 random_datain_seq_offsets) 206 u32 random_datain_seq_offsets)
207{ 207{
@@ -221,7 +221,7 @@ extern int iscsit_na_random_datain_seq_offsets(
221 return 0; 221 return 0;
222} 222}
223 223
224extern int iscsit_na_random_r2t_offsets( 224int iscsit_na_random_r2t_offsets(
225 struct iscsi_node_acl *acl, 225 struct iscsi_node_acl *acl,
226 u32 random_r2t_offsets) 226 u32 random_r2t_offsets)
227{ 227{
@@ -241,7 +241,7 @@ extern int iscsit_na_random_r2t_offsets(
241 return 0; 241 return 0;
242} 242}
243 243
244extern int iscsit_na_default_erl( 244int iscsit_na_default_erl(
245 struct iscsi_node_acl *acl, 245 struct iscsi_node_acl *acl,
246 u32 default_erl) 246 u32 default_erl)
247{ 247{
diff --git a/drivers/target/iscsi/iscsi_target_parameters.c b/drivers/target/iscsi/iscsi_target_parameters.c
index 5b773160200f..eb05c9d751ea 100644
--- a/drivers/target/iscsi/iscsi_target_parameters.c
+++ b/drivers/target/iscsi/iscsi_target_parameters.c
@@ -874,8 +874,8 @@ static int iscsi_check_numerical_value(struct iscsi_param *param, char *value_pt
874static int iscsi_check_numerical_range_value(struct iscsi_param *param, char *value) 874static int iscsi_check_numerical_range_value(struct iscsi_param *param, char *value)
875{ 875{
876 char *left_val_ptr = NULL, *right_val_ptr = NULL; 876 char *left_val_ptr = NULL, *right_val_ptr = NULL;
877 char *tilde_ptr = NULL, *tmp_ptr = NULL; 877 char *tilde_ptr = NULL;
878 u32 left_val, right_val, local_left_val, local_right_val; 878 u32 left_val, right_val, local_left_val;
879 879
880 if (strcmp(param->name, IFMARKINT) && 880 if (strcmp(param->name, IFMARKINT) &&
881 strcmp(param->name, OFMARKINT)) { 881 strcmp(param->name, OFMARKINT)) {
@@ -903,8 +903,8 @@ static int iscsi_check_numerical_range_value(struct iscsi_param *param, char *va
903 if (iscsi_check_numerical_value(param, right_val_ptr) < 0) 903 if (iscsi_check_numerical_value(param, right_val_ptr) < 0)
904 return -1; 904 return -1;
905 905
906 left_val = simple_strtoul(left_val_ptr, &tmp_ptr, 0); 906 left_val = simple_strtoul(left_val_ptr, NULL, 0);
907 right_val = simple_strtoul(right_val_ptr, &tmp_ptr, 0); 907 right_val = simple_strtoul(right_val_ptr, NULL, 0);
908 *tilde_ptr = '~'; 908 *tilde_ptr = '~';
909 909
910 if (right_val < left_val) { 910 if (right_val < left_val) {
@@ -928,8 +928,7 @@ static int iscsi_check_numerical_range_value(struct iscsi_param *param, char *va
928 left_val_ptr = param->value; 928 left_val_ptr = param->value;
929 right_val_ptr = param->value + strlen(left_val_ptr) + 1; 929 right_val_ptr = param->value + strlen(left_val_ptr) + 1;
930 930
931 local_left_val = simple_strtoul(left_val_ptr, &tmp_ptr, 0); 931 local_left_val = simple_strtoul(left_val_ptr, NULL, 0);
932 local_right_val = simple_strtoul(right_val_ptr, &tmp_ptr, 0);
933 *tilde_ptr = '~'; 932 *tilde_ptr = '~';
934 933
935 if (param->set_param) { 934 if (param->set_param) {
@@ -1189,7 +1188,7 @@ static int iscsi_check_proposer_state(struct iscsi_param *param, char *value)
1189 if (IS_TYPE_NUMBER_RANGE(param)) { 1188 if (IS_TYPE_NUMBER_RANGE(param)) {
1190 u32 left_val = 0, right_val = 0, recieved_value = 0; 1189 u32 left_val = 0, right_val = 0, recieved_value = 0;
1191 char *left_val_ptr = NULL, *right_val_ptr = NULL; 1190 char *left_val_ptr = NULL, *right_val_ptr = NULL;
1192 char *tilde_ptr = NULL, *tmp_ptr = NULL; 1191 char *tilde_ptr = NULL;
1193 1192
1194 if (!strcmp(value, IRRELEVANT) || !strcmp(value, REJECT)) { 1193 if (!strcmp(value, IRRELEVANT) || !strcmp(value, REJECT)) {
1195 if (iscsi_update_param_value(param, value) < 0) 1194 if (iscsi_update_param_value(param, value) < 0)
@@ -1213,9 +1212,9 @@ static int iscsi_check_proposer_state(struct iscsi_param *param, char *value)
1213 1212
1214 left_val_ptr = param->value; 1213 left_val_ptr = param->value;
1215 right_val_ptr = param->value + strlen(left_val_ptr) + 1; 1214 right_val_ptr = param->value + strlen(left_val_ptr) + 1;
1216 left_val = simple_strtoul(left_val_ptr, &tmp_ptr, 0); 1215 left_val = simple_strtoul(left_val_ptr, NULL, 0);
1217 right_val = simple_strtoul(right_val_ptr, &tmp_ptr, 0); 1216 right_val = simple_strtoul(right_val_ptr, NULL, 0);
1218 recieved_value = simple_strtoul(value, &tmp_ptr, 0); 1217 recieved_value = simple_strtoul(value, NULL, 0);
1219 1218
1220 *tilde_ptr = '~'; 1219 *tilde_ptr = '~';
1221 1220
diff --git a/drivers/target/iscsi/iscsi_target_tmr.c b/drivers/target/iscsi/iscsi_target_tmr.c
index 255ed35da815..e01da9d2b37e 100644
--- a/drivers/target/iscsi/iscsi_target_tmr.c
+++ b/drivers/target/iscsi/iscsi_target_tmr.c
@@ -250,7 +250,7 @@ static int iscsit_task_reassign_complete_write(
250 * so if we have received all DataOUT we can safety ignore Initiator. 250 * so if we have received all DataOUT we can safety ignore Initiator.
251 */ 251 */
252 if (cmd->cmd_flags & ICF_GOT_LAST_DATAOUT) { 252 if (cmd->cmd_flags & ICF_GOT_LAST_DATAOUT) {
253 if (!atomic_read(&cmd->se_cmd.t_transport_sent)) { 253 if (!(cmd->se_cmd.transport_state & CMD_T_SENT)) {
254 pr_debug("WRITE ITT: 0x%08x: t_state: %d" 254 pr_debug("WRITE ITT: 0x%08x: t_state: %d"
255 " never sent to transport\n", 255 " never sent to transport\n",
256 cmd->init_task_tag, cmd->se_cmd.t_state); 256 cmd->init_task_tag, cmd->se_cmd.t_state);
@@ -314,7 +314,7 @@ static int iscsit_task_reassign_complete_read(
314 cmd->acked_data_sn = (tmr_req->exp_data_sn - 1); 314 cmd->acked_data_sn = (tmr_req->exp_data_sn - 1);
315 } 315 }
316 316
317 if (!atomic_read(&cmd->se_cmd.t_transport_sent)) { 317 if (!(cmd->se_cmd.transport_state & CMD_T_SENT)) {
318 pr_debug("READ ITT: 0x%08x: t_state: %d never sent to" 318 pr_debug("READ ITT: 0x%08x: t_state: %d never sent to"
319 " transport\n", cmd->init_task_tag, 319 " transport\n", cmd->init_task_tag,
320 cmd->se_cmd.t_state); 320 cmd->se_cmd.t_state);
@@ -322,7 +322,7 @@ static int iscsit_task_reassign_complete_read(
322 return 0; 322 return 0;
323 } 323 }
324 324
325 if (!atomic_read(&se_cmd->t_transport_complete)) { 325 if (!(se_cmd->transport_state & CMD_T_COMPLETE)) {
326 pr_err("READ ITT: 0x%08x: t_state: %d, never returned" 326 pr_err("READ ITT: 0x%08x: t_state: %d, never returned"
327 " from transport\n", cmd->init_task_tag, 327 " from transport\n", cmd->init_task_tag,
328 cmd->se_cmd.t_state); 328 cmd->se_cmd.t_state);
diff --git a/drivers/target/iscsi/iscsi_target_tq.c b/drivers/target/iscsi/iscsi_target_tq.c
index 0baac5bcebd4..977e1cf90e83 100644
--- a/drivers/target/iscsi/iscsi_target_tq.c
+++ b/drivers/target/iscsi/iscsi_target_tq.c
@@ -536,12 +536,6 @@ int iscsi_thread_set_init(void)
536 return -ENOMEM; 536 return -ENOMEM;
537 } 537 }
538 538
539 spin_lock_init(&active_ts_lock);
540 spin_lock_init(&inactive_ts_lock);
541 spin_lock_init(&ts_bitmap_lock);
542 INIT_LIST_HEAD(&active_ts_list);
543 INIT_LIST_HEAD(&inactive_ts_list);
544
545 return 0; 539 return 0;
546} 540}
547 541
diff --git a/drivers/target/iscsi/iscsi_target_util.c b/drivers/target/iscsi/iscsi_target_util.c
index 11287e1ece13..4eba86d2bd82 100644
--- a/drivers/target/iscsi/iscsi_target_util.c
+++ b/drivers/target/iscsi/iscsi_target_util.c
@@ -229,6 +229,7 @@ struct iscsi_cmd *iscsit_allocate_se_cmd_for_tmr(
229{ 229{
230 struct iscsi_cmd *cmd; 230 struct iscsi_cmd *cmd;
231 struct se_cmd *se_cmd; 231 struct se_cmd *se_cmd;
232 int rc;
232 u8 tcm_function; 233 u8 tcm_function;
233 234
234 cmd = iscsit_allocate_cmd(conn, GFP_KERNEL); 235 cmd = iscsit_allocate_cmd(conn, GFP_KERNEL);
@@ -286,10 +287,8 @@ struct iscsi_cmd *iscsit_allocate_se_cmd_for_tmr(
286 goto out; 287 goto out;
287 } 288 }
288 289
289 se_cmd->se_tmr_req = core_tmr_alloc_req(se_cmd, 290 rc = core_tmr_alloc_req(se_cmd, cmd->tmr_req, tcm_function, GFP_KERNEL);
290 cmd->tmr_req, tcm_function, 291 if (rc < 0)
291 GFP_KERNEL);
292 if (!se_cmd->se_tmr_req)
293 goto out; 292 goto out;
294 293
295 cmd->tmr_req->se_tmr_req = se_cmd->se_tmr_req; 294 cmd->tmr_req->se_tmr_req = se_cmd->se_tmr_req;