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; | 	ret = -EXDEV; | ||||||
| 	if (src_file.file->f_path.mnt != dst_file->f_path.mnt) | 	if (src_file.file->f_path.mnt != dst_file->f_path.mnt) | ||||||
| 		goto fdput; | 		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: | ||||||
| 	fdput(src_file); | 	fdput(src_file); | ||||||
| 	return ret; | 	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, | __be32 nfsd4_clone_file_range(struct file *src, u64 src_pos, struct file *dst, | ||||||
| 		u64 dst_pos, u64 count) | 		u64 dst_pos, u64 count) | ||||||
| { | { | ||||||
| 	return nfserrno(vfs_clone_file_range(src, src_pos, dst, dst_pos, | 	return nfserrno(do_clone_file_range(src, src_pos, dst, dst_pos, count)); | ||||||
| 			count)); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ssize_t nfsd_copy_file_range(struct file *src, u64 src_pos, struct file *dst, | 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)) | 	if (pos_in + len > i_size_read(inode_in)) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
| 	sb_start_write(inode_out->i_sb); |  | ||||||
| 
 |  | ||||||
| 	ret = file_in->f_op->clone_file_range(file_in, pos_in, | 	ret = file_in->f_op->clone_file_range(file_in, pos_in, | ||||||
| 			file_out, pos_out, len); | 			file_out, pos_out, len); | ||||||
| 	if (!ret) { | 	if (!ret) { | ||||||
|  | @ -1696,7 +1694,6 @@ int vfs_clone_file_range(struct file *file_in, loff_t pos_in, | ||||||
| 		fsnotify_modify(file_out); | 		fsnotify_modify(file_out); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	sb_end_write(inode_out->i_sb); |  | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(vfs_clone_file_range); | 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, | extern int vfs_dedupe_file_range(struct file *file, | ||||||
| 				 struct file_dedupe_range *same); | 				 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 super_operations { | ||||||
|    	struct inode *(*alloc_inode)(struct super_block *sb); |    	struct inode *(*alloc_inode)(struct super_block *sb); | ||||||
| 	void (*destroy_inode)(struct inode *); | 	void (*destroy_inode)(struct inode *); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Amir Goldstein
						Amir Goldstein