vhost-scsi: Add missing virtio-scsi -> TCM attribute conversion
authorNicholas Bellinger <nab@linux-iscsi.org>
Fri, 30 Jan 2015 22:17:24 +0000 (22:17 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 6 Feb 2015 06:35:40 +0000 (22:35 -0800)
commit 46243860806bdc2756f3ce8ac86b4d7c616bcd6c upstream.

While looking at hch's recent conversion to drop the MSG_*_TAG
definitions, I noticed a long standing bug in vhost-scsi where
the VIRTIO_SCSI_S_* attribute definitions where incorrectly
being passed directly into target_submit_cmd_map_sgls().

This patch adds the missing virtio-scsi to TCM/SAM task attribute
conversion.

Cc: Christoph Hellwig <hch@lst.de>
Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/vhost/scsi.c

index 46882116355ffff40533a8e7a7e6ae9a4cea728f..fb97bc0b80e78a394b05e6ffe8b5d00fde6120b1 100644 (file)
@@ -820,6 +820,23 @@ static int vhost_scsi_map_iov_to_sgl(struct tcm_vhost_cmd *tv_cmd,
        return 0;
 }
 
+static int vhost_scsi_to_tcm_attr(int attr)
+{
+       switch (attr) {
+       case VIRTIO_SCSI_S_SIMPLE:
+               return MSG_SIMPLE_TAG;
+       case VIRTIO_SCSI_S_ORDERED:
+               return MSG_ORDERED_TAG;
+       case VIRTIO_SCSI_S_HEAD:
+               return MSG_HEAD_TAG;
+       case VIRTIO_SCSI_S_ACA:
+               return MSG_ACA_TAG;
+       default:
+               break;
+       }
+       return MSG_SIMPLE_TAG;
+}
+
 static void tcm_vhost_submission_work(struct work_struct *work)
 {
        struct tcm_vhost_cmd *tv_cmd =
@@ -846,9 +863,9 @@ static void tcm_vhost_submission_work(struct work_struct *work)
        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);
+                       vhost_scsi_to_tcm_attr(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,
                                TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE, 0);