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: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
02e5f5c0a0
commit
ba8805b973
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue