Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 333051
b: refs/heads/master
c: 9f0abc1
h: refs/heads/master
i:
  333049: 5683daa
  333047: 558c814
v: v3
  • Loading branch information
Nicholas Bellinger committed Oct 2, 2012
1 parent c1b6f07 commit 64b713f
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 55 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 944981c7e106af2aa004847e9177497856630980
refs/heads/master: 9f0abc1554cfedf2f2391f6ee54ae319441cd1b9
68 changes: 14 additions & 54 deletions trunk/drivers/vhost/tcm_vhost.c
Original file line number Diff line number Diff line change
Expand Up @@ -415,10 +415,7 @@ static struct tcm_vhost_cmd *vhost_scsi_allocate_cmd(
{
struct tcm_vhost_cmd *tv_cmd;
struct tcm_vhost_nexus *tv_nexus;
struct se_portal_group *se_tpg = &tv_tpg->se_tpg;
struct se_session *se_sess;
struct se_cmd *se_cmd;
int sam_task_attr;

tv_nexus = tv_tpg->tpg_nexus;
if (!tv_nexus) {
Expand All @@ -434,23 +431,11 @@ static struct tcm_vhost_cmd *vhost_scsi_allocate_cmd(
}
INIT_LIST_HEAD(&tv_cmd->tvc_completion_list);
tv_cmd->tvc_tag = v_req->tag;
tv_cmd->tvc_task_attr = v_req->task_attr;
tv_cmd->tvc_exp_data_len = exp_data_len;
tv_cmd->tvc_data_direction = data_direction;
tv_cmd->tvc_nexus = tv_nexus;

se_cmd = &tv_cmd->tvc_se_cmd;
/*
* Locate the SAM Task Attr from virtio_scsi_cmd_req
*/
sam_task_attr = v_req->task_attr;
/*
* Initialize struct se_cmd descriptor from TCM infrastructure
*/
transport_init_se_cmd(se_cmd, se_tpg->se_tpg_tfo, se_sess, exp_data_len,
data_direction, sam_task_attr,
&tv_cmd->tvc_sense_buf[0]);

#if 0 /* FIXME: vhost_scsi_allocate_cmd() BIDI operation */
if (bidi)
se_cmd->se_cmd_flags |= SCF_BIDI;
#endif
return tv_cmd;
}

Expand Down Expand Up @@ -549,37 +534,10 @@ static void tcm_vhost_submission_work(struct work_struct *work)
{
struct tcm_vhost_cmd *tv_cmd =
container_of(work, struct tcm_vhost_cmd, work);
struct tcm_vhost_nexus *tv_nexus;
struct se_cmd *se_cmd = &tv_cmd->tvc_se_cmd;
struct scatterlist *sg_ptr, *sg_bidi_ptr = NULL;
int rc, sg_no_bidi = 0;
/*
* Locate the struct se_lun pointer based on v_req->lun, and
* attach it to struct se_cmd
*/
rc = transport_lookup_cmd_lun(&tv_cmd->tvc_se_cmd, tv_cmd->tvc_lun);
if (rc < 0) {
pr_err("Failed to look up lun: %d\n", tv_cmd->tvc_lun);
transport_send_check_condition_and_sense(&tv_cmd->tvc_se_cmd,
tv_cmd->tvc_se_cmd.scsi_sense_reason, 0);
transport_generic_free_cmd(se_cmd, 0);
return;
}

rc = target_setup_cmd_from_cdb(se_cmd, tv_cmd->tvc_cdb);
if (rc == -ENOMEM) {
transport_send_check_condition_and_sense(se_cmd,
TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE, 0);
transport_generic_free_cmd(se_cmd, 0);
return;
} else if (rc < 0) {
if (se_cmd->se_cmd_flags & SCF_SCSI_RESERVATION_CONFLICT)
tcm_vhost_queue_status(se_cmd);
else
transport_send_check_condition_and_sense(se_cmd,
se_cmd->scsi_sense_reason, 0);
transport_generic_free_cmd(se_cmd, 0);
return;
}

if (tv_cmd->tvc_sgl_count) {
sg_ptr = tv_cmd->tvc_sgl;
Expand All @@ -597,17 +555,19 @@ static void tcm_vhost_submission_work(struct work_struct *work)
} else {
sg_ptr = NULL;
}

rc = transport_generic_map_mem_to_cmd(se_cmd, sg_ptr,
tv_cmd->tvc_sgl_count, sg_bidi_ptr,
sg_no_bidi);
tv_nexus = tv_cmd->tvc_nexus;

rc = target_submit_cmd_map_sgls(se_cmd, tv_nexus->tvn_se_sess,
tv_cmd->tvc_cdb, &tv_cmd->tvc_sense_buf[0],
tv_cmd->tvc_lun, tv_cmd->tvc_exp_data_len,
tv_cmd->tvc_task_attr, tv_cmd->tvc_data_direction,
0, sg_ptr, tv_cmd->tvc_sgl_count,
sg_bidi_ptr, sg_no_bidi);
if (rc < 0) {
transport_send_check_condition_and_sense(se_cmd,
se_cmd->scsi_sense_reason, 0);
TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE, 0);
transport_generic_free_cmd(se_cmd, 0);
return;
}
transport_handle_cdb_direct(se_cmd);
}

static void vhost_scsi_handle_vq(struct vhost_scsi *vs)
Expand Down
8 changes: 8 additions & 0 deletions trunk/drivers/vhost/tcm_vhost.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@
struct tcm_vhost_cmd {
/* Descriptor from vhost_get_vq_desc() for virt_queue segment */
int tvc_vq_desc;
/* virtio-scsi initiator task attribute */
int tvc_task_attr;
/* virtio-scsi initiator data direction */
enum dma_data_direction tvc_data_direction;
/* Expected data transfer length from virtio-scsi header */
u32 tvc_exp_data_len;
/* The Tag from include/linux/virtio_scsi.h:struct virtio_scsi_cmd_req */
u64 tvc_tag;
/* The number of scatterlists associated with this cmd */
Expand All @@ -17,6 +23,8 @@ struct tcm_vhost_cmd {
struct virtio_scsi_cmd_resp __user *tvc_resp;
/* Pointer to vhost_scsi for our device */
struct vhost_scsi *tvc_vhost;
/* Pointer to vhost nexus memory */
struct tcm_vhost_nexus *tvc_nexus;
/* The TCM I/O descriptor that is accessed via container_of() */
struct se_cmd tvc_se_cmd;
/* work item used for cmwq dispatch to tcm_vhost_submission_work() */
Expand Down

0 comments on commit 64b713f

Please sign in to comment.