blk-map.c (d93618da6b6d453c6a9684a3460ffd51b9b4ef2e) blk-map.c (7ee4ccf57484d260c37b29f9a48b65c4101403e8)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Functions related to mapping data to requests
4 */
5#include <linux/kernel.h>
6#include <linux/sched/task_stack.h>
7#include <linux/module.h>
8#include <linux/bio.h>

--- 253 unchanged lines hidden (view full) ---

262 return bio;
263}
264
265static int bio_map_user_iov(struct request *rq, struct iov_iter *iter,
266 gfp_t gfp_mask)
267{
268 unsigned int max_sectors = queue_max_hw_sectors(rq->q);
269 unsigned int nr_vecs = iov_iter_npages(iter, BIO_MAX_VECS);
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Functions related to mapping data to requests
4 */
5#include <linux/kernel.h>
6#include <linux/sched/task_stack.h>
7#include <linux/module.h>
8#include <linux/bio.h>

--- 253 unchanged lines hidden (view full) ---

262 return bio;
263}
264
265static int bio_map_user_iov(struct request *rq, struct iov_iter *iter,
266 gfp_t gfp_mask)
267{
268 unsigned int max_sectors = queue_max_hw_sectors(rq->q);
269 unsigned int nr_vecs = iov_iter_npages(iter, BIO_MAX_VECS);
270 unsigned int gup_flags = 0;
270 struct bio *bio;
271 int ret;
272 int j;
273
274 if (!iov_iter_count(iter))
275 return -EINVAL;
276
277 bio = blk_rq_map_bio_alloc(rq, nr_vecs, gfp_mask);
278 if (bio == NULL)
279 return -ENOMEM;
280
271 struct bio *bio;
272 int ret;
273 int j;
274
275 if (!iov_iter_count(iter))
276 return -EINVAL;
277
278 bio = blk_rq_map_bio_alloc(rq, nr_vecs, gfp_mask);
279 if (bio == NULL)
280 return -ENOMEM;
281
282 if (blk_queue_pci_p2pdma(rq->q))
283 gup_flags |= FOLL_PCI_P2PDMA;
284
281 while (iov_iter_count(iter)) {
282 struct page **pages, *stack_pages[UIO_FASTIOV];
283 ssize_t bytes;
284 size_t offs;
285 int npages;
286
287 if (nr_vecs <= ARRAY_SIZE(stack_pages)) {
288 pages = stack_pages;
285 while (iov_iter_count(iter)) {
286 struct page **pages, *stack_pages[UIO_FASTIOV];
287 ssize_t bytes;
288 size_t offs;
289 int npages;
290
291 if (nr_vecs <= ARRAY_SIZE(stack_pages)) {
292 pages = stack_pages;
289 bytes = iov_iter_get_pages2(iter, pages, LONG_MAX,
290 nr_vecs, &offs);
293 bytes = iov_iter_get_pages(iter, pages, LONG_MAX,
294 nr_vecs, &offs, gup_flags);
291 } else {
295 } else {
292 bytes = iov_iter_get_pages_alloc2(iter, &pages,
293 LONG_MAX, &offs);
296 bytes = iov_iter_get_pages_alloc(iter, &pages,
297 LONG_MAX, &offs, gup_flags);
294 }
295 if (unlikely(bytes <= 0)) {
296 ret = bytes ? bytes : -EFAULT;
297 goto out_unmap;
298 }
299
300 npages = DIV_ROUND_UP(offs + bytes, PAGE_SIZE);
301

--- 248 unchanged lines hidden (view full) ---

550
551/* Prepare bio for passthrough IO given ITER_BVEC iter */
552static int blk_rq_map_user_bvec(struct request *rq, const struct iov_iter *iter)
553{
554 struct request_queue *q = rq->q;
555 size_t nr_iter = iov_iter_count(iter);
556 size_t nr_segs = iter->nr_segs;
557 struct bio_vec *bvecs, *bvprvp = NULL;
298 }
299 if (unlikely(bytes <= 0)) {
300 ret = bytes ? bytes : -EFAULT;
301 goto out_unmap;
302 }
303
304 npages = DIV_ROUND_UP(offs + bytes, PAGE_SIZE);
305

--- 248 unchanged lines hidden (view full) ---

554
555/* Prepare bio for passthrough IO given ITER_BVEC iter */
556static int blk_rq_map_user_bvec(struct request *rq, const struct iov_iter *iter)
557{
558 struct request_queue *q = rq->q;
559 size_t nr_iter = iov_iter_count(iter);
560 size_t nr_segs = iter->nr_segs;
561 struct bio_vec *bvecs, *bvprvp = NULL;
558 struct queue_limits *lim = &q->limits;
562 const struct queue_limits *lim = &q->limits;
559 unsigned int nsegs = 0, bytes = 0;
560 struct bio *bio;
561 size_t i;
562
563 if (!nr_iter || (nr_iter >> SECTOR_SHIFT) > queue_max_hw_sectors(q))
564 return -EINVAL;
565 if (nr_segs > queue_max_segments(q))
566 return -EINVAL;

--- 239 unchanged lines hidden ---
563 unsigned int nsegs = 0, bytes = 0;
564 struct bio *bio;
565 size_t i;
566
567 if (!nr_iter || (nr_iter >> SECTOR_SHIFT) > queue_max_hw_sectors(q))
568 return -EINVAL;
569 if (nr_segs > queue_max_segments(q))
570 return -EINVAL;

--- 239 unchanged lines hidden ---