diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-02-15 00:48:16 +0400 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-02-15 00:48:16 +0400 | 
| commit | bd3813d52d567ea6e85e70ce205770bfdafac368 (patch) | |
| tree | 1e50ffd435919121b87c93eaacaf31a7bf31f872 /drivers/md/raid1.c | |
| parent | c1b8ae03c38281e442c2ad3725e921b09f23290a (diff) | |
| parent | 789b5e0315284463617e106baad360cb9e8db3ac (diff) | |
| download | linux-bd3813d52d567ea6e85e70ce205770bfdafac368.tar.xz | |
Merge tag 'md/3.14-fixes' of git://neil.brown.name/md
Pull md fixes from Neil Brown:
 "Two bugfixes for md
  both tagged for -stable"
* tag 'md/3.14-fixes' of git://neil.brown.name/md:
  md/raid5: Fix CPU hotplug callback registration
  md/raid1: restore ability for check and repair to fix read errors.
Diffstat (limited to 'drivers/md/raid1.c')
| -rw-r--r-- | drivers/md/raid1.c | 13 | 
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index fd3a2a14b587..4a6ca1cb2e78 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -1953,11 +1953,15 @@ static int process_checks(struct r1bio *r1_bio)  	for (i = 0; i < conf->raid_disks * 2; i++) {  		int j;  		int size; +		int uptodate;  		struct bio *b = r1_bio->bios[i];  		if (b->bi_end_io != end_sync_read)  			continue; -		/* fixup the bio for reuse */ +		/* fixup the bio for reuse, but preserve BIO_UPTODATE */ +		uptodate = test_bit(BIO_UPTODATE, &b->bi_flags);  		bio_reset(b); +		if (!uptodate) +			clear_bit(BIO_UPTODATE, &b->bi_flags);  		b->bi_vcnt = vcnt;  		b->bi_iter.bi_size = r1_bio->sectors << 9;  		b->bi_iter.bi_sector = r1_bio->sector + @@ -1990,11 +1994,14 @@ static int process_checks(struct r1bio *r1_bio)  		int j;  		struct bio *pbio = r1_bio->bios[primary];  		struct bio *sbio = r1_bio->bios[i]; +		int uptodate = test_bit(BIO_UPTODATE, &sbio->bi_flags);  		if (sbio->bi_end_io != end_sync_read)  			continue; +		/* Now we can 'fixup' the BIO_UPTODATE flag */ +		set_bit(BIO_UPTODATE, &sbio->bi_flags); -		if (test_bit(BIO_UPTODATE, &sbio->bi_flags)) { +		if (uptodate) {  			for (j = vcnt; j-- ; ) {  				struct page *p, *s;  				p = pbio->bi_io_vec[j].bv_page; @@ -2009,7 +2016,7 @@ static int process_checks(struct r1bio *r1_bio)  		if (j >= 0)  			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))) { +			      && uptodate)) {  			/* No need to write to this device. */  			sbio->bi_end_io = NULL;  			rdev_dec_pending(conf->mirrors[i].rdev, mddev);  | 
