diff options
author | NeilBrown <neilb@suse.de> | 2011-07-27 03:00:36 +0200 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2011-07-27 03:00:36 +0200 |
commit | c5a3100062cf277d3edd4e6f4a1f1e403524b464 (patch) | |
tree | ccc8f2ae6491497cd8ad172a3bbc0165f86edcdf /drivers/md/raid5.c | |
parent | md/raid5: Move code for finishing a reconstruction into handle_stripe. (diff) | |
download | linux-c5a3100062cf277d3edd4e6f4a1f1e403524b464.tar.xz linux-c5a3100062cf277d3edd4e6f4a1f1e403524b464.zip |
md/raid5: move more code into common handle_stripe
The difference between the RAID5 and RAID6 code here is easily
resolved using conf->max_degraded.
Signed-off-by: NeilBrown <neilb@suse.de>
Reviewed-by: Namhyung Kim <namhyung@gmail.com>
Diffstat (limited to '')
-rw-r--r-- | drivers/md/raid5.c | 90 |
1 files changed, 32 insertions, 58 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index cd6f04f145e6..74a575bbd25c 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -3176,34 +3176,6 @@ static int handle_stripe5(struct stripe_head *sh, struct stripe_head_state *s) !test_bit(STRIPE_COMPUTE_RUN, &sh->state) && !test_bit(STRIPE_INSYNC, &sh->state))) handle_parity_checks5(conf, sh, s, disks); - - if (s->syncing && s->locked == 0 - && test_bit(STRIPE_INSYNC, &sh->state)) { - md_done_sync(conf->mddev, STRIPE_SECTORS,1); - clear_bit(STRIPE_SYNCING, &sh->state); - } - - /* If the failed drive is just a ReadError, then we might need to progress - * the repair/check process - */ - if (s->failed == 1 && !conf->mddev->ro && - test_bit(R5_ReadError, &sh->dev[s->failed_num[0]].flags) - && !test_bit(R5_LOCKED, &sh->dev[s->failed_num[0]].flags) - && test_bit(R5_UPTODATE, &sh->dev[s->failed_num[0]].flags) - ) { - dev = &sh->dev[s->failed_num[0]]; - if (!test_bit(R5_ReWrite, &dev->flags)) { - set_bit(R5_Wantwrite, &dev->flags); - set_bit(R5_ReWrite, &dev->flags); - set_bit(R5_LOCKED, &dev->flags); - s->locked++; - } else { - /* let's read it back */ - set_bit(R5_Wantread, &dev->flags); - set_bit(R5_LOCKED, &dev->flags); - s->locked++; - } - } return 0; } @@ -3393,36 +3365,6 @@ static int handle_stripe6(struct stripe_head *sh, struct stripe_head_state *s) !test_bit(STRIPE_COMPUTE_RUN, &sh->state) && !test_bit(STRIPE_INSYNC, &sh->state))) handle_parity_checks6(conf, sh, s, disks); - - if (s->syncing && s->locked == 0 - && test_bit(STRIPE_INSYNC, &sh->state)) { - md_done_sync(conf->mddev, STRIPE_SECTORS,1); - clear_bit(STRIPE_SYNCING, &sh->state); - } - - /* If the failed drives are just a ReadError, then we might need - * to progress the repair/check process - */ - if (s->failed <= 2 && !conf->mddev->ro) - for (i = 0; i < s->failed; i++) { - dev = &sh->dev[s->failed_num[i]]; - if (test_bit(R5_ReadError, &dev->flags) - && !test_bit(R5_LOCKED, &dev->flags) - && test_bit(R5_UPTODATE, &dev->flags) - ) { - if (!test_bit(R5_ReWrite, &dev->flags)) { - set_bit(R5_Wantwrite, &dev->flags); - set_bit(R5_ReWrite, &dev->flags); - set_bit(R5_LOCKED, &dev->flags); - s->locked++; - } else { - /* let's read it back */ - set_bit(R5_Wantread, &dev->flags); - set_bit(R5_LOCKED, &dev->flags); - s->locked++; - } - } - } return 0; } @@ -3465,6 +3407,38 @@ static void handle_stripe(struct stripe_head *sh) if (done) goto finish; + + + if (s.syncing && s.locked == 0 && test_bit(STRIPE_INSYNC, &sh->state)) { + md_done_sync(conf->mddev, STRIPE_SECTORS, 1); + clear_bit(STRIPE_SYNCING, &sh->state); + } + + /* If the failed drives are just a ReadError, then we might need + * to progress the repair/check process + */ + if (s.failed <= conf->max_degraded && !conf->mddev->ro) + for (i = 0; i < s.failed; i++) { + struct r5dev *dev = &sh->dev[s.failed_num[i]]; + if (test_bit(R5_ReadError, &dev->flags) + && !test_bit(R5_LOCKED, &dev->flags) + && test_bit(R5_UPTODATE, &dev->flags) + ) { + if (!test_bit(R5_ReWrite, &dev->flags)) { + set_bit(R5_Wantwrite, &dev->flags); + set_bit(R5_ReWrite, &dev->flags); + set_bit(R5_LOCKED, &dev->flags); + s.locked++; + } else { + /* let's read it back */ + set_bit(R5_Wantread, &dev->flags); + set_bit(R5_LOCKED, &dev->flags); + s.locked++; + } + } + } + + /* Finish reconstruct operations initiated by the expansion process */ if (sh->reconstruct_state == reconstruct_state_result) { struct stripe_head *sh_src |