diff options
Diffstat (limited to 'drivers/md/raid5.c')
-rw-r--r-- | drivers/md/raid5.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 9c4f7659f8b1..ec0f951ae19f 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -4085,10 +4085,15 @@ static void handle_parity_checks5(struct r5conf *conf, struct stripe_head *sh, | |||
4085 | set_bit(STRIPE_INSYNC, &sh->state); | 4085 | set_bit(STRIPE_INSYNC, &sh->state); |
4086 | else { | 4086 | else { |
4087 | atomic64_add(STRIPE_SECTORS, &conf->mddev->resync_mismatches); | 4087 | atomic64_add(STRIPE_SECTORS, &conf->mddev->resync_mismatches); |
4088 | if (test_bit(MD_RECOVERY_CHECK, &conf->mddev->recovery)) | 4088 | if (test_bit(MD_RECOVERY_CHECK, &conf->mddev->recovery)) { |
4089 | /* don't try to repair!! */ | 4089 | /* don't try to repair!! */ |
4090 | set_bit(STRIPE_INSYNC, &sh->state); | 4090 | set_bit(STRIPE_INSYNC, &sh->state); |
4091 | else { | 4091 | pr_warn_ratelimited("%s: mismatch sector in range " |
4092 | "%llu-%llu\n", mdname(conf->mddev), | ||
4093 | (unsigned long long) sh->sector, | ||
4094 | (unsigned long long) sh->sector + | ||
4095 | STRIPE_SECTORS); | ||
4096 | } else { | ||
4092 | sh->check_state = check_state_compute_run; | 4097 | sh->check_state = check_state_compute_run; |
4093 | set_bit(STRIPE_COMPUTE_RUN, &sh->state); | 4098 | set_bit(STRIPE_COMPUTE_RUN, &sh->state); |
4094 | set_bit(STRIPE_OP_COMPUTE_BLK, &s->ops_request); | 4099 | set_bit(STRIPE_OP_COMPUTE_BLK, &s->ops_request); |
@@ -4237,10 +4242,15 @@ static void handle_parity_checks6(struct r5conf *conf, struct stripe_head *sh, | |||
4237 | } | 4242 | } |
4238 | } else { | 4243 | } else { |
4239 | atomic64_add(STRIPE_SECTORS, &conf->mddev->resync_mismatches); | 4244 | atomic64_add(STRIPE_SECTORS, &conf->mddev->resync_mismatches); |
4240 | if (test_bit(MD_RECOVERY_CHECK, &conf->mddev->recovery)) | 4245 | if (test_bit(MD_RECOVERY_CHECK, &conf->mddev->recovery)) { |
4241 | /* don't try to repair!! */ | 4246 | /* don't try to repair!! */ |
4242 | set_bit(STRIPE_INSYNC, &sh->state); | 4247 | set_bit(STRIPE_INSYNC, &sh->state); |
4243 | else { | 4248 | pr_warn_ratelimited("%s: mismatch sector in range " |
4249 | "%llu-%llu\n", mdname(conf->mddev), | ||
4250 | (unsigned long long) sh->sector, | ||
4251 | (unsigned long long) sh->sector + | ||
4252 | STRIPE_SECTORS); | ||
4253 | } else { | ||
4244 | int *target = &sh->ops.target; | 4254 | int *target = &sh->ops.target; |
4245 | 4255 | ||
4246 | sh->ops.target = -1; | 4256 | sh->ops.target = -1; |
@@ -7108,6 +7118,9 @@ static int raid5_run(struct mddev *mddev) | |||
7108 | long long min_offset_diff = 0; | 7118 | long long min_offset_diff = 0; |
7109 | int first = 1; | 7119 | int first = 1; |
7110 | 7120 | ||
7121 | if (mddev_init_writes_pending(mddev) < 0) | ||
7122 | return -ENOMEM; | ||
7123 | |||
7111 | if (mddev->recovery_cp != MaxSector) | 7124 | if (mddev->recovery_cp != MaxSector) |
7112 | pr_notice("md/raid:%s: not clean -- starting background reconstruction\n", | 7125 | pr_notice("md/raid:%s: not clean -- starting background reconstruction\n", |
7113 | mdname(mddev)); | 7126 | mdname(mddev)); |