1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Functions related to mapping data to requests
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun #include <linux/kernel.h>
6*4882a593Smuzhiyun #include <linux/sched/task_stack.h>
7*4882a593Smuzhiyun #include <linux/module.h>
8*4882a593Smuzhiyun #include <linux/bio.h>
9*4882a593Smuzhiyun #include <linux/blkdev.h>
10*4882a593Smuzhiyun #include <linux/uio.h>
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #include "blk.h"
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun struct bio_map_data {
15*4882a593Smuzhiyun bool is_our_pages : 1;
16*4882a593Smuzhiyun bool is_null_mapped : 1;
17*4882a593Smuzhiyun struct iov_iter iter;
18*4882a593Smuzhiyun struct iovec iov[];
19*4882a593Smuzhiyun };
20*4882a593Smuzhiyun
bio_alloc_map_data(struct iov_iter * data,gfp_t gfp_mask)21*4882a593Smuzhiyun static struct bio_map_data *bio_alloc_map_data(struct iov_iter *data,
22*4882a593Smuzhiyun gfp_t gfp_mask)
23*4882a593Smuzhiyun {
24*4882a593Smuzhiyun struct bio_map_data *bmd;
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun if (data->nr_segs > UIO_MAXIOV)
27*4882a593Smuzhiyun return NULL;
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun bmd = kmalloc(struct_size(bmd, iov, data->nr_segs), gfp_mask);
30*4882a593Smuzhiyun if (!bmd)
31*4882a593Smuzhiyun return NULL;
32*4882a593Smuzhiyun memcpy(bmd->iov, data->iov, sizeof(struct iovec) * data->nr_segs);
33*4882a593Smuzhiyun bmd->iter = *data;
34*4882a593Smuzhiyun bmd->iter.iov = bmd->iov;
35*4882a593Smuzhiyun return bmd;
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun /**
39*4882a593Smuzhiyun * bio_copy_from_iter - copy all pages from iov_iter to bio
40*4882a593Smuzhiyun * @bio: The &struct bio which describes the I/O as destination
41*4882a593Smuzhiyun * @iter: iov_iter as source
42*4882a593Smuzhiyun *
43*4882a593Smuzhiyun * Copy all pages from iov_iter to bio.
44*4882a593Smuzhiyun * Returns 0 on success, or error on failure.
45*4882a593Smuzhiyun */
bio_copy_from_iter(struct bio * bio,struct iov_iter * iter)46*4882a593Smuzhiyun static int bio_copy_from_iter(struct bio *bio, struct iov_iter *iter)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun struct bio_vec *bvec;
49*4882a593Smuzhiyun struct bvec_iter_all iter_all;
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun bio_for_each_segment_all(bvec, bio, iter_all) {
52*4882a593Smuzhiyun ssize_t ret;
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun ret = copy_page_from_iter(bvec->bv_page,
55*4882a593Smuzhiyun bvec->bv_offset,
56*4882a593Smuzhiyun bvec->bv_len,
57*4882a593Smuzhiyun iter);
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun if (!iov_iter_count(iter))
60*4882a593Smuzhiyun break;
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun if (ret < bvec->bv_len)
63*4882a593Smuzhiyun return -EFAULT;
64*4882a593Smuzhiyun }
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun return 0;
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun /**
70*4882a593Smuzhiyun * bio_copy_to_iter - copy all pages from bio to iov_iter
71*4882a593Smuzhiyun * @bio: The &struct bio which describes the I/O as source
72*4882a593Smuzhiyun * @iter: iov_iter as destination
73*4882a593Smuzhiyun *
74*4882a593Smuzhiyun * Copy all pages from bio to iov_iter.
75*4882a593Smuzhiyun * Returns 0 on success, or error on failure.
76*4882a593Smuzhiyun */
bio_copy_to_iter(struct bio * bio,struct iov_iter iter)77*4882a593Smuzhiyun static int bio_copy_to_iter(struct bio *bio, struct iov_iter iter)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun struct bio_vec *bvec;
80*4882a593Smuzhiyun struct bvec_iter_all iter_all;
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun bio_for_each_segment_all(bvec, bio, iter_all) {
83*4882a593Smuzhiyun ssize_t ret;
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun ret = copy_page_to_iter(bvec->bv_page,
86*4882a593Smuzhiyun bvec->bv_offset,
87*4882a593Smuzhiyun bvec->bv_len,
88*4882a593Smuzhiyun &iter);
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun if (!iov_iter_count(&iter))
91*4882a593Smuzhiyun break;
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun if (ret < bvec->bv_len)
94*4882a593Smuzhiyun return -EFAULT;
95*4882a593Smuzhiyun }
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun return 0;
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun /**
101*4882a593Smuzhiyun * bio_uncopy_user - finish previously mapped bio
102*4882a593Smuzhiyun * @bio: bio being terminated
103*4882a593Smuzhiyun *
104*4882a593Smuzhiyun * Free pages allocated from bio_copy_user_iov() and write back data
105*4882a593Smuzhiyun * to user space in case of a read.
106*4882a593Smuzhiyun */
bio_uncopy_user(struct bio * bio)107*4882a593Smuzhiyun static int bio_uncopy_user(struct bio *bio)
108*4882a593Smuzhiyun {
109*4882a593Smuzhiyun struct bio_map_data *bmd = bio->bi_private;
110*4882a593Smuzhiyun int ret = 0;
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun if (!bmd->is_null_mapped) {
113*4882a593Smuzhiyun /*
114*4882a593Smuzhiyun * if we're in a workqueue, the request is orphaned, so
115*4882a593Smuzhiyun * don't copy into a random user address space, just free
116*4882a593Smuzhiyun * and return -EINTR so user space doesn't expect any data.
117*4882a593Smuzhiyun */
118*4882a593Smuzhiyun if (!current->mm)
119*4882a593Smuzhiyun ret = -EINTR;
120*4882a593Smuzhiyun else if (bio_data_dir(bio) == READ)
121*4882a593Smuzhiyun ret = bio_copy_to_iter(bio, bmd->iter);
122*4882a593Smuzhiyun if (bmd->is_our_pages)
123*4882a593Smuzhiyun bio_free_pages(bio);
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun kfree(bmd);
126*4882a593Smuzhiyun bio_put(bio);
127*4882a593Smuzhiyun return ret;
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun
bio_copy_user_iov(struct request * rq,struct rq_map_data * map_data,struct iov_iter * iter,gfp_t gfp_mask)130*4882a593Smuzhiyun static int bio_copy_user_iov(struct request *rq, struct rq_map_data *map_data,
131*4882a593Smuzhiyun struct iov_iter *iter, gfp_t gfp_mask)
132*4882a593Smuzhiyun {
133*4882a593Smuzhiyun struct bio_map_data *bmd;
134*4882a593Smuzhiyun struct page *page;
135*4882a593Smuzhiyun struct bio *bio, *bounce_bio;
136*4882a593Smuzhiyun int i = 0, ret;
137*4882a593Smuzhiyun int nr_pages;
138*4882a593Smuzhiyun unsigned int len = iter->count;
139*4882a593Smuzhiyun unsigned int offset = map_data ? offset_in_page(map_data->offset) : 0;
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun bmd = bio_alloc_map_data(iter, gfp_mask);
142*4882a593Smuzhiyun if (!bmd)
143*4882a593Smuzhiyun return -ENOMEM;
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun /*
146*4882a593Smuzhiyun * We need to do a deep copy of the iov_iter including the iovecs.
147*4882a593Smuzhiyun * The caller provided iov might point to an on-stack or otherwise
148*4882a593Smuzhiyun * shortlived one.
149*4882a593Smuzhiyun */
150*4882a593Smuzhiyun bmd->is_our_pages = !map_data;
151*4882a593Smuzhiyun bmd->is_null_mapped = (map_data && map_data->null_mapped);
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun nr_pages = DIV_ROUND_UP(offset + len, PAGE_SIZE);
154*4882a593Smuzhiyun if (nr_pages > BIO_MAX_PAGES)
155*4882a593Smuzhiyun nr_pages = BIO_MAX_PAGES;
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun ret = -ENOMEM;
158*4882a593Smuzhiyun bio = bio_kmalloc(gfp_mask, nr_pages);
159*4882a593Smuzhiyun if (!bio)
160*4882a593Smuzhiyun goto out_bmd;
161*4882a593Smuzhiyun bio->bi_opf |= req_op(rq);
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun if (map_data) {
164*4882a593Smuzhiyun nr_pages = 1 << map_data->page_order;
165*4882a593Smuzhiyun i = map_data->offset / PAGE_SIZE;
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun while (len) {
168*4882a593Smuzhiyun unsigned int bytes = PAGE_SIZE;
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun bytes -= offset;
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun if (bytes > len)
173*4882a593Smuzhiyun bytes = len;
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun if (map_data) {
176*4882a593Smuzhiyun if (i == map_data->nr_entries * nr_pages) {
177*4882a593Smuzhiyun ret = -ENOMEM;
178*4882a593Smuzhiyun goto cleanup;
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun page = map_data->pages[i / nr_pages];
182*4882a593Smuzhiyun page += (i % nr_pages);
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun i++;
185*4882a593Smuzhiyun } else {
186*4882a593Smuzhiyun page = alloc_page(rq->q->bounce_gfp | gfp_mask);
187*4882a593Smuzhiyun if (!page) {
188*4882a593Smuzhiyun ret = -ENOMEM;
189*4882a593Smuzhiyun goto cleanup;
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun if (bio_add_pc_page(rq->q, bio, page, bytes, offset) < bytes) {
194*4882a593Smuzhiyun if (!map_data)
195*4882a593Smuzhiyun __free_page(page);
196*4882a593Smuzhiyun break;
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun len -= bytes;
200*4882a593Smuzhiyun offset = 0;
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun if (map_data)
204*4882a593Smuzhiyun map_data->offset += bio->bi_iter.bi_size;
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun /*
207*4882a593Smuzhiyun * success
208*4882a593Smuzhiyun */
209*4882a593Smuzhiyun if ((iov_iter_rw(iter) == WRITE &&
210*4882a593Smuzhiyun (!map_data || !map_data->null_mapped)) ||
211*4882a593Smuzhiyun (map_data && map_data->from_user)) {
212*4882a593Smuzhiyun ret = bio_copy_from_iter(bio, iter);
213*4882a593Smuzhiyun if (ret)
214*4882a593Smuzhiyun goto cleanup;
215*4882a593Smuzhiyun } else {
216*4882a593Smuzhiyun if (bmd->is_our_pages)
217*4882a593Smuzhiyun zero_fill_bio(bio);
218*4882a593Smuzhiyun iov_iter_advance(iter, bio->bi_iter.bi_size);
219*4882a593Smuzhiyun }
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun bio->bi_private = bmd;
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun bounce_bio = bio;
224*4882a593Smuzhiyun ret = blk_rq_append_bio(rq, &bounce_bio);
225*4882a593Smuzhiyun if (ret)
226*4882a593Smuzhiyun goto cleanup;
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun /*
229*4882a593Smuzhiyun * We link the bounce buffer in and could have to traverse it later, so
230*4882a593Smuzhiyun * we have to get a ref to prevent it from being freed
231*4882a593Smuzhiyun */
232*4882a593Smuzhiyun bio_get(bounce_bio);
233*4882a593Smuzhiyun return 0;
234*4882a593Smuzhiyun cleanup:
235*4882a593Smuzhiyun if (!map_data)
236*4882a593Smuzhiyun bio_free_pages(bio);
237*4882a593Smuzhiyun bio_put(bio);
238*4882a593Smuzhiyun out_bmd:
239*4882a593Smuzhiyun kfree(bmd);
240*4882a593Smuzhiyun return ret;
241*4882a593Smuzhiyun }
242*4882a593Smuzhiyun
bio_map_user_iov(struct request * rq,struct iov_iter * iter,gfp_t gfp_mask)243*4882a593Smuzhiyun static int bio_map_user_iov(struct request *rq, struct iov_iter *iter,
244*4882a593Smuzhiyun gfp_t gfp_mask)
245*4882a593Smuzhiyun {
246*4882a593Smuzhiyun unsigned int max_sectors = queue_max_hw_sectors(rq->q);
247*4882a593Smuzhiyun struct bio *bio, *bounce_bio;
248*4882a593Smuzhiyun int ret;
249*4882a593Smuzhiyun int j;
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun if (!iov_iter_count(iter))
252*4882a593Smuzhiyun return -EINVAL;
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun bio = bio_kmalloc(gfp_mask, iov_iter_npages(iter, BIO_MAX_PAGES));
255*4882a593Smuzhiyun if (!bio)
256*4882a593Smuzhiyun return -ENOMEM;
257*4882a593Smuzhiyun bio->bi_opf |= req_op(rq);
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun while (iov_iter_count(iter)) {
260*4882a593Smuzhiyun struct page **pages;
261*4882a593Smuzhiyun ssize_t bytes;
262*4882a593Smuzhiyun size_t offs, added = 0;
263*4882a593Smuzhiyun int npages;
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun bytes = iov_iter_get_pages_alloc(iter, &pages, LONG_MAX, &offs);
266*4882a593Smuzhiyun if (unlikely(bytes <= 0)) {
267*4882a593Smuzhiyun ret = bytes ? bytes : -EFAULT;
268*4882a593Smuzhiyun goto out_unmap;
269*4882a593Smuzhiyun }
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun npages = DIV_ROUND_UP(offs + bytes, PAGE_SIZE);
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun if (unlikely(offs & queue_dma_alignment(rq->q))) {
274*4882a593Smuzhiyun ret = -EINVAL;
275*4882a593Smuzhiyun j = 0;
276*4882a593Smuzhiyun } else {
277*4882a593Smuzhiyun for (j = 0; j < npages; j++) {
278*4882a593Smuzhiyun struct page *page = pages[j];
279*4882a593Smuzhiyun unsigned int n = PAGE_SIZE - offs;
280*4882a593Smuzhiyun bool same_page = false;
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun if (n > bytes)
283*4882a593Smuzhiyun n = bytes;
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun if (!bio_add_hw_page(rq->q, bio, page, n, offs,
286*4882a593Smuzhiyun max_sectors, &same_page)) {
287*4882a593Smuzhiyun if (same_page)
288*4882a593Smuzhiyun put_page(page);
289*4882a593Smuzhiyun break;
290*4882a593Smuzhiyun }
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun added += n;
293*4882a593Smuzhiyun bytes -= n;
294*4882a593Smuzhiyun offs = 0;
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun iov_iter_advance(iter, added);
297*4882a593Smuzhiyun }
298*4882a593Smuzhiyun /*
299*4882a593Smuzhiyun * release the pages we didn't map into the bio, if any
300*4882a593Smuzhiyun */
301*4882a593Smuzhiyun while (j < npages)
302*4882a593Smuzhiyun put_page(pages[j++]);
303*4882a593Smuzhiyun kvfree(pages);
304*4882a593Smuzhiyun /* couldn't stuff something into bio? */
305*4882a593Smuzhiyun if (bytes)
306*4882a593Smuzhiyun break;
307*4882a593Smuzhiyun }
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun /*
310*4882a593Smuzhiyun * Subtle: if we end up needing to bounce a bio, it would normally
311*4882a593Smuzhiyun * disappear when its bi_end_io is run. However, we need the original
312*4882a593Smuzhiyun * bio for the unmap, so grab an extra reference to it
313*4882a593Smuzhiyun */
314*4882a593Smuzhiyun bio_get(bio);
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun bounce_bio = bio;
317*4882a593Smuzhiyun ret = blk_rq_append_bio(rq, &bounce_bio);
318*4882a593Smuzhiyun if (ret)
319*4882a593Smuzhiyun goto out_put_orig;
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun /*
322*4882a593Smuzhiyun * We link the bounce buffer in and could have to traverse it
323*4882a593Smuzhiyun * later, so we have to get a ref to prevent it from being freed
324*4882a593Smuzhiyun */
325*4882a593Smuzhiyun bio_get(bounce_bio);
326*4882a593Smuzhiyun return 0;
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun out_put_orig:
329*4882a593Smuzhiyun bio_put(bio);
330*4882a593Smuzhiyun out_unmap:
331*4882a593Smuzhiyun bio_release_pages(bio, false);
332*4882a593Smuzhiyun bio_put(bio);
333*4882a593Smuzhiyun return ret;
334*4882a593Smuzhiyun }
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun /**
337*4882a593Smuzhiyun * bio_unmap_user - unmap a bio
338*4882a593Smuzhiyun * @bio: the bio being unmapped
339*4882a593Smuzhiyun *
340*4882a593Smuzhiyun * Unmap a bio previously mapped by bio_map_user_iov(). Must be called from
341*4882a593Smuzhiyun * process context.
342*4882a593Smuzhiyun *
343*4882a593Smuzhiyun * bio_unmap_user() may sleep.
344*4882a593Smuzhiyun */
bio_unmap_user(struct bio * bio)345*4882a593Smuzhiyun static void bio_unmap_user(struct bio *bio)
346*4882a593Smuzhiyun {
347*4882a593Smuzhiyun bio_release_pages(bio, bio_data_dir(bio) == READ);
348*4882a593Smuzhiyun bio_put(bio);
349*4882a593Smuzhiyun bio_put(bio);
350*4882a593Smuzhiyun }
351*4882a593Smuzhiyun
bio_invalidate_vmalloc_pages(struct bio * bio)352*4882a593Smuzhiyun static void bio_invalidate_vmalloc_pages(struct bio *bio)
353*4882a593Smuzhiyun {
354*4882a593Smuzhiyun #ifdef ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
355*4882a593Smuzhiyun if (bio->bi_private && !op_is_write(bio_op(bio))) {
356*4882a593Smuzhiyun unsigned long i, len = 0;
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun for (i = 0; i < bio->bi_vcnt; i++)
359*4882a593Smuzhiyun len += bio->bi_io_vec[i].bv_len;
360*4882a593Smuzhiyun invalidate_kernel_vmap_range(bio->bi_private, len);
361*4882a593Smuzhiyun }
362*4882a593Smuzhiyun #endif
363*4882a593Smuzhiyun }
364*4882a593Smuzhiyun
bio_map_kern_endio(struct bio * bio)365*4882a593Smuzhiyun static void bio_map_kern_endio(struct bio *bio)
366*4882a593Smuzhiyun {
367*4882a593Smuzhiyun bio_invalidate_vmalloc_pages(bio);
368*4882a593Smuzhiyun bio_put(bio);
369*4882a593Smuzhiyun }
370*4882a593Smuzhiyun
371*4882a593Smuzhiyun /**
372*4882a593Smuzhiyun * bio_map_kern - map kernel address into bio
373*4882a593Smuzhiyun * @q: the struct request_queue for the bio
374*4882a593Smuzhiyun * @data: pointer to buffer to map
375*4882a593Smuzhiyun * @len: length in bytes
376*4882a593Smuzhiyun * @gfp_mask: allocation flags for bio allocation
377*4882a593Smuzhiyun *
378*4882a593Smuzhiyun * Map the kernel address into a bio suitable for io to a block
379*4882a593Smuzhiyun * device. Returns an error pointer in case of error.
380*4882a593Smuzhiyun */
bio_map_kern(struct request_queue * q,void * data,unsigned int len,gfp_t gfp_mask)381*4882a593Smuzhiyun static struct bio *bio_map_kern(struct request_queue *q, void *data,
382*4882a593Smuzhiyun unsigned int len, gfp_t gfp_mask)
383*4882a593Smuzhiyun {
384*4882a593Smuzhiyun unsigned long kaddr = (unsigned long)data;
385*4882a593Smuzhiyun unsigned long end = (kaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
386*4882a593Smuzhiyun unsigned long start = kaddr >> PAGE_SHIFT;
387*4882a593Smuzhiyun const int nr_pages = end - start;
388*4882a593Smuzhiyun bool is_vmalloc = is_vmalloc_addr(data);
389*4882a593Smuzhiyun struct page *page;
390*4882a593Smuzhiyun int offset, i;
391*4882a593Smuzhiyun struct bio *bio;
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun bio = bio_kmalloc(gfp_mask, nr_pages);
394*4882a593Smuzhiyun if (!bio)
395*4882a593Smuzhiyun return ERR_PTR(-ENOMEM);
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun if (is_vmalloc) {
398*4882a593Smuzhiyun flush_kernel_vmap_range(data, len);
399*4882a593Smuzhiyun bio->bi_private = data;
400*4882a593Smuzhiyun }
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun offset = offset_in_page(kaddr);
403*4882a593Smuzhiyun for (i = 0; i < nr_pages; i++) {
404*4882a593Smuzhiyun unsigned int bytes = PAGE_SIZE - offset;
405*4882a593Smuzhiyun
406*4882a593Smuzhiyun if (len <= 0)
407*4882a593Smuzhiyun break;
408*4882a593Smuzhiyun
409*4882a593Smuzhiyun if (bytes > len)
410*4882a593Smuzhiyun bytes = len;
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun if (!is_vmalloc)
413*4882a593Smuzhiyun page = virt_to_page(data);
414*4882a593Smuzhiyun else
415*4882a593Smuzhiyun page = vmalloc_to_page(data);
416*4882a593Smuzhiyun if (bio_add_pc_page(q, bio, page, bytes,
417*4882a593Smuzhiyun offset) < bytes) {
418*4882a593Smuzhiyun /* we don't support partial mappings */
419*4882a593Smuzhiyun bio_put(bio);
420*4882a593Smuzhiyun return ERR_PTR(-EINVAL);
421*4882a593Smuzhiyun }
422*4882a593Smuzhiyun
423*4882a593Smuzhiyun data += bytes;
424*4882a593Smuzhiyun len -= bytes;
425*4882a593Smuzhiyun offset = 0;
426*4882a593Smuzhiyun }
427*4882a593Smuzhiyun
428*4882a593Smuzhiyun bio->bi_end_io = bio_map_kern_endio;
429*4882a593Smuzhiyun return bio;
430*4882a593Smuzhiyun }
431*4882a593Smuzhiyun
bio_copy_kern_endio(struct bio * bio)432*4882a593Smuzhiyun static void bio_copy_kern_endio(struct bio *bio)
433*4882a593Smuzhiyun {
434*4882a593Smuzhiyun bio_free_pages(bio);
435*4882a593Smuzhiyun bio_put(bio);
436*4882a593Smuzhiyun }
437*4882a593Smuzhiyun
bio_copy_kern_endio_read(struct bio * bio)438*4882a593Smuzhiyun static void bio_copy_kern_endio_read(struct bio *bio)
439*4882a593Smuzhiyun {
440*4882a593Smuzhiyun char *p = bio->bi_private;
441*4882a593Smuzhiyun struct bio_vec *bvec;
442*4882a593Smuzhiyun struct bvec_iter_all iter_all;
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun bio_for_each_segment_all(bvec, bio, iter_all) {
445*4882a593Smuzhiyun memcpy(p, page_address(bvec->bv_page), bvec->bv_len);
446*4882a593Smuzhiyun p += bvec->bv_len;
447*4882a593Smuzhiyun }
448*4882a593Smuzhiyun
449*4882a593Smuzhiyun bio_copy_kern_endio(bio);
450*4882a593Smuzhiyun }
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun /**
453*4882a593Smuzhiyun * bio_copy_kern - copy kernel address into bio
454*4882a593Smuzhiyun * @q: the struct request_queue for the bio
455*4882a593Smuzhiyun * @data: pointer to buffer to copy
456*4882a593Smuzhiyun * @len: length in bytes
457*4882a593Smuzhiyun * @gfp_mask: allocation flags for bio and page allocation
458*4882a593Smuzhiyun * @reading: data direction is READ
459*4882a593Smuzhiyun *
460*4882a593Smuzhiyun * copy the kernel address into a bio suitable for io to a block
461*4882a593Smuzhiyun * device. Returns an error pointer in case of error.
462*4882a593Smuzhiyun */
bio_copy_kern(struct request_queue * q,void * data,unsigned int len,gfp_t gfp_mask,int reading)463*4882a593Smuzhiyun static struct bio *bio_copy_kern(struct request_queue *q, void *data,
464*4882a593Smuzhiyun unsigned int len, gfp_t gfp_mask, int reading)
465*4882a593Smuzhiyun {
466*4882a593Smuzhiyun unsigned long kaddr = (unsigned long)data;
467*4882a593Smuzhiyun unsigned long end = (kaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
468*4882a593Smuzhiyun unsigned long start = kaddr >> PAGE_SHIFT;
469*4882a593Smuzhiyun struct bio *bio;
470*4882a593Smuzhiyun void *p = data;
471*4882a593Smuzhiyun int nr_pages = 0;
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun /*
474*4882a593Smuzhiyun * Overflow, abort
475*4882a593Smuzhiyun */
476*4882a593Smuzhiyun if (end < start)
477*4882a593Smuzhiyun return ERR_PTR(-EINVAL);
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun nr_pages = end - start;
480*4882a593Smuzhiyun bio = bio_kmalloc(gfp_mask, nr_pages);
481*4882a593Smuzhiyun if (!bio)
482*4882a593Smuzhiyun return ERR_PTR(-ENOMEM);
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun while (len) {
485*4882a593Smuzhiyun struct page *page;
486*4882a593Smuzhiyun unsigned int bytes = PAGE_SIZE;
487*4882a593Smuzhiyun
488*4882a593Smuzhiyun if (bytes > len)
489*4882a593Smuzhiyun bytes = len;
490*4882a593Smuzhiyun
491*4882a593Smuzhiyun page = alloc_page(q->bounce_gfp | __GFP_ZERO | gfp_mask);
492*4882a593Smuzhiyun if (!page)
493*4882a593Smuzhiyun goto cleanup;
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun if (!reading)
496*4882a593Smuzhiyun memcpy(page_address(page), p, bytes);
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun if (bio_add_pc_page(q, bio, page, bytes, 0) < bytes)
499*4882a593Smuzhiyun break;
500*4882a593Smuzhiyun
501*4882a593Smuzhiyun len -= bytes;
502*4882a593Smuzhiyun p += bytes;
503*4882a593Smuzhiyun }
504*4882a593Smuzhiyun
505*4882a593Smuzhiyun if (reading) {
506*4882a593Smuzhiyun bio->bi_end_io = bio_copy_kern_endio_read;
507*4882a593Smuzhiyun bio->bi_private = data;
508*4882a593Smuzhiyun } else {
509*4882a593Smuzhiyun bio->bi_end_io = bio_copy_kern_endio;
510*4882a593Smuzhiyun }
511*4882a593Smuzhiyun
512*4882a593Smuzhiyun return bio;
513*4882a593Smuzhiyun
514*4882a593Smuzhiyun cleanup:
515*4882a593Smuzhiyun bio_free_pages(bio);
516*4882a593Smuzhiyun bio_put(bio);
517*4882a593Smuzhiyun return ERR_PTR(-ENOMEM);
518*4882a593Smuzhiyun }
519*4882a593Smuzhiyun
520*4882a593Smuzhiyun /*
521*4882a593Smuzhiyun * Append a bio to a passthrough request. Only works if the bio can be merged
522*4882a593Smuzhiyun * into the request based on the driver constraints.
523*4882a593Smuzhiyun */
blk_rq_append_bio(struct request * rq,struct bio ** bio)524*4882a593Smuzhiyun int blk_rq_append_bio(struct request *rq, struct bio **bio)
525*4882a593Smuzhiyun {
526*4882a593Smuzhiyun struct bio *orig_bio = *bio;
527*4882a593Smuzhiyun struct bvec_iter iter;
528*4882a593Smuzhiyun struct bio_vec bv;
529*4882a593Smuzhiyun unsigned int nr_segs = 0;
530*4882a593Smuzhiyun
531*4882a593Smuzhiyun blk_queue_bounce(rq->q, bio);
532*4882a593Smuzhiyun
533*4882a593Smuzhiyun bio_for_each_bvec(bv, *bio, iter)
534*4882a593Smuzhiyun nr_segs++;
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun if (!rq->bio) {
537*4882a593Smuzhiyun blk_rq_bio_prep(rq, *bio, nr_segs);
538*4882a593Smuzhiyun } else {
539*4882a593Smuzhiyun if (!ll_back_merge_fn(rq, *bio, nr_segs)) {
540*4882a593Smuzhiyun if (orig_bio != *bio) {
541*4882a593Smuzhiyun bio_put(*bio);
542*4882a593Smuzhiyun *bio = orig_bio;
543*4882a593Smuzhiyun }
544*4882a593Smuzhiyun return -EINVAL;
545*4882a593Smuzhiyun }
546*4882a593Smuzhiyun
547*4882a593Smuzhiyun rq->biotail->bi_next = *bio;
548*4882a593Smuzhiyun rq->biotail = *bio;
549*4882a593Smuzhiyun rq->__data_len += (*bio)->bi_iter.bi_size;
550*4882a593Smuzhiyun bio_crypt_free_ctx(*bio);
551*4882a593Smuzhiyun }
552*4882a593Smuzhiyun
553*4882a593Smuzhiyun return 0;
554*4882a593Smuzhiyun }
555*4882a593Smuzhiyun EXPORT_SYMBOL(blk_rq_append_bio);
556*4882a593Smuzhiyun
557*4882a593Smuzhiyun /**
558*4882a593Smuzhiyun * blk_rq_map_user_iov - map user data to a request, for passthrough requests
559*4882a593Smuzhiyun * @q: request queue where request should be inserted
560*4882a593Smuzhiyun * @rq: request to map data to
561*4882a593Smuzhiyun * @map_data: pointer to the rq_map_data holding pages (if necessary)
562*4882a593Smuzhiyun * @iter: iovec iterator
563*4882a593Smuzhiyun * @gfp_mask: memory allocation flags
564*4882a593Smuzhiyun *
565*4882a593Smuzhiyun * Description:
566*4882a593Smuzhiyun * Data will be mapped directly for zero copy I/O, if possible. Otherwise
567*4882a593Smuzhiyun * a kernel bounce buffer is used.
568*4882a593Smuzhiyun *
569*4882a593Smuzhiyun * A matching blk_rq_unmap_user() must be issued at the end of I/O, while
570*4882a593Smuzhiyun * still in process context.
571*4882a593Smuzhiyun *
572*4882a593Smuzhiyun * Note: The mapped bio may need to be bounced through blk_queue_bounce()
573*4882a593Smuzhiyun * before being submitted to the device, as pages mapped may be out of
574*4882a593Smuzhiyun * reach. It's the callers responsibility to make sure this happens. The
575*4882a593Smuzhiyun * original bio must be passed back in to blk_rq_unmap_user() for proper
576*4882a593Smuzhiyun * unmapping.
577*4882a593Smuzhiyun */
blk_rq_map_user_iov(struct request_queue * q,struct request * rq,struct rq_map_data * map_data,const struct iov_iter * iter,gfp_t gfp_mask)578*4882a593Smuzhiyun int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
579*4882a593Smuzhiyun struct rq_map_data *map_data,
580*4882a593Smuzhiyun const struct iov_iter *iter, gfp_t gfp_mask)
581*4882a593Smuzhiyun {
582*4882a593Smuzhiyun bool copy = false;
583*4882a593Smuzhiyun unsigned long align = q->dma_pad_mask | queue_dma_alignment(q);
584*4882a593Smuzhiyun struct bio *bio = NULL;
585*4882a593Smuzhiyun struct iov_iter i;
586*4882a593Smuzhiyun int ret = -EINVAL;
587*4882a593Smuzhiyun
588*4882a593Smuzhiyun if (!iter_is_iovec(iter))
589*4882a593Smuzhiyun goto fail;
590*4882a593Smuzhiyun
591*4882a593Smuzhiyun if (map_data)
592*4882a593Smuzhiyun copy = true;
593*4882a593Smuzhiyun else if (iov_iter_alignment(iter) & align)
594*4882a593Smuzhiyun copy = true;
595*4882a593Smuzhiyun else if (queue_virt_boundary(q))
596*4882a593Smuzhiyun copy = queue_virt_boundary(q) & iov_iter_gap_alignment(iter);
597*4882a593Smuzhiyun
598*4882a593Smuzhiyun i = *iter;
599*4882a593Smuzhiyun do {
600*4882a593Smuzhiyun if (copy)
601*4882a593Smuzhiyun ret = bio_copy_user_iov(rq, map_data, &i, gfp_mask);
602*4882a593Smuzhiyun else
603*4882a593Smuzhiyun ret = bio_map_user_iov(rq, &i, gfp_mask);
604*4882a593Smuzhiyun if (ret)
605*4882a593Smuzhiyun goto unmap_rq;
606*4882a593Smuzhiyun if (!bio)
607*4882a593Smuzhiyun bio = rq->bio;
608*4882a593Smuzhiyun } while (iov_iter_count(&i));
609*4882a593Smuzhiyun
610*4882a593Smuzhiyun return 0;
611*4882a593Smuzhiyun
612*4882a593Smuzhiyun unmap_rq:
613*4882a593Smuzhiyun blk_rq_unmap_user(bio);
614*4882a593Smuzhiyun fail:
615*4882a593Smuzhiyun rq->bio = NULL;
616*4882a593Smuzhiyun return ret;
617*4882a593Smuzhiyun }
618*4882a593Smuzhiyun EXPORT_SYMBOL(blk_rq_map_user_iov);
619*4882a593Smuzhiyun
blk_rq_map_user(struct request_queue * q,struct request * rq,struct rq_map_data * map_data,void __user * ubuf,unsigned long len,gfp_t gfp_mask)620*4882a593Smuzhiyun int blk_rq_map_user(struct request_queue *q, struct request *rq,
621*4882a593Smuzhiyun struct rq_map_data *map_data, void __user *ubuf,
622*4882a593Smuzhiyun unsigned long len, gfp_t gfp_mask)
623*4882a593Smuzhiyun {
624*4882a593Smuzhiyun struct iovec iov;
625*4882a593Smuzhiyun struct iov_iter i;
626*4882a593Smuzhiyun int ret = import_single_range(rq_data_dir(rq), ubuf, len, &iov, &i);
627*4882a593Smuzhiyun
628*4882a593Smuzhiyun if (unlikely(ret < 0))
629*4882a593Smuzhiyun return ret;
630*4882a593Smuzhiyun
631*4882a593Smuzhiyun return blk_rq_map_user_iov(q, rq, map_data, &i, gfp_mask);
632*4882a593Smuzhiyun }
633*4882a593Smuzhiyun EXPORT_SYMBOL(blk_rq_map_user);
634*4882a593Smuzhiyun
635*4882a593Smuzhiyun /**
636*4882a593Smuzhiyun * blk_rq_unmap_user - unmap a request with user data
637*4882a593Smuzhiyun * @bio: start of bio list
638*4882a593Smuzhiyun *
639*4882a593Smuzhiyun * Description:
640*4882a593Smuzhiyun * Unmap a rq previously mapped by blk_rq_map_user(). The caller must
641*4882a593Smuzhiyun * supply the original rq->bio from the blk_rq_map_user() return, since
642*4882a593Smuzhiyun * the I/O completion may have changed rq->bio.
643*4882a593Smuzhiyun */
blk_rq_unmap_user(struct bio * bio)644*4882a593Smuzhiyun int blk_rq_unmap_user(struct bio *bio)
645*4882a593Smuzhiyun {
646*4882a593Smuzhiyun struct bio *mapped_bio;
647*4882a593Smuzhiyun int ret = 0, ret2;
648*4882a593Smuzhiyun
649*4882a593Smuzhiyun while (bio) {
650*4882a593Smuzhiyun mapped_bio = bio;
651*4882a593Smuzhiyun if (unlikely(bio_flagged(bio, BIO_BOUNCED)))
652*4882a593Smuzhiyun mapped_bio = bio->bi_private;
653*4882a593Smuzhiyun
654*4882a593Smuzhiyun if (bio->bi_private) {
655*4882a593Smuzhiyun ret2 = bio_uncopy_user(mapped_bio);
656*4882a593Smuzhiyun if (ret2 && !ret)
657*4882a593Smuzhiyun ret = ret2;
658*4882a593Smuzhiyun } else {
659*4882a593Smuzhiyun bio_unmap_user(mapped_bio);
660*4882a593Smuzhiyun }
661*4882a593Smuzhiyun
662*4882a593Smuzhiyun mapped_bio = bio;
663*4882a593Smuzhiyun bio = bio->bi_next;
664*4882a593Smuzhiyun bio_put(mapped_bio);
665*4882a593Smuzhiyun }
666*4882a593Smuzhiyun
667*4882a593Smuzhiyun return ret;
668*4882a593Smuzhiyun }
669*4882a593Smuzhiyun EXPORT_SYMBOL(blk_rq_unmap_user);
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun /**
672*4882a593Smuzhiyun * blk_rq_map_kern - map kernel data to a request, for passthrough requests
673*4882a593Smuzhiyun * @q: request queue where request should be inserted
674*4882a593Smuzhiyun * @rq: request to fill
675*4882a593Smuzhiyun * @kbuf: the kernel buffer
676*4882a593Smuzhiyun * @len: length of user data
677*4882a593Smuzhiyun * @gfp_mask: memory allocation flags
678*4882a593Smuzhiyun *
679*4882a593Smuzhiyun * Description:
680*4882a593Smuzhiyun * Data will be mapped directly if possible. Otherwise a bounce
681*4882a593Smuzhiyun * buffer is used. Can be called multiple times to append multiple
682*4882a593Smuzhiyun * buffers.
683*4882a593Smuzhiyun */
blk_rq_map_kern(struct request_queue * q,struct request * rq,void * kbuf,unsigned int len,gfp_t gfp_mask)684*4882a593Smuzhiyun int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf,
685*4882a593Smuzhiyun unsigned int len, gfp_t gfp_mask)
686*4882a593Smuzhiyun {
687*4882a593Smuzhiyun int reading = rq_data_dir(rq) == READ;
688*4882a593Smuzhiyun unsigned long addr = (unsigned long) kbuf;
689*4882a593Smuzhiyun struct bio *bio, *orig_bio;
690*4882a593Smuzhiyun int ret;
691*4882a593Smuzhiyun
692*4882a593Smuzhiyun if (len > (queue_max_hw_sectors(q) << 9))
693*4882a593Smuzhiyun return -EINVAL;
694*4882a593Smuzhiyun if (!len || !kbuf)
695*4882a593Smuzhiyun return -EINVAL;
696*4882a593Smuzhiyun
697*4882a593Smuzhiyun if (!blk_rq_aligned(q, addr, len) || object_is_on_stack(kbuf))
698*4882a593Smuzhiyun bio = bio_copy_kern(q, kbuf, len, gfp_mask, reading);
699*4882a593Smuzhiyun else
700*4882a593Smuzhiyun bio = bio_map_kern(q, kbuf, len, gfp_mask);
701*4882a593Smuzhiyun
702*4882a593Smuzhiyun if (IS_ERR(bio))
703*4882a593Smuzhiyun return PTR_ERR(bio);
704*4882a593Smuzhiyun
705*4882a593Smuzhiyun bio->bi_opf &= ~REQ_OP_MASK;
706*4882a593Smuzhiyun bio->bi_opf |= req_op(rq);
707*4882a593Smuzhiyun
708*4882a593Smuzhiyun orig_bio = bio;
709*4882a593Smuzhiyun ret = blk_rq_append_bio(rq, &bio);
710*4882a593Smuzhiyun if (unlikely(ret)) {
711*4882a593Smuzhiyun /* request is too big */
712*4882a593Smuzhiyun bio_put(orig_bio);
713*4882a593Smuzhiyun return ret;
714*4882a593Smuzhiyun }
715*4882a593Smuzhiyun
716*4882a593Smuzhiyun return 0;
717*4882a593Smuzhiyun }
718*4882a593Smuzhiyun EXPORT_SYMBOL(blk_rq_map_kern);
719