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)
{
.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 */