md: When resync aborted,using ->curr_resync as the last completed request rather than ->curr_resync_completed.
PATCH 1/5 md: When resync aborted,using ->curr_resync as the last completed request rather than ->curr_resync_completed.
Quoted 4 lines · In commit(db91ff55bdf06736b849afc1b1fce5763bbb8d5d),it said:
If a resync is aborted we should record how far we got (
recovery_cp) the last request that we know has completed (->curr_resync_completed) rather than the last request that was submitted (->curr_resync).
But when resync aborted, it execed
Quoted 1 line
wait_event(mddev->recovery_wait, !atomic_read(&mddev->recovery_active));
After this, the ->curr_resync is the last completed request.
--- drivers/md/md.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/md/md.c +1 -2
@@ -7558,8 +7558,7 @@ 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; + mddev->recovery_cp = mddev->curr_resync; } }else mddev->recovery_cp = MaxSector;
Signature · 1 line
1.7.9.5
Quoted 19 lines · On Sat, 27 Oct 2012 10:28:58 +0800 kernelmail <[email protected]> wrote:
Quoted 4 lines · In commit(db91ff55bdf06736b849afc1b1fce5763bbb8d5d),it said:
If a resync is aborted we should record how far we got (
recovery_cp) the last request that we know has completed (->curr_resync_completed) rather than the last request that was submitted (->curr_resync).But when resync aborted, it execed
Quoted 1 line
wait_event(mddev->recovery_wait, !atomic_read(&mddev->recovery_active));After this, the ->curr_resync is the last completed request.
Signed-off-by Jianpeng Ma <[email protected]>--- drivers/md/md.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)drivers/md/md.c +0
-0
drivers/md/md.c void md_do_sync(struct md_thread *thread) · line 7564
Quoted 9 lines
drivers/md/md.c +1
-2@@ -7558,8 +7558,7 @@ 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; + mddev->recovery_cp = mddev->curr_resync; } }else mddev->recovery_cp = MaxSector;
No.
This reverts commit db91ff55bdf06736b849afc1b1fce5763bbb8d5d
Maybe if we differentiated between an abort-due-to-error and an abort-due-to-request, then in the second card we could use ->curr_resync.
NeilBrown
Quoted 34 lines · On Sat, 27 Oct 2012 10:28:58 +0800 kernelmail <[email protected]> wrote:
Quoted 20 lines
Quoted 4 lines · In commit(db91ff55bdf06736b849afc1b1fce5763bbb8d5d),it said:
If a resync is aborted we should record how far we got (
recovery_cp) the last request that we know has completed (->curr_resync_completed) rather than the last request that was submitted (->curr_resync).But when resync aborted, it execed
Quoted 1 line
wait_event(mddev->recovery_wait, !atomic_read(&mddev->recovery_active));After this, the ->curr_resync is the last completed request.
Signed-off-by Jianpeng Ma <[email protected]>--- drivers/md/md.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)drivers/md/md.c +0
-0drivers/md/md.c void md_do_sync(struct md_thread *thread) · line 7564
Quoted 9 lines
drivers/md/md.c +1
-2@@ -7558,8 +7558,7 @@ 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; + mddev->recovery_cp = mddev->curr_resync; } }else mddev->recovery_cp = MaxSector;No.
This reverts commitdb91ff55bdf06736b849afc1b1fce5763bbb8d5d
Quoted 5 lines
Maybe if we differentiated between an abort-due-to-error and an abort-due-to-request, then in the second card we could use ->curr_resync.
NeilBrown
Yes, i missed the case which interrupted by io-error. So i add a flag MD_RECOVERY_ERROR in md_done_sync.
drivers/md/md.c +7 -2
@@ -7172,6 +7172,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 .... }
@@ -7558,8 +7559,12 @@ 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;
drivers/md/md.h +2 -0
@@ -307,6 +307,7 @@ struct mddev {* REQUEST: user-space has requested a sync (used with SYNC) * CHECK: user-space request for check-only, no repair * RESHAPE: A reshape is happening +* ERROR: interrupted by IO error not by request * * 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_RESHAPE 8#define MD_RECOVERY_FROZEN 9 +#define MD_RECOVERY_ERROR 10unsigned long recovery;/* If a RAID personality determines that recovery (of a particular
How about this patch?
Jianpeng
Quoted 91 lines · On Mon, 29 Oct 2012 11:27:25 +0800 majianpeng <[email protected]> wrote:
Quoted 34 lines · On Sat, 27 Oct 2012 10:28:58 +0800 kernelmail <[email protected]> wrote:
Quoted 20 lines
Quoted 4 lines · In commit(db91ff55bdf06736b849afc1b1fce5763bbb8d5d),it said:
If a resync is aborted we should record how far we got (
recovery_cp) the last request that we know has completed (->curr_resync_completed) rather than the last request that was submitted (->curr_resync).But when resync aborted, it execed
Quoted 1 line
wait_event(mddev->recovery_wait, !atomic_read(&mddev->recovery_active));After this, the ->curr_resync is the last completed request.
Signed-off-by Jianpeng Ma <[email protected]>--- drivers/md/md.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)drivers/md/md.c +0
-0drivers/md/md.c void md_do_sync(struct md_thread *thread) · line 7564
Quoted 9 lines
drivers/md/md.c +1
-2@@ -7558,8 +7558,7 @@ 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; + mddev->recovery_cp = mddev->curr_resync; } }else mddev->recovery_cp = MaxSector;No.
This reverts commitdb91ff55bdf06736b849afc1b1fce5763bbb8d5dQuoted 5 lines
Maybe if we differentiated between an abort-due-to-error and an abort-due-to-request, then in the second card we could use ->curr_resync.
NeilBrown
Yes, i missed the case which interrupted by io-error. So i add a flag
MD_RECOVERY_ERRORinmd_done_sync.drivers/md/md.c +7
-2@@ -7172,6 +7172,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 .... }@@ -7558,8 +7559,12 @@ 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;drivers/md/md.h +2
-0@@ -307,6 +307,7 @@ struct mddev {* REQUEST: user-space has requested a sync (used with SYNC) * CHECK: user-space request for check-only, no repair * RESHAPE: A reshape is happening +* ERROR: interrupted by IO error not by request * * 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_RESHAPE 8#define MD_RECOVERY_FROZEN 9 +#define MD_RECOVERY_ERROR 10unsigned long recovery;/* If a RAID personality determines that recovery (of a particular
Quoted 5 lines
How about this patch?
Jianpeng
Look OK except that it is badly white-space damaged. Could you try resending it properly please?
Thanks,
NeilBrown