diff options
Diffstat (limited to 'fs/coda/file.c')
| -rw-r--r-- | fs/coda/file.c | 29 | 
1 files changed, 28 insertions, 1 deletions
diff --git a/fs/coda/file.c b/fs/coda/file.c index 3f3c81e6b1ab..12b26bd13564 100644 --- a/fs/coda/file.c +++ b/fs/coda/file.c @@ -23,6 +23,7 @@  #include <linux/slab.h>  #include <linux/uaccess.h>  #include <linux/uio.h> +#include <linux/splice.h>  #include <linux/coda.h>  #include "coda_psdev.h" @@ -94,6 +95,32 @@ finish_write:  	return ret;  } +static ssize_t +coda_file_splice_read(struct file *coda_file, loff_t *ppos, +		      struct pipe_inode_info *pipe, +		      size_t len, unsigned int flags) +{ +	struct inode *coda_inode = file_inode(coda_file); +	struct coda_file_info *cfi = coda_ftoc(coda_file); +	struct file *in = cfi->cfi_container; +	loff_t ki_pos = *ppos; +	ssize_t ret; + +	ret = venus_access_intent(coda_inode->i_sb, coda_i2f(coda_inode), +				  &cfi->cfi_access_intent, +				  len, ki_pos, CODA_ACCESS_TYPE_READ); +	if (ret) +		goto finish_read; + +	ret = vfs_splice_read(in, ppos, pipe, len, flags); + +finish_read: +	venus_access_intent(coda_inode->i_sb, coda_i2f(coda_inode), +			    &cfi->cfi_access_intent, +			    len, ki_pos, CODA_ACCESS_TYPE_READ_FINISH); +	return ret; +} +  static void  coda_vm_open(struct vm_area_struct *vma)  { @@ -302,5 +329,5 @@ const struct file_operations coda_file_operations = {  	.open		= coda_open,  	.release	= coda_release,  	.fsync		= coda_fsync, -	.splice_read	= generic_file_splice_read, +	.splice_read	= coda_file_splice_read,  };  |