diff options
author | majianpeng <majianpeng@gmail.com> | 2013-11-13 23:16:18 -0500 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2013-11-18 23:19:18 -0500 |
commit | 07169fd478ed2fbb3c894d524be9400658f16747 (patch) | |
tree | 54f3ee7b83d33459ae3a3ff4b6e84cd264979b7d | |
parent | b364e3d048e49b1d177eb7ee7853e77aa0560464 (diff) |
raid1: Replace raise_barrier/lower_barrier with freeze_array/unfreeze_array when reconfiguring the array.
We used to use raise_barrier to suspend normal IO while we reconfigure
the array. However raise_barrier will soon only suspend some normal
IO, not all. So we need something else.
Change it to use freeze_array.
But freeze_array not only suspends normal io, it also suspends
resync io.
For the place where call raise_barrier for reconfigure, it isn't a
problem.
Signed-off-by: Jianpeng Ma <majianpeng@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r-- | drivers/md/raid1.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 729db21dc829..ba5efb080862 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -2870,8 +2870,8 @@ static int stop(struct mddev *mddev) | |||
2870 | atomic_read(&bitmap->behind_writes) == 0); | 2870 | atomic_read(&bitmap->behind_writes) == 0); |
2871 | } | 2871 | } |
2872 | 2872 | ||
2873 | raise_barrier(conf); | 2873 | freeze_array(conf, 0); |
2874 | lower_barrier(conf); | 2874 | unfreeze_array(conf); |
2875 | 2875 | ||
2876 | md_unregister_thread(&mddev->thread); | 2876 | md_unregister_thread(&mddev->thread); |
2877 | if (conf->r1bio_pool) | 2877 | if (conf->r1bio_pool) |
@@ -3030,10 +3030,10 @@ static void raid1_quiesce(struct mddev *mddev, int state) | |||
3030 | wake_up(&conf->wait_barrier); | 3030 | wake_up(&conf->wait_barrier); |
3031 | break; | 3031 | break; |
3032 | case 1: | 3032 | case 1: |
3033 | raise_barrier(conf); | 3033 | freeze_array(conf, 0); |
3034 | break; | 3034 | break; |
3035 | case 0: | 3035 | case 0: |
3036 | lower_barrier(conf); | 3036 | unfreeze_array(conf); |
3037 | break; | 3037 | break; |
3038 | } | 3038 | } |
3039 | } | 3039 | } |
@@ -3050,7 +3050,8 @@ static void *raid1_takeover(struct mddev *mddev) | |||
3050 | mddev->new_chunk_sectors = 0; | 3050 | mddev->new_chunk_sectors = 0; |
3051 | conf = setup_conf(mddev); | 3051 | conf = setup_conf(mddev); |
3052 | if (!IS_ERR(conf)) | 3052 | if (!IS_ERR(conf)) |
3053 | conf->barrier = 1; | 3053 | /* Array must appear to be quiesced */ |
3054 | conf->array_frozen = 1; | ||
3054 | return conf; | 3055 | return conf; |
3055 | } | 3056 | } |
3056 | return ERR_PTR(-EINVAL); | 3057 | return ERR_PTR(-EINVAL); |