aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r--drivers/md/md.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index a3019121dc57..540347c538f9 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)
288 int rv; 288 int rv;
289 int cpu; 289 int cpu;
290 290
291 if (mddev == NULL || mddev->pers == NULL) { 291 if (mddev == NULL || mddev->pers == NULL
292 || !mddev->ready) {
292 bio_io_error(bio); 293 bio_io_error(bio);
293 return 0; 294 return 0;
294 } 295 }
296 smp_rmb(); /* Ensure implications of 'active' are visible */
295 rcu_read_lock(); 297 rcu_read_lock();
296 if (mddev->suspended) { 298 if (mddev->suspended) {
297 DEFINE_WAIT(__wait); 299 DEFINE_WAIT(__wait);
@@ -4564,7 +4566,8 @@ int md_run(mddev_t *mddev)
4564 mddev->safemode_timer.data = (unsigned long) mddev; 4566 mddev->safemode_timer.data = (unsigned long) mddev;
4565 mddev->safemode_delay = (200 * HZ)/1000 +1; /* 200 msec delay */ 4567 mddev->safemode_delay = (200 * HZ)/1000 +1; /* 200 msec delay */
4566 mddev->in_sync = 1; 4568 mddev->in_sync = 1;
4567 4569 smp_wmb();
4570 mddev->ready = 1;
4568 list_for_each_entry(rdev, &mddev->disks, same_set) 4571 list_for_each_entry(rdev, &mddev->disks, same_set)
4569 if (rdev->raid_disk >= 0) { 4572 if (rdev->raid_disk >= 0) {
4570 char nm[20]; 4573 char nm[20];
@@ -4725,6 +4728,7 @@ EXPORT_SYMBOL_GPL(md_stop_writes);
4725 4728
4726void md_stop(mddev_t *mddev) 4729void md_stop(mddev_t *mddev)
4727{ 4730{
4731 mddev->ready = 0;
4728 mddev->pers->stop(mddev); 4732 mddev->pers->stop(mddev);
4729 if (mddev->pers->sync_request && mddev->to_remove == NULL) 4733 if (mddev->pers->sync_request && mddev->to_remove == NULL)
4730 mddev->to_remove = &md_redundancy_group; 4734 mddev->to_remove = &md_redundancy_group;