scsi: target: vhost-scsi: Convert to new submission API
authorMike Christie <michael.christie@oracle.com>
Sat, 27 Feb 2021 16:59:52 +0000 (10:59 -0600)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 4 Mar 2021 22:37:01 +0000 (17:37 -0500)
target_submit_cmd_map_sgls() is being removed, so convert vhost-scsi to the
new submission API. This has it use target_init_cmd(),
target_submit_prep(), target_submit() because we need to have LIO core map
sgls which is now done in target_submit_prep(), and in the next patches we
will do the target_submit step from the LIO workqueue.

Note: vhost-scsi never calls target_stop_session() so
target_submit_cmd_map_sgls() never failed (in the new API target_init_cmd()
handles target_stop_session() being called when cmds are being
submitted). If it were to have used target_stop_session() and got an error,
we would have hit a refcount bug like xen and usb, because it does:

if (rc < 0) {
transport_send_check_condition_and_sense(se_cmd,
TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE, 0);
transport_generic_free_cmd(se_cmd, 0);
}

transport_send_check_condition_and_sense() calls queue_status which does
transport_generic_free_cmd(), and then we do an extra
transport_generic_free_cmd() call above which would have dropped the
refcount to -1 and the refcount code would spit out errors.

Link: https://lore.kernel.org/r/20210227170006.5077-12-michael.christie@oracle.com
Cc: "Michael S. Tsirkin" <mst@redhat.com>
Cc: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Mike Christie <michael.christie@oracle.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/vhost/scsi.c

index 936584250a0bdcc9bafc58d86170e7c097e13cce..ec7ffd51fe5b285d20e39a3e93c69935e855eb13 100644 (file)
@@ -789,7 +789,6 @@ static void vhost_scsi_submission_work(struct work_struct *work)
        struct vhost_scsi_nexus *tv_nexus;
        struct se_cmd *se_cmd = &cmd->tvc_se_cmd;
        struct scatterlist *sg_ptr, *sg_prot_ptr = NULL;
-       int rc;
 
        /* FIXME: BIDI operation */
        if (cmd->tvc_sgl_count) {
@@ -805,18 +804,17 @@ static void vhost_scsi_submission_work(struct work_struct *work)
        tv_nexus = cmd->tvc_nexus;
 
        se_cmd->tag = 0;
-       rc = target_submit_cmd_map_sgls(se_cmd, tv_nexus->tvn_se_sess,
-                       cmd->tvc_cdb, &cmd->tvc_sense_buf[0],
+       target_init_cmd(se_cmd, tv_nexus->tvn_se_sess, &cmd->tvc_sense_buf[0],
                        cmd->tvc_lun, cmd->tvc_exp_data_len,
                        vhost_scsi_to_tcm_attr(cmd->tvc_task_attr),
-                       cmd->tvc_data_direction, TARGET_SCF_ACK_KREF,
-                       sg_ptr, cmd->tvc_sgl_count, NULL, 0, sg_prot_ptr,
-                       cmd->tvc_prot_sgl_count);
-       if (rc < 0) {
-               transport_send_check_condition_and_sense(se_cmd,
-                               TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE, 0);
-               transport_generic_free_cmd(se_cmd, 0);
-       }
+                       cmd->tvc_data_direction, TARGET_SCF_ACK_KREF);
+
+       if (target_submit_prep(se_cmd, cmd->tvc_cdb, sg_ptr,
+                              cmd->tvc_sgl_count, NULL, 0, sg_prot_ptr,
+                              cmd->tvc_prot_sgl_count))
+               return;
+
+       target_submit(se_cmd);
 }
 
 static void