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

Commit ba8805b9 authored by NeilBrown's avatar NeilBrown
Browse files

md/raid5.c: add proper locking to error path of raid5_start_reshape.



If raid5_start_reshape errors out, we need to reset all the fields
that were updated (not just some), and need to use the seq_counter
to ensure make_request() doesn't use an inconsitent state.

Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent 02e5f5c0
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -6384,12 +6384,18 @@ static int raid5_start_reshape(struct mddev *mddev)
	if (!mddev->sync_thread) {
		mddev->recovery = 0;
		spin_lock_irq(&conf->device_lock);
		write_seqcount_begin(&conf->gen_lock);
		mddev->raid_disks = conf->raid_disks = conf->previous_raid_disks;
		mddev->new_chunk_sectors =
			conf->chunk_sectors = conf->prev_chunk_sectors;
		mddev->new_layout = conf->algorithm = conf->prev_algo;
		rdev_for_each(rdev, mddev)
			rdev->new_data_offset = rdev->data_offset;
		smp_wmb();
		conf->generation --;
		conf->reshape_progress = MaxSector;
		mddev->reshape_position = MaxSector;
		write_seqcount_end(&conf->gen_lock);
		spin_unlock_irq(&conf->device_lock);
		return -EAGAIN;
	}