block: Generic bio chaining

This adds a generic mechanism for chaining bio completions. This is
going to be used for a bio_split() replacement, and it turns out to be
very useful in a fair amount of driver code - a fair number of drivers
were implementing this in their own roundabout ways, often painfully.

Note that this means it's no longer to call bio_endio() more than once
on the same bio! This can cause problems for drivers that save/restore
bi_end_io. Arguably they shouldn't be saving/restoring bi_end_io at all
- in all but the simplest cases they'd be better off just cloning the
bio, and immutable biovecs is making bio cloning cheaper. But for now,
we add a bio_endio_nodec() for these cases.

Signed-off-by: Kent Overstreet <kmo@daterainc.com>
Cc: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Kent Overstreet
2013-11-23 18:34:15 -08:00
parent e90abc8ec3
commit 196d38bccf
9 changed files with 90 additions and 11 deletions

View File

@@ -765,6 +765,12 @@ static void writethrough_endio(struct bio *bio, int err)
dm_unhook_bio(&pb->hook_info, bio);
/*
* Must bump bi_remaining to allow bio to complete with
* restored bi_end_io.
*/
atomic_inc(&bio->bi_remaining);
if (err) {
bio_endio(bio, err);
return;