|
@@ -578,6 +578,19 @@ static void use_dmio(struct dm_buffer *b, int rw, sector_t block,
|
|
|
end_io(&b->bio, r);
|
|
|
}
|
|
|
|
|
|
+static void inline_endio(struct bio *bio, int error)
|
|
|
+{
|
|
|
+ bio_end_io_t *end_fn = bio->bi_private;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Reset the bio to free any attached resources
|
|
|
+ * (e.g. bio integrity profiles).
|
|
|
+ */
|
|
|
+ bio_reset(bio);
|
|
|
+
|
|
|
+ end_fn(bio, error);
|
|
|
+}
|
|
|
+
|
|
|
static void use_inline_bio(struct dm_buffer *b, int rw, sector_t block,
|
|
|
bio_end_io_t *end_io)
|
|
|
{
|
|
@@ -589,7 +602,12 @@ static void use_inline_bio(struct dm_buffer *b, int rw, sector_t block,
|
|
|
b->bio.bi_max_vecs = DM_BUFIO_INLINE_VECS;
|
|
|
b->bio.bi_iter.bi_sector = block << b->c->sectors_per_block_bits;
|
|
|
b->bio.bi_bdev = b->c->bdev;
|
|
|
- b->bio.bi_end_io = end_io;
|
|
|
+ b->bio.bi_end_io = inline_endio;
|
|
|
+ /*
|
|
|
+ * Use of .bi_private isn't a problem here because
|
|
|
+ * the dm_buffer's inline bio is local to bufio.
|
|
|
+ */
|
|
|
+ b->bio.bi_private = end_io;
|
|
|
|
|
|
/*
|
|
|
* We assume that if len >= PAGE_SIZE ptr is page-aligned.
|