diff options
Diffstat (limited to 'drivers/md/raid1.c')
-rw-r--r-- | drivers/md/raid1.c | 18 |
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 | ||
2962 | static int stop(struct mddev *mddev) | 2964 | static 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); |