summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2009-11-06 14:59:27 +1100
committerGreg Kroah-Hartman <gregkh@suse.de>2009-12-08 10:20:56 -0800
commit98bc571940095198eec1e4b9af70bf9024b5f539 (patch)
tree9005885ffe16d59bb281ac1d20f75fae4d41bd49 /drivers
parent146d0c086cc8b6d580cb08b6e8ad149f91c1e03d (diff)
md: don't clear endpoint for resync when resync is interrupted.
commit 24395a85d8efe6eee477ea35c73d045a8dd7a3a1 upstream. If a 'sync_max' has been set (via sysfs), it is wrong to clear it until a resync (or reshape or recovery ...) actually reached that point. So if a resync is interrupted (e.g. by device failure), leave 'resync_max' unchanged. This is particularly important for 'reshape' operations that do not change the size of the array. For such operations mdadm needs to monitor the reshape taking rolling backups of the section being reshaped. If resync_max gets cleared, the reshape can get ahead of mdadm and then the backups that mdadm creates are useless. This is suitable for 2.6.31.y stable kernels. Signed-off-by: NeilBrown <neilb@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/md/md.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 9dd872000cec..78871cd97460 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -6495,8 +6495,9 @@ void md_do_sync(mddev_t *mddev)
skip:
mddev->curr_resync = 0;
mddev->curr_resync_completed = 0;
- mddev->resync_min = 0;
- mddev->resync_max = MaxSector;
+ if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery))
+ /* We completed so max setting can be forgotten. */
+ mddev->resync_max = MaxSector;
sysfs_notify(&mddev->kobj, NULL, "sync_completed");
wake_up(&resync_wait);
set_bit(MD_RECOVERY_DONE, &mddev->recovery);