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: Nate Dailey <nate.dailey@stratus.com> Tested-by: Xiao Ni <xni@redhat.com> Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com> Signed-off-by: NeilBrown <neilb@suse.com>
This commit is contained in:
parent
644df1a85f
commit
e8ff8bf09f
1 changed files with 2 additions and 3 deletions
|
@ -881,8 +881,7 @@ static sector_t wait_barrier(struct r1conf *conf, struct bio *bio)
|
|||
}
|
||||
|
||||
if (bio && bio_data_dir(bio) == WRITE) {
|
||||
if (bio->bi_iter.bi_sector >=
|
||||
conf->mddev->curr_resync_completed) {
|
||||
if (bio->bi_iter.bi_sector >= conf->next_resync) {
|
||||
if (conf->start_next_window == MaxSector)
|
||||
conf->start_next_window =
|
||||
conf->next_resync +
|
||||
|
@ -1516,7 +1515,7 @@ static void close_sync(struct r1conf *conf)
|
|||
conf->r1buf_pool = NULL;
|
||||
|
||||
spin_lock_irq(&conf->resync_lock);
|
||||
conf->next_resync = 0;
|
||||
conf->next_resync = MaxSector - 2 * NEXT_NORMALIO_DISTANCE;
|
||||
conf->start_next_window = MaxSector;
|
||||
conf->current_window_requests +=
|
||||
conf->next_window_requests;
|
||||
|
|
Loading…
Reference in a new issue