scsi: core: Move command size detection out of the fast path
authorChristoph Hellwig <hch@lst.de>
Mon, 5 Oct 2020 08:41:23 +0000 (10:41 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 8 Oct 2020 01:48:27 +0000 (21:48 -0400)
We only need to detect the command size for ioctl request from userspace,
which is limited to the passthrough path.  Move the check there instead of
doing it for all queuecommand invocations.

Link: https://lore.kernel.org/r/20201005084130.143273-4-hch@lst.de
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/scsi_lib.c

index b515560..b0bd15f 100644 (file)
@@ -1181,6 +1181,8 @@ static blk_status_t scsi_setup_scsi_cmnd(struct scsi_device *sdev,
        }
 
        cmd->cmd_len = scsi_req(req)->cmd_len;
+       if (cmd->cmd_len == 0)
+               cmd->cmd_len = scsi_command_size(cmd->cmnd);
        cmd->cmnd = scsi_req(req)->cmd;
        cmd->transfersize = blk_rq_bytes(req);
        cmd->allowed = scsi_req(req)->retries;
@@ -1694,8 +1696,6 @@ static blk_status_t scsi_queue_rq(struct blk_mq_hw_ctx *hctx,
 
        scsi_set_resid(cmd, 0);
        memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
-       if (cmd->cmd_len == 0)
-               cmd->cmd_len = scsi_command_size(cmd->cmnd);
        cmd->scsi_done = scsi_mq_done;
 
        reason = scsi_dispatch_cmd(cmd);