diff options
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r-- | drivers/md/md.c | 8 |
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 | ||
4726 | void md_stop(mddev_t *mddev) | 4729 | void 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; |