From: "Stephen M. Cameron" <scameron@beardog.cce.hp.com>
To: James.Bottomley@HansenPartnership.com, akpm@linux-foundation.org
Cc: mikem@beardog.cce.hp.com, brace@beardog.cce.hp.com,
matthew.gates@hp.com, linux-scsi@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: [PATCH 22/30] hpsa: use scan_start and scan_finished entry points for scanning
Date: Thu, 04 Feb 2010 08:43:16 -0600 [thread overview]
Message-ID: <20100204144316.10406.66122.stgit@beardog.cce.hp.com> (raw)
In-Reply-To: <20100204144012.10406.14868.stgit@beardog.cce.hp.com>
From: Stephen M. Cameron <scameron@beardog.cce.hp.com>
hpsa: use scan_start and scan_finished entry points for scanning and
route the CCISS_REGNEWD ioctl and sysfs triggering of same functionality
through hpsa_scan_start.
Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com>
---
drivers/scsi/hpsa.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++---
drivers/scsi/hpsa.h | 3 +++
2 files changed, 55 insertions(+), 3 deletions(-)
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
index e81df76..f889ec8 100644
--- a/drivers/scsi/hpsa.c
+++ b/drivers/scsi/hpsa.c
@@ -131,6 +131,9 @@ static void fill_cmd(struct CommandList *c, u8 cmd, struct ctlr_info *h,
static int hpsa_scsi_queue_command(struct scsi_cmnd *cmd,
void (*done)(struct scsi_cmnd *));
+static void hpsa_scan_start(struct Scsi_Host *);
+static int hpsa_scan_finished(struct Scsi_Host *sh,
+ unsigned long elapsed_time);
static int hpsa_eh_device_reset_handler(struct scsi_cmnd *scsicmd);
static int hpsa_slave_alloc(struct scsi_device *sdev);
@@ -177,6 +180,8 @@ static struct scsi_host_template hpsa_driver_template = {
.name = "hpsa",
.proc_name = "hpsa",
.queuecommand = hpsa_scsi_queue_command,
+ .scan_start = hpsa_scan_start,
+ .scan_finished = hpsa_scan_finished,
.this_id = -1,
.sg_tablesize = MAXSGENTRIES,
.use_clustering = ENABLE_CLUSTERING,
@@ -320,7 +325,7 @@ static int hpsa_scan_func(__attribute__((unused)) void *data)
h->busy_scanning = 1;
mutex_unlock(&hpsa_scan_mutex);
host_no = h->scsi_host ? h->scsi_host->host_no : -1;
- hpsa_update_scsi_devices(h, host_no);
+ hpsa_scan_start(h->scsi_host);
complete_all(&h->scan_wait);
mutex_lock(&hpsa_scan_mutex);
h->busy_scanning = 0;
@@ -2006,6 +2011,48 @@ static int hpsa_scsi_queue_command(struct scsi_cmnd *cmd,
return 0;
}
+static void hpsa_scan_start(struct Scsi_Host *sh)
+{
+ struct ctlr_info *h = shost_to_hba(sh);
+ unsigned long flags;
+
+ /* wait until any scan already in progress is finished. */
+ while (1) {
+ spin_lock_irqsave(&h->scan_lock, flags);
+ if (h->scan_finished)
+ break;
+ spin_unlock_irqrestore(&h->scan_lock, flags);
+ wait_event(h->scan_wait_queue, h->scan_finished);
+ /* Note: We don't need to worry about a race between this
+ * thread and driver unload because the midlayer will
+ * have incremented the reference count, so unload won't
+ * happen if we're in here.
+ */
+ }
+ h->scan_finished = 0; /* mark scan as in progress */
+ spin_unlock_irqrestore(&h->scan_lock, flags);
+
+ 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);
+}
+
+static int hpsa_scan_finished(struct Scsi_Host *sh,
+ unsigned long elapsed_time)
+{
+ struct ctlr_info *h = shost_to_hba(sh);
+ unsigned long flags;
+ int finished;
+
+ spin_lock_irqsave(&h->scan_lock, flags);
+ finished = h->scan_finished;
+ spin_unlock_irqrestore(&h->scan_lock, flags);
+ return finished;
+}
+
static void hpsa_unregister_scsi(struct ctlr_info *h)
{
/* we are being forcibly unloaded, and may not refuse. */
@@ -2018,7 +2065,6 @@ static int hpsa_register_scsi(struct ctlr_info *h)
{
int rc;
- hpsa_update_scsi_devices(h, -1);
rc = hpsa_scsi_detect(h);
if (rc != 0)
dev_err(&h->pdev->dev, "hpsa_register_scsi: failed"
@@ -2619,7 +2665,7 @@ static int hpsa_ioctl(struct scsi_device *dev, int cmd, void *arg)
case CCISS_DEREGDISK:
case CCISS_REGNEWDISK:
case CCISS_REGNEWD:
- hpsa_update_scsi_devices(h, dev->host->host_no);
+ hpsa_scan_start(h->scsi_host);
return 0;
case CCISS_GETPCIINFO:
return hpsa_getpciinfo_ioctl(h, argp);
@@ -3532,6 +3578,9 @@ static int __devinit hpsa_init_one(struct pci_dev *pdev,
goto clean4;
}
spin_lock_init(&h->lock);
+ spin_lock_init(&h->scan_lock);
+ init_waitqueue_head(&h->scan_wait_queue);
+ h->scan_finished = 1; /* no scan currently in progress */
pci_set_drvdata(pdev, h);
memset(h->cmd_pool_bits, 0,
diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h
index 1ab0c1b..a0502b3 100644
--- a/drivers/scsi/hpsa.h
+++ b/drivers/scsi/hpsa.h
@@ -94,6 +94,9 @@ struct ctlr_info {
int nr_frees;
int busy_initializing;
int busy_scanning;
+ int scan_finished;
+ spinlock_t scan_lock;
+ wait_queue_head_t scan_wait_queue;
struct mutex busy_shutting_down;
struct list_head scan_list;
struct completion scan_wait;
next prev parent reply other threads:[~2010-02-04 14:40 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-04 14:41 [PATCH 00/30] hpsa: Feb 2010 driver updates Stephen M. Cameron
2010-02-04 14:41 ` [PATCH 01/30] hpsa: fix typo in comments Stephen M. Cameron
2010-02-04 14:41 ` [PATCH 02/30] hpsa: Use kernel integer types, not userland ones Stephen M. Cameron
2010-02-04 14:41 ` [PATCH 03/30] hpsa: avoid unwanted promotion from unsigned to signed for raid level index Stephen M. Cameron
2010-02-04 14:41 ` [PATCH 04/30] hpsa: Use BUG_ON instead of an if statement Stephen M. Cameron
2010-02-04 14:41 ` [PATCH 05/30] hpsa: make adjust_hpsa_scsi_table return void Stephen M. Cameron
2010-02-04 14:41 ` [PATCH 06/30] hpsa: remove superfluous returns from void functions Stephen M. Cameron
2010-02-04 14:41 ` [PATCH 07/30] hpsa: return proper error codes not minus one Stephen M. Cameron
2010-02-04 14:42 ` [PATCH 08/30] hpsa: use sizeof() not an inline constant in memset Stephen M. Cameron
2010-02-04 14:42 ` [PATCH 09/30] hpsa: use kzalloc not kmalloc plus memset Stephen M. Cameron
2010-02-04 14:42 ` [PATCH 10/30] hpsa: remove unwanted debug code Stephen M. Cameron
2010-02-04 14:42 ` [PATCH 11/30] hpsa: eliminate unnecessary memcpys Stephen M. Cameron
2010-02-04 14:42 ` [PATCH 12/30] hpsa: make tag macros into functions Stephen M. Cameron
2010-02-04 14:42 ` [PATCH 13/30] hpsa: fix some debug printks to use dev_dbg instead Stephen M. Cameron
2010-02-04 14:42 ` [PATCH 14/30] hpsa: interrupt pending function should return bool not unsigned long Stephen M. Cameron
2010-02-04 14:42 ` [PATCH 15/30] hpsa: Allow multiple command completions per interrupt Stephen M. Cameron
2010-02-04 14:42 ` [PATCH 16/30] hpsa: add pci ids for storageworks 1210m, remove p400, p800, p700m Stephen M. Cameron
2010-02-04 14:42 ` [PATCH 17/30] hpsa: Fix p1210m LUN assignment Stephen M. Cameron
2010-02-04 14:42 ` [PATCH 18/30] hpsa: Return DID_RESET for commands which complete with status of UNSOLICITED ABORT Stephen M. Cameron
2010-02-04 14:43 ` [PATCH 19/30] hpsa: Retry commands completing with a sense key of ABORTED_COMMAND Stephen M. Cameron
2010-02-04 14:43 ` [PATCH 20/30] hpsa: Don't return DID_NO_CONNECT when a device is merely not ready Stephen M. Cameron
2010-02-04 14:43 ` [PATCH 21/30] hpsa: Add an shost_to_hba helper function Stephen M. Cameron
2010-02-04 14:43 ` Stephen M. Cameron [this message]
2010-02-04 14:43 ` [PATCH 23/30] hpsa: when resetting devices, print out which device Stephen M. Cameron
2010-02-04 14:43 ` [PATCH 24/30] hpsa: print all the bytes of the CDB, not just the first one Stephen M. Cameron
2010-02-04 14:43 ` [PATCH 25/30] hpsa: clarify obscure comment in adjust_hpsa_scsi_table Stephen M. Cameron
2010-02-04 14:43 ` [PATCH 26/30] hpsa: Fix hpsa_find_scsi_entry so that it doesn't try to dereference NULL pointers Stephen M. Cameron
2010-02-04 14:43 ` [PATCH 27/30] hpsa: fix bug in adjust_hpsa_scsi_table Stephen M. Cameron
2010-02-04 14:43 ` [PATCH 28/30] hpsa: eliminate lock_kernel in compat_ioctl Stephen M. Cameron
2010-02-04 14:43 ` [PATCH 29/30] hpsa: Reorder compat ioctl functions to eliminate some forward declarations Stephen M. Cameron
2010-02-04 14:43 ` [PATCH 30/30] hpsa: `update driver version to 2.0.1-3 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=20100204144316.10406.66122.stgit@beardog.cce.hp.com \
--to=scameron@beardog.cce.hp.com \
--cc=James.Bottomley@HansenPartnership.com \
--cc=akpm@linux-foundation.org \
--cc=brace@beardog.cce.hp.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=matthew.gates@hp.com \
--cc=mikem@beardog.cce.hp.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