OSDN Git Service

hpsa: refactor duplicated scan completion code into a new routine
authorWebb Scales <webbnh@hp.com>
Fri, 23 Jan 2015 22:44:50 +0000 (16:44 -0600)
committerJames Bottomley <JBottomley@Parallels.com>
Mon, 2 Feb 2015 17:57:43 +0000 (09:57 -0800)
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: Scott Teel <scott.teel@pmcs.com>
Signed-off-by: Webb Scales <webbnh@hp.com>
Signed-off-by: Don Brace <don.brace@pmcs.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/scsi/hpsa.c

index 7915dc4..a92653a 100644 (file)
@@ -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);
 }
 
-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;
 
-       /*
-        * 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))) {
-               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;
+       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);
 }
 
 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);
        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. */
        while (1) {
@@ -4194,15 +4189,12 @@ static void hpsa_scan_start(struct Scsi_Host *sh)
        h->scan_finished = 0; /* mark scan as in progress */
        spin_unlock_irqrestore(&h->scan_lock, flags);
 
-       if (do_not_scan_if_controller_locked_up(h))
-               return;
+       if (unlikely(lockup_detected(h)))
+               return hpsa_scan_complete(h);
 
        hpsa_update_scsi_devices(h, h->scsi_host->host_no);
 
-       spin_lock_irqsave(&h->scan_lock, flags);
-       h->scan_finished = 1; /* mark scan as finished. */
-       wake_up_all(&h->scan_wait_queue);
-       spin_unlock_irqrestore(&h->scan_lock, flags);
+       hpsa_scan_complete(h);
 }
 
 static int hpsa_change_queue_depth(struct scsi_device *sdev, int qdepth)