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 --- |