|
@@ -5738,6 +5738,7 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, int *sk
|
|
|
*/
|
|
|
struct r5conf *conf = mddev->private;
|
|
|
struct stripe_head *sh;
|
|
|
+ struct md_rdev *rdev;
|
|
|
sector_t first_sector, last_sector;
|
|
|
int raid_disks = conf->previous_raid_disks;
|
|
|
int data_disks = raid_disks - conf->max_degraded;
|
|
@@ -5860,6 +5861,15 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, int *sk
|
|
|
return 0;
|
|
|
mddev->reshape_position = conf->reshape_progress;
|
|
|
mddev->curr_resync_completed = sector_nr;
|
|
|
+ if (!mddev->reshape_backwards)
|
|
|
+ /* Can update recovery_offset */
|
|
|
+ rdev_for_each(rdev, mddev)
|
|
|
+ if (rdev->raid_disk >= 0 &&
|
|
|
+ !test_bit(Journal, &rdev->flags) &&
|
|
|
+ !test_bit(In_sync, &rdev->flags) &&
|
|
|
+ rdev->recovery_offset < sector_nr)
|
|
|
+ rdev->recovery_offset = sector_nr;
|
|
|
+
|
|
|
conf->reshape_checkpoint = jiffies;
|
|
|
set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
|
|
|
md_wakeup_thread(mddev->thread);
|
|
@@ -5958,6 +5968,14 @@ finish:
|
|
|
goto ret;
|
|
|
mddev->reshape_position = conf->reshape_progress;
|
|
|
mddev->curr_resync_completed = sector_nr;
|
|
|
+ if (!mddev->reshape_backwards)
|
|
|
+ /* Can update recovery_offset */
|
|
|
+ rdev_for_each(rdev, mddev)
|
|
|
+ if (rdev->raid_disk >= 0 &&
|
|
|
+ !test_bit(Journal, &rdev->flags) &&
|
|
|
+ !test_bit(In_sync, &rdev->flags) &&
|
|
|
+ rdev->recovery_offset < sector_nr)
|
|
|
+ rdev->recovery_offset = sector_nr;
|
|
|
conf->reshape_checkpoint = jiffies;
|
|
|
set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
|
|
|
md_wakeup_thread(mddev->thread);
|
|
@@ -7945,6 +7963,7 @@ static void end_reshape(struct r5conf *conf)
|
|
|
{
|
|
|
|
|
|
if (!test_bit(MD_RECOVERY_INTR, &conf->mddev->recovery)) {
|
|
|
+ struct md_rdev *rdev;
|
|
|
|
|
|
spin_lock_irq(&conf->device_lock);
|
|
|
conf->previous_raid_disks = conf->raid_disks;
|
|
@@ -7952,6 +7971,11 @@ static void end_reshape(struct r5conf *conf)
|
|
|
smp_wmb();
|
|
|
conf->reshape_progress = MaxSector;
|
|
|
conf->mddev->reshape_position = MaxSector;
|
|
|
+ rdev_for_each(rdev, conf->mddev)
|
|
|
+ if (rdev->raid_disk >= 0 &&
|
|
|
+ !test_bit(Journal, &rdev->flags) &&
|
|
|
+ !test_bit(In_sync, &rdev->flags))
|
|
|
+ rdev->recovery_offset = MaxSector;
|
|
|
spin_unlock_irq(&conf->device_lock);
|
|
|
wake_up(&conf->wait_for_overlap);
|
|
|
|