On Fri, Oct 5, 2018 at 3:46 AM Darrick J. Wong <darrick.wong@xxxxxxxxxx> wrote:
>
> From: Darrick J. Wong <darrick.wong@xxxxxxxxxx>
>
> Pass operational flags to the per-filesystem clone and dedupe
> implementations. This enables the vfs to signal when it can deal with
> short clone and short dedupe operations.
>
> Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx>
> ---
[...]
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -1761,7 +1761,7 @@ struct file_operations {
> loff_t, size_t, unsigned int);
> s64 (*clone_file_range)(struct file *file_in, loff_t pos_in,
> struct file *file_out, loff_t pos_out,
> - u64 count);
> + u64 count, unsigned int flags);
> s64 (*dedupe_file_range)(struct file *file_in, loff_t pos_in,
> struct file *file_out, loff_t pos_out,
> u64 count);
> @@ -1827,9 +1827,15 @@ extern ssize_t vfs_readv(struct file *, const struct iovec __user *,
> unsigned long, loff_t *, rwf_t);
> extern ssize_t vfs_copy_file_range(struct file *, loff_t , struct file *,
> loff_t, size_t, unsigned int);
> +/* Caller can handle a shortened operation. */
> +#define CLONERANGE_SHORT (1 << 0)
> +/* End operation at the source file's EOF. */
> +#define CLONERANGE_EOF (1 << 1)
> +/* Operation is actually dedupe, not clone. */
> +#define CLONERANGE_DEDUPE (1 << 2)
That's cool. But you know what's going to be the next step, right?
Merging the 3 file operation interfaces into a single one.
copy_file_range() already has the flags arg for future extensions
and as you wrote somewhere, clone is really an optimized copy.
ovl_copyfile() already does that internally.
So the only take away for this patch series, please use constant
names COPYRANGE_* and also explicitly define:
/* Operation is actually clone, not copy. */
#define COPYRANGE_CLONE (1 << 2)
/* Operation is actually dedupe, not copy. */
#define COPYRANGE_DEDUPE (1 << 3)
Thanks,
Amir.