Commit 8ebc9248 authored by Webb Scales's avatar Webb Scales Committed by James Bottomley

hpsa: refactor duplicated scan completion code into a new routine

Hoist the conditional out of do_not_scan_if_controller_locked_up() and
place it in the caller (this improves the code structure, making it
more consistent with other uses and enabling tail-call optimization);
rename the function to hpsa_scan_complete(), and use it at the end of
hpsa_scan_start() as well.
Reviewed-by: default avatarScott Teel <scott.teel@pmcs.com>
Signed-off-by: default avatarWebb Scales <webbnh@hp.com>
Signed-off-by: default avatarDon Brace <don.brace@pmcs.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent ec5cbf04
...@@ -4149,25 +4149,14 @@ static int hpsa_scsi_queue_command(struct Scsi_Host *sh, struct scsi_cmnd *cmd) ...@@ -4149,25 +4149,14 @@ static int hpsa_scsi_queue_command(struct Scsi_Host *sh, struct scsi_cmnd *cmd)
return hpsa_ciss_submit(h, c, cmd, scsi3addr); return hpsa_ciss_submit(h, c, cmd, scsi3addr);
} }
static int do_not_scan_if_controller_locked_up(struct ctlr_info *h) static void hpsa_scan_complete(struct ctlr_info *h)
{ {
unsigned long flags; unsigned long flags;
/* spin_lock_irqsave(&h->scan_lock, flags);
* Don't let rescans be initiated on a controller known h->scan_finished = 1;
* to be locked up. If the controller locks up *during* wake_up_all(&h->scan_wait_queue);
* a rescan, that thread is probably hosed, but at least spin_unlock_irqrestore(&h->scan_lock, flags);
* we can prevent new rescan threads from piling up on a
* locked up controller.
*/
if (unlikely(lockup_detected(h))) {
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;
}
return 0;
} }
static void hpsa_scan_start(struct Scsi_Host *sh) static void hpsa_scan_start(struct Scsi_Host *sh)
...@@ -4175,8 +4164,14 @@ static void hpsa_scan_start(struct Scsi_Host *sh) ...@@ -4175,8 +4164,14 @@ 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; * 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.
*/
if (unlikely(lockup_detected(h)))
return hpsa_scan_complete(h);
/* wait until any scan already in progress is finished. */ /* wait until any scan already in progress is finished. */
while (1) { while (1) {
...@@ -4194,15 +4189,12 @@ static void hpsa_scan_start(struct Scsi_Host *sh) ...@@ -4194,15 +4189,12 @@ 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)) if (unlikely(lockup_detected(h)))
return; return hpsa_scan_complete(h);
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); hpsa_scan_complete(h);
h->scan_finished = 1; /* mark scan as finished. */
wake_up_all(&h->scan_wait_queue);
spin_unlock_irqrestore(&h->scan_lock, flags);
} }
static int hpsa_change_queue_depth(struct scsi_device *sdev, int qdepth) static int hpsa_change_queue_depth(struct scsi_device *sdev, int qdepth)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment