summaryrefslogtreecommitdiffstats
path: root/fs/read_write.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-09-14 21:13:32 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-09-14 21:13:32 -0400
commit581bfce969cbfc7ce43ee92273be9cb7c3fdfa61 (patch)
tree0a693778ce39c49b9b7d93d0d6795c576896f5cf /fs/read_write.c
parentcc73fee0bae2d66594d1fa2df92bbd783aa98e04 (diff)
parent9725d4cef62229b4ec4c912e0db0761e7d400650 (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.c43
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}
416EXPORT_SYMBOL(__vfs_read); 416
417ssize_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}
429EXPORT_SYMBOL(kernel_read);
417 430
418ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) 431ssize_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
444EXPORT_SYMBOL(vfs_read);
445
446static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos) 457static 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}
474EXPORT_SYMBOL(__vfs_write);
475 485
476ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t *pos) 486ssize_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
500EXPORT_SYMBOL(__kernel_write); 509EXPORT_SYMBOL(__kernel_write);
501 510
511ssize_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}
525EXPORT_SYMBOL(kernel_write);
526
502ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos) 527ssize_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
530EXPORT_SYMBOL(vfs_write);
531
532static inline loff_t file_pos_read(struct file *file) 555static 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}
962EXPORT_SYMBOL(vfs_readv);
963 985
964ssize_t vfs_writev(struct file *file, const struct iovec __user *vec, 986static 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}
981EXPORT_SYMBOL(vfs_writev);
982 1003
983static ssize_t do_readv(unsigned long fd, const struct iovec __user *vec, 1004static 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)