Commit e8ff8bf0 authored by Jes Sorensen's avatar Jes Sorensen Committed by 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: default avatarNate Dailey <nate.dailey@stratus.com>
Tested-by: default avatarXiao Ni <xni@redhat.com>
Signed-off-by: default avatarJes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: default avatarNeilBrown <neilb@suse.com>
parent 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%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment