1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2019 Christoph Hellwig.
7 static inline unsigned int bio_max_vecs(unsigned int count
)
9 return min_t(unsigned, howmany(count
, PAGE_SIZE
), BIO_MAX_PAGES
);
14 struct block_device
*bdev
,
21 unsigned int is_vmalloc
= is_vmalloc_addr(data
);
22 unsigned int left
= count
;
26 if (is_vmalloc
&& op
== REQ_OP_WRITE
)
27 flush_kernel_vmap_range(data
, count
);
29 bio
= bio_alloc(GFP_KERNEL
, bio_max_vecs(left
));
30 bio_set_dev(bio
, bdev
);
31 bio
->bi_iter
.bi_sector
= sector
;
32 bio
->bi_opf
= op
| REQ_META
| REQ_SYNC
;
35 struct page
*page
= kmem_to_page(data
);
36 unsigned int off
= offset_in_page(data
);
37 unsigned int len
= min_t(unsigned, left
, PAGE_SIZE
- off
);
39 while (bio_add_page(bio
, page
, len
, off
) != len
) {
40 struct bio
*prev
= bio
;
42 bio
= bio_alloc(GFP_KERNEL
, bio_max_vecs(left
));
43 bio_copy_dev(bio
, prev
);
44 bio
->bi_iter
.bi_sector
= bio_end_sector(prev
);
45 bio
->bi_opf
= prev
->bi_opf
;
55 error
= submit_bio_wait(bio
);
58 if (is_vmalloc
&& op
== REQ_OP_READ
)
59 invalidate_kernel_vmap_range(data
, count
);