diff options
author | Christoph Hellwig <hch@lst.de> | 2016-03-11 17:34:52 +0100 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2016-03-14 08:55:24 -0600 |
commit | ba8c6967b7391aab8fa562611fe637a57850b4aa (patch) | |
tree | 863d75b6e83dc4bd77a0d51d64e92be79b4cba53 /block | |
parent | 38f8baae890561203ba6093f76b14576ce9b271b (diff) | |
download | linux-ba8c6967b7391aab8fa562611fe637a57850b4aa.tar.gz linux-ba8c6967b7391aab8fa562611fe637a57850b4aa.tar.bz2 linux-ba8c6967b7391aab8fa562611fe637a57850b4aa.zip |
block: cleanup bio_endio
Replace the while loop that unecessarily checks for a NULL bio in the fast
path with a simple goto loop.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/bio.c | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/block/bio.c b/block/bio.c index 67e51ace1b77..e4682ec11fcd 100644 --- a/block/bio.c +++ b/block/bio.c @@ -1745,26 +1745,25 @@ static inline bool bio_remaining_done(struct bio *bio) **/ void bio_endio(struct bio *bio) { - while (bio) { - if (unlikely(!bio_remaining_done(bio))) - break; +again: + if (unlikely(!bio_remaining_done(bio))) + return; - /* - * Need to have a real endio function for chained bios, - * otherwise various corner cases will break (like stacking - * block devices that save/restore bi_end_io) - however, we want - * to avoid unbounded recursion and blowing the stack. Tail call - * optimization would handle this, but compiling with frame - * pointers also disables gcc's sibling call optimization. - */ - if (bio->bi_end_io == bio_chain_endio) { - bio = __bio_chain_endio(bio); - } else { - if (bio->bi_end_io) - bio->bi_end_io(bio); - bio = NULL; - } + /* + * Need to have a real endio function for chained bios, otherwise + * various corner cases will break (like stacking block devices that + * save/restore bi_end_io) - however, we want to avoid unbounded + * recursion and blowing the stack. Tail call optimization would + * handle this, but compiling with frame pointers also disables + * gcc's sibling call optimization. + */ + if (bio->bi_end_io == bio_chain_endio) { + bio = __bio_chain_endio(bio); + goto again; } + + if (bio->bi_end_io) + bio->bi_end_io(bio); } EXPORT_SYMBOL(bio_endio); |