Commit a36840d8 authored by Sudhakar Panneerselvam's avatar Sudhakar Panneerselvam Committed by Martin K. Petersen

scsi: target: Initialize LUN in transport_init_se_cmd()

Initialization of orig_fe_lun is moved to transport_init_se_cmd() from
transport_lookup_cmd_lun(). This helps for the cases where the SCSI request
fails before the call to transport_lookup_cmd_lun() so that
trace_target_cmd_complete() can print the LUN information to the trace
buffer. Due to this change, the lun parameter is removed from
transport_lookup_cmd_lun() and transport_lookup_tmr_lun().

Link: https://lore.kernel.org/r/1591559913-8388-3-git-send-email-sudhakar.panneerselvam@oracle.comReviewed-by: default avatarMike Christie <michael.christie@oracle.com>
Signed-off-by: default avatarSudhakar Panneerselvam <sudhakar.panneerselvam@oracle.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent f98c2ddf
...@@ -1158,7 +1158,7 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, ...@@ -1158,7 +1158,7 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
transport_init_se_cmd(&cmd->se_cmd, &iscsi_ops, transport_init_se_cmd(&cmd->se_cmd, &iscsi_ops,
conn->sess->se_sess, be32_to_cpu(hdr->data_length), conn->sess->se_sess, be32_to_cpu(hdr->data_length),
cmd->data_direction, sam_task_attr, cmd->data_direction, sam_task_attr,
cmd->sense_buffer + 2); cmd->sense_buffer + 2, scsilun_to_int(&hdr->lun));
pr_debug("Got SCSI Command, ITT: 0x%08x, CmdSN: 0x%08x," pr_debug("Got SCSI Command, ITT: 0x%08x, CmdSN: 0x%08x,"
" ExpXferLen: %u, Length: %u, CID: %hu\n", hdr->itt, " ExpXferLen: %u, Length: %u, CID: %hu\n", hdr->itt,
...@@ -1167,8 +1167,7 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, ...@@ -1167,8 +1167,7 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
target_get_sess_cmd(&cmd->se_cmd, true); target_get_sess_cmd(&cmd->se_cmd, true);
cmd->sense_reason = transport_lookup_cmd_lun(&cmd->se_cmd, cmd->sense_reason = transport_lookup_cmd_lun(&cmd->se_cmd);
scsilun_to_int(&hdr->lun));
if (cmd->sense_reason) if (cmd->sense_reason)
goto attach_cmd; goto attach_cmd;
...@@ -2000,7 +1999,8 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, ...@@ -2000,7 +1999,8 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
transport_init_se_cmd(&cmd->se_cmd, &iscsi_ops, transport_init_se_cmd(&cmd->se_cmd, &iscsi_ops,
conn->sess->se_sess, 0, DMA_NONE, conn->sess->se_sess, 0, DMA_NONE,
TCM_SIMPLE_TAG, cmd->sense_buffer + 2); TCM_SIMPLE_TAG, cmd->sense_buffer + 2,
scsilun_to_int(&hdr->lun));
target_get_sess_cmd(&cmd->se_cmd, true); target_get_sess_cmd(&cmd->se_cmd, true);
...@@ -2038,8 +2038,7 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, ...@@ -2038,8 +2038,7 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
* Locate the struct se_lun for all TMRs not related to ERL=2 TASK_REASSIGN * Locate the struct se_lun for all TMRs not related to ERL=2 TASK_REASSIGN
*/ */
if (function != ISCSI_TM_FUNC_TASK_REASSIGN) { if (function != ISCSI_TM_FUNC_TASK_REASSIGN) {
ret = transport_lookup_tmr_lun(&cmd->se_cmd, ret = transport_lookup_tmr_lun(&cmd->se_cmd);
scsilun_to_int(&hdr->lun));
if (ret < 0) { if (ret < 0) {
se_tmr->response = ISCSI_TMF_RSP_NO_LUN; se_tmr->response = ISCSI_TMF_RSP_NO_LUN;
goto attach; goto attach;
......
...@@ -45,7 +45,7 @@ static struct se_hba *lun0_hba; ...@@ -45,7 +45,7 @@ static struct se_hba *lun0_hba;
struct se_device *g_lun0_dev; struct se_device *g_lun0_dev;
sense_reason_t sense_reason_t
transport_lookup_cmd_lun(struct se_cmd *se_cmd, u64 unpacked_lun) transport_lookup_cmd_lun(struct se_cmd *se_cmd)
{ {
struct se_lun *se_lun = NULL; struct se_lun *se_lun = NULL;
struct se_session *se_sess = se_cmd->se_sess; struct se_session *se_sess = se_cmd->se_sess;
...@@ -54,7 +54,7 @@ transport_lookup_cmd_lun(struct se_cmd *se_cmd, u64 unpacked_lun) ...@@ -54,7 +54,7 @@ transport_lookup_cmd_lun(struct se_cmd *se_cmd, u64 unpacked_lun)
sense_reason_t ret = TCM_NO_SENSE; sense_reason_t ret = TCM_NO_SENSE;
rcu_read_lock(); rcu_read_lock();
deve = target_nacl_find_deve(nacl, unpacked_lun); deve = target_nacl_find_deve(nacl, se_cmd->orig_fe_lun);
if (deve) { if (deve) {
atomic_long_inc(&deve->total_cmds); atomic_long_inc(&deve->total_cmds);
...@@ -74,7 +74,6 @@ transport_lookup_cmd_lun(struct se_cmd *se_cmd, u64 unpacked_lun) ...@@ -74,7 +74,6 @@ transport_lookup_cmd_lun(struct se_cmd *se_cmd, u64 unpacked_lun)
se_cmd->se_lun = se_lun; se_cmd->se_lun = se_lun;
se_cmd->pr_res_key = deve->pr_res_key; se_cmd->pr_res_key = deve->pr_res_key;
se_cmd->orig_fe_lun = unpacked_lun;
se_cmd->se_cmd_flags |= SCF_SE_LUN_CMD; se_cmd->se_cmd_flags |= SCF_SE_LUN_CMD;
se_cmd->lun_ref_active = true; se_cmd->lun_ref_active = true;
...@@ -83,7 +82,7 @@ transport_lookup_cmd_lun(struct se_cmd *se_cmd, u64 unpacked_lun) ...@@ -83,7 +82,7 @@ transport_lookup_cmd_lun(struct se_cmd *se_cmd, u64 unpacked_lun)
pr_err("TARGET_CORE[%s]: Detected WRITE_PROTECTED LUN" pr_err("TARGET_CORE[%s]: Detected WRITE_PROTECTED LUN"
" Access for 0x%08llx\n", " Access for 0x%08llx\n",
se_cmd->se_tfo->fabric_name, se_cmd->se_tfo->fabric_name,
unpacked_lun); se_cmd->orig_fe_lun);
rcu_read_unlock(); rcu_read_unlock();
ret = TCM_WRITE_PROTECTED; ret = TCM_WRITE_PROTECTED;
goto ref_dev; goto ref_dev;
...@@ -98,18 +97,17 @@ transport_lookup_cmd_lun(struct se_cmd *se_cmd, u64 unpacked_lun) ...@@ -98,18 +97,17 @@ transport_lookup_cmd_lun(struct se_cmd *se_cmd, u64 unpacked_lun)
* REPORT_LUNS, et al to be returned when no active * REPORT_LUNS, et al to be returned when no active
* MappedLUN=0 exists for this Initiator Port. * MappedLUN=0 exists for this Initiator Port.
*/ */
if (unpacked_lun != 0) { if (se_cmd->orig_fe_lun != 0) {
pr_err("TARGET_CORE[%s]: Detected NON_EXISTENT_LUN" pr_err("TARGET_CORE[%s]: Detected NON_EXISTENT_LUN"
" Access for 0x%08llx from %s\n", " Access for 0x%08llx from %s\n",
se_cmd->se_tfo->fabric_name, se_cmd->se_tfo->fabric_name,
unpacked_lun, se_cmd->orig_fe_lun,
nacl->initiatorname); nacl->initiatorname);
return TCM_NON_EXISTENT_LUN; return TCM_NON_EXISTENT_LUN;
} }
se_lun = se_sess->se_tpg->tpg_virt_lun0; se_lun = se_sess->se_tpg->tpg_virt_lun0;
se_cmd->se_lun = se_sess->se_tpg->tpg_virt_lun0; se_cmd->se_lun = se_sess->se_tpg->tpg_virt_lun0;
se_cmd->orig_fe_lun = 0;
se_cmd->se_cmd_flags |= SCF_SE_LUN_CMD; se_cmd->se_cmd_flags |= SCF_SE_LUN_CMD;
percpu_ref_get(&se_lun->lun_ref); percpu_ref_get(&se_lun->lun_ref);
...@@ -145,7 +143,7 @@ transport_lookup_cmd_lun(struct se_cmd *se_cmd, u64 unpacked_lun) ...@@ -145,7 +143,7 @@ transport_lookup_cmd_lun(struct se_cmd *se_cmd, u64 unpacked_lun)
} }
EXPORT_SYMBOL(transport_lookup_cmd_lun); EXPORT_SYMBOL(transport_lookup_cmd_lun);
int transport_lookup_tmr_lun(struct se_cmd *se_cmd, u64 unpacked_lun) int transport_lookup_tmr_lun(struct se_cmd *se_cmd)
{ {
struct se_dev_entry *deve; struct se_dev_entry *deve;
struct se_lun *se_lun = NULL; struct se_lun *se_lun = NULL;
...@@ -155,7 +153,7 @@ int transport_lookup_tmr_lun(struct se_cmd *se_cmd, u64 unpacked_lun) ...@@ -155,7 +153,7 @@ int transport_lookup_tmr_lun(struct se_cmd *se_cmd, u64 unpacked_lun)
unsigned long flags; unsigned long flags;
rcu_read_lock(); rcu_read_lock();
deve = target_nacl_find_deve(nacl, unpacked_lun); deve = target_nacl_find_deve(nacl, se_cmd->orig_fe_lun);
if (deve) { if (deve) {
se_lun = rcu_dereference(deve->se_lun); se_lun = rcu_dereference(deve->se_lun);
...@@ -166,7 +164,6 @@ int transport_lookup_tmr_lun(struct se_cmd *se_cmd, u64 unpacked_lun) ...@@ -166,7 +164,6 @@ int transport_lookup_tmr_lun(struct se_cmd *se_cmd, u64 unpacked_lun)
se_cmd->se_lun = se_lun; se_cmd->se_lun = se_lun;
se_cmd->pr_res_key = deve->pr_res_key; se_cmd->pr_res_key = deve->pr_res_key;
se_cmd->orig_fe_lun = unpacked_lun;
se_cmd->se_cmd_flags |= SCF_SE_LUN_CMD; se_cmd->se_cmd_flags |= SCF_SE_LUN_CMD;
se_cmd->lun_ref_active = true; se_cmd->lun_ref_active = true;
} }
...@@ -177,7 +174,7 @@ int transport_lookup_tmr_lun(struct se_cmd *se_cmd, u64 unpacked_lun) ...@@ -177,7 +174,7 @@ int transport_lookup_tmr_lun(struct se_cmd *se_cmd, u64 unpacked_lun)
pr_debug("TARGET_CORE[%s]: Detected NON_EXISTENT_LUN" pr_debug("TARGET_CORE[%s]: Detected NON_EXISTENT_LUN"
" Access for 0x%08llx for %s\n", " Access for 0x%08llx for %s\n",
se_cmd->se_tfo->fabric_name, se_cmd->se_tfo->fabric_name,
unpacked_lun, se_cmd->orig_fe_lun,
nacl->initiatorname); nacl->initiatorname);
return -ENODEV; return -ENODEV;
} }
......
...@@ -148,8 +148,8 @@ void core_tmr_abort_task( ...@@ -148,8 +148,8 @@ void core_tmr_abort_task(
* code. * code.
*/ */
if (!tmr->tmr_dev) if (!tmr->tmr_dev)
WARN_ON_ONCE(transport_lookup_tmr_lun(tmr->task_cmd, WARN_ON_ONCE(transport_lookup_tmr_lun(tmr->task_cmd) <
se_cmd->orig_fe_lun) < 0); 0);
target_put_cmd_and_wait(se_cmd); target_put_cmd_and_wait(se_cmd);
......
...@@ -1364,7 +1364,7 @@ void transport_init_se_cmd( ...@@ -1364,7 +1364,7 @@ void transport_init_se_cmd(
u32 data_length, u32 data_length,
int data_direction, int data_direction,
int task_attr, int task_attr,
unsigned char *sense_buffer) unsigned char *sense_buffer, u64 unpacked_lun)
{ {
INIT_LIST_HEAD(&cmd->se_delayed_node); INIT_LIST_HEAD(&cmd->se_delayed_node);
INIT_LIST_HEAD(&cmd->se_qf_node); INIT_LIST_HEAD(&cmd->se_qf_node);
...@@ -1383,6 +1383,7 @@ void transport_init_se_cmd( ...@@ -1383,6 +1383,7 @@ void transport_init_se_cmd(
cmd->data_direction = data_direction; cmd->data_direction = data_direction;
cmd->sam_task_attr = task_attr; cmd->sam_task_attr = task_attr;
cmd->sense_buffer = sense_buffer; cmd->sense_buffer = sense_buffer;
cmd->orig_fe_lun = unpacked_lun;
cmd->state_active = false; cmd->state_active = false;
} }
...@@ -1596,7 +1597,8 @@ int target_submit_cmd_map_sgls(struct se_cmd *se_cmd, struct se_session *se_sess ...@@ -1596,7 +1597,8 @@ int target_submit_cmd_map_sgls(struct se_cmd *se_cmd, struct se_session *se_sess
* target_core_fabric_ops->queue_status() callback * target_core_fabric_ops->queue_status() callback
*/ */
transport_init_se_cmd(se_cmd, se_tpg->se_tpg_tfo, se_sess, transport_init_se_cmd(se_cmd, se_tpg->se_tpg_tfo, se_sess,
data_length, data_dir, task_attr, sense); data_length, data_dir, task_attr, sense,
unpacked_lun);
if (flags & TARGET_SCF_USE_CPUID) if (flags & TARGET_SCF_USE_CPUID)
se_cmd->se_cmd_flags |= SCF_USE_CPUID; se_cmd->se_cmd_flags |= SCF_USE_CPUID;
...@@ -1622,7 +1624,7 @@ int target_submit_cmd_map_sgls(struct se_cmd *se_cmd, struct se_session *se_sess ...@@ -1622,7 +1624,7 @@ int target_submit_cmd_map_sgls(struct se_cmd *se_cmd, struct se_session *se_sess
/* /*
* Locate se_lun pointer and attach it to struct se_cmd * Locate se_lun pointer and attach it to struct se_cmd
*/ */
rc = transport_lookup_cmd_lun(se_cmd, unpacked_lun); rc = transport_lookup_cmd_lun(se_cmd);
if (rc) { if (rc) {
transport_send_check_condition_and_sense(se_cmd, rc, 0); transport_send_check_condition_and_sense(se_cmd, rc, 0);
target_put_sess_cmd(se_cmd); target_put_sess_cmd(se_cmd);
...@@ -1790,7 +1792,7 @@ int target_submit_tmr(struct se_cmd *se_cmd, struct se_session *se_sess, ...@@ -1790,7 +1792,7 @@ int target_submit_tmr(struct se_cmd *se_cmd, struct se_session *se_sess,
BUG_ON(!se_tpg); BUG_ON(!se_tpg);
transport_init_se_cmd(se_cmd, se_tpg->se_tpg_tfo, se_sess, transport_init_se_cmd(se_cmd, se_tpg->se_tpg_tfo, se_sess,
0, DMA_NONE, TCM_SIMPLE_TAG, sense); 0, DMA_NONE, TCM_SIMPLE_TAG, sense, unpacked_lun);
/* /*
* FIXME: Currently expect caller to handle se_cmd->se_tmr_req * FIXME: Currently expect caller to handle se_cmd->se_tmr_req
* allocation failure. * allocation failure.
...@@ -1818,7 +1820,7 @@ int target_submit_tmr(struct se_cmd *se_cmd, struct se_session *se_sess, ...@@ -1818,7 +1820,7 @@ int target_submit_tmr(struct se_cmd *se_cmd, struct se_session *se_sess,
goto failure; goto failure;
} }
ret = transport_lookup_tmr_lun(se_cmd, unpacked_lun); ret = transport_lookup_tmr_lun(se_cmd);
if (ret) if (ret)
goto failure; goto failure;
......
...@@ -585,7 +585,7 @@ static int target_xcopy_read_source( ...@@ -585,7 +585,7 @@ static int target_xcopy_read_source(
(unsigned long long)src_lba, src_sectors, length); (unsigned long long)src_lba, src_sectors, length);
transport_init_se_cmd(se_cmd, &xcopy_pt_tfo, &xcopy_pt_sess, length, transport_init_se_cmd(se_cmd, &xcopy_pt_tfo, &xcopy_pt_sess, length,
DMA_FROM_DEVICE, 0, &xpt_cmd.sense_buffer[0]); DMA_FROM_DEVICE, 0, &xpt_cmd.sense_buffer[0], 0);
rc = target_xcopy_setup_pt_cmd(&xpt_cmd, xop, src_dev, &cdb[0], rc = target_xcopy_setup_pt_cmd(&xpt_cmd, xop, src_dev, &cdb[0],
remote_port); remote_port);
...@@ -630,7 +630,7 @@ static int target_xcopy_write_destination( ...@@ -630,7 +630,7 @@ static int target_xcopy_write_destination(
(unsigned long long)dst_lba, dst_sectors, length); (unsigned long long)dst_lba, dst_sectors, length);
transport_init_se_cmd(se_cmd, &xcopy_pt_tfo, &xcopy_pt_sess, length, transport_init_se_cmd(se_cmd, &xcopy_pt_tfo, &xcopy_pt_sess, length,
DMA_TO_DEVICE, 0, &xpt_cmd.sense_buffer[0]); DMA_TO_DEVICE, 0, &xpt_cmd.sense_buffer[0], 0);
rc = target_xcopy_setup_pt_cmd(&xpt_cmd, xop, dst_dev, &cdb[0], rc = target_xcopy_setup_pt_cmd(&xpt_cmd, xop, dst_dev, &cdb[0],
remote_port); remote_port);
......
...@@ -1049,7 +1049,8 @@ static void usbg_cmd_work(struct work_struct *work) ...@@ -1049,7 +1049,8 @@ static void usbg_cmd_work(struct work_struct *work)
transport_init_se_cmd(se_cmd, transport_init_se_cmd(se_cmd,
tv_nexus->tvn_se_sess->se_tpg->se_tpg_tfo, tv_nexus->tvn_se_sess->se_tpg->se_tpg_tfo,
tv_nexus->tvn_se_sess, cmd->data_len, DMA_NONE, tv_nexus->tvn_se_sess, cmd->data_len, DMA_NONE,
cmd->prio_attr, cmd->sense_iu.sense); cmd->prio_attr, cmd->sense_iu.sense,
cmd->unpacked_lun);
goto out; goto out;
} }
...@@ -1179,7 +1180,8 @@ static void bot_cmd_work(struct work_struct *work) ...@@ -1179,7 +1180,8 @@ static void bot_cmd_work(struct work_struct *work)
transport_init_se_cmd(se_cmd, transport_init_se_cmd(se_cmd,
tv_nexus->tvn_se_sess->se_tpg->se_tpg_tfo, tv_nexus->tvn_se_sess->se_tpg->se_tpg_tfo,
tv_nexus->tvn_se_sess, cmd->data_len, DMA_NONE, tv_nexus->tvn_se_sess, cmd->data_len, DMA_NONE,
cmd->prio_attr, cmd->sense_iu.sense); cmd->prio_attr, cmd->sense_iu.sense,
cmd->unpacked_lun);
goto out; goto out;
} }
......
...@@ -150,8 +150,8 @@ void transport_deregister_session(struct se_session *); ...@@ -150,8 +150,8 @@ void transport_deregister_session(struct se_session *);
void transport_init_se_cmd(struct se_cmd *, void transport_init_se_cmd(struct se_cmd *,
const struct target_core_fabric_ops *, const struct target_core_fabric_ops *,
struct se_session *, u32, int, int, unsigned char *); struct se_session *, u32, int, int, unsigned char *, u64);
sense_reason_t transport_lookup_cmd_lun(struct se_cmd *, u64); sense_reason_t transport_lookup_cmd_lun(struct se_cmd *);
sense_reason_t target_cmd_init_cdb(struct se_cmd *, unsigned char *); sense_reason_t target_cmd_init_cdb(struct se_cmd *, unsigned char *);
sense_reason_t target_setup_cmd_from_cdb(struct se_cmd *, unsigned char *); sense_reason_t target_setup_cmd_from_cdb(struct se_cmd *, unsigned char *);
int target_submit_cmd_map_sgls(struct se_cmd *, struct se_session *, int target_submit_cmd_map_sgls(struct se_cmd *, struct se_session *,
...@@ -188,7 +188,7 @@ int core_tmr_alloc_req(struct se_cmd *, void *, u8, gfp_t); ...@@ -188,7 +188,7 @@ int core_tmr_alloc_req(struct se_cmd *, void *, u8, gfp_t);
void core_tmr_release_req(struct se_tmr_req *); void core_tmr_release_req(struct se_tmr_req *);
int transport_generic_handle_tmr(struct se_cmd *); int transport_generic_handle_tmr(struct se_cmd *);
void transport_generic_request_failure(struct se_cmd *, sense_reason_t); void transport_generic_request_failure(struct se_cmd *, sense_reason_t);
int transport_lookup_tmr_lun(struct se_cmd *, u64); int transport_lookup_tmr_lun(struct se_cmd *);
void core_allocate_nexus_loss_ua(struct se_node_acl *acl); void core_allocate_nexus_loss_ua(struct se_node_acl *acl);
struct se_node_acl *core_tpg_get_initiator_node_acl(struct se_portal_group *tpg, struct se_node_acl *core_tpg_get_initiator_node_acl(struct se_portal_group *tpg,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment