On Mon, 24 Sep 2012 19:15:12 +0800 "Jianpeng Ma" <majianpeng@xxxxxxxxx> wrote: > Sorry for using this title to send this. It isn't hard to change the Subject line for the Email, is it? > This code maybe error,so it should correct(If multiple-thread dosen't enable,it maybe also error,but no obviously). > In func handle_parity_checks5: > >>conf->mddev->resync_mismatches += STRIPE_SECTORS; > If multi-thread handle stripe on different cpu, there will be raced on resync_mismatches. > > So the patch is: > > Subject: [PATCH] md:change resync_mismatches to atomic64_t to avoid races I doubt this is really necessary, as resync_mismatches doesn't need to be precise. But it doesn't really hurt either, so I've applied it. Thanks, NeilBrown > > Signed-off-by: Jianpeng Ma <majianpeng@xxxxxxxxx> > --- > drivers/md/md.c | 7 ++++--- > drivers/md/md.h | 2 +- > drivers/md/raid1.c | 2 +- > drivers/md/raid10.c | 2 +- > drivers/md/raid5.c | 4 ++-- > 5 files changed, 9 insertions(+), 8 deletions(-) > > diff --git a/drivers/md/md.c b/drivers/md/md.c > index 308e87b..b0b9474 100644 > --- a/drivers/md/md.c > +++ b/drivers/md/md.c > @@ -4278,7 +4278,8 @@ static ssize_t > mismatch_cnt_show(struct mddev *mddev, char *page) > { > return sprintf(page, "%llu\n", > - (unsigned long long) mddev->resync_mismatches); > + (unsigned long long) > + atomic64_read(&mddev->resync_mismatches)); > } > > static struct md_sysfs_entry md_scan_mode = > @@ -5245,7 +5246,7 @@ static void md_clean(struct mddev *mddev) > mddev->new_layout = 0; > mddev->new_chunk_sectors = 0; > mddev->curr_resync = 0; > - mddev->resync_mismatches = 0; > + atomic64_set(&mddev->resync_mismatches, 0); > mddev->suspend_lo = mddev->suspend_hi = 0; > mddev->sync_speed_min = mddev->sync_speed_max = 0; > mddev->recovery = 0; > @@ -7349,7 +7350,7 @@ void md_do_sync(struct mddev *mddev) > * which defaults to physical size, but can be virtual size > */ > max_sectors = mddev->resync_max_sectors; > - mddev->resync_mismatches = 0; > + atomic64_set(&mddev->resync_mismatches, 0); > /* we don't use the checkpoint if there's a bitmap */ > if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) > j = mddev->resync_min; > diff --git a/drivers/md/md.h b/drivers/md/md.h > index f385b03..8f341d8 100644 > --- a/drivers/md/md.h > +++ b/drivers/md/md.h > @@ -282,7 +282,7 @@ struct mddev { > > sector_t resync_max_sectors; /* may be set by personality */ > > - sector_t resync_mismatches; /* count of sectors where > + atomic64_t resync_mismatches; /* count of sectors where > * parity/replica mismatch found > */ > > diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c > index 611b5f7..ebceb98 100644 > --- a/drivers/md/raid1.c > +++ b/drivers/md/raid1.c > @@ -1867,7 +1867,7 @@ static int process_checks(struct r1bio *r1_bio) > } else > j = 0; > if (j >= 0) > - mddev->resync_mismatches += r1_bio->sectors; > + atomic64_add(r1_bio->sectors, &mddev->resync_mismatches); > if (j < 0 || (test_bit(MD_RECOVERY_CHECK, &mddev->recovery) > && test_bit(BIO_UPTODATE, &sbio->bi_flags))) { > /* No need to write to this device. */ > diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c > index 1c2eb38..ad0a8b7 100644 > --- a/drivers/md/raid10.c > +++ b/drivers/md/raid10.c > @@ -1950,7 +1950,7 @@ static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio) > break; > if (j == vcnt) > continue; > - mddev->resync_mismatches += r10_bio->sectors; > + atomic64_add(r10_bio->sectors, &mddev->resync_mismatches); > if (test_bit(MD_RECOVERY_CHECK, &mddev->recovery)) > /* Don't fix anything. */ > continue; > diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c > index 7031b86..0a2702f 100644 > --- a/drivers/md/raid5.c > +++ b/drivers/md/raid5.c > @@ -2931,7 +2931,7 @@ static void handle_parity_checks5(struct r5conf *conf, struct stripe_head *sh, > */ > set_bit(STRIPE_INSYNC, &sh->state); > else { > - conf->mddev->resync_mismatches += STRIPE_SECTORS; > + atomic64_add(STRIPE_SECTORS, &conf->mddev->resync_mismatches); > if (test_bit(MD_RECOVERY_CHECK, &conf->mddev->recovery)) > /* don't try to repair!! */ > set_bit(STRIPE_INSYNC, &sh->state); > @@ -3083,7 +3083,7 @@ static void handle_parity_checks6(struct r5conf *conf, struct stripe_head *sh, > */ > } > } else { > - conf->mddev->resync_mismatches += STRIPE_SECTORS; > + atomic64_add(STRIPE_SECTORS, &conf->mddev->resync_mismatches); > if (test_bit(MD_RECOVERY_CHECK, &conf->mddev->recovery)) > /* don't try to repair!! */ > set_bit(STRIPE_INSYNC, &sh->state);
Attachment:
signature.asc
Description: PGP signature