Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e8ff8bf0 authored by Jes Sorensen's avatar Jes Sorensen Committed by NeilBrown
Browse files

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
Loading
Loading
Loading
Loading
+2 −3
Original line number Original line Diff line number Diff line
@@ -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)
	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;