From: Stephen M. Cameron <[email protected]>

This relies on a kernel thread which I wish to remove and
replace with a work queue based solution.

Signed-off-by: Stephen M. Cameron <[email protected]>
---
 drivers/scsi/hpsa.c |  128 ---------------------------------------------------
 drivers/scsi/hpsa.h |   13 -----
 2 files changed, 1 insertions(+), 140 deletions(-)

diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
index 89f50c3..961332b 100644
--- a/drivers/scsi/hpsa.c
+++ b/drivers/scsi/hpsa.c
@@ -220,8 +220,6 @@ static int hpsa_lookup_board_id(struct pci_dev *pdev, u32 
*board_id);
 static int hpsa_wait_for_board_state(struct pci_dev *pdev, void __iomem *vaddr,
                                     int wait_for_ready);
 static inline void finish_cmd(struct CommandList *c);
-static unsigned char hpsa_format_in_progress(struct ctlr_info *h,
-               unsigned char scsi3addr[]);
 #define BOARD_NOT_READY 0
 #define BOARD_READY 1
 
@@ -945,112 +943,6 @@ static int hpsa_scsi_find_entry(struct hpsa_scsi_dev_t 
*needle,
        return DEVICE_NOT_FOUND;
 }
 
-#define OFFLINE_DEVICE_POLL_INTERVAL (120 * HZ)
-static int hpsa_offline_device_thread(void *v)
-{
-       struct ctlr_info *h = v;
-       unsigned long flags;
-       struct offline_device_entry *d;
-       unsigned char need_rescan = 0;
-       struct list_head *this, *tmp;
-
-       while (1) {
-               schedule_timeout_interruptible(OFFLINE_DEVICE_POLL_INTERVAL);
-               if (kthread_should_stop())
-                       break;
-
-               /* Check if any of the offline devices have become ready */
-               spin_lock_irqsave(&h->offline_device_lock, flags);
-               list_for_each_safe(this, tmp, &h->offline_device_list) {
-                       d = list_entry(this, struct offline_device_entry,
-                                       offline_list);
-                       spin_unlock_irqrestore(&h->offline_device_lock, flags);
-                       if (!hpsa_format_in_progress(h, d->scsi3addr)) {
-                               need_rescan = 1;
-                               goto do_rescan;
-                       }
-                       spin_lock_irqsave(&h->offline_device_lock, flags);
-               }
-               spin_unlock_irqrestore(&h->offline_device_lock, flags);
-       }
-
-do_rescan:
-
-       /* Remove all entries from the list and rescan and exit this thread.
-        * If there are still offline devices, the rescan will make a new list
-        * and create a new offline device monitor thread.
-        */
-       spin_lock_irqsave(&h->offline_device_lock, flags);
-       list_for_each_safe(this, tmp, &h->offline_device_list) {
-               d = list_entry(this, struct offline_device_entry, offline_list);
-               list_del_init(this);
-               kfree(d);
-       }
-       h->offline_device_monitor = NULL;
-       h->offline_device_thread_state = OFFLINE_DEVICE_THREAD_STOPPED;
-       spin_unlock_irqrestore(&h->offline_device_lock, flags);
-       if (need_rescan)
-               hpsa_scan_start(h->scsi_host);
-       return 0;
-}
-
-static void hpsa_monitor_offline_device(struct ctlr_info *h,
-                                       unsigned char scsi3addr[])
-{
-       struct offline_device_entry *device;
-       unsigned long flags;
-
-       /* Check to see if device is already on the list */
-       spin_lock_irqsave(&h->offline_device_lock, flags);
-       list_for_each_entry(device, &h->offline_device_list, offline_list) {
-               if (memcmp(device->scsi3addr, scsi3addr,
-                               sizeof(device->scsi3addr)) == 0) {
-                       spin_unlock_irqrestore(&h->offline_device_lock, flags);
-                       return;
-               }
-       }
-       spin_unlock_irqrestore(&h->offline_device_lock, flags);
-
-       /* Device is not on the list, add it. */
-       device = kmalloc(sizeof(*device), GFP_KERNEL);
-       if (!device) {
-               dev_warn(&h->pdev->dev, "out of memory in %s\n", __func__);
-               return;
-       }
-       memcpy(device->scsi3addr, scsi3addr, sizeof(device->scsi3addr));
-       spin_lock_irqsave(&h->offline_device_lock, flags);
-       list_add_tail(&device->offline_list, &h->offline_device_list);
-       if (h->offline_device_thread_state == OFFLINE_DEVICE_THREAD_STOPPED) {
-               h->offline_device_thread_state = OFFLINE_DEVICE_THREAD_RUNNING;
-               spin_unlock_irqrestore(&h->offline_device_lock, flags);
-               h->offline_device_monitor =
-                       kthread_run(hpsa_offline_device_thread, h, HPSA "-odm");
-               spin_lock_irqsave(&h->offline_device_lock, flags);
-       }
-       if (!h->offline_device_monitor) {
-               dev_warn(&h->pdev->dev, "failed to start offline device monitor 
thread.\n");
-               h->offline_device_thread_state = OFFLINE_DEVICE_THREAD_STOPPED;
-       }
-       spin_unlock_irqrestore(&h->offline_device_lock, flags);
-}
-
-static void stop_offline_device_monitor(struct ctlr_info *h)
-{
-       unsigned long flags;
-       int stop_thread;
-
-       spin_lock_irqsave(&h->offline_device_lock, flags);
-       stop_thread = (h->offline_device_thread_state ==
-                               OFFLINE_DEVICE_THREAD_RUNNING);
-       if (stop_thread)
-               /* STOPPING state prevents new thread from starting. */
-               h->offline_device_thread_state =
-                               OFFLINE_DEVICE_THREAD_STOPPING;
-       spin_unlock_irqrestore(&h->offline_device_lock, flags);
-       if (stop_thread)
-               kthread_stop(h->offline_device_monitor);
-}
-
 static void adjust_hpsa_scsi_table(struct ctlr_info *h, int hostno,
        struct hpsa_scsi_dev_t *sd[], int nsds)
 {
@@ -1123,10 +1015,7 @@ static void adjust_hpsa_scsi_table(struct ctlr_info *h, 
int hostno,
                 */
                if (sd[i]->format_in_progress) {
                        dev_info(&h->pdev->dev,
-                               "c%db%dt%dl%d: Logical drive parity 
initialization, erase or format in progress\n",
-                               h->scsi_host->host_no,
-                               sd[i]->bus, sd[i]->target, sd[i]->lun);
-                       dev_info(&h->pdev->dev, "c%db%dt%dl%d: temporarily 
offline\n",
+                               "Logical drive format in progress, device 
c%db%dt%dl%d offline.\n",
                                h->scsi_host->host_no,
                                sd[i]->bus, sd[i]->target, sd[i]->lun);
                        continue;
@@ -1150,17 +1039,6 @@ static void adjust_hpsa_scsi_table(struct ctlr_info *h, 
int hostno,
        }
        spin_unlock_irqrestore(&h->devlock, flags);
 
-       /* Monitor devices which are NOT READY, FORMAT IN PROGRESS to be
-        * brought online later. This must be done without holding h->devlock,
-        * so don't touch h->dev[]
-        */
-       for (i = 0; i < nsds; i++) {
-               if (!sd[i]) /* if already added above. */
-                       continue;
-               if (sd[i]->format_in_progress)
-                       hpsa_monitor_offline_device(h, sd[i]->scsi3addr);
-       }
-
        /* Don't notify scsi mid layer of any changes the first time through
         * (or if there are no changes) scsi_scan_host will do it later the
         * first time through.
@@ -5065,10 +4943,8 @@ reinit_after_soft_reset:
        h->intr_mode = hpsa_simple_mode ? SIMPLE_MODE_INT : PERF_MODE_INT;
        INIT_LIST_HEAD(&h->cmpQ);
        INIT_LIST_HEAD(&h->reqQ);
-       INIT_LIST_HEAD(&h->offline_device_list);
        spin_lock_init(&h->lock);
        spin_lock_init(&h->scan_lock);
-       spin_lock_init(&h->offline_device_lock);
        spin_lock_init(&h->passthru_count_lock);
        rc = hpsa_pci_init(h);
        if (rc != 0)
@@ -5077,7 +4953,6 @@ reinit_after_soft_reset:
        sprintf(h->devname, HPSA "%d", number_of_controllers);
        h->ctlr = number_of_controllers;
        number_of_controllers++;
-       h->offline_device_thread_state = OFFLINE_DEVICE_THREAD_STOPPED;
 
        /* configure PCI DMA stuff */
        rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
@@ -5256,7 +5131,6 @@ static void hpsa_remove_one(struct pci_dev *pdev)
        }
        h = pci_get_drvdata(pdev);
        stop_controller_lockup_detector(h);
-       stop_offline_device_monitor(h);
        hpsa_unregister_scsi(h);        /* unhook from SCSI subsystem */
        hpsa_shutdown(pdev);
        iounmap(h->vaddr);
diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h
index bea2365..04074f5 100644
--- a/drivers/scsi/hpsa.h
+++ b/drivers/scsi/hpsa.h
@@ -161,20 +161,7 @@ struct ctlr_info {
 #define HPSATMF_LOG_QRY_TASK    (1 << 23)
 #define HPSATMF_LOG_QRY_TSET    (1 << 24)
 #define HPSATMF_LOG_QRY_ASYNC   (1 << 25)
-       spinlock_t offline_device_lock;
-       struct list_head offline_device_list;
-       struct task_struct *offline_device_monitor;
-       unsigned char offline_device_thread_state;
-#define OFFLINE_DEVICE_THREAD_STOPPED 0
-#define OFFLINE_DEVICE_THREAD_STOPPING 1
-#define OFFLINE_DEVICE_THREAD_RUNNING 2
 };
-
-struct offline_device_entry {
-       unsigned char scsi3addr[8];
-       struct list_head offline_list;
-};
-
 #define HPSA_ABORT_MSG 0
 #define HPSA_DEVICE_RESET_MSG 1
 #define HPSA_RESET_TYPE_CONTROLLER 0x00

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to