aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/raid1.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/raid1.c')
-rw-r--r--drivers/md/raid1.c18
1 files changed, 3 insertions, 15 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index 45c512a4b75d..fccea0b39808 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -2954,29 +2954,17 @@ static int run(struct mddev *mddev)
2954 } 2954 }
2955 2955
2956 ret = md_integrity_register(mddev); 2956 ret = md_integrity_register(mddev);
2957 if (ret) 2957 if (ret) {
2958 md_unregister_thread(&mddev->thread);
2958 stop(mddev); 2959 stop(mddev);
2960 }
2959 return ret; 2961 return ret;
2960} 2962}
2961 2963
2962static int stop(struct mddev *mddev) 2964static int stop(struct mddev *mddev)
2963{ 2965{
2964 struct r1conf *conf = mddev->private; 2966 struct r1conf *conf = mddev->private;
2965 struct bitmap *bitmap = mddev->bitmap;
2966
2967 /* wait for behind writes to complete */
2968 if (bitmap && atomic_read(&bitmap->behind_writes) > 0) {
2969 printk(KERN_INFO "md/raid1:%s: behind writes in progress - waiting to stop.\n",
2970 mdname(mddev));
2971 /* need to kick something here to make sure I/O goes? */
2972 wait_event(bitmap->behind_wait,
2973 atomic_read(&bitmap->behind_writes) == 0);
2974 }
2975
2976 freeze_array(conf, 0);
2977 unfreeze_array(conf);
2978 2967
2979 md_unregister_thread(&mddev->thread);
2980 if (conf->r1bio_pool) 2968 if (conf->r1bio_pool)
2981 mempool_destroy(conf->r1bio_pool); 2969 mempool_destroy(conf->r1bio_pool);
2982 kfree(conf->mirrors); 2970 kfree(conf->mirrors);