Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull more SCSI updates from James Bottomley: "This is the set of changes collected since just before the merge window opened. It's mostly minor fixes in drivers. The one non-driver set is the three optical disk (sr) changes where two are error path fixes and one is a helper conversion. The big driver change is the hpsa compat_alloc_userspace rework by Al so he can kill the remaining user. This has been tested and acked by the maintainer" * tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (21 commits) scsi: acornscsi: Fix an error handling path in acornscsi_probe() scsi: storvsc: Remove memset before memory freeing in storvsc_suspend() scsi: cxlflash: Remove an unnecessary NULL check scsi: ibmvscsi: Don't send host info in adapter info MAD after LPM scsi: sr: Fix sr_probe() missing deallocate of device minor scsi: sr: Fix sr_probe() missing mutex_destroy scsi: st: Convert convert get_user_pages() --> pin_user_pages() scsi: target: Rename target_setup_cmd_from_cdb() to target_cmd_parse_cdb() scsi: target: Fix NULL pointer dereference scsi: target: Initialize LUN in transport_init_se_cmd() scsi: target: Factor out a new helper, target_cmd_init_cdb() scsi: hpsa: hpsa_ioctl(): Tidy up a bit scsi: hpsa: Get rid of compat_alloc_user_space() scsi: hpsa: Don't bother with vmalloc for BIG_IOCTL_Command_struct scsi: hpsa: Lift {BIG_,}IOCTL_Command_struct copy{in,out} into hpsa_ioctl() scsi: ufs: Remove redundant urgent_bkop_lvl initialization scsi: ufs: Don't update urgent bkops level when toggling auto bkops scsi: qedf: Remove redundant initialization of variable rc scsi: mpt3sas: Fix memset() in non-RDPQ mode scsi: iscsi: Fix reference count leak in iscsi_boot_create_kobj ...
This commit is contained in:
@@ -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,
|
||||
conn->sess->se_sess, be32_to_cpu(hdr->data_length),
|
||||
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,"
|
||||
" ExpXferLen: %u, Length: %u, CID: %hu\n", hdr->itt,
|
||||
@@ -1167,22 +1167,25 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
||||
|
||||
target_get_sess_cmd(&cmd->se_cmd, true);
|
||||
|
||||
cmd->sense_reason = transport_lookup_cmd_lun(&cmd->se_cmd,
|
||||
scsilun_to_int(&hdr->lun));
|
||||
cmd->sense_reason = target_cmd_init_cdb(&cmd->se_cmd, hdr->cdb);
|
||||
if (cmd->sense_reason) {
|
||||
if (cmd->sense_reason == TCM_OUT_OF_RESOURCES) {
|
||||
return iscsit_add_reject_cmd(cmd,
|
||||
ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf);
|
||||
}
|
||||
|
||||
goto attach_cmd;
|
||||
}
|
||||
|
||||
cmd->sense_reason = transport_lookup_cmd_lun(&cmd->se_cmd);
|
||||
if (cmd->sense_reason)
|
||||
goto attach_cmd;
|
||||
|
||||
/* only used for printks or comparing with ->ref_task_tag */
|
||||
cmd->se_cmd.tag = (__force u32)cmd->init_task_tag;
|
||||
cmd->sense_reason = target_setup_cmd_from_cdb(&cmd->se_cmd, hdr->cdb);
|
||||
if (cmd->sense_reason) {
|
||||
if (cmd->sense_reason == TCM_OUT_OF_RESOURCES) {
|
||||
return iscsit_add_reject_cmd(cmd,
|
||||
ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf);
|
||||
}
|
||||
|
||||
cmd->sense_reason = target_cmd_parse_cdb(&cmd->se_cmd);
|
||||
if (cmd->sense_reason)
|
||||
goto attach_cmd;
|
||||
}
|
||||
|
||||
if (iscsit_build_pdu_and_seq_lists(cmd, payload_length) < 0) {
|
||||
return iscsit_add_reject_cmd(cmd,
|
||||
@@ -2000,7 +2003,8 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
||||
|
||||
transport_init_se_cmd(&cmd->se_cmd, &iscsi_ops,
|
||||
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);
|
||||
|
||||
@@ -2038,8 +2042,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
|
||||
*/
|
||||
if (function != ISCSI_TM_FUNC_TASK_REASSIGN) {
|
||||
ret = transport_lookup_tmr_lun(&cmd->se_cmd,
|
||||
scsilun_to_int(&hdr->lun));
|
||||
ret = transport_lookup_tmr_lun(&cmd->se_cmd);
|
||||
if (ret < 0) {
|
||||
se_tmr->response = ISCSI_TMF_RSP_NO_LUN;
|
||||
goto attach;
|
||||
|
@@ -45,7 +45,7 @@ static struct se_hba *lun0_hba;
|
||||
struct se_device *g_lun0_dev;
|
||||
|
||||
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_session *se_sess = se_cmd->se_sess;
|
||||
@@ -54,7 +54,7 @@ transport_lookup_cmd_lun(struct se_cmd *se_cmd, u64 unpacked_lun)
|
||||
sense_reason_t ret = TCM_NO_SENSE;
|
||||
|
||||
rcu_read_lock();
|
||||
deve = target_nacl_find_deve(nacl, unpacked_lun);
|
||||
deve = target_nacl_find_deve(nacl, se_cmd->orig_fe_lun);
|
||||
if (deve) {
|
||||
atomic_long_inc(&deve->total_cmds);
|
||||
|
||||
@@ -74,7 +74,6 @@ transport_lookup_cmd_lun(struct se_cmd *se_cmd, u64 unpacked_lun)
|
||||
|
||||
se_cmd->se_lun = se_lun;
|
||||
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->lun_ref_active = true;
|
||||
|
||||
@@ -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"
|
||||
" Access for 0x%08llx\n",
|
||||
se_cmd->se_tfo->fabric_name,
|
||||
unpacked_lun);
|
||||
se_cmd->orig_fe_lun);
|
||||
rcu_read_unlock();
|
||||
ret = TCM_WRITE_PROTECTED;
|
||||
goto ref_dev;
|
||||
@@ -98,18 +97,17 @@ out_unlock:
|
||||
* REPORT_LUNS, et al to be returned when no active
|
||||
* 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"
|
||||
" Access for 0x%08llx from %s\n",
|
||||
se_cmd->se_tfo->fabric_name,
|
||||
unpacked_lun,
|
||||
se_cmd->orig_fe_lun,
|
||||
nacl->initiatorname);
|
||||
return TCM_NON_EXISTENT_LUN;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
percpu_ref_get(&se_lun->lun_ref);
|
||||
@@ -145,7 +143,7 @@ ref_dev:
|
||||
}
|
||||
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_lun *se_lun = NULL;
|
||||
@@ -155,7 +153,7 @@ int transport_lookup_tmr_lun(struct se_cmd *se_cmd, u64 unpacked_lun)
|
||||
unsigned long flags;
|
||||
|
||||
rcu_read_lock();
|
||||
deve = target_nacl_find_deve(nacl, unpacked_lun);
|
||||
deve = target_nacl_find_deve(nacl, se_cmd->orig_fe_lun);
|
||||
if (deve) {
|
||||
se_lun = rcu_dereference(deve->se_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->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->lun_ref_active = true;
|
||||
}
|
||||
@@ -177,7 +174,7 @@ out_unlock:
|
||||
pr_debug("TARGET_CORE[%s]: Detected NON_EXISTENT_LUN"
|
||||
" Access for 0x%08llx for %s\n",
|
||||
se_cmd->se_tfo->fabric_name,
|
||||
unpacked_lun,
|
||||
se_cmd->orig_fe_lun,
|
||||
nacl->initiatorname);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
@@ -148,8 +148,8 @@ void core_tmr_abort_task(
|
||||
* code.
|
||||
*/
|
||||
if (!tmr->tmr_dev)
|
||||
WARN_ON_ONCE(transport_lookup_tmr_lun(tmr->task_cmd,
|
||||
se_cmd->orig_fe_lun) < 0);
|
||||
WARN_ON_ONCE(transport_lookup_tmr_lun(tmr->task_cmd) <
|
||||
0);
|
||||
|
||||
target_put_cmd_and_wait(se_cmd);
|
||||
|
||||
|
@@ -1364,7 +1364,7 @@ void transport_init_se_cmd(
|
||||
u32 data_length,
|
||||
int data_direction,
|
||||
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_qf_node);
|
||||
@@ -1383,6 +1383,7 @@ void transport_init_se_cmd(
|
||||
cmd->data_direction = data_direction;
|
||||
cmd->sam_task_attr = task_attr;
|
||||
cmd->sense_buffer = sense_buffer;
|
||||
cmd->orig_fe_lun = unpacked_lun;
|
||||
|
||||
cmd->state_active = false;
|
||||
}
|
||||
@@ -1410,11 +1411,11 @@ transport_check_alloc_task_attr(struct se_cmd *cmd)
|
||||
}
|
||||
|
||||
sense_reason_t
|
||||
target_setup_cmd_from_cdb(struct se_cmd *cmd, unsigned char *cdb)
|
||||
target_cmd_init_cdb(struct se_cmd *cmd, unsigned char *cdb)
|
||||
{
|
||||
struct se_device *dev = cmd->se_dev;
|
||||
sense_reason_t ret;
|
||||
|
||||
cmd->t_task_cdb = &cmd->__t_task_cdb[0];
|
||||
/*
|
||||
* Ensure that the received CDB is less than the max (252 + 8) bytes
|
||||
* for VARIABLE_LENGTH_CMD
|
||||
@@ -1423,7 +1424,8 @@ target_setup_cmd_from_cdb(struct se_cmd *cmd, unsigned char *cdb)
|
||||
pr_err("Received SCSI CDB with command_size: %d that"
|
||||
" exceeds SCSI_MAX_VARLEN_CDB_SIZE: %d\n",
|
||||
scsi_command_size(cdb), SCSI_MAX_VARLEN_CDB_SIZE);
|
||||
return TCM_INVALID_CDB_FIELD;
|
||||
ret = TCM_INVALID_CDB_FIELD;
|
||||
goto err;
|
||||
}
|
||||
/*
|
||||
* If the received CDB is larger than TCM_MAX_COMMAND_SIZE,
|
||||
@@ -1438,16 +1440,34 @@ target_setup_cmd_from_cdb(struct se_cmd *cmd, unsigned char *cdb)
|
||||
" %u > sizeof(cmd->__t_task_cdb): %lu ops\n",
|
||||
scsi_command_size(cdb),
|
||||
(unsigned long)sizeof(cmd->__t_task_cdb));
|
||||
return TCM_OUT_OF_RESOURCES;
|
||||
ret = TCM_OUT_OF_RESOURCES;
|
||||
goto err;
|
||||
}
|
||||
} else
|
||||
cmd->t_task_cdb = &cmd->__t_task_cdb[0];
|
||||
}
|
||||
/*
|
||||
* Copy the original CDB into cmd->
|
||||
*/
|
||||
memcpy(cmd->t_task_cdb, cdb, scsi_command_size(cdb));
|
||||
|
||||
trace_target_sequencer_start(cmd);
|
||||
return 0;
|
||||
|
||||
err:
|
||||
/*
|
||||
* Copy the CDB here to allow trace_target_cmd_complete() to
|
||||
* print the cdb to the trace buffers.
|
||||
*/
|
||||
memcpy(cmd->t_task_cdb, cdb, min(scsi_command_size(cdb),
|
||||
(unsigned int)TCM_MAX_COMMAND_SIZE));
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(target_cmd_init_cdb);
|
||||
|
||||
sense_reason_t
|
||||
target_cmd_parse_cdb(struct se_cmd *cmd)
|
||||
{
|
||||
struct se_device *dev = cmd->se_dev;
|
||||
sense_reason_t ret;
|
||||
|
||||
ret = dev->transport->parse_cdb(cmd);
|
||||
if (ret == TCM_UNSUPPORTED_SCSI_OPCODE)
|
||||
@@ -1466,7 +1486,7 @@ target_setup_cmd_from_cdb(struct se_cmd *cmd, unsigned char *cdb)
|
||||
atomic_long_inc(&cmd->se_lun->lun_stats.cmd_pdus);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(target_setup_cmd_from_cdb);
|
||||
EXPORT_SYMBOL(target_cmd_parse_cdb);
|
||||
|
||||
/*
|
||||
* Used by fabric module frontends to queue tasks directly.
|
||||
@@ -1588,7 +1608,8 @@ int target_submit_cmd_map_sgls(struct se_cmd *se_cmd, struct se_session *se_sess
|
||||
* target_core_fabric_ops->queue_status() callback
|
||||
*/
|
||||
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)
|
||||
se_cmd->se_cmd_flags |= SCF_USE_CPUID;
|
||||
@@ -1611,17 +1632,25 @@ int target_submit_cmd_map_sgls(struct se_cmd *se_cmd, struct se_session *se_sess
|
||||
*/
|
||||
if (flags & TARGET_SCF_BIDI_OP)
|
||||
se_cmd->se_cmd_flags |= SCF_BIDI;
|
||||
/*
|
||||
* Locate se_lun pointer and attach it to struct se_cmd
|
||||
*/
|
||||
rc = transport_lookup_cmd_lun(se_cmd, unpacked_lun);
|
||||
|
||||
rc = target_cmd_init_cdb(se_cmd, cdb);
|
||||
if (rc) {
|
||||
transport_send_check_condition_and_sense(se_cmd, rc, 0);
|
||||
target_put_sess_cmd(se_cmd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
rc = target_setup_cmd_from_cdb(se_cmd, cdb);
|
||||
/*
|
||||
* Locate se_lun pointer and attach it to struct se_cmd
|
||||
*/
|
||||
rc = transport_lookup_cmd_lun(se_cmd);
|
||||
if (rc) {
|
||||
transport_send_check_condition_and_sense(se_cmd, rc, 0);
|
||||
target_put_sess_cmd(se_cmd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
rc = target_cmd_parse_cdb(se_cmd);
|
||||
if (rc != 0) {
|
||||
transport_generic_request_failure(se_cmd, rc);
|
||||
return 0;
|
||||
@@ -1782,7 +1811,7 @@ int target_submit_tmr(struct se_cmd *se_cmd, struct se_session *se_sess,
|
||||
BUG_ON(!se_tpg);
|
||||
|
||||
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
|
||||
* allocation failure.
|
||||
@@ -1810,7 +1839,7 @@ int target_submit_tmr(struct se_cmd *se_cmd, struct se_session *se_sess,
|
||||
goto failure;
|
||||
}
|
||||
|
||||
ret = transport_lookup_tmr_lun(se_cmd, unpacked_lun);
|
||||
ret = transport_lookup_tmr_lun(se_cmd);
|
||||
if (ret)
|
||||
goto failure;
|
||||
|
||||
|
@@ -1007,7 +1007,7 @@ static int queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, sense_reason_t *scsi_err)
|
||||
entry->hdr.cmd_id = 0; /* not used for PAD */
|
||||
entry->hdr.kflags = 0;
|
||||
entry->hdr.uflags = 0;
|
||||
tcmu_flush_dcache_range(entry, sizeof(*entry));
|
||||
tcmu_flush_dcache_range(entry, sizeof(entry->hdr));
|
||||
|
||||
UPDATE_HEAD(mb->cmd_head, pad_size, udev->cmdr_size);
|
||||
tcmu_flush_dcache_range(mb, sizeof(*mb));
|
||||
@@ -1072,7 +1072,7 @@ static int queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, sense_reason_t *scsi_err)
|
||||
cdb_off = CMDR_OFF + cmd_head + base_command_size;
|
||||
memcpy((void *) mb + cdb_off, se_cmd->t_task_cdb, scsi_command_size(se_cmd->t_task_cdb));
|
||||
entry->req.cdb_off = cdb_off;
|
||||
tcmu_flush_dcache_range(entry, sizeof(*entry));
|
||||
tcmu_flush_dcache_range(entry, command_size);
|
||||
|
||||
UPDATE_HEAD(mb->cmd_head, command_size, udev->cmdr_size);
|
||||
tcmu_flush_dcache_range(mb, sizeof(*mb));
|
||||
|
@@ -526,8 +526,11 @@ static int target_xcopy_setup_pt_cmd(
|
||||
}
|
||||
cmd->se_cmd_flags |= SCF_SE_LUN_CMD;
|
||||
|
||||
if (target_cmd_init_cdb(cmd, cdb))
|
||||
return -EINVAL;
|
||||
|
||||
cmd->tag = 0;
|
||||
if (target_setup_cmd_from_cdb(cmd, cdb))
|
||||
if (target_cmd_parse_cdb(cmd))
|
||||
return -EINVAL;
|
||||
|
||||
if (transport_generic_map_mem_to_cmd(cmd, xop->xop_data_sg,
|
||||
@@ -585,7 +588,7 @@ static int target_xcopy_read_source(
|
||||
(unsigned long long)src_lba, src_sectors, 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],
|
||||
remote_port);
|
||||
@@ -630,7 +633,7 @@ static int target_xcopy_write_destination(
|
||||
(unsigned long long)dst_lba, dst_sectors, 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],
|
||||
remote_port);
|
||||
|
Reference in New Issue
Block a user