if (req->sg_cnt > BIO_MAX_PAGES)
                return -EINVAL;
 
-       bio = bio_alloc(GFP_KERNEL, req->sg_cnt);
-       bio->bi_end_io = bio_put;
+       if (req->transfer_len <= NVMET_MAX_INLINE_DATA_LEN) {
+               bio = &req->p.inline_bio;
+               bio_init(bio, req->inline_bvec, ARRAY_SIZE(req->inline_bvec));
+       } else {
+               bio = bio_alloc(GFP_KERNEL, min(req->sg_cnt, BIO_MAX_PAGES));
+               bio->bi_end_io = bio_put;
+       }
        bio->bi_opf = req_op(rq);
 
        for_each_sg(req->sg, sg, req->sg_cnt, i) {
                if (bio_add_pc_page(rq->q, bio, sg_page(sg), sg->length,
                                    sg->offset) < sg->length) {
-                       bio_put(bio);
+                       if (bio != &req->p.inline_bio)
+                               bio_put(bio);
                        return -EINVAL;
                }
        }