When sending a device reset we should not take a reference to the
scsi command.

Signed-off-by: Hannes Reinecke <h...@suse.com>
---
 drivers/scsi/aic7xxx/aic79xx_osm.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c 
b/drivers/scsi/aic7xxx/aic79xx_osm.c
index 66f9450..695e93e 100644
--- a/drivers/scsi/aic7xxx/aic79xx_osm.c
+++ b/drivers/scsi/aic7xxx/aic79xx_osm.c
@@ -536,8 +536,10 @@ void ahd_insb(struct ahd_softc * ahd, long port,
        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 
**************************************/
@@ -830,7 +832,7 @@ static DEF_SCSI_QCMD(ahd_linux_queue)
 
        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);
@@ -1787,9 +1789,16 @@ struct scsi_host_template aic79xx_driver_template = {
        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);
 
-- 
1.8.5.6

Reply via email to