{
struct iomap_dio *dio = bio->bi_private;
bool should_dirty = (dio->flags & IOMAP_DIO_DIRTY);
+ struct bio_alloc_cache *cache = dio->iocb->ki_bio_cache;
+ if (!(dio->iocb->ki_flags & IOCB_ALLOC_CACHE))
+ cache = NULL;
if (bio->bi_status)
iomap_dio_set_error(dio, blk_status_to_errno(bio->bi_status));
bio_check_pages_dirty(bio);
} else {
bio_release_pages(bio, false);
- bio_put(bio);
+ bio_cache_put(cache, bio);
}
}
goto out;
}
- bio = bio_alloc(GFP_KERNEL, nr_pages);
+ bio = NULL;
+ if (dio->iocb->ki_flags & IOCB_ALLOC_CACHE) {
+ bio = bio_cache_get(dio->iocb->ki_bio_cache, GFP_KERNEL,
+ nr_pages, &fs_bio_set);
+ if (!bio)
+ dio->iocb->ki_flags &= ~IOCB_ALLOC_CACHE;
+ }
+ if (!bio)
+ bio = bio_alloc(GFP_KERNEL, nr_pages);
bio_set_dev(bio, iomap->bdev);
bio->bi_iter.bi_sector = iomap_sector(iomap, pos);
bio->bi_write_hint = dio->iocb->ki_hint;