md: Use ->curr_resync as last completed request when cleanly aborting resync.

If a resync is aborted cleanly, ->curr_resync is a reliable
record of where we got up to.
If there was an error it is less reliable but we always know that
->curr_resync_completed is safe.

So add a flag MD_RECOVERY_ERROR to differentiate between these cases
and set recovery_cp accordingly.

Signed-off-by: Jianpeng Ma <majianpeng@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
majianpeng 2012-11-19 19:57:34 +08:00 committed by NeilBrown
parent 4f8c55c5ad
commit 0a19caabf0
2 changed files with 10 additions and 2 deletions

View File

@ -7180,6 +7180,7 @@ void md_done_sync(struct mddev *mddev, int blocks, int ok)
wake_up(&mddev->recovery_wait); wake_up(&mddev->recovery_wait);
if (!ok) { if (!ok) {
set_bit(MD_RECOVERY_INTR, &mddev->recovery); set_bit(MD_RECOVERY_INTR, &mddev->recovery);
set_bit(MD_RECOVERY_ERROR, &mddev->recovery);
md_wakeup_thread(mddev->thread); md_wakeup_thread(mddev->thread);
// stop recovery, signal do_sync .... // stop recovery, signal do_sync ....
} }
@ -7574,8 +7575,13 @@ void md_do_sync(struct md_thread *thread)
printk(KERN_INFO printk(KERN_INFO
"md: checkpointing %s of %s.\n", "md: checkpointing %s of %s.\n",
desc, mdname(mddev)); desc, mdname(mddev));
mddev->recovery_cp = if (test_bit(MD_RECOVERY_ERROR,
mddev->curr_resync_completed; &mddev->recovery))
mddev->recovery_cp =
mddev->curr_resync_completed;
else
mddev->recovery_cp =
mddev->curr_resync;
} }
} else } else
mddev->recovery_cp = MaxSector; mddev->recovery_cp = MaxSector;

View File

@ -307,6 +307,7 @@ struct mddev {
* REQUEST: user-space has requested a sync (used with SYNC) * REQUEST: user-space has requested a sync (used with SYNC)
* CHECK: user-space request for check-only, no repair * CHECK: user-space request for check-only, no repair
* RESHAPE: A reshape is happening * RESHAPE: A reshape is happening
* ERROR: sync-action interrupted because io-error
* *
* If neither SYNC or RESHAPE are set, then it is a recovery. * If neither SYNC or RESHAPE are set, then it is a recovery.
*/ */
@ -320,6 +321,7 @@ struct mddev {
#define MD_RECOVERY_CHECK 7 #define MD_RECOVERY_CHECK 7
#define MD_RECOVERY_RESHAPE 8 #define MD_RECOVERY_RESHAPE 8
#define MD_RECOVERY_FROZEN 9 #define MD_RECOVERY_FROZEN 9
#define MD_RECOVERY_ERROR 10
unsigned long recovery; unsigned long recovery;
/* If a RAID personality determines that recovery (of a particular /* If a RAID personality determines that recovery (of a particular