diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2016-09-17 18:02:44 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2016-09-27 18:12:24 -0400 |
commit | 4bce9f6ee8f84fdf333d0fd7fcf7f0d8c7cce7fa (patch) | |
tree | a5d3f51f67b05e37d3de3ed9201794924b66efc2 /include/linux/pagemap.h | |
parent | 08895a8b6b06ed2323cd97a36ee40a116b3db8ed (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.h | 54 |
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); | |||
518 | extern void add_page_wait_queue(struct page *page, wait_queue_t *waiter); | 518 | extern 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 | */ |
525 | static inline int fault_in_pages_writeable(char __user *uaddr, int size) | 523 | static 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 | |||
545 | static 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 | */ | ||
572 | static 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 | ||
599 | static inline int fault_in_multipages_readable(const char __user *uaddr, | 550 | static 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; |