diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-09-14 21:13:32 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-09-14 21:13:32 -0400 |
commit | 581bfce969cbfc7ce43ee92273be9cb7c3fdfa61 (patch) | |
tree | 0a693778ce39c49b9b7d93d0d6795c576896f5cf /fs/read_write.c | |
parent | cc73fee0bae2d66594d1fa2df92bbd783aa98e04 (diff) | |
parent | 9725d4cef62229b4ec4c912e0db0761e7d400650 (diff) |
Merge branch 'work.set_fs' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull more set_fs removal from Al Viro:
"Christoph's 'use kernel_read and friends rather than open-coding
set_fs()' series"
* 'work.set_fs' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
fs: unexport vfs_readv and vfs_writev
fs: unexport vfs_read and vfs_write
fs: unexport __vfs_read/__vfs_write
lustre: switch to kernel_write
gadget/f_mass_storage: stop messing with the address limit
mconsole: switch to kernel_read
btrfs: switch write_buf to kernel_write
net/9p: switch p9_fd_read to kernel_write
mm/nommu: switch do_mmap_private to kernel_read
serial2002: switch serial2002_tty_write to kernel_{read/write}
fs: make the buf argument to __kernel_write a void pointer
fs: fix kernel_write prototype
fs: fix kernel_read prototype
fs: move kernel_read to fs/read_write.c
fs: move kernel_write to fs/read_write.c
autofs4: switch autofs4_write to __kernel_write
ashmem: switch to ->read_iter
Diffstat (limited to 'fs/read_write.c')
-rw-r--r-- | fs/read_write.c | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/fs/read_write.c b/fs/read_write.c index 61b58c7b6531..a2b9a47235c5 100644 --- a/fs/read_write.c +++ b/fs/read_write.c | |||
@@ -413,7 +413,20 @@ ssize_t __vfs_read(struct file *file, char __user *buf, size_t count, | |||
413 | else | 413 | else |
414 | return -EINVAL; | 414 | return -EINVAL; |
415 | } | 415 | } |
416 | EXPORT_SYMBOL(__vfs_read); | 416 | |
417 | ssize_t kernel_read(struct file *file, void *buf, size_t count, loff_t *pos) | ||
418 | { | ||
419 | mm_segment_t old_fs; | ||
420 | ssize_t result; | ||
421 | |||
422 | old_fs = get_fs(); | ||
423 | set_fs(get_ds()); | ||
424 | /* The cast to a user pointer is valid due to the set_fs() */ | ||
425 | result = vfs_read(file, (void __user *)buf, count, pos); | ||
426 | set_fs(old_fs); | ||
427 | return result; | ||
428 | } | ||
429 | EXPORT_SYMBOL(kernel_read); | ||
417 | 430 | ||
418 | ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) | 431 | ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) |
419 | { | 432 | { |
@@ -441,8 +454,6 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) | |||
441 | return ret; | 454 | return ret; |
442 | } | 455 | } |
443 | 456 | ||
444 | EXPORT_SYMBOL(vfs_read); | ||
445 | |||
446 | static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos) | 457 | static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos) |
447 | { | 458 | { |
448 | struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len }; | 459 | struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len }; |
@@ -471,9 +482,8 @@ ssize_t __vfs_write(struct file *file, const char __user *p, size_t count, | |||
471 | else | 482 | else |
472 | return -EINVAL; | 483 | return -EINVAL; |
473 | } | 484 | } |
474 | EXPORT_SYMBOL(__vfs_write); | ||
475 | 485 | ||
476 | ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t *pos) | 486 | ssize_t __kernel_write(struct file *file, const void *buf, size_t count, loff_t *pos) |
477 | { | 487 | { |
478 | mm_segment_t old_fs; | 488 | mm_segment_t old_fs; |
479 | const char __user *p; | 489 | const char __user *p; |
@@ -496,9 +506,24 @@ ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t | |||
496 | inc_syscw(current); | 506 | inc_syscw(current); |
497 | return ret; | 507 | return ret; |
498 | } | 508 | } |
499 | |||
500 | EXPORT_SYMBOL(__kernel_write); | 509 | EXPORT_SYMBOL(__kernel_write); |
501 | 510 | ||
511 | ssize_t kernel_write(struct file *file, const void *buf, size_t count, | ||
512 | loff_t *pos) | ||
513 | { | ||
514 | mm_segment_t old_fs; | ||
515 | ssize_t res; | ||
516 | |||
517 | old_fs = get_fs(); | ||
518 | set_fs(get_ds()); | ||
519 | /* The cast to a user pointer is valid due to the set_fs() */ | ||
520 | res = vfs_write(file, (__force const char __user *)buf, count, pos); | ||
521 | set_fs(old_fs); | ||
522 | |||
523 | return res; | ||
524 | } | ||
525 | EXPORT_SYMBOL(kernel_write); | ||
526 | |||
502 | ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos) | 527 | ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos) |
503 | { | 528 | { |
504 | ssize_t ret; | 529 | ssize_t ret; |
@@ -527,8 +552,6 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_ | |||
527 | return ret; | 552 | return ret; |
528 | } | 553 | } |
529 | 554 | ||
530 | EXPORT_SYMBOL(vfs_write); | ||
531 | |||
532 | static inline loff_t file_pos_read(struct file *file) | 555 | static inline loff_t file_pos_read(struct file *file) |
533 | { | 556 | { |
534 | return file->f_pos; | 557 | return file->f_pos; |
@@ -959,9 +982,8 @@ ssize_t vfs_readv(struct file *file, const struct iovec __user *vec, | |||
959 | 982 | ||
960 | return ret; | 983 | return ret; |
961 | } | 984 | } |
962 | EXPORT_SYMBOL(vfs_readv); | ||
963 | 985 | ||
964 | ssize_t vfs_writev(struct file *file, const struct iovec __user *vec, | 986 | static ssize_t vfs_writev(struct file *file, const struct iovec __user *vec, |
965 | unsigned long vlen, loff_t *pos, rwf_t flags) | 987 | unsigned long vlen, loff_t *pos, rwf_t flags) |
966 | { | 988 | { |
967 | struct iovec iovstack[UIO_FASTIOV]; | 989 | struct iovec iovstack[UIO_FASTIOV]; |
@@ -978,7 +1000,6 @@ ssize_t vfs_writev(struct file *file, const struct iovec __user *vec, | |||
978 | } | 1000 | } |
979 | return ret; | 1001 | return ret; |
980 | } | 1002 | } |
981 | EXPORT_SYMBOL(vfs_writev); | ||
982 | 1003 | ||
983 | static ssize_t do_readv(unsigned long fd, const struct iovec __user *vec, | 1004 | static ssize_t do_readv(unsigned long fd, const struct iovec __user *vec, |
984 | unsigned long vlen, rwf_t flags) | 1005 | unsigned long vlen, rwf_t flags) |