wrapfs_file: Add wrapfs wrappers for splice_read and splice_write wrapfs-dev
authorAnuraag Reddy Patllollu <apatllollu@cs.stonybrook.edu>
Wed, 4 Dec 2024 08:16:36 +0000 (03:16 -0500)
committerAnuraag Reddy Patllollu <apatllollu@cs.stonybrook.edu>
Wed, 4 Dec 2024 08:16:36 +0000 (03:16 -0500)
fs/wrapfs/file.c

index 2f7a6ef9d1066cb19e5194e8f17fea441131f5a0..a81d97495f10fd994af5a2ecac1a6c52d5a7820b 100644 (file)
@@ -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 */