summaryrefslogtreecommitdiffstats
path: root/include/linux/pagemap.h
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2016-09-17 18:02:44 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2016-09-27 18:12:24 -0400
commit4bce9f6ee8f84fdf333d0fd7fcf7f0d8c7cce7fa (patch)
treea5d3f51f67b05e37d3de3ed9201794924b66efc2 /include/linux/pagemap.h
parent08895a8b6b06ed2323cd97a36ee40a116b3db8ed (diff)
get rid of separate multipage fault-in primitives
* the only remaining callers of "short" fault-ins are just as happy with generic variants (both in lib/iov_iter.c); switch them to multipage variants, kill the "short" ones * rename the multipage variants to now available plain ones. * get rid of compat macro defining iov_iter_fault_in_multipage_readable by expanding it in its only user. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'include/linux/pagemap.h')
-rw-r--r--include/linux/pagemap.h54
1 files changed, 2 insertions, 52 deletions
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index 01e84436cddf..cb2e1d06d2e9 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -518,59 +518,10 @@ void page_endio(struct page *page, bool is_write, int err);
518extern void add_page_wait_queue(struct page *page, wait_queue_t *waiter); 518extern void add_page_wait_queue(struct page *page, wait_queue_t *waiter);
519 519
520/* 520/*
521 * Fault one or two userspace pages into pagetables. 521 * Fault everything in given userspace address range in.
522 * Return -EINVAL if more than two pages would be needed.
523 * Return non-zero on a fault.
524 */ 522 */
525static inline int fault_in_pages_writeable(char __user *uaddr, int size) 523static inline int fault_in_pages_writeable(char __user *uaddr, int size)
526{ 524{
527 int span, ret;
528
529 if (unlikely(size == 0))
530 return 0;
531
532 span = offset_in_page(uaddr) + size;
533 if (span > 2 * PAGE_SIZE)
534 return -EINVAL;
535 /*
536 * Writing zeroes into userspace here is OK, because we know that if
537 * the zero gets there, we'll be overwriting it.
538 */
539 ret = __put_user(0, uaddr);
540 if (ret == 0 && span > PAGE_SIZE)
541 ret = __put_user(0, uaddr + size - 1);
542 return ret;
543}
544
545static inline int fault_in_pages_readable(const char __user *uaddr, int size)
546{
547 volatile char c;
548 int ret;
549
550 if (unlikely(size == 0))
551 return 0;
552
553 ret = __get_user(c, uaddr);
554 if (ret == 0) {
555 const char __user *end = uaddr + size - 1;
556
557 if (((unsigned long)uaddr & PAGE_MASK) !=
558 ((unsigned long)end & PAGE_MASK)) {
559 ret = __get_user(c, end);
560 (void)c;
561 }
562 }
563 return ret;
564}
565
566/*
567 * Multipage variants of the above prefault helpers, useful if more than
568 * PAGE_SIZE of data needs to be prefaulted. These are separate from the above
569 * functions (which only handle up to PAGE_SIZE) to avoid clobbering the
570 * filemap.c hotpaths.
571 */
572static inline int fault_in_multipages_writeable(char __user *uaddr, int size)
573{
574 char __user *end = uaddr + size - 1; 525 char __user *end = uaddr + size - 1;
575 526
576 if (unlikely(size == 0)) 527 if (unlikely(size == 0))
@@ -596,8 +547,7 @@ static inline int fault_in_multipages_writeable(char __user *uaddr, int size)
596 return 0; 547 return 0;
597} 548}
598 549
599static inline int fault_in_multipages_readable(const char __user *uaddr, 550static inline int fault_in_pages_readable(const char __user *uaddr, int size)
600 int size)
601{ 551{
602 volatile char c; 552 volatile char c;
603 const char __user *end = uaddr + size - 1; 553 const char __user *end = uaddr + size - 1;