f2fs: Provide a splice-read wrapper
[linux-block.git] / fs / overlayfs / file.c
index 7c04f033aadd75d36d078d3ca1d1669867605a2b..86197882ff35128424dd0ddd2d26058d68100847 100644 (file)
@@ -419,6 +419,27 @@ out_unlock:
        return ret;
 }
 
+static ssize_t ovl_splice_read(struct file *in, loff_t *ppos,
+                              struct pipe_inode_info *pipe, size_t len,
+                              unsigned int flags)
+{
+       const struct cred *old_cred;
+       struct fd real;
+       ssize_t ret;
+
+       ret = ovl_real_fdget(in, &real);
+       if (ret)
+               return ret;
+
+       old_cred = ovl_override_creds(file_inode(in)->i_sb);
+       ret = vfs_splice_read(real.file, ppos, pipe, len, flags);
+       revert_creds(old_cred);
+       ovl_file_accessed(in);
+
+       fdput(real);
+       return ret;
+}
+
 /*
  * Calling iter_file_splice_write() directly from overlay's f_op may deadlock
  * due to lock order inversion between pipe->mutex in iter_file_splice_write()
@@ -695,7 +716,7 @@ const struct file_operations ovl_file_operations = {
        .fallocate      = ovl_fallocate,
        .fadvise        = ovl_fadvise,
        .flush          = ovl_flush,
-       .splice_read    = generic_file_splice_read,
+       .splice_read    = ovl_splice_read,
        .splice_write   = ovl_splice_write,
 
        .copy_file_range        = ovl_copy_file_range,