xref: /openbmc/linux/block/blk-map.c (revision 86db1e29772372155db08ff48a9ceb76e11a2ad1)
1*86db1e29SJens Axboe /*
2*86db1e29SJens Axboe  * Functions related to mapping data to requests
3*86db1e29SJens Axboe  */
4*86db1e29SJens Axboe #include <linux/kernel.h>
5*86db1e29SJens Axboe #include <linux/module.h>
6*86db1e29SJens Axboe #include <linux/bio.h>
7*86db1e29SJens Axboe #include <linux/blkdev.h>
8*86db1e29SJens Axboe 
9*86db1e29SJens Axboe #include "blk.h"
10*86db1e29SJens Axboe 
11*86db1e29SJens Axboe int blk_rq_append_bio(struct request_queue *q, struct request *rq,
12*86db1e29SJens Axboe 		      struct bio *bio)
13*86db1e29SJens Axboe {
14*86db1e29SJens Axboe 	if (!rq->bio)
15*86db1e29SJens Axboe 		blk_rq_bio_prep(q, rq, bio);
16*86db1e29SJens Axboe 	else if (!ll_back_merge_fn(q, rq, bio))
17*86db1e29SJens Axboe 		return -EINVAL;
18*86db1e29SJens Axboe 	else {
19*86db1e29SJens Axboe 		rq->biotail->bi_next = bio;
20*86db1e29SJens Axboe 		rq->biotail = bio;
21*86db1e29SJens Axboe 
22*86db1e29SJens Axboe 		rq->data_len += bio->bi_size;
23*86db1e29SJens Axboe 	}
24*86db1e29SJens Axboe 	return 0;
25*86db1e29SJens Axboe }
26*86db1e29SJens Axboe EXPORT_SYMBOL(blk_rq_append_bio);
27*86db1e29SJens Axboe 
28*86db1e29SJens Axboe static int __blk_rq_unmap_user(struct bio *bio)
29*86db1e29SJens Axboe {
30*86db1e29SJens Axboe 	int ret = 0;
31*86db1e29SJens Axboe 
32*86db1e29SJens Axboe 	if (bio) {
33*86db1e29SJens Axboe 		if (bio_flagged(bio, BIO_USER_MAPPED))
34*86db1e29SJens Axboe 			bio_unmap_user(bio);
35*86db1e29SJens Axboe 		else
36*86db1e29SJens Axboe 			ret = bio_uncopy_user(bio);
37*86db1e29SJens Axboe 	}
38*86db1e29SJens Axboe 
39*86db1e29SJens Axboe 	return ret;
40*86db1e29SJens Axboe }
41*86db1e29SJens Axboe 
42*86db1e29SJens Axboe static int __blk_rq_map_user(struct request_queue *q, struct request *rq,
43*86db1e29SJens Axboe 			     void __user *ubuf, unsigned int len)
44*86db1e29SJens Axboe {
45*86db1e29SJens Axboe 	unsigned long uaddr;
46*86db1e29SJens Axboe 	struct bio *bio, *orig_bio;
47*86db1e29SJens Axboe 	int reading, ret;
48*86db1e29SJens Axboe 
49*86db1e29SJens Axboe 	reading = rq_data_dir(rq) == READ;
50*86db1e29SJens Axboe 
51*86db1e29SJens Axboe 	/*
52*86db1e29SJens Axboe 	 * if alignment requirement is satisfied, map in user pages for
53*86db1e29SJens Axboe 	 * direct dma. else, set up kernel bounce buffers
54*86db1e29SJens Axboe 	 */
55*86db1e29SJens Axboe 	uaddr = (unsigned long) ubuf;
56*86db1e29SJens Axboe 	if (!(uaddr & queue_dma_alignment(q)) && !(len & queue_dma_alignment(q)))
57*86db1e29SJens Axboe 		bio = bio_map_user(q, NULL, uaddr, len, reading);
58*86db1e29SJens Axboe 	else
59*86db1e29SJens Axboe 		bio = bio_copy_user(q, uaddr, len, reading);
60*86db1e29SJens Axboe 
61*86db1e29SJens Axboe 	if (IS_ERR(bio))
62*86db1e29SJens Axboe 		return PTR_ERR(bio);
63*86db1e29SJens Axboe 
64*86db1e29SJens Axboe 	orig_bio = bio;
65*86db1e29SJens Axboe 	blk_queue_bounce(q, &bio);
66*86db1e29SJens Axboe 
67*86db1e29SJens Axboe 	/*
68*86db1e29SJens Axboe 	 * We link the bounce buffer in and could have to traverse it
69*86db1e29SJens Axboe 	 * later so we have to get a ref to prevent it from being freed
70*86db1e29SJens Axboe 	 */
71*86db1e29SJens Axboe 	bio_get(bio);
72*86db1e29SJens Axboe 
73*86db1e29SJens Axboe 	ret = blk_rq_append_bio(q, rq, bio);
74*86db1e29SJens Axboe 	if (!ret)
75*86db1e29SJens Axboe 		return bio->bi_size;
76*86db1e29SJens Axboe 
77*86db1e29SJens Axboe 	/* if it was boucned we must call the end io function */
78*86db1e29SJens Axboe 	bio_endio(bio, 0);
79*86db1e29SJens Axboe 	__blk_rq_unmap_user(orig_bio);
80*86db1e29SJens Axboe 	bio_put(bio);
81*86db1e29SJens Axboe 	return ret;
82*86db1e29SJens Axboe }
83*86db1e29SJens Axboe 
84*86db1e29SJens Axboe /**
85*86db1e29SJens Axboe  * blk_rq_map_user - map user data to a request, for REQ_BLOCK_PC usage
86*86db1e29SJens Axboe  * @q:		request queue where request should be inserted
87*86db1e29SJens Axboe  * @rq:		request structure to fill
88*86db1e29SJens Axboe  * @ubuf:	the user buffer
89*86db1e29SJens Axboe  * @len:	length of user data
90*86db1e29SJens Axboe  *
91*86db1e29SJens Axboe  * Description:
92*86db1e29SJens Axboe  *    Data will be mapped directly for zero copy io, if possible. Otherwise
93*86db1e29SJens Axboe  *    a kernel bounce buffer is used.
94*86db1e29SJens Axboe  *
95*86db1e29SJens Axboe  *    A matching blk_rq_unmap_user() must be issued at the end of io, while
96*86db1e29SJens Axboe  *    still in process context.
97*86db1e29SJens Axboe  *
98*86db1e29SJens Axboe  *    Note: The mapped bio may need to be bounced through blk_queue_bounce()
99*86db1e29SJens Axboe  *    before being submitted to the device, as pages mapped may be out of
100*86db1e29SJens Axboe  *    reach. It's the callers responsibility to make sure this happens. The
101*86db1e29SJens Axboe  *    original bio must be passed back in to blk_rq_unmap_user() for proper
102*86db1e29SJens Axboe  *    unmapping.
103*86db1e29SJens Axboe  */
104*86db1e29SJens Axboe int blk_rq_map_user(struct request_queue *q, struct request *rq,
105*86db1e29SJens Axboe 		    void __user *ubuf, unsigned long len)
106*86db1e29SJens Axboe {
107*86db1e29SJens Axboe 	unsigned long bytes_read = 0;
108*86db1e29SJens Axboe 	struct bio *bio = NULL;
109*86db1e29SJens Axboe 	int ret;
110*86db1e29SJens Axboe 
111*86db1e29SJens Axboe 	if (len > (q->max_hw_sectors << 9))
112*86db1e29SJens Axboe 		return -EINVAL;
113*86db1e29SJens Axboe 	if (!len || !ubuf)
114*86db1e29SJens Axboe 		return -EINVAL;
115*86db1e29SJens Axboe 
116*86db1e29SJens Axboe 	while (bytes_read != len) {
117*86db1e29SJens Axboe 		unsigned long map_len, end, start;
118*86db1e29SJens Axboe 
119*86db1e29SJens Axboe 		map_len = min_t(unsigned long, len - bytes_read, BIO_MAX_SIZE);
120*86db1e29SJens Axboe 		end = ((unsigned long)ubuf + map_len + PAGE_SIZE - 1)
121*86db1e29SJens Axboe 								>> PAGE_SHIFT;
122*86db1e29SJens Axboe 		start = (unsigned long)ubuf >> PAGE_SHIFT;
123*86db1e29SJens Axboe 
124*86db1e29SJens Axboe 		/*
125*86db1e29SJens Axboe 		 * A bad offset could cause us to require BIO_MAX_PAGES + 1
126*86db1e29SJens Axboe 		 * pages. If this happens we just lower the requested
127*86db1e29SJens Axboe 		 * mapping len by a page so that we can fit
128*86db1e29SJens Axboe 		 */
129*86db1e29SJens Axboe 		if (end - start > BIO_MAX_PAGES)
130*86db1e29SJens Axboe 			map_len -= PAGE_SIZE;
131*86db1e29SJens Axboe 
132*86db1e29SJens Axboe 		ret = __blk_rq_map_user(q, rq, ubuf, map_len);
133*86db1e29SJens Axboe 		if (ret < 0)
134*86db1e29SJens Axboe 			goto unmap_rq;
135*86db1e29SJens Axboe 		if (!bio)
136*86db1e29SJens Axboe 			bio = rq->bio;
137*86db1e29SJens Axboe 		bytes_read += ret;
138*86db1e29SJens Axboe 		ubuf += ret;
139*86db1e29SJens Axboe 	}
140*86db1e29SJens Axboe 
141*86db1e29SJens Axboe 	rq->buffer = rq->data = NULL;
142*86db1e29SJens Axboe 	return 0;
143*86db1e29SJens Axboe unmap_rq:
144*86db1e29SJens Axboe 	blk_rq_unmap_user(bio);
145*86db1e29SJens Axboe 	return ret;
146*86db1e29SJens Axboe }
147*86db1e29SJens Axboe 
148*86db1e29SJens Axboe EXPORT_SYMBOL(blk_rq_map_user);
149*86db1e29SJens Axboe 
150*86db1e29SJens Axboe /**
151*86db1e29SJens Axboe  * blk_rq_map_user_iov - map user data to a request, for REQ_BLOCK_PC usage
152*86db1e29SJens Axboe  * @q:		request queue where request should be inserted
153*86db1e29SJens Axboe  * @rq:		request to map data to
154*86db1e29SJens Axboe  * @iov:	pointer to the iovec
155*86db1e29SJens Axboe  * @iov_count:	number of elements in the iovec
156*86db1e29SJens Axboe  * @len:	I/O byte count
157*86db1e29SJens Axboe  *
158*86db1e29SJens Axboe  * Description:
159*86db1e29SJens Axboe  *    Data will be mapped directly for zero copy io, if possible. Otherwise
160*86db1e29SJens Axboe  *    a kernel bounce buffer is used.
161*86db1e29SJens Axboe  *
162*86db1e29SJens Axboe  *    A matching blk_rq_unmap_user() must be issued at the end of io, while
163*86db1e29SJens Axboe  *    still in process context.
164*86db1e29SJens Axboe  *
165*86db1e29SJens Axboe  *    Note: The mapped bio may need to be bounced through blk_queue_bounce()
166*86db1e29SJens Axboe  *    before being submitted to the device, as pages mapped may be out of
167*86db1e29SJens Axboe  *    reach. It's the callers responsibility to make sure this happens. The
168*86db1e29SJens Axboe  *    original bio must be passed back in to blk_rq_unmap_user() for proper
169*86db1e29SJens Axboe  *    unmapping.
170*86db1e29SJens Axboe  */
171*86db1e29SJens Axboe int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
172*86db1e29SJens Axboe 			struct sg_iovec *iov, int iov_count, unsigned int len)
173*86db1e29SJens Axboe {
174*86db1e29SJens Axboe 	struct bio *bio;
175*86db1e29SJens Axboe 
176*86db1e29SJens Axboe 	if (!iov || iov_count <= 0)
177*86db1e29SJens Axboe 		return -EINVAL;
178*86db1e29SJens Axboe 
179*86db1e29SJens Axboe 	/* we don't allow misaligned data like bio_map_user() does.  If the
180*86db1e29SJens Axboe 	 * user is using sg, they're expected to know the alignment constraints
181*86db1e29SJens Axboe 	 * and respect them accordingly */
182*86db1e29SJens Axboe 	bio = bio_map_user_iov(q, NULL, iov, iov_count, rq_data_dir(rq)== READ);
183*86db1e29SJens Axboe 	if (IS_ERR(bio))
184*86db1e29SJens Axboe 		return PTR_ERR(bio);
185*86db1e29SJens Axboe 
186*86db1e29SJens Axboe 	if (bio->bi_size != len) {
187*86db1e29SJens Axboe 		bio_endio(bio, 0);
188*86db1e29SJens Axboe 		bio_unmap_user(bio);
189*86db1e29SJens Axboe 		return -EINVAL;
190*86db1e29SJens Axboe 	}
191*86db1e29SJens Axboe 
192*86db1e29SJens Axboe 	bio_get(bio);
193*86db1e29SJens Axboe 	blk_rq_bio_prep(q, rq, bio);
194*86db1e29SJens Axboe 	rq->buffer = rq->data = NULL;
195*86db1e29SJens Axboe 	return 0;
196*86db1e29SJens Axboe }
197*86db1e29SJens Axboe 
198*86db1e29SJens Axboe EXPORT_SYMBOL(blk_rq_map_user_iov);
199*86db1e29SJens Axboe 
200*86db1e29SJens Axboe /**
201*86db1e29SJens Axboe  * blk_rq_unmap_user - unmap a request with user data
202*86db1e29SJens Axboe  * @bio:	       start of bio list
203*86db1e29SJens Axboe  *
204*86db1e29SJens Axboe  * Description:
205*86db1e29SJens Axboe  *    Unmap a rq previously mapped by blk_rq_map_user(). The caller must
206*86db1e29SJens Axboe  *    supply the original rq->bio from the blk_rq_map_user() return, since
207*86db1e29SJens Axboe  *    the io completion may have changed rq->bio.
208*86db1e29SJens Axboe  */
209*86db1e29SJens Axboe int blk_rq_unmap_user(struct bio *bio)
210*86db1e29SJens Axboe {
211*86db1e29SJens Axboe 	struct bio *mapped_bio;
212*86db1e29SJens Axboe 	int ret = 0, ret2;
213*86db1e29SJens Axboe 
214*86db1e29SJens Axboe 	while (bio) {
215*86db1e29SJens Axboe 		mapped_bio = bio;
216*86db1e29SJens Axboe 		if (unlikely(bio_flagged(bio, BIO_BOUNCED)))
217*86db1e29SJens Axboe 			mapped_bio = bio->bi_private;
218*86db1e29SJens Axboe 
219*86db1e29SJens Axboe 		ret2 = __blk_rq_unmap_user(mapped_bio);
220*86db1e29SJens Axboe 		if (ret2 && !ret)
221*86db1e29SJens Axboe 			ret = ret2;
222*86db1e29SJens Axboe 
223*86db1e29SJens Axboe 		mapped_bio = bio;
224*86db1e29SJens Axboe 		bio = bio->bi_next;
225*86db1e29SJens Axboe 		bio_put(mapped_bio);
226*86db1e29SJens Axboe 	}
227*86db1e29SJens Axboe 
228*86db1e29SJens Axboe 	return ret;
229*86db1e29SJens Axboe }
230*86db1e29SJens Axboe 
231*86db1e29SJens Axboe EXPORT_SYMBOL(blk_rq_unmap_user);
232*86db1e29SJens Axboe 
233*86db1e29SJens Axboe /**
234*86db1e29SJens Axboe  * blk_rq_map_kern - map kernel data to a request, for REQ_BLOCK_PC usage
235*86db1e29SJens Axboe  * @q:		request queue where request should be inserted
236*86db1e29SJens Axboe  * @rq:		request to fill
237*86db1e29SJens Axboe  * @kbuf:	the kernel buffer
238*86db1e29SJens Axboe  * @len:	length of user data
239*86db1e29SJens Axboe  * @gfp_mask:	memory allocation flags
240*86db1e29SJens Axboe  */
241*86db1e29SJens Axboe int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf,
242*86db1e29SJens Axboe 		    unsigned int len, gfp_t gfp_mask)
243*86db1e29SJens Axboe {
244*86db1e29SJens Axboe 	struct bio *bio;
245*86db1e29SJens Axboe 
246*86db1e29SJens Axboe 	if (len > (q->max_hw_sectors << 9))
247*86db1e29SJens Axboe 		return -EINVAL;
248*86db1e29SJens Axboe 	if (!len || !kbuf)
249*86db1e29SJens Axboe 		return -EINVAL;
250*86db1e29SJens Axboe 
251*86db1e29SJens Axboe 	bio = bio_map_kern(q, kbuf, len, gfp_mask);
252*86db1e29SJens Axboe 	if (IS_ERR(bio))
253*86db1e29SJens Axboe 		return PTR_ERR(bio);
254*86db1e29SJens Axboe 
255*86db1e29SJens Axboe 	if (rq_data_dir(rq) == WRITE)
256*86db1e29SJens Axboe 		bio->bi_rw |= (1 << BIO_RW);
257*86db1e29SJens Axboe 
258*86db1e29SJens Axboe 	blk_rq_bio_prep(q, rq, bio);
259*86db1e29SJens Axboe 	blk_queue_bounce(q, &rq->bio);
260*86db1e29SJens Axboe 	rq->buffer = rq->data = NULL;
261*86db1e29SJens Axboe 	return 0;
262*86db1e29SJens Axboe }
263*86db1e29SJens Axboe 
264*86db1e29SJens Axboe EXPORT_SYMBOL(blk_rq_map_kern);
265