]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
md/raid5.c: add proper locking to error path of raid5_start_reshape.
authorNeilBrown <neilb@suse.de>
Wed, 11 Sep 2013 00:53:45 +0000 (10:53 +1000)
committerNeilBrown <neilb@suse.de>
Thu, 24 Oct 2013 02:39:58 +0000 (13:39 +1100)
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>
drivers/md/raid5.c

index f8b9068439267a3539d671e6e59ceb0b47b90547..ee9e609da7a87a7135a8558a1e21f6ce9dedfa0a 100644 (file)
@@ -6383,12 +6383,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;
        }