|
@@ -5555,7 +5555,7 @@ static void hpsa_scan_complete(struct ctlr_info *h)
|
|
|
|
|
|
spin_lock_irqsave(&h->scan_lock, flags);
|
|
|
h->scan_finished = 1;
|
|
|
- wake_up_all(&h->scan_wait_queue);
|
|
|
+ wake_up(&h->scan_wait_queue);
|
|
|
spin_unlock_irqrestore(&h->scan_lock, flags);
|
|
|
}
|
|
|
|
|
@@ -5573,11 +5573,23 @@ static void hpsa_scan_start(struct Scsi_Host *sh)
|
|
|
if (unlikely(lockup_detected(h)))
|
|
|
return hpsa_scan_complete(h);
|
|
|
|
|
|
+ /*
|
|
|
+ * If a scan is already waiting to run, no need to add another
|
|
|
+ */
|
|
|
+ spin_lock_irqsave(&h->scan_lock, flags);
|
|
|
+ if (h->scan_waiting) {
|
|
|
+ spin_unlock_irqrestore(&h->scan_lock, flags);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ spin_unlock_irqrestore(&h->scan_lock, flags);
|
|
|
+
|
|
|
/* wait until any scan already in progress is finished. */
|
|
|
while (1) {
|
|
|
spin_lock_irqsave(&h->scan_lock, flags);
|
|
|
if (h->scan_finished)
|
|
|
break;
|
|
|
+ h->scan_waiting = 1;
|
|
|
spin_unlock_irqrestore(&h->scan_lock, flags);
|
|
|
wait_event(h->scan_wait_queue, h->scan_finished);
|
|
|
/* Note: We don't need to worry about a race between this
|
|
@@ -5587,6 +5599,7 @@ static void hpsa_scan_start(struct Scsi_Host *sh)
|
|
|
*/
|
|
|
}
|
|
|
h->scan_finished = 0; /* mark scan as in progress */
|
|
|
+ h->scan_waiting = 0;
|
|
|
spin_unlock_irqrestore(&h->scan_lock, flags);
|
|
|
|
|
|
if (unlikely(lockup_detected(h)))
|
|
@@ -8789,6 +8802,7 @@ reinit_after_soft_reset:
|
|
|
init_waitqueue_head(&h->event_sync_wait_queue);
|
|
|
mutex_init(&h->reset_mutex);
|
|
|
h->scan_finished = 1; /* no scan currently in progress */
|
|
|
+ h->scan_waiting = 0;
|
|
|
|
|
|
pci_set_drvdata(pdev, h);
|
|
|
h->ndevices = 0;
|