mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-01 00:58:39 +02:00 
			
		
		
		
	vfs: call vfs_clone_file_range() under freeze protection
Move sb_start_write()/sb_end_write() out of the vfs helper and up into the ioctl handler. Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
This commit is contained in:
		
							parent
							
								
									913b86e92e
								
							
						
					
					
						commit
						031a072a0b
					
				
					 4 changed files with 15 additions and 6 deletions
				
			
		|  | @ -226,7 +226,7 @@ static long ioctl_file_clone(struct file *dst_file, unsigned long srcfd, | |||
| 	ret = -EXDEV; | ||||
| 	if (src_file.file->f_path.mnt != dst_file->f_path.mnt) | ||||
| 		goto fdput; | ||||
| 	ret = vfs_clone_file_range(src_file.file, off, dst_file, destoff, olen); | ||||
| 	ret = do_clone_file_range(src_file.file, off, dst_file, destoff, olen); | ||||
| fdput: | ||||
| 	fdput(src_file); | ||||
| 	return ret; | ||||
|  |  | |||
|  | @ -509,8 +509,7 @@ __be32 nfsd4_set_nfs4_label(struct svc_rqst *rqstp, struct svc_fh *fhp, | |||
| __be32 nfsd4_clone_file_range(struct file *src, u64 src_pos, struct file *dst, | ||||
| 		u64 dst_pos, u64 count) | ||||
| { | ||||
| 	return nfserrno(vfs_clone_file_range(src, src_pos, dst, dst_pos, | ||||
| 			count)); | ||||
| 	return nfserrno(do_clone_file_range(src, src_pos, dst, dst_pos, count)); | ||||
| } | ||||
| 
 | ||||
| ssize_t nfsd_copy_file_range(struct file *src, u64 src_pos, struct file *dst, | ||||
|  |  | |||
|  | @ -1687,8 +1687,6 @@ int vfs_clone_file_range(struct file *file_in, loff_t pos_in, | |||
| 	if (pos_in + len > i_size_read(inode_in)) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	sb_start_write(inode_out->i_sb); | ||||
| 
 | ||||
| 	ret = file_in->f_op->clone_file_range(file_in, pos_in, | ||||
| 			file_out, pos_out, len); | ||||
| 	if (!ret) { | ||||
|  | @ -1696,7 +1694,6 @@ int vfs_clone_file_range(struct file *file_in, loff_t pos_in, | |||
| 		fsnotify_modify(file_out); | ||||
| 	} | ||||
| 
 | ||||
| 	sb_end_write(inode_out->i_sb); | ||||
| 	return ret; | ||||
| } | ||||
| EXPORT_SYMBOL(vfs_clone_file_range); | ||||
|  |  | |||
|  | @ -1783,6 +1783,19 @@ extern int vfs_clone_file_range(struct file *file_in, loff_t pos_in, | |||
| extern int vfs_dedupe_file_range(struct file *file, | ||||
| 				 struct file_dedupe_range *same); | ||||
| 
 | ||||
| static inline int do_clone_file_range(struct file *file_in, loff_t pos_in, | ||||
| 				      struct file *file_out, loff_t pos_out, | ||||
| 				      u64 len) | ||||
| { | ||||
| 	int ret; | ||||
| 
 | ||||
| 	sb_start_write(file_inode(file_out)->i_sb); | ||||
| 	ret = vfs_clone_file_range(file_in, pos_in, file_out, pos_out, len); | ||||
| 	sb_end_write(file_inode(file_out)->i_sb); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| struct super_operations { | ||||
|    	struct inode *(*alloc_inode)(struct super_block *sb); | ||||
| 	void (*destroy_inode)(struct inode *); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Amir Goldstein
						Amir Goldstein