Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iov_iter: advancing variants of iov_iter_get_pages{,_alloc}()

Most of the users immediately follow successful iov_iter_get_pages()
with advancing by the amount it had returned.

Provide inline wrappers doing that, convert trivial open-coded
uses of those.

BTW, iov_iter_get_pages() never returns more than it had been asked
to; such checks in cifs ought to be removed someday...

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro 1ef255e2 3cf42da3

+34 -30
+1 -3
drivers/vhost/scsi.c
··· 643 643 size_t offset; 644 644 unsigned int npages = 0; 645 645 646 - bytes = iov_iter_get_pages(iter, pages, LONG_MAX, 646 + bytes = iov_iter_get_pages2(iter, pages, LONG_MAX, 647 647 VHOST_SCSI_PREALLOC_UPAGES, &offset); 648 648 /* No pages were pinned */ 649 649 if (bytes <= 0) 650 650 return bytes < 0 ? bytes : -EFAULT; 651 - 652 - iov_iter_advance(iter, bytes); 653 651 654 652 while (bytes) { 655 653 unsigned n = min_t(unsigned, PAGE_SIZE - offset, bytes);
+1 -2
fs/ceph/file.c
··· 95 95 size_t start; 96 96 int idx = 0; 97 97 98 - bytes = iov_iter_get_pages(iter, pages, maxsize - size, 98 + bytes = iov_iter_get_pages2(iter, pages, maxsize - size, 99 99 ITER_GET_BVECS_PAGES, &start); 100 100 if (bytes < 0) 101 101 return size ?: bytes; 102 102 103 - iov_iter_advance(iter, bytes); 104 103 size += bytes; 105 104 106 105 for ( ; bytes; idx++, bvec_idx++) {
+2 -4
fs/cifs/file.c
··· 3022 3022 if (ctx->direct_io) { 3023 3023 ssize_t result; 3024 3024 3025 - result = iov_iter_get_pages_alloc( 3025 + result = iov_iter_get_pages_alloc2( 3026 3026 from, &pagevec, cur_len, &start); 3027 3027 if (result < 0) { 3028 3028 cifs_dbg(VFS, ··· 3036 3036 break; 3037 3037 } 3038 3038 cur_len = (size_t)result; 3039 - iov_iter_advance(from, cur_len); 3040 3039 3041 3040 nr_pages = 3042 3041 (cur_len + start + PAGE_SIZE - 1) / PAGE_SIZE; ··· 3757 3758 if (ctx->direct_io) { 3758 3759 ssize_t result; 3759 3760 3760 - result = iov_iter_get_pages_alloc( 3761 + result = iov_iter_get_pages_alloc2( 3761 3762 &direct_iov, &pagevec, 3762 3763 cur_len, &start); 3763 3764 if (result < 0) { ··· 3773 3774 break; 3774 3775 } 3775 3776 cur_len = (size_t)result; 3776 - iov_iter_advance(&direct_iov, cur_len); 3777 3777 3778 3778 rdata = cifs_readdata_direct_alloc( 3779 3779 pagevec, cifs_uncached_readv_complete);
+1 -2
fs/cifs/misc.c
··· 1029 1029 saved_len = count; 1030 1030 1031 1031 while (count && npages < max_pages) { 1032 - rc = iov_iter_get_pages(iter, pages, count, max_pages, &start); 1032 + rc = iov_iter_get_pages2(iter, pages, count, max_pages, &start); 1033 1033 if (rc < 0) { 1034 1034 cifs_dbg(VFS, "Couldn't get user pages (rc=%zd)\n", rc); 1035 1035 break; ··· 1041 1041 break; 1042 1042 } 1043 1043 1044 - iov_iter_advance(iter, rc); 1045 1044 count -= rc; 1046 1045 rc += start; 1047 1046 cur_npages = DIV_ROUND_UP(rc, PAGE_SIZE);
+1 -2
fs/direct-io.c
··· 169 169 const enum req_op dio_op = dio->opf & REQ_OP_MASK; 170 170 ssize_t ret; 171 171 172 - ret = iov_iter_get_pages(sdio->iter, dio->pages, LONG_MAX, DIO_PAGES, 172 + ret = iov_iter_get_pages2(sdio->iter, dio->pages, LONG_MAX, DIO_PAGES, 173 173 &sdio->from); 174 174 175 175 if (ret < 0 && sdio->blocks_available && dio_op == REQ_OP_WRITE) { ··· 191 191 } 192 192 193 193 if (ret >= 0) { 194 - iov_iter_advance(sdio->iter, ret); 195 194 ret += sdio->from; 196 195 sdio->head = 0; 197 196 sdio->tail = (ret + PAGE_SIZE - 1) / PAGE_SIZE;
+1 -2
fs/fuse/dev.c
··· 730 730 } 731 731 } else { 732 732 size_t off; 733 - err = iov_iter_get_pages(cs->iter, &page, PAGE_SIZE, 1, &off); 733 + err = iov_iter_get_pages2(cs->iter, &page, PAGE_SIZE, 1, &off); 734 734 if (err < 0) 735 735 return err; 736 736 BUG_ON(!err); 737 737 cs->len = err; 738 738 cs->offset = off; 739 739 cs->pg = page; 740 - iov_iter_advance(cs->iter, err); 741 740 } 742 741 743 742 return lock_request(cs->req);
+1 -2
fs/fuse/file.c
··· 1401 1401 while (nbytes < *nbytesp && ap->num_pages < max_pages) { 1402 1402 unsigned npages; 1403 1403 size_t start; 1404 - ret = iov_iter_get_pages(ii, &ap->pages[ap->num_pages], 1404 + ret = iov_iter_get_pages2(ii, &ap->pages[ap->num_pages], 1405 1405 *nbytesp - nbytes, 1406 1406 max_pages - ap->num_pages, 1407 1407 &start); 1408 1408 if (ret < 0) 1409 1409 break; 1410 1410 1411 - iov_iter_advance(ii, ret); 1412 1411 nbytes += ret; 1413 1412 1414 1413 ret += start;
+2 -4
fs/nfs/direct.c
··· 364 364 size_t pgbase; 365 365 unsigned npages, i; 366 366 367 - result = iov_iter_get_pages_alloc(iter, &pagevec, 367 + result = iov_iter_get_pages_alloc2(iter, &pagevec, 368 368 rsize, &pgbase); 369 369 if (result < 0) 370 370 break; 371 371 372 372 bytes = result; 373 - iov_iter_advance(iter, bytes); 374 373 npages = (result + pgbase + PAGE_SIZE - 1) / PAGE_SIZE; 375 374 for (i = 0; i < npages; i++) { 376 375 struct nfs_page *req; ··· 811 812 size_t pgbase; 812 813 unsigned npages, i; 813 814 814 - result = iov_iter_get_pages_alloc(iter, &pagevec, 815 + result = iov_iter_get_pages_alloc2(iter, &pagevec, 815 816 wsize, &pgbase); 816 817 if (result < 0) 817 818 break; 818 819 819 820 bytes = result; 820 - iov_iter_advance(iter, bytes); 821 821 npages = (result + pgbase + PAGE_SIZE - 1) / PAGE_SIZE; 822 822 for (i = 0; i < npages; i++) { 823 823 struct nfs_page *req;
+20
include/linux/uio.h
··· 351 351 }; 352 352 } 353 353 354 + static inline ssize_t iov_iter_get_pages2(struct iov_iter *i, struct page **pages, 355 + size_t maxsize, unsigned maxpages, size_t *start) 356 + { 357 + ssize_t res = iov_iter_get_pages(i, pages, maxsize, maxpages, start); 358 + 359 + if (res >= 0) 360 + iov_iter_advance(i, res); 361 + return res; 362 + } 363 + 364 + static inline ssize_t iov_iter_get_pages_alloc2(struct iov_iter *i, struct page ***pages, 365 + size_t maxsize, size_t *start) 366 + { 367 + ssize_t res = iov_iter_get_pages_alloc(i, pages, maxsize, start); 368 + 369 + if (res >= 0) 370 + iov_iter_advance(i, res); 371 + return res; 372 + } 373 + 354 374 #endif
+1 -2
net/core/datagram.c
··· 632 632 if (frag == MAX_SKB_FRAGS) 633 633 return -EMSGSIZE; 634 634 635 - copied = iov_iter_get_pages(from, pages, length, 635 + copied = iov_iter_get_pages2(from, pages, length, 636 636 MAX_SKB_FRAGS - frag, &start); 637 637 if (copied < 0) 638 638 return -EFAULT; 639 639 640 - iov_iter_advance(from, copied); 641 640 length -= copied; 642 641 643 642 truesize = PAGE_ALIGN(copied + start);
+1 -2
net/core/skmsg.c
··· 324 324 goto out; 325 325 } 326 326 327 - copied = iov_iter_get_pages(from, pages, bytes, maxpages, 327 + copied = iov_iter_get_pages2(from, pages, bytes, maxpages, 328 328 &offset); 329 329 if (copied <= 0) { 330 330 ret = -EFAULT; 331 331 goto out; 332 332 } 333 333 334 - iov_iter_advance(from, copied); 335 334 bytes -= copied; 336 335 msg->sg.size += copied; 337 336
+1 -2
net/rds/message.c
··· 391 391 size_t start; 392 392 ssize_t copied; 393 393 394 - copied = iov_iter_get_pages(from, &pages, PAGE_SIZE, 394 + copied = iov_iter_get_pages2(from, &pages, PAGE_SIZE, 395 395 1, &start); 396 396 if (copied < 0) { 397 397 struct mmpin *mmp; ··· 405 405 goto err; 406 406 } 407 407 total_copied += copied; 408 - iov_iter_advance(from, copied); 409 408 length -= copied; 410 409 sg_set_page(sg, pages, copied, start); 411 410 rm->data.op_nents++;
+1 -3
net/tls/tls_sw.c
··· 1352 1352 rc = -EFAULT; 1353 1353 goto out; 1354 1354 } 1355 - copied = iov_iter_get_pages(from, pages, 1355 + copied = iov_iter_get_pages2(from, pages, 1356 1356 length, 1357 1357 maxpages, &offset); 1358 1358 if (copied <= 0) { 1359 1359 rc = -EFAULT; 1360 1360 goto out; 1361 1361 } 1362 - 1363 - iov_iter_advance(from, copied); 1364 1362 1365 1363 length -= copied; 1366 1364 size += copied;