diff options
author | Darrick J. Wong <darrick.wong@oracle.com> | 2018-10-29 19:41:49 -0400 |
---|---|---|
committer | Dave Chinner <david@fromorbit.com> | 2018-10-29 19:41:49 -0400 |
commit | 42ec3d4c02187a18e27ff94b409ec27234bf2ffd (patch) | |
tree | c9db04db8187c370718a43e6067af0e5aa944500 /include/linux/fs.h | |
parent | 8dde90bca6fca3736ea20109654bcf6dcf2ecf1d (diff) |
vfs: make remap_file_range functions take and return bytes completed
Change the remap_file_range functions to take a number of bytes to
operate upon and return the number of bytes they operated on. This is a
requirement for allowing fs implementations to return short clone/dedupe
results to the user, which will enable us to obey resource limits in a
graceful manner.
A subsequent patch will enable copy_file_range to signal to the
->clone_file_range implementation that it can handle a short length,
which will be returned in the function's return value. For now the
short return is not implemented anywhere so the behavior won't change --
either copy_file_range manages to clone the entire range or it tries an
alternative.
Neither clone ioctl can take advantage of this, alas.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
Diffstat (limited to 'include/linux/fs.h')
-rw-r--r-- | include/linux/fs.h | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/include/linux/fs.h b/include/linux/fs.h index c5435ca81132..c72d8c3c065a 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -1777,9 +1777,9 @@ struct file_operations { | |||
1777 | #endif | 1777 | #endif |
1778 | ssize_t (*copy_file_range)(struct file *, loff_t, struct file *, | 1778 | ssize_t (*copy_file_range)(struct file *, loff_t, struct file *, |
1779 | loff_t, size_t, unsigned int); | 1779 | loff_t, size_t, unsigned int); |
1780 | int (*remap_file_range)(struct file *file_in, loff_t pos_in, | 1780 | loff_t (*remap_file_range)(struct file *file_in, loff_t pos_in, |
1781 | struct file *file_out, loff_t pos_out, | 1781 | struct file *file_out, loff_t pos_out, |
1782 | u64 len, unsigned int remap_flags); | 1782 | loff_t len, unsigned int remap_flags); |
1783 | int (*fadvise)(struct file *, loff_t, loff_t, int); | 1783 | int (*fadvise)(struct file *, loff_t, loff_t, int); |
1784 | } __randomize_layout; | 1784 | } __randomize_layout; |
1785 | 1785 | ||
@@ -1844,19 +1844,22 @@ extern ssize_t vfs_copy_file_range(struct file *, loff_t , struct file *, | |||
1844 | loff_t, size_t, unsigned int); | 1844 | loff_t, size_t, unsigned int); |
1845 | extern int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in, | 1845 | extern int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in, |
1846 | struct file *file_out, loff_t pos_out, | 1846 | struct file *file_out, loff_t pos_out, |
1847 | u64 *count, unsigned int remap_flags); | 1847 | loff_t *count, |
1848 | extern int do_clone_file_range(struct file *file_in, loff_t pos_in, | 1848 | unsigned int remap_flags); |
1849 | struct file *file_out, loff_t pos_out, u64 len); | 1849 | extern loff_t do_clone_file_range(struct file *file_in, loff_t pos_in, |
1850 | extern int vfs_clone_file_range(struct file *file_in, loff_t pos_in, | 1850 | struct file *file_out, loff_t pos_out, |
1851 | struct file *file_out, loff_t pos_out, u64 len); | 1851 | loff_t len); |
1852 | extern loff_t vfs_clone_file_range(struct file *file_in, loff_t pos_in, | ||
1853 | struct file *file_out, loff_t pos_out, | ||
1854 | loff_t len); | ||
1852 | extern int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff, | 1855 | extern int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff, |
1853 | struct inode *dest, loff_t destoff, | 1856 | struct inode *dest, loff_t destoff, |
1854 | loff_t len, bool *is_same); | 1857 | loff_t len, bool *is_same); |
1855 | extern int vfs_dedupe_file_range(struct file *file, | 1858 | extern int vfs_dedupe_file_range(struct file *file, |
1856 | struct file_dedupe_range *same); | 1859 | struct file_dedupe_range *same); |
1857 | extern int vfs_dedupe_file_range_one(struct file *src_file, loff_t src_pos, | 1860 | extern loff_t vfs_dedupe_file_range_one(struct file *src_file, loff_t src_pos, |
1858 | struct file *dst_file, loff_t dst_pos, | 1861 | struct file *dst_file, loff_t dst_pos, |
1859 | u64 len); | 1862 | loff_t len); |
1860 | 1863 | ||
1861 | 1864 | ||
1862 | struct super_operations { | 1865 | struct super_operations { |
@@ -2986,7 +2989,7 @@ extern int generic_file_readonly_mmap(struct file *, struct vm_area_struct *); | |||
2986 | extern ssize_t generic_write_checks(struct kiocb *, struct iov_iter *); | 2989 | extern ssize_t generic_write_checks(struct kiocb *, struct iov_iter *); |
2987 | extern int generic_remap_checks(struct file *file_in, loff_t pos_in, | 2990 | extern int generic_remap_checks(struct file *file_in, loff_t pos_in, |
2988 | struct file *file_out, loff_t pos_out, | 2991 | struct file *file_out, loff_t pos_out, |
2989 | uint64_t *count, unsigned int remap_flags); | 2992 | loff_t *count, unsigned int remap_flags); |
2990 | extern ssize_t generic_file_read_iter(struct kiocb *, struct iov_iter *); | 2993 | extern ssize_t generic_file_read_iter(struct kiocb *, struct iov_iter *); |
2991 | extern ssize_t __generic_file_write_iter(struct kiocb *, struct iov_iter *); | 2994 | extern ssize_t __generic_file_write_iter(struct kiocb *, struct iov_iter *); |
2992 | extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *); | 2995 | extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *); |