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

Commit bb63a701 authored by NeilBrown's avatar NeilBrown
Browse files

md/raid10: resize bitmap when required during reshape.



If a reshape changes the size of the array, then we can now
update the bitmap to suit - so do so.

Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent a4a6125a
Loading
Loading
Loading
Loading
+24 −13
Original line number Diff line number Diff line
@@ -3786,8 +3786,6 @@ static int raid10_check_reshape(struct mddev *mddev)
			/* not factor of array size */
			return -EINVAL;

	if (mddev->bitmap)
		return -EBUSY;
	if (!enough(conf, -1))
		return -EINVAL;

@@ -3882,6 +3880,7 @@ static int raid10_start_reshape(struct mddev *mddev)
	struct r10conf *conf = mddev->private;
	struct md_rdev *rdev;
	int spares = 0;
	int ret;

	if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
		return -EBUSY;
@@ -3943,6 +3942,14 @@ static int raid10_start_reshape(struct mddev *mddev)
		conf->reshape_progress = 0;
	spin_unlock_irq(&conf->device_lock);

	if (mddev->delta_disks && mddev->bitmap) {
		ret = bitmap_resize(mddev->bitmap,
				    raid10_size(mddev, 0,
						conf->geo.raid_disks),
				    0, 0);
		if (ret)
			goto abort;
	}
	if (mddev->delta_disks > 0) {
		rdev_for_each(rdev, mddev)
			if (rdev->raid_disk < 0 &&
@@ -3982,6 +3989,15 @@ static int raid10_start_reshape(struct mddev *mddev)
	mddev->sync_thread = md_register_thread(md_do_sync, mddev,
						"reshape");
	if (!mddev->sync_thread) {
		ret = -EAGAIN;
		goto abort;
	}
	conf->reshape_checkpoint = jiffies;
	md_wakeup_thread(mddev->sync_thread);
	md_new_event(mddev);
	return 0;

abort:
	mddev->recovery = 0;
	spin_lock_irq(&conf->device_lock);
	conf->geo = conf->prev;
@@ -3992,12 +4008,7 @@ static int raid10_start_reshape(struct mddev *mddev)
	conf->reshape_progress = MaxSector;
	mddev->reshape_position = MaxSector;
	spin_unlock_irq(&conf->device_lock);
		return -EAGAIN;
	}
	conf->reshape_checkpoint = jiffies;
	md_wakeup_thread(mddev->sync_thread);
	md_new_event(mddev);
	return 0;
	return ret;
}

/* Calculate the last device-address that could contain