]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
scsi: aic79xx: Do not reference SCSI command when resetting device
authorHannes Reinecke <hare@suse.de>
Mon, 2 Oct 2023 15:43:19 +0000 (17:43 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 13 Oct 2023 18:23:14 +0000 (14:23 -0400)
When sending a device reset we should not take a reference to the SCSI
command.

Signed-off-by: Hannes Reinecke <hare@suse.de>
Link: https://lore.kernel.org/r/20231002154328.43718-10-hare@suse.de
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/aic7xxx/aic79xx_osm.c

index 7e5253da04cd0fc35333f0b84f6d4f1ff7563724..b3075a022d99a481896a113023a04e1af5c64f7e 100644 (file)
@@ -536,8 +536,10 @@ ahd_linux_unmap_scb(struct ahd_softc *ahd, struct scb *scb)
        struct scsi_cmnd *cmd;
 
        cmd = scb->io_ctx;
-       ahd_sync_sglist(ahd, scb, BUS_DMASYNC_POSTWRITE);
-       scsi_dma_unmap(cmd);
+       if (cmd) {
+               ahd_sync_sglist(ahd, scb, BUS_DMASYNC_POSTWRITE);
+               scsi_dma_unmap(cmd);
+       }
 }
 
 /******************************** Macros **************************************/
@@ -814,7 +816,7 @@ ahd_linux_dev_reset(struct scsi_cmnd *cmd)
 
        tinfo = ahd_fetch_transinfo(ahd, 'A', ahd->our_id,
                                    cmd->device->id, &tstate);
-       reset_scb->io_ctx = cmd;
+       reset_scb->io_ctx = NULL;
        reset_scb->platform_data->dev = dev;
        reset_scb->sg_count = 0;
        ahd_set_residual(reset_scb, 0);
@@ -1769,9 +1771,16 @@ ahd_done(struct ahd_softc *ahd, struct scb *scb)
        dev = scb->platform_data->dev;
        dev->active--;
        dev->openings++;
-       if ((cmd->result & (CAM_DEV_QFRZN << 16)) != 0) {
-               cmd->result &= ~(CAM_DEV_QFRZN << 16);
-               dev->qfrozen--;
+       if (cmd) {
+               if ((cmd->result & (CAM_DEV_QFRZN << 16)) != 0) {
+                       cmd->result &= ~(CAM_DEV_QFRZN << 16);
+                       dev->qfrozen--;
+               }
+       } else if (scb->flags & SCB_DEVICE_RESET) {
+               if (ahd->platform_data->eh_done)
+                       complete(ahd->platform_data->eh_done);
+               ahd_free_scb(ahd, scb);
+               return;
        }
        ahd_linux_unmap_scb(ahd, scb);