mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	ovl: simplify file splice
generic_file_splice_read() and iter_file_splice_write() will call back into f_op->iter_read() and f_op->iter_write() respectively. These already do the real file lookup and cred override. So the code in ovl_splice_read() and ovl_splice_write() is redundant. In addition the ovl_file_accessed() call in ovl_splice_write() is incorrect, though probably harmless. Fix by calling generic_file_splice_read() and iter_file_splice_write() directly. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
This commit is contained in:
		
							parent
							
								
									89bdfaf93d
								
							
						
					
					
						commit
						82a763e61e
					
				
					 1 changed files with 2 additions and 44 deletions
				
			
		| 
						 | 
				
			
			@ -397,48 +397,6 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter)
 | 
			
		|||
	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)
 | 
			
		||||
{
 | 
			
		||||
	ssize_t ret;
 | 
			
		||||
	struct fd real;
 | 
			
		||||
	const struct cred *old_cred;
 | 
			
		||||
 | 
			
		||||
	ret = ovl_real_fdget(in, &real);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		return ret;
 | 
			
		||||
 | 
			
		||||
	old_cred = ovl_override_creds(file_inode(in)->i_sb);
 | 
			
		||||
	ret = generic_file_splice_read(real.file, ppos, pipe, len, flags);
 | 
			
		||||
	revert_creds(old_cred);
 | 
			
		||||
 | 
			
		||||
	ovl_file_accessed(in);
 | 
			
		||||
	fdput(real);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ssize_t
 | 
			
		||||
ovl_splice_write(struct pipe_inode_info *pipe, struct file *out,
 | 
			
		||||
			  loff_t *ppos, size_t len, unsigned int flags)
 | 
			
		||||
{
 | 
			
		||||
	struct fd real;
 | 
			
		||||
	const struct cred *old_cred;
 | 
			
		||||
	ssize_t ret;
 | 
			
		||||
 | 
			
		||||
	ret = ovl_real_fdget(out, &real);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		return ret;
 | 
			
		||||
 | 
			
		||||
	old_cred = ovl_override_creds(file_inode(out)->i_sb);
 | 
			
		||||
	ret = iter_file_splice_write(pipe, real.file, ppos, len, flags);
 | 
			
		||||
	revert_creds(old_cred);
 | 
			
		||||
 | 
			
		||||
	ovl_file_accessed(out);
 | 
			
		||||
	fdput(real);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int ovl_fsync(struct file *file, loff_t start, loff_t end, int datasync)
 | 
			
		||||
{
 | 
			
		||||
	struct fd real;
 | 
			
		||||
| 
						 | 
				
			
			@ -746,8 +704,8 @@ const struct file_operations ovl_file_operations = {
 | 
			
		|||
#ifdef CONFIG_COMPAT
 | 
			
		||||
	.compat_ioctl	= ovl_compat_ioctl,
 | 
			
		||||
#endif
 | 
			
		||||
	.splice_read    = ovl_splice_read,
 | 
			
		||||
	.splice_write   = ovl_splice_write,
 | 
			
		||||
	.splice_read    = generic_file_splice_read,
 | 
			
		||||
	.splice_write   = iter_file_splice_write,
 | 
			
		||||
 | 
			
		||||
	.copy_file_range	= ovl_copy_file_range,
 | 
			
		||||
	.remap_file_range	= ovl_remap_file_range,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue