Commit 3df83e16 authored by Linus Torvalds's avatar Linus Torvalds

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
  ...
parents 91fa5884 42c76c98
...@@ -2911,8 +2911,10 @@ static int acornscsi_probe(struct expansion_card *ec, const struct ecard_id *id) ...@@ -2911,8 +2911,10 @@ static int acornscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
ashost->base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0); ashost->base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0);
ashost->fast = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0); ashost->fast = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0);
if (!ashost->base || !ashost->fast) if (!ashost->base || !ashost->fast) {
ret = -ENOMEM;
goto out_put; goto out_put;
}
host->irq = ec->irq; host->irq = ec->irq;
ashost->host = host; ashost->host = host;
......
...@@ -47,9 +47,6 @@ static void process_cmd_err(struct afu_cmd *cmd, struct scsi_cmnd *scp) ...@@ -47,9 +47,6 @@ static void process_cmd_err(struct afu_cmd *cmd, struct scsi_cmnd *scp)
struct sisl_ioasa *ioasa; struct sisl_ioasa *ioasa;
u32 resid; u32 resid;
if (unlikely(!cmd))
return;
ioasa = &(cmd->sa); ioasa = &(cmd->sa);
if (ioasa->rc.flags & SISL_RC_FLAGS_UNDERRUN) { if (ioasa->rc.flags & SISL_RC_FLAGS_UNDERRUN) {
......
This diff is collapsed.
...@@ -415,6 +415,8 @@ static int ibmvscsi_reenable_crq_queue(struct crq_queue *queue, ...@@ -415,6 +415,8 @@ static int ibmvscsi_reenable_crq_queue(struct crq_queue *queue,
int rc = 0; int rc = 0;
struct vio_dev *vdev = to_vio_dev(hostdata->dev); struct vio_dev *vdev = to_vio_dev(hostdata->dev);
set_adapter_info(hostdata);
/* Re-enable the CRQ */ /* Re-enable the CRQ */
do { do {
if (rc) if (rc)
......
...@@ -352,7 +352,7 @@ iscsi_boot_create_kobj(struct iscsi_boot_kset *boot_kset, ...@@ -352,7 +352,7 @@ iscsi_boot_create_kobj(struct iscsi_boot_kset *boot_kset,
boot_kobj->kobj.kset = boot_kset->kset; boot_kobj->kobj.kset = boot_kset->kset;
if (kobject_init_and_add(&boot_kobj->kobj, &iscsi_boot_ktype, if (kobject_init_and_add(&boot_kobj->kobj, &iscsi_boot_ktype,
NULL, name, index)) { NULL, name, index)) {
kfree(boot_kobj); kobject_put(&boot_kobj->kobj);
return NULL; return NULL;
} }
boot_kobj->data = data; boot_kobj->data = data;
......
...@@ -4984,7 +4984,7 @@ base_alloc_rdpq_dma_pool(struct MPT3SAS_ADAPTER *ioc, int sz) ...@@ -4984,7 +4984,7 @@ base_alloc_rdpq_dma_pool(struct MPT3SAS_ADAPTER *ioc, int sz)
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
if ((i % RDPQ_MAX_INDEX_IN_ONE_CHUNK == 0) && dma_alloc_count) { if ((i % RDPQ_MAX_INDEX_IN_ONE_CHUNK == 0) && dma_alloc_count) {
ioc->reply_post[i].reply_post_free = ioc->reply_post[i].reply_post_free =
dma_pool_alloc(ioc->reply_post_free_dma_pool, dma_pool_zalloc(ioc->reply_post_free_dma_pool,
GFP_KERNEL, GFP_KERNEL,
&ioc->reply_post[i].reply_post_free_dma); &ioc->reply_post[i].reply_post_free_dma);
if (!ioc->reply_post[i].reply_post_free) if (!ioc->reply_post[i].reply_post_free)
...@@ -5008,9 +5008,6 @@ base_alloc_rdpq_dma_pool(struct MPT3SAS_ADAPTER *ioc, int sz) ...@@ -5008,9 +5008,6 @@ base_alloc_rdpq_dma_pool(struct MPT3SAS_ADAPTER *ioc, int sz)
ioc->reply_post[i].reply_post_free_dma)); ioc->reply_post[i].reply_post_free_dma));
return -EAGAIN; return -EAGAIN;
} }
memset(ioc->reply_post[i].reply_post_free, 0,
RDPQ_MAX_INDEX_IN_ONE_CHUNK *
reply_post_free_sz);
dma_alloc_count--; dma_alloc_count--;
} else { } else {
......
...@@ -20,7 +20,7 @@ void qedf_fcoe_send_vlan_req(struct qedf_ctx *qedf) ...@@ -20,7 +20,7 @@ void qedf_fcoe_send_vlan_req(struct qedf_ctx *qedf)
#define MY_FIP_ALL_FCF_MACS ((__u8[6]) { 1, 0x10, 0x18, 1, 0, 2 }) #define MY_FIP_ALL_FCF_MACS ((__u8[6]) { 1, 0x10, 0x18, 1, 0, 2 })
static u8 my_fcoe_all_fcfs[ETH_ALEN] = MY_FIP_ALL_FCF_MACS; static u8 my_fcoe_all_fcfs[ETH_ALEN] = MY_FIP_ALL_FCF_MACS;
unsigned long flags = 0; unsigned long flags = 0;
int rc = -1; int rc;
skb = dev_alloc_skb(sizeof(struct fip_vlan)); skb = dev_alloc_skb(sizeof(struct fip_vlan));
if (!skb) { if (!skb) {
......
...@@ -792,7 +792,7 @@ static int sr_probe(struct device *dev) ...@@ -792,7 +792,7 @@ static int sr_probe(struct device *dev)
disk->queue = sdev->request_queue; disk->queue = sdev->request_queue;
if (register_cdrom(disk, &cd->cdi)) if (register_cdrom(disk, &cd->cdi))
goto fail_put; goto fail_minor;
/* /*
* Initialize block layer runtime PM stuffs before the * Initialize block layer runtime PM stuffs before the
...@@ -810,8 +810,13 @@ static int sr_probe(struct device *dev) ...@@ -810,8 +810,13 @@ static int sr_probe(struct device *dev)
return 0; return 0;
fail_minor:
spin_lock(&sr_index_lock);
clear_bit(minor, sr_index_bits);
spin_unlock(&sr_index_lock);
fail_put: fail_put:
put_disk(disk); put_disk(disk);
mutex_destroy(&cd->lock);
fail_free: fail_free:
kfree(cd); kfree(cd);
fail: fail:
......
...@@ -4921,7 +4921,7 @@ static int sgl_map_user_pages(struct st_buffer *STbp, ...@@ -4921,7 +4921,7 @@ static int sgl_map_user_pages(struct st_buffer *STbp,
unsigned long end = (uaddr + count + PAGE_SIZE - 1) >> PAGE_SHIFT; unsigned long end = (uaddr + count + PAGE_SIZE - 1) >> PAGE_SHIFT;
unsigned long start = uaddr >> PAGE_SHIFT; unsigned long start = uaddr >> PAGE_SHIFT;
const int nr_pages = end - start; const int nr_pages = end - start;
int res, i, j; int res, i;
struct page **pages; struct page **pages;
struct rq_map_data *mdata = &STbp->map_data; struct rq_map_data *mdata = &STbp->map_data;
...@@ -4943,7 +4943,7 @@ static int sgl_map_user_pages(struct st_buffer *STbp, ...@@ -4943,7 +4943,7 @@ static int sgl_map_user_pages(struct st_buffer *STbp,
/* Try to fault in all of the necessary pages */ /* Try to fault in all of the necessary pages */
/* rw==READ means read from drive, write into memory area */ /* rw==READ means read from drive, write into memory area */
res = get_user_pages_fast(uaddr, nr_pages, rw == READ ? FOLL_WRITE : 0, res = pin_user_pages_fast(uaddr, nr_pages, rw == READ ? FOLL_WRITE : 0,
pages); pages);
/* Errors and no page mapped should return here */ /* Errors and no page mapped should return here */
...@@ -4963,8 +4963,7 @@ static int sgl_map_user_pages(struct st_buffer *STbp, ...@@ -4963,8 +4963,7 @@ static int sgl_map_user_pages(struct st_buffer *STbp,
return nr_pages; return nr_pages;
out_unmap: out_unmap:
if (res > 0) { if (res > 0) {
for (j=0; j < res; j++) unpin_user_pages(pages, res);
put_page(pages[j]);
res = 0; res = 0;
} }
kfree(pages); kfree(pages);
...@@ -4976,18 +4975,9 @@ static int sgl_map_user_pages(struct st_buffer *STbp, ...@@ -4976,18 +4975,9 @@ static int sgl_map_user_pages(struct st_buffer *STbp,
static int sgl_unmap_user_pages(struct st_buffer *STbp, static int sgl_unmap_user_pages(struct st_buffer *STbp,
const unsigned int nr_pages, int dirtied) const unsigned int nr_pages, int dirtied)
{ {
int i; /* FIXME: cache flush missing for rw==READ */
unpin_user_pages_dirty_lock(STbp->mapped_pages, nr_pages, dirtied);
for (i=0; i < nr_pages; i++) {
struct page *page = STbp->mapped_pages[i];
if (dirtied)
SetPageDirty(page);
/* FIXME: cache flush missing for rw==READ
* FIXME: call the correct reference counting function
*/
put_page(page);
}
kfree(STbp->mapped_pages); kfree(STbp->mapped_pages);
STbp->mapped_pages = NULL; STbp->mapped_pages = NULL;
......
...@@ -2035,9 +2035,6 @@ static int storvsc_suspend(struct hv_device *hv_dev) ...@@ -2035,9 +2035,6 @@ static int storvsc_suspend(struct hv_device *hv_dev)
vmbus_close(hv_dev->channel); vmbus_close(hv_dev->channel);
memset(stor_device->stor_chns, 0,
num_possible_cpus() * sizeof(void *));
kfree(stor_device->stor_chns); kfree(stor_device->stor_chns);
stor_device->stor_chns = NULL; stor_device->stor_chns = NULL;
......
...@@ -5076,6 +5076,7 @@ static void ufshcd_force_reset_auto_bkops(struct ufs_hba *hba) ...@@ -5076,6 +5076,7 @@ static void ufshcd_force_reset_auto_bkops(struct ufs_hba *hba)
hba->ee_ctrl_mask &= ~MASK_EE_URGENT_BKOPS; hba->ee_ctrl_mask &= ~MASK_EE_URGENT_BKOPS;
ufshcd_disable_auto_bkops(hba); ufshcd_disable_auto_bkops(hba);
} }
hba->urgent_bkops_lvl = BKOPS_STATUS_PERF_IMPACT;
hba->is_urgent_bkops_lvl_checked = false; hba->is_urgent_bkops_lvl_checked = false;
} }
...@@ -5123,7 +5124,6 @@ static int ufshcd_bkops_ctrl(struct ufs_hba *hba, ...@@ -5123,7 +5124,6 @@ static int ufshcd_bkops_ctrl(struct ufs_hba *hba,
err = ufshcd_enable_auto_bkops(hba); err = ufshcd_enable_auto_bkops(hba);
else else
err = ufshcd_disable_auto_bkops(hba); err = ufshcd_disable_auto_bkops(hba);
hba->urgent_bkops_lvl = curr_status;
out: out:
return err; return err;
} }
...@@ -7373,10 +7373,6 @@ static int ufshcd_probe_hba(struct ufs_hba *hba, bool async) ...@@ -7373,10 +7373,6 @@ static int ufshcd_probe_hba(struct ufs_hba *hba, bool async)
if (ret) if (ret)
goto out; goto out;
/* set the default level for urgent bkops */
hba->urgent_bkops_lvl = BKOPS_STATUS_PERF_IMPACT;
hba->is_urgent_bkops_lvl_checked = false;
/* Debug counters initialization */ /* Debug counters initialization */
ufshcd_clear_dbg_ufs_stats(hba); ufshcd_clear_dbg_ufs_stats(hba);
......
...@@ -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,23 +1167,26 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, ...@@ -1167,23 +1167,26 @@ 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 = target_cmd_init_cdb(&cmd->se_cmd, hdr->cdb);
scsilun_to_int(&hdr->lun));
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) {
if (cmd->sense_reason == TCM_OUT_OF_RESOURCES) { if (cmd->sense_reason == TCM_OUT_OF_RESOURCES) {
return iscsit_add_reject_cmd(cmd, return iscsit_add_reject_cmd(cmd,
ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf); ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf);
} }
goto attach_cmd; 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_cmd_parse_cdb(&cmd->se_cmd);
if (cmd->sense_reason)
goto attach_cmd;
if (iscsit_build_pdu_and_seq_lists(cmd, payload_length) < 0) { if (iscsit_build_pdu_and_seq_lists(cmd, payload_length) < 0) {
return iscsit_add_reject_cmd(cmd, return iscsit_add_reject_cmd(cmd,
ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf); ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf);
...@@ -2000,7 +2003,8 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_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, 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 +2042,7 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, ...@@ -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 * 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;
} }
...@@ -1410,11 +1411,11 @@ transport_check_alloc_task_attr(struct se_cmd *cmd) ...@@ -1410,11 +1411,11 @@ transport_check_alloc_task_attr(struct se_cmd *cmd)
} }
sense_reason_t 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; 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 * Ensure that the received CDB is less than the max (252 + 8) bytes
* for VARIABLE_LENGTH_CMD * for VARIABLE_LENGTH_CMD
...@@ -1423,7 +1424,8 @@ target_setup_cmd_from_cdb(struct se_cmd *cmd, unsigned char *cdb) ...@@ -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" pr_err("Received SCSI CDB with command_size: %d that"
" exceeds SCSI_MAX_VARLEN_CDB_SIZE: %d\n", " exceeds SCSI_MAX_VARLEN_CDB_SIZE: %d\n",
scsi_command_size(cdb), SCSI_MAX_VARLEN_CDB_SIZE); 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, * 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) ...@@ -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", " %u > sizeof(cmd->__t_task_cdb): %lu ops\n",
scsi_command_size(cdb), scsi_command_size(cdb),
(unsigned long)sizeof(cmd->__t_task_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-> * Copy the original CDB into cmd->
*/ */
memcpy(cmd->t_task_cdb, cdb, scsi_command_size(cdb)); memcpy(cmd->t_task_cdb, cdb, scsi_command_size(cdb));
trace_target_sequencer_start(cmd); 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); ret = dev->transport->parse_cdb(cmd);
if (ret == TCM_UNSUPPORTED_SCSI_OPCODE) if (ret == TCM_UNSUPPORTED_SCSI_OPCODE)
...@@ -1466,7 +1486,7 @@ target_setup_cmd_from_cdb(struct se_cmd *cmd, unsigned char *cdb) ...@@ -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); atomic_long_inc(&cmd->se_lun->lun_stats.cmd_pdus);
return 0; return 0;
} }
EXPORT_SYMBOL(target_setup_cmd_from_cdb); EXPORT_SYMBOL(target_cmd_parse_cdb);
/* /*
* Used by fabric module frontends to queue tasks directly. * 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 ...@@ -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 * 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;
...@@ -1611,17 +1632,25 @@ int target_submit_cmd_map_sgls(struct se_cmd *se_cmd, struct se_session *se_sess ...@@ -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) if (flags & TARGET_SCF_BIDI_OP)
se_cmd->se_cmd_flags |= SCF_BIDI; se_cmd->se_cmd_flags |= SCF_BIDI;
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;
}
/* /*
* 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);
return 0; return 0;
} }
rc = target_setup_cmd_from_cdb(se_cmd, cdb); rc = target_cmd_parse_cdb(se_cmd);
if (rc != 0) { if (rc != 0) {
transport_generic_request_failure(se_cmd, rc); transport_generic_request_failure(se_cmd, rc);
return 0; return 0;
...@@ -1782,7 +1811,7 @@ int target_submit_tmr(struct se_cmd *se_cmd, struct se_session *se_sess, ...@@ -1782,7 +1811,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.
...@@ -1810,7 +1839,7 @@ int target_submit_tmr(struct se_cmd *se_cmd, struct se_session *se_sess, ...@@ -1810,7 +1839,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;
......
...@@ -1007,7 +1007,7 @@ static int queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, sense_reason_t *scsi_err) ...@@ -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.cmd_id = 0; /* not used for PAD */
entry->hdr.kflags = 0; entry->hdr.kflags = 0;
entry->hdr.uflags = 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); UPDATE_HEAD(mb->cmd_head, pad_size, udev->cmdr_size);
tcmu_flush_dcache_range(mb, sizeof(*mb)); 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) ...@@ -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; 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)); memcpy((void *) mb + cdb_off, se_cmd->t_task_cdb, scsi_command_size(se_cmd->t_task_cdb));
entry->req.cdb_off = cdb_off; 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); UPDATE_HEAD(mb->cmd_head, command_size, udev->cmdr_size);
tcmu_flush_dcache_range(mb, sizeof(*mb)); tcmu_flush_dcache_range(mb, sizeof(*mb));
......
...@@ -526,8 +526,11 @@ static int target_xcopy_setup_pt_cmd( ...@@ -526,8 +526,11 @@ static int target_xcopy_setup_pt_cmd(
} }
cmd->se_cmd_flags |= SCF_SE_LUN_CMD; cmd->se_cmd_flags |= SCF_SE_LUN_CMD;
if (target_cmd_init_cdb(cmd, cdb))
return -EINVAL;
cmd->tag = 0; cmd->tag = 0;
if (target_setup_cmd_from_cdb(cmd, cdb)) if (target_cmd_parse_cdb(cmd))
return -EINVAL; return -EINVAL;
if (transport_generic_map_mem_to_cmd(cmd, xop->xop_data_sg, if (transport_generic_map_mem_to_cmd(cmd, xop->xop_data_sg,
...@@ -585,7 +588,7 @@ static int target_xcopy_read_source( ...@@ -585,7 +588,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 +633,7 @@ static int target_xcopy_write_destination( ...@@ -630,7 +633,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);
......
...@@ -1052,7 +1052,8 @@ static void usbg_cmd_work(struct work_struct *work) ...@@ -1052,7 +1052,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;
} }
...@@ -1182,7 +1183,8 @@ static void bot_cmd_work(struct work_struct *work) ...@@ -1182,7 +1183,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,9 +150,10 @@ void transport_deregister_session(struct se_session *); ...@@ -150,9 +150,10 @@ 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_setup_cmd_from_cdb(struct se_cmd *, unsigned char *); sense_reason_t target_cmd_init_cdb(struct se_cmd *, unsigned char *);
sense_reason_t target_cmd_parse_cdb(struct se_cmd *);
int target_submit_cmd_map_sgls(struct se_cmd *, struct se_session *, int target_submit_cmd_map_sgls(struct se_cmd *, struct se_session *,
unsigned char *, unsigned char *, u64, u32, int, int, int, unsigned char *, unsigned char *, u64, u32, int, int, int,
struct scatterlist *, u32, struct scatterlist *, u32, struct scatterlist *, u32, struct scatterlist *, u32,
...@@ -187,7 +188,7 @@ int core_tmr_alloc_req(struct se_cmd *, void *, u8, gfp_t); ...@@ -187,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