scsi: ips: Use correct command completion on error
authorHannes Reinecke <hare@suse.de>
Wed, 13 Jan 2021 09:04:56 +0000 (10:04 +0100)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sat, 23 Jan 2021 02:14:12 +0000 (21:14 -0500)
A non-zero queuecommand() return code means 'busy', i.e. the command hasn't
been submitted. So any command which should be failed need to be completed
via the ->scsi_done() callback with the appropriate result code set.

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

index 2e6077c..1a3c534 100644 (file)
@@ -1045,10 +1045,10 @@ static int ips_queue_lck(struct scsi_cmnd *SC, void (*done) (struct scsi_cmnd *)
        ha = (ips_ha_t *) SC->device->host->hostdata;
 
        if (!ha)
-               return (1);
+               goto out_error;
 
        if (!ha->active)
-               return (DID_ERROR);
+               goto out_error;
 
        if (ips_is_passthru(SC)) {
                if (ha->copp_waitlist.count == IPS_MAX_IOCTL_QUEUE) {
@@ -1124,6 +1124,11 @@ static int ips_queue_lck(struct scsi_cmnd *SC, void (*done) (struct scsi_cmnd *)
        ips_next(ha, IPS_INTR_IORL);
 
        return (0);
+out_error:
+       SC->result = DID_ERROR << 16;
+       done(SC);
+
+       return (0);
 }
 
 static DEF_SCSI_QCMD(ips_queue)