From 20a307c5981b0f256196a3b9b1e45c833bf5171b Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Fri, 14 Jan 2011 09:14:33 +1100 Subject: [PATCH] --- yaml --- r: 230646 b: refs/heads/master c: 0ca69886a8273ac1350143d562280bfcbe4760dc h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/md/md.c | 8 ++++++-- trunk/drivers/md/md.h | 3 ++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index e3664ac0467c..ff628b4df49d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 067032bc628598606056412594042564fcf09e22 +refs/heads/master: 0ca69886a8273ac1350143d562280bfcbe4760dc diff --git a/trunk/drivers/md/md.c b/trunk/drivers/md/md.c index a3019121dc57..540347c538f9 100644 --- a/trunk/drivers/md/md.c +++ b/trunk/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/trunk/drivers/md/md.h b/trunk/drivers/md/md.h index d05bab55df4e..229675a604f7 100644 --- a/trunk/drivers/md/md.h +++ b/trunk/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;