Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ba8c6967 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

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: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent 38f8baae
Loading
Loading
Loading
Loading
+17 −18
Original line number Diff line number Diff line
@@ -1745,26 +1745,25 @@ static inline bool bio_remaining_done(struct bio *bio)
 **/
void bio_endio(struct bio *bio)
{
	while (bio) {
again:
	if (unlikely(!bio_remaining_done(bio)))
			break;
		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.
	 * 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 {
		goto again;
	}

	if (bio->bi_end_io)
		bio->bi_end_io(bio);
			bio = NULL;
		}
	}
}
EXPORT_SYMBOL(bio_endio);