xref: /OK3568_Linux_fs/kernel/block/blk-map.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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