提交 5f389360 编写于 作者: S Stephen M. Cameron 提交者: James Bottomley

[SCSI] hpsa: do not rescan controllers known to be locked up

* Do not check event bits on locked up controllers to
  see if they need to be rescanned.
* Do not initiate any device rescans on controllers
  which are known to be locked up.
Signed-off-by: NStephen M. Cameron <scameron@beardog.cce.hp.com>
Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
上级 76438d08
...@@ -2868,11 +2868,38 @@ static int hpsa_scsi_queue_command_lck(struct scsi_cmnd *cmd, ...@@ -2868,11 +2868,38 @@ static int hpsa_scsi_queue_command_lck(struct scsi_cmnd *cmd,
static DEF_SCSI_QCMD(hpsa_scsi_queue_command) static DEF_SCSI_QCMD(hpsa_scsi_queue_command)
static int do_not_scan_if_controller_locked_up(struct ctlr_info *h)
{
unsigned long flags;
/*
* Don't let rescans be initiated on a controller known
* to be locked up. If the controller locks up *during*
* a rescan, that thread is probably hosed, but at least
* we can prevent new rescan threads from piling up on a
* locked up controller.
*/
spin_lock_irqsave(&h->lock, flags);
if (unlikely(h->lockup_detected)) {
spin_unlock_irqrestore(&h->lock, flags);
spin_lock_irqsave(&h->scan_lock, flags);
h->scan_finished = 1;
wake_up_all(&h->scan_wait_queue);
spin_unlock_irqrestore(&h->scan_lock, flags);
return 1;
}
spin_unlock_irqrestore(&h->lock, flags);
return 0;
}
static void hpsa_scan_start(struct Scsi_Host *sh) static void hpsa_scan_start(struct Scsi_Host *sh)
{ {
struct ctlr_info *h = shost_to_hba(sh); struct ctlr_info *h = shost_to_hba(sh);
unsigned long flags; unsigned long flags;
if (do_not_scan_if_controller_locked_up(h))
return;
/* wait until any scan already in progress is finished. */ /* wait until any scan already in progress is finished. */
while (1) { while (1) {
spin_lock_irqsave(&h->scan_lock, flags); spin_lock_irqsave(&h->scan_lock, flags);
...@@ -2889,6 +2916,9 @@ static void hpsa_scan_start(struct Scsi_Host *sh) ...@@ -2889,6 +2916,9 @@ static void hpsa_scan_start(struct Scsi_Host *sh)
h->scan_finished = 0; /* mark scan as in progress */ h->scan_finished = 0; /* mark scan as in progress */
spin_unlock_irqrestore(&h->scan_lock, flags); spin_unlock_irqrestore(&h->scan_lock, flags);
if (do_not_scan_if_controller_locked_up(h))
return;
hpsa_update_scsi_devices(h, h->scsi_host->host_no); hpsa_update_scsi_devices(h, h->scsi_host->host_no);
spin_lock_irqsave(&h->scan_lock, flags); spin_lock_irqsave(&h->scan_lock, flags);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册