summaryrefslogtreecommitdiffstats
path: root/include/linux/pagemap.h
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-10-10 16:04:49 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-10-10 16:04:49 -0400
commitabb5a14fa20fdd400995926134b7be9eb8ce6048 (patch)
tree085add41cae3193b8c8293d25b453fd1ecae0c19 /include/linux/pagemap.h
parent911f9dab301e8583143c7e75b552eadd434ea0a8 (diff)
parente55f1d1d13e7f1c364672d667d78fd1f640ab9f9 (diff)
Merge branch 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull misc vfs updates from Al Viro: "Assorted misc bits and pieces. There are several single-topic branches left after this (rename2 series from Miklos, current_time series from Deepa Dinamani, xattr series from Andreas, uaccess stuff from from me) and I'd prefer to send those separately" * 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (39 commits) proc: switch auxv to use of __mem_open() hpfs: support FIEMAP cifs: get rid of unused arguments of CIFSSMBWrite() posix_acl: uapi header split posix_acl: xattr representation cleanups fs/aio.c: eliminate redundant loads in put_aio_ring_file fs/internal.h: add const to ns_dentry_operations declaration compat: remove compat_printk() fs/buffer.c: make __getblk_slow() static proc: unsigned file descriptors fs/file: more unsigned file descriptors fs: compat: remove redundant check of nr_segs cachefiles: Fix attempt to read i_blocks after deleting file [ver #2] cifs: don't use memcpy() to copy struct iov_iter get rid of separate multipage fault-in primitives fs: Avoid premature clearing of capabilities fs: Give dentry to inode_change_ok() instead of inode fuse: Propagate dentry down to inode_change_ok() ceph: Propagate dentry down to inode_change_ok() xfs: Propagate dentry down to inode_change_ok() ...
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 794dbcb91084..747f401cc312 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -530,59 +530,10 @@ void page_endio(struct page *page, bool is_write, int err);
530extern void add_page_wait_queue(struct page *page, wait_queue_t *waiter); 530extern void add_page_wait_queue(struct page *page, wait_queue_t *waiter);
531 531
532/* 532/*
533 * Fault one or two userspace pages into pagetables. 533 * Fault everything in given userspace address range in.
534 * Return -EINVAL if more than two pages would be needed.
535 * Return non-zero on a fault.
536 */ 534 */
537static inline int fault_in_pages_writeable(char __user *uaddr, int size) 535static inline int fault_in_pages_writeable(char __user *uaddr, int size)
538{ 536{
539 int span, ret;
540
541 if (unlikely(size == 0))
542 return 0;
543
544 span = offset_in_page(uaddr) + size;
545 if (span > 2 * PAGE_SIZE)
546 return -EINVAL;
547 /*
548 * Writing zeroes into userspace here is OK, because we know that if
549 * the zero gets there, we'll be overwriting it.
550 */
551 ret = __put_user(0, uaddr);
552 if (ret == 0 && span > PAGE_SIZE)
553 ret = __put_user(0, uaddr + size - 1);
554 return ret;
555}
556
557static inline int fault_in_pages_readable(const char __user *uaddr, int size)
558{
559 volatile char c;
560 int ret;
561
562 if (unlikely(size == 0))
563 return 0;
564
565 ret = __get_user(c, uaddr);
566 if (ret == 0) {
567 const char __user *end = uaddr + size - 1;
568
569 if (((unsigned long)uaddr & PAGE_MASK) !=
570 ((unsigned long)end & PAGE_MASK)) {
571 ret = __get_user(c, end);
572 (void)c;
573 }
574 }
575 return ret;
576}
577
578/*
579 * Multipage variants of the above prefault helpers, useful if more than
580 * PAGE_SIZE of data needs to be prefaulted. These are separate from the above
581 * functions (which only handle up to PAGE_SIZE) to avoid clobbering the
582 * filemap.c hotpaths.
583 */
584static inline int fault_in_multipages_writeable(char __user *uaddr, int size)
585{
586 char __user *end = uaddr + size - 1; 537 char __user *end = uaddr + size - 1;
587 538
588 if (unlikely(size == 0)) 539 if (unlikely(size == 0))
@@ -608,8 +559,7 @@ static inline int fault_in_multipages_writeable(char __user *uaddr, int size)
608 return 0; 559 return 0;
609} 560}
610 561
611static inline int fault_in_multipages_readable(const char __user *uaddr, 562static inline int fault_in_pages_readable(const char __user *uaddr, int size)
612 int size)
613{ 563{
614 volatile char c; 564 volatile char c;
615 const char __user *end = uaddr + size - 1; 565 const char __user *end = uaddr + size - 1;