diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-17 20:34:21 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-17 20:34:21 -0500 |
commit | 0d695d6d8bc1ed39f20c9ce115abf0129b27cb6f (patch) | |
tree | 742e5159cb3b3b836a00eeb840fbe3172981842c /drivers/md | |
parent | d96c757efad495378e25de47000478f571322cf2 (diff) | |
parent | 26ac107378c4742978216be1005b7291b799c7b2 (diff) |
Merge tag 'md/3.20-fixes' of git://neil.brown.name/md
Pull md bugfixes from Neil Brown:
"Three bug md fixes for 3.20
yet-another-livelock in raid5, and a problem with write errors to
4K-block devices"
* tag 'md/3.20-fixes' of git://neil.brown.name/md:
md/raid5: Fix livelock when array is both resyncing and degraded.
md/raid10: round up to bdev_logical_block_size in narrow_write_error.
md/raid1: round up to bdev_logical_block_size in narrow_write_error
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/raid1.c | 3 | ||||
-rw-r--r-- | drivers/md/raid10.c | 3 | ||||
-rw-r--r-- | drivers/md/raid5.c | 3 |
3 files changed, 6 insertions, 3 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 5dd0c2e59ab9..4153da5d4011 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -2196,7 +2196,8 @@ static int narrow_write_error(struct r1bio *r1_bio, int i) | |||
2196 | if (rdev->badblocks.shift < 0) | 2196 | if (rdev->badblocks.shift < 0) |
2197 | return 0; | 2197 | return 0; |
2198 | 2198 | ||
2199 | block_sectors = 1 << rdev->badblocks.shift; | 2199 | block_sectors = roundup(1 << rdev->badblocks.shift, |
2200 | bdev_logical_block_size(rdev->bdev) >> 9); | ||
2200 | sector = r1_bio->sector; | 2201 | sector = r1_bio->sector; |
2201 | sectors = ((sector + block_sectors) | 2202 | sectors = ((sector + block_sectors) |
2202 | & ~(sector_t)(block_sectors - 1)) | 2203 | & ~(sector_t)(block_sectors - 1)) |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index b8d76b1fba64..a7196c49d15d 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -2572,7 +2572,8 @@ static int narrow_write_error(struct r10bio *r10_bio, int i) | |||
2572 | if (rdev->badblocks.shift < 0) | 2572 | if (rdev->badblocks.shift < 0) |
2573 | return 0; | 2573 | return 0; |
2574 | 2574 | ||
2575 | block_sectors = 1 << rdev->badblocks.shift; | 2575 | block_sectors = roundup(1 << rdev->badblocks.shift, |
2576 | bdev_logical_block_size(rdev->bdev) >> 9); | ||
2576 | sector = r10_bio->sector; | 2577 | sector = r10_bio->sector; |
2577 | sectors = ((r10_bio->sector + block_sectors) | 2578 | sectors = ((r10_bio->sector + block_sectors) |
2578 | & ~(sector_t)(block_sectors - 1)) | 2579 | & ~(sector_t)(block_sectors - 1)) |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index aa76865b804b..e75d48c0421a 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -3170,7 +3170,8 @@ static void handle_stripe_dirtying(struct r5conf *conf, | |||
3170 | * generate correct data from the parity. | 3170 | * generate correct data from the parity. |
3171 | */ | 3171 | */ |
3172 | if (conf->max_degraded == 2 || | 3172 | if (conf->max_degraded == 2 || |
3173 | (recovery_cp < MaxSector && sh->sector >= recovery_cp)) { | 3173 | (recovery_cp < MaxSector && sh->sector >= recovery_cp && |
3174 | s->failed == 0)) { | ||
3174 | /* Calculate the real rcw later - for now make it | 3175 | /* Calculate the real rcw later - for now make it |
3175 | * look like rcw is cheaper | 3176 | * look like rcw is cheaper |
3176 | */ | 3177 | */ |