diff options
| author | majianpeng <majianpeng@gmail.com> | 2012-11-19 19:57:34 +0800 | 
|---|---|---|
| committer | NeilBrown <neilb@suse.de> | 2012-12-13 19:52:11 +1100 | 
| commit | 0a19caabf01ac138bf3668786939e50ea4d9c8ac (patch) | |
| tree | dc672faa83d44dbbb8097b367a35ce1cfba9c90f /drivers/md/md.c | |
| parent | 4f8c55c5ad491dbc7b52ce08bb702ca39ce944cf (diff) | |
| download | olio-linux-3.10-0a19caabf01ac138bf3668786939e50ea4d9c8ac.tar.xz olio-linux-3.10-0a19caabf01ac138bf3668786939e50ea4d9c8ac.zip  | |
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>
Diffstat (limited to 'drivers/md/md.c')
| -rw-r--r-- | drivers/md/md.c | 10 | 
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 6aefa443481..30ba223e5ed 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -7180,6 +7180,7 @@ void md_done_sync(struct mddev *mddev, int blocks, int ok)  	wake_up(&mddev->recovery_wait);  	if (!ok) {  		set_bit(MD_RECOVERY_INTR, &mddev->recovery); +		set_bit(MD_RECOVERY_ERROR, &mddev->recovery);  		md_wakeup_thread(mddev->thread);  		// stop recovery, signal do_sync ....  	} @@ -7574,8 +7575,13 @@ void md_do_sync(struct md_thread *thread)  					printk(KERN_INFO  					       "md: checkpointing %s of %s.\n",  					       desc, mdname(mddev)); -					mddev->recovery_cp = -						mddev->curr_resync_completed; +					if (test_bit(MD_RECOVERY_ERROR, +						&mddev->recovery)) +						mddev->recovery_cp = +							mddev->curr_resync_completed; +					else +						mddev->recovery_cp = +							mddev->curr_resync;  				}  			} else  				mddev->recovery_cp = MaxSector;  |