diff options
author | NeilBrown <neilb@suse.com> | 2017-03-15 04:05:13 +0100 |
---|---|---|
committer | Shaohua Li <shli@fb.com> | 2017-03-23 03:16:30 +0100 |
commit | 016c76ac76e4c678b01a75a602dc6be0282f5b29 (patch) | |
tree | ed943bdfc80ab4ff7aa3228023f6f0dc0c0992fa /drivers/md/raid5-cache.c | |
parent | md/raid5: call bio_endio() directly rather than queueing for later. (diff) | |
download | linux-016c76ac76e4c678b01a75a602dc6be0282f5b29.tar.xz linux-016c76ac76e4c678b01a75a602dc6be0282f5b29.zip |
md/raid5: use bio_inc_remaining() instead of repurposing bi_phys_segments as a counter
md/raid5 needs to keep track of how many stripe_heads are processing a
bio so that it can delay calling bio_endio() until all stripe_heads
have completed. It currently uses 16 bits of ->bi_phys_segments for
this purpose.
16 bits is only enough for 256M requests, and it is possible for a
single bio to be larger than this, which causes problems. Also, the
bio struct contains a larger counter, __bi_remaining, which has a
purpose very similar to the purpose of our counter. So stop using
->bi_phys_segments, and instead use __bi_remaining.
This means we don't need to initialize the counter, as our caller
initializes it to '1'. It also means we can call bio_endio() directly
as it tests this counter internally.
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
Diffstat (limited to 'drivers/md/raid5-cache.c')
-rw-r--r-- | drivers/md/raid5-cache.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index 5be8dbc5d91b..25eb048298fe 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -318,8 +318,7 @@ r5c_return_dev_pending_writes(struct r5conf *conf, struct r5dev *dev) dev->sector + STRIPE_SECTORS) { wbi2 = r5_next_bio(wbi, dev->sector); md_write_end(conf->mddev); - if (!raid5_dec_bi_active_stripes(wbi)) - bio_endio(wbi); + bio_endio(wbi); wbi = wbi2; } } |