diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-10-10 16:04:49 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-10-10 16:04:49 -0400 |
commit | abb5a14fa20fdd400995926134b7be9eb8ce6048 (patch) | |
tree | 085add41cae3193b8c8293d25b453fd1ecae0c19 /include/linux/pagemap.h | |
parent | 911f9dab301e8583143c7e75b552eadd434ea0a8 (diff) | |
parent | e55f1d1d13e7f1c364672d667d78fd1f640ab9f9 (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.h | 54 |
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); | |||
530 | extern void add_page_wait_queue(struct page *page, wait_queue_t *waiter); | 530 | extern 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 | */ |
537 | static inline int fault_in_pages_writeable(char __user *uaddr, int size) | 535 | static 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 | |||
557 | static 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 | */ | ||
584 | static 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 | ||
611 | static inline int fault_in_multipages_readable(const char __user *uaddr, | 562 | static 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; |