diff options
author | majianpeng <majianpeng@gmail.com> | 2012-07-30 20:04:21 -0400 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2012-07-30 20:04:21 -0400 |
commit | 3f9e7c140e4c4e75bdeeb8df46dd40e49386c978 (patch) | |
tree | 81585524e1ce341eb518716c0702a6dfd64a19ef /drivers | |
parent | 12cee5a8a29e7263e39953f1d941f723c617ca5f (diff) |
raid5: Add R5_ReadNoMerge flag which prevent bio from merging at block layer
Because bios will merge at block-layer,so bios-error may caused by other
bio which be merged into to the same request.
Using this flag,it will find exactly error-sector and not do redundant
operation like re-write and re-read.
V0->V1:Using REQ_FLUSH instead REQ_NOMERGE avoid bio merging at block
layer.
Signed-off-by: Jianpeng Ma <majianpeng@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/md/raid5.c | 14 | ||||
-rw-r--r-- | drivers/md/raid5.h | 1 |
2 files changed, 13 insertions, 2 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index c2192a2907e4..29493982dbf5 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -653,6 +653,9 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s) | |||
653 | else | 653 | else |
654 | bi->bi_sector = (sh->sector | 654 | bi->bi_sector = (sh->sector |
655 | + rdev->data_offset); | 655 | + rdev->data_offset); |
656 | if (test_bit(R5_ReadNoMerge, &sh->dev[i].flags)) | ||
657 | bi->bi_rw |= REQ_FLUSH; | ||
658 | |||
656 | bi->bi_flags = 1 << BIO_UPTODATE; | 659 | bi->bi_flags = 1 << BIO_UPTODATE; |
657 | bi->bi_idx = 0; | 660 | bi->bi_idx = 0; |
658 | bi->bi_io_vec[0].bv_len = STRIPE_SIZE; | 661 | bi->bi_io_vec[0].bv_len = STRIPE_SIZE; |
@@ -1750,7 +1753,9 @@ static void raid5_end_read_request(struct bio * bi, int error) | |||
1750 | atomic_add(STRIPE_SECTORS, &rdev->corrected_errors); | 1753 | atomic_add(STRIPE_SECTORS, &rdev->corrected_errors); |
1751 | clear_bit(R5_ReadError, &sh->dev[i].flags); | 1754 | clear_bit(R5_ReadError, &sh->dev[i].flags); |
1752 | clear_bit(R5_ReWrite, &sh->dev[i].flags); | 1755 | clear_bit(R5_ReWrite, &sh->dev[i].flags); |
1753 | } | 1756 | } else if (test_bit(R5_ReadNoMerge, &sh->dev[i].flags)) |
1757 | clear_bit(R5_ReadNoMerge, &sh->dev[i].flags); | ||
1758 | |||
1754 | if (atomic_read(&rdev->read_errors)) | 1759 | if (atomic_read(&rdev->read_errors)) |
1755 | atomic_set(&rdev->read_errors, 0); | 1760 | atomic_set(&rdev->read_errors, 0); |
1756 | } else { | 1761 | } else { |
@@ -1795,7 +1800,11 @@ static void raid5_end_read_request(struct bio * bi, int error) | |||
1795 | else | 1800 | else |
1796 | retry = 1; | 1801 | retry = 1; |
1797 | if (retry) | 1802 | if (retry) |
1798 | set_bit(R5_ReadError, &sh->dev[i].flags); | 1803 | if (test_bit(R5_ReadNoMerge, &sh->dev[i].flags)) { |
1804 | set_bit(R5_ReadError, &sh->dev[i].flags); | ||
1805 | clear_bit(R5_ReadNoMerge, &sh->dev[i].flags); | ||
1806 | } else | ||
1807 | set_bit(R5_ReadNoMerge, &sh->dev[i].flags); | ||
1799 | else { | 1808 | else { |
1800 | clear_bit(R5_ReadError, &sh->dev[i].flags); | 1809 | clear_bit(R5_ReadError, &sh->dev[i].flags); |
1801 | clear_bit(R5_ReWrite, &sh->dev[i].flags); | 1810 | clear_bit(R5_ReWrite, &sh->dev[i].flags); |
@@ -4515,6 +4524,7 @@ static int retry_aligned_read(struct r5conf *conf, struct bio *raid_bio) | |||
4515 | return handled; | 4524 | return handled; |
4516 | } | 4525 | } |
4517 | 4526 | ||
4527 | set_bit(R5_ReadNoMerge, &sh->dev[dd_idx].flags); | ||
4518 | handle_stripe(sh); | 4528 | handle_stripe(sh); |
4519 | release_stripe(sh); | 4529 | release_stripe(sh); |
4520 | handled++; | 4530 | handled++; |
diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h index f03fb3395183..61dbb615c30b 100644 --- a/drivers/md/raid5.h +++ b/drivers/md/raid5.h | |||
@@ -274,6 +274,7 @@ enum r5dev_flags { | |||
274 | R5_Wantwrite, | 274 | R5_Wantwrite, |
275 | R5_Overlap, /* There is a pending overlapping request | 275 | R5_Overlap, /* There is a pending overlapping request |
276 | * on this block */ | 276 | * on this block */ |
277 | R5_ReadNoMerge, /* prevent bio from merging in block-layer */ | ||
277 | R5_ReadError, /* seen a read error here recently */ | 278 | R5_ReadError, /* seen a read error here recently */ |
278 | R5_ReWrite, /* have tried to over-write the readerror */ | 279 | R5_ReWrite, /* have tried to over-write the readerror */ |
279 | 280 | ||