]> git.karo-electronics.de Git - linux-beck.git/commitdiff
[SCSI] ipr: Fix BUG on adapter dump timeout
authorBrian King <brking@linux.vnet.ibm.com>
Sat, 15 Oct 2011 14:08:56 +0000 (09:08 -0500)
committerJames Bottomley <JBottomley@Parallels.com>
Thu, 20 Oct 2011 15:19:55 +0000 (10:19 -0500)
If an adapter dump times out, the ipr driver will abort the
dump and proceed to reset and recover the adapter. When an
adapter dump completes, the work thread which is reading the
adapter dump will initiate an adapter reset to recover the
adapter. However, when the adapter dump gets aborted, the
work thread should not initiate an adapter reset, since an
adapter reset is already in progress. This fixes a case of
calling pci_block_user_cfg_access overlapped, which results
in a BUG.

Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/ipr.c
drivers/scsi/ipr.h

index e16a9cf442c1b3992537fe0597558d1c8274ca0e..73e24b48dced4d10a6f1139f75ebfab1fcebba5e 100644 (file)
@@ -3109,7 +3109,7 @@ static void ipr_worker_thread(struct work_struct *work)
                kref_put(&dump->kref, ipr_release_dump);
 
                spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
-               if (ioa_cfg->sdt_state == DUMP_OBTAINED)
+               if (ioa_cfg->sdt_state == DUMP_OBTAINED && !ioa_cfg->dump_timeout)
                        ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
                spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
                return;
@@ -7447,6 +7447,7 @@ static int ipr_reset_wait_for_dump(struct ipr_cmnd *ipr_cmd)
        else if (ioa_cfg->sdt_state == READ_DUMP)
                ioa_cfg->sdt_state = ABORT_DUMP;
 
+       ioa_cfg->dump_timeout = 1;
        ipr_cmd->job_step = ipr_reset_alert;
 
        return IPR_RC_JOB_CONTINUE;
@@ -7611,6 +7612,7 @@ static int ipr_reset_restore_cfg_space(struct ipr_cmnd *ipr_cmd)
 
                if (GET_DUMP == ioa_cfg->sdt_state) {
                        ioa_cfg->sdt_state = READ_DUMP;
+                       ioa_cfg->dump_timeout = 0;
                        if (ioa_cfg->sis64)
                                ipr_reset_start_timer(ipr_cmd, IPR_SIS64_DUMP_TIMEOUT);
                        else
index 0cbf58f6ae5d668e9aa6edfa397d9e5e01081dab..6d257e0dd6a57e8b7b7c6448e5430ba3bb483568 100644 (file)
@@ -1385,6 +1385,7 @@ struct ipr_ioa_cfg {
        u8 needs_warm_reset:1;
        u8 msi_received:1;
        u8 sis64:1;
+       u8 dump_timeout:1;
 
        u8 revid;