diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-03 15:06:43 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-11 22:29:37 -0400 |
commit | 493c84c0722ac991a96df2fd6c7798b2126b626c (patch) | |
tree | 5c7166cf90d8e9afa5be2f48b174a9da6fd14d03 | |
parent | c48722c6364ec94738afa42e48b1e1f8f20e3192 (diff) |
new helper: __vfs_write()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | fs/read_write.c | 28 | ||||
-rw-r--r-- | include/linux/fs.h | 1 |
2 files changed, 17 insertions, 12 deletions
diff --git a/fs/read_write.c b/fs/read_write.c index 69128b378646..9d7952a6829b 100644 --- a/fs/read_write.c +++ b/fs/read_write.c | |||
@@ -527,6 +527,20 @@ ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, lo | |||
527 | 527 | ||
528 | EXPORT_SYMBOL(new_sync_write); | 528 | EXPORT_SYMBOL(new_sync_write); |
529 | 529 | ||
530 | ssize_t __vfs_write(struct file *file, const char __user *p, size_t count, | ||
531 | loff_t *pos) | ||
532 | { | ||
533 | if (file->f_op->write) | ||
534 | return file->f_op->write(file, p, count, pos); | ||
535 | else if (file->f_op->aio_write) | ||
536 | return do_sync_write(file, p, count, pos); | ||
537 | else if (file->f_op->write_iter) | ||
538 | return new_sync_write(file, p, count, pos); | ||
539 | else | ||
540 | return -EINVAL; | ||
541 | } | ||
542 | EXPORT_SYMBOL(__vfs_write); | ||
543 | |||
530 | ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t *pos) | 544 | ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t *pos) |
531 | { | 545 | { |
532 | mm_segment_t old_fs; | 546 | mm_segment_t old_fs; |
@@ -541,12 +555,7 @@ ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t | |||
541 | p = (__force const char __user *)buf; | 555 | p = (__force const char __user *)buf; |
542 | if (count > MAX_RW_COUNT) | 556 | if (count > MAX_RW_COUNT) |
543 | count = MAX_RW_COUNT; | 557 | count = MAX_RW_COUNT; |
544 | if (file->f_op->write) | 558 | ret = __vfs_write(file, p, count, pos); |
545 | ret = file->f_op->write(file, p, count, pos); | ||
546 | else if (file->f_op->aio_write) | ||
547 | ret = do_sync_write(file, p, count, pos); | ||
548 | else | ||
549 | ret = new_sync_write(file, p, count, pos); | ||
550 | set_fs(old_fs); | 559 | set_fs(old_fs); |
551 | if (ret > 0) { | 560 | if (ret > 0) { |
552 | fsnotify_modify(file); | 561 | fsnotify_modify(file); |
@@ -573,12 +582,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_ | |||
573 | if (ret >= 0) { | 582 | if (ret >= 0) { |
574 | count = ret; | 583 | count = ret; |
575 | file_start_write(file); | 584 | file_start_write(file); |
576 | if (file->f_op->write) | 585 | ret = __vfs_write(file, buf, count, pos); |
577 | ret = file->f_op->write(file, buf, count, pos); | ||
578 | else if (file->f_op->aio_write) | ||
579 | ret = do_sync_write(file, buf, count, pos); | ||
580 | else | ||
581 | ret = new_sync_write(file, buf, count, pos); | ||
582 | if (ret > 0) { | 586 | if (ret > 0) { |
583 | fsnotify_modify(file); | 587 | fsnotify_modify(file); |
584 | add_wchar(current, ret); | 588 | add_wchar(current, ret); |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 20fe15fe236d..4a1cb00bd805 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -1639,6 +1639,7 @@ ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, | |||
1639 | struct iovec **ret_pointer); | 1639 | struct iovec **ret_pointer); |
1640 | 1640 | ||
1641 | extern ssize_t __vfs_read(struct file *, char __user *, size_t, loff_t *); | 1641 | extern ssize_t __vfs_read(struct file *, char __user *, size_t, loff_t *); |
1642 | extern ssize_t __vfs_write(struct file *, const char __user *, size_t, loff_t *); | ||
1642 | extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *); | 1643 | extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *); |
1643 | extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *); | 1644 | extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *); |
1644 | extern ssize_t vfs_readv(struct file *, const struct iovec __user *, | 1645 | extern ssize_t vfs_readv(struct file *, const struct iovec __user *, |