提交 e8ff8bf0 编写于 作者: J Jes Sorensen 提交者: NeilBrown

md/raid1: Avoid raid1 resync getting stuck

close_sync() needs to set conf->next_resync to a large, but safe value
below MaxSector and use it to determine whether or not to set
start_next_window in wait_barrier()

Solution suggested by Neil Brown.
Reported-by: NNate Dailey <nate.dailey@stratus.com>
Tested-by: NXiao Ni <xni@redhat.com>
Signed-off-by: NJes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: NNeilBrown <neilb@suse.com>
上级 644df1a8
...@@ -881,8 +881,7 @@ static sector_t wait_barrier(struct r1conf *conf, struct bio *bio) ...@@ -881,8 +881,7 @@ static sector_t wait_barrier(struct r1conf *conf, struct bio *bio)
} }
if (bio && bio_data_dir(bio) == WRITE) { if (bio && bio_data_dir(bio) == WRITE) {
if (bio->bi_iter.bi_sector >= if (bio->bi_iter.bi_sector >= conf->next_resync) {
conf->mddev->curr_resync_completed) {
if (conf->start_next_window == MaxSector) if (conf->start_next_window == MaxSector)
conf->start_next_window = conf->start_next_window =
conf->next_resync + conf->next_resync +
...@@ -1516,7 +1515,7 @@ static void close_sync(struct r1conf *conf) ...@@ -1516,7 +1515,7 @@ static void close_sync(struct r1conf *conf)
conf->r1buf_pool = NULL; conf->r1buf_pool = NULL;
spin_lock_irq(&conf->resync_lock); spin_lock_irq(&conf->resync_lock);
conf->next_resync = 0; conf->next_resync = MaxSector - 2 * NEXT_NORMALIO_DISTANCE;
conf->start_next_window = MaxSector; conf->start_next_window = MaxSector;
conf->current_window_requests += conf->current_window_requests +=
conf->next_window_requests; conf->next_window_requests;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册