From: "Stephen M. Cameron" <scameron@beardog.cce.hp.com>
To: james.bottomley@hansenpartnership.com
Cc: stephenmcameron@gmail.com, mikem@beardog.cce.hp.com,
thenzl@redhat.com, linux-scsi@vger.kernel.org, scott.teel@hp.com
Subject: [PATCH 1/9] hpsa: revert bring logical drives online when format completes
Date: Wed, 04 Dec 2013 17:09:51 -0600 [thread overview]
Message-ID: <20131204230951.21798.75512.stgit@beardog.cce.hp.com> (raw)
In-Reply-To: <20131204230123.21798.93593.stgit@beardog.cce.hp.com>
From: Stephen M. Cameron <scameron@beardog.cce.hp.com>
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 <scameron@beardog.cce.hp.com>
---
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
next prev parent reply other threads:[~2013-12-04 23:09 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-04 23:09 [PATCH 0/9] hpsa: resend of November 2013 patches Stephen M. Cameron
2013-12-04 23:09 ` Stephen M. Cameron [this message]
2013-12-04 23:09 ` [PATCH 2/9] hpsa: revert hide logical drives with format in progress from linux Stephen M. Cameron
2013-12-04 23:10 ` [PATCH 3/9] hpsa: return 0 from driver probe function on success, not 1 Stephen M. Cameron
2013-12-04 23:10 ` [PATCH 4/9] hpsa: use workqueue instead of kernel thread for lockup detection Stephen M. Cameron
2013-12-04 23:10 ` [PATCH 5/9] hpsa: rename scsi prefetch field Stephen M. Cameron
2013-12-04 23:10 ` [PATCH 6/9] hpsa: enable unit attention reporting Stephen M. Cameron
2013-12-04 23:10 ` [PATCH 7/9] hpsa: do not discard scsi status on aborted commands Stephen M. Cameron
2013-12-04 23:10 ` [PATCH 8/9] hpsa: do not require board "not ready" status after hard reset Stephen M. Cameron
2013-12-04 23:10 ` [PATCH 9/9] hpsa: allow SCSI mid layer to handle unit attention Stephen M. Cameron
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20131204230951.21798.75512.stgit@beardog.cce.hp.com \
--to=scameron@beardog.cce.hp.com \
--cc=james.bottomley@hansenpartnership.com \
--cc=linux-scsi@vger.kernel.org \
--cc=mikem@beardog.cce.hp.com \
--cc=scott.teel@hp.com \
--cc=stephenmcameron@gmail.com \
--cc=thenzl@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).