}
EXPORT_SYMBOL(bio_reset);
-static void bio_chain_endio(struct bio *bio)
+static struct bio *__bio_chain_endio(struct bio *bio)
{
struct bio *parent = bio->bi_private;
if (!parent->bi_error)
parent->bi_error = bio->bi_error;
- bio_endio(parent);
bio_put(bio);
+ return parent;
+}
+
+static void bio_chain_endio(struct bio *bio)
+{
+ bio_endio(__bio_chain_endio(bio));
}
/*
* pointers also disables gcc's sibling call optimization.
*/
if (bio->bi_end_io == bio_chain_endio) {
- struct bio *parent = bio->bi_private;
-
- if (!parent->bi_error)
- parent->bi_error = bio->bi_error;
- bio_put(bio);
- bio = parent;
+ bio = __bio_chain_endio(bio);
} else {
if (bio->bi_end_io)
bio->bi_end_io(bio);