From b2c5db15cfcbca68e8c2b2b13bb4dd3c11c530a0 Mon Sep 17 00:00:00 2001 From: Anuraag Reddy Patllollu Date: Wed, 4 Dec 2024 03:16:36 -0500 Subject: [PATCH] wrapfs_file: Add wrapfs wrappers for splice_read and splice_write --- fs/wrapfs/file.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/fs/wrapfs/file.c b/fs/wrapfs/file.c index 2f7a6ef9d106..a81d97495f10 100644 --- a/fs/wrapfs/file.c +++ b/fs/wrapfs/file.c @@ -41,6 +41,48 @@ static ssize_t wrapfs_copy_file_range(struct file *file_in, loff_t pos_in, return err; } +static ssize_t wrapfs_generic_file_splice_read(struct file *file, loff_t *pos, + struct pipe_inode_info *info, + size_t len, unsigned int flags) +{ + int err; + struct file *lower_file; + struct dentry *dentry; + + dentry = file->f_path.dentry; + lower_file = wrapfs_lower_file(file); + err = generic_file_splice_read(lower_file, pos, info, len, flags); + + if (err >= 0) { + fsstack_copy_attr_atime(d_inode(dentry), + file_inode(lower_file)); + } + + return err; +} + +static ssize_t wrapfs_iter_file_splice_write(struct pipe_inode_info *info, + struct file *file, loff_t *pos, + size_t len, unsigned int flags) +{ + int err; + struct file *lower_file; + struct dentry *dentry; + + dentry = file->f_path.dentry; + lower_file = wrapfs_lower_file(file); + err = iter_file_splice_write(info, lower_file, pos, len, flags); + + if (err >= 0) { + fsstack_copy_inode_size(d_inode(dentry), + file_inode(lower_file)); + fsstack_copy_attr_times(d_inode(dentry), + file_inode(lower_file)); + } + + return err; +} + static ssize_t wrapfs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { @@ -414,8 +456,8 @@ const struct file_operations wrapfs_main_fops = { .fasync = wrapfs_fasync, .read_iter = wrapfs_read_iter, .write_iter = wrapfs_write_iter, - .splice_read = generic_file_splice_read, - .splice_write = iter_file_splice_write, + .splice_read = wrapfs_generic_file_splice_read, + .splice_write = wrapfs_iter_file_splice_write, }; /* trimmed directory options */ -- 2.43.0