linux-raid.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: NeilBrown <neilb@suse.de>
To: linux-raid@vger.kernel.org
Subject: [md PATCH 04/13] md: Ensure no IO request to get md device before it is properly initialised.
Date: Wed, 12 Jan 2011 09:12:46 +1100	[thread overview]
Message-ID: <20110111221246.12732.57094.stgit@notabene.brown> (raw)
In-Reply-To: <20110111221050.12732.31647.stgit@notabene.brown>

When an md device is in the process of coming on line it is possible
for an IO request (typically a partition table probe) to get through
before the array is fully initialised, which can cause unexpected
behaviour (e.g. a crash).

So explicitly record when the array is ready for IO and don't allow IO
through until then.

There is no possibility for a similar problem when the array is going
off-line as there must only be one 'open' at that time, and it is busy
off-lining the array and so cannot send IO requests.  So no memory
barrier is needed in md_stop()

This has been a bug since commit 409c57f3801 in 2.6.30 which
introduced md_make_request.  Before then, each personality would
register its own make_request_fn when it was ready.
This is suitable for any stable kernel from 2.6.30.y onwards.

Cc: <stable@kernel.org>
Signed-off-by: NeilBrown <neilb@suse.de>
Reported-by:  "Hawrylewicz Czarnowski, Przemyslaw" <przemyslaw.hawrylewicz.czarnowski@intel.com>
---

 drivers/md/md.c |    8 ++++++--
 drivers/md/md.h |    3 ++-
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/md/md.c b/drivers/md/md.c
index a301912..540347c 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -288,10 +288,12 @@ static int md_make_request(struct request_queue *q, struct bio *bio)
 	int rv;
 	int cpu;
 
-	if (mddev == NULL || mddev->pers == NULL) {
+	if (mddev == NULL || mddev->pers == NULL
+	    || !mddev->ready) {
 		bio_io_error(bio);
 		return 0;
 	}
+	smp_rmb(); /* Ensure implications of  'active' are visible */
 	rcu_read_lock();
 	if (mddev->suspended) {
 		DEFINE_WAIT(__wait);
@@ -4564,7 +4566,8 @@ int md_run(mddev_t *mddev)
 	mddev->safemode_timer.data = (unsigned long) mddev;
 	mddev->safemode_delay = (200 * HZ)/1000 +1; /* 200 msec delay */
 	mddev->in_sync = 1;
-
+	smp_wmb();
+	mddev->ready = 1;
 	list_for_each_entry(rdev, &mddev->disks, same_set)
 		if (rdev->raid_disk >= 0) {
 			char nm[20];
@@ -4725,6 +4728,7 @@ EXPORT_SYMBOL_GPL(md_stop_writes);
 
 void md_stop(mddev_t *mddev)
 {
+	mddev->ready = 0;
 	mddev->pers->stop(mddev);
 	if (mddev->pers->sync_request && mddev->to_remove == NULL)
 		mddev->to_remove = &md_redundancy_group;
diff --git a/drivers/md/md.h b/drivers/md/md.h
index d05bab5..229675a 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -148,7 +148,8 @@ struct mddev_s
 						       * are happening, so run/
 						       * takeover/stop are not safe
 						       */
-
+	int				ready; /* See when safe to pass 
+						* IO requests down */
 	struct gendisk			*gendisk;
 
 	struct kobject			kobj;



  parent reply	other threads:[~2011-01-11 22:12 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-01-11 22:12 [md PATCH 00/13] md patches for the current merge window NeilBrown
2011-01-11 22:12 ` [md PATCH 03/13] md: Fix single printks with multiple KERN_<level>s NeilBrown
2011-01-11 22:12 ` [md PATCH 02/13] md: fix regression resulting in delays in clearing bits in a bitmap NeilBrown
2011-01-11 22:12 ` [md PATCH 06/13] md: md_stop_writes requires mddev_lock NeilBrown
2011-01-11 22:12 ` [md PATCH 01/13] md: fix regression with re-adding devices to arrays with no metadata NeilBrown
2011-01-11 22:12 ` NeilBrown [this message]
2011-01-11 22:12 ` [md PATCH 07/13] md: Be more careful about clearing flags bit in ->recovery NeilBrown
2011-01-11 22:12 ` [md PATCH 05/13] md/raid5: use sysfs_notify_dirent_safe to avoid NULL pointer NeilBrown
2011-01-11 22:12 ` [md PATCH 08/13] md-new-param-to-calc_dev_sboffset NeilBrown
2011-01-11 22:12 ` [md PATCH 10/13] md: separate meta and data devs NeilBrown
2011-01-11 22:12 ` [md PATCH 11/13] md: Don't let implementation detail of curr_resync leak out through sysfs NeilBrown
2011-01-11 22:12 ` [md PATCH 12/13] md: allow suspend_lo and suspend_hi to decrease as well as increase NeilBrown
2011-01-11 22:12 ` [md PATCH 09/13] md-new-param-to_sync_page_io NeilBrown
2011-01-11 22:12 ` [md PATCH 13/13] md: fix sync_completed reporting for very large drives (>2TB) NeilBrown

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=20110111221246.12732.57094.stgit@notabene.brown \
    --to=neilb@suse.de \
    --cc=linux-raid@vger.kernel.org \
    /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).