mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 08:38:45 +02:00 
			
		
		
		
	fsdax: dedupe: iter two files at the same time
The iomap_iter() on a range of one file may loop more than once. In this case, the inner dst_iter can update its iomap but the outer src_iter can't. This may cause the wrong remapping in filesystem. Let them called at the same time. Link: https://lkml.kernel.org/r/1669908701-93-1-git-send-email-ruansy.fnst@fujitsu.com Signed-off-by: Shiyang Ruan <ruansy.fnst@fujitsu.com> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Cc: Alistair Popple <apopple@nvidia.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Dave Chinner <david@fromorbit.com> Cc: Jason Gunthorpe <jgg@nvidia.com> Cc: John Hubbard <jhubbard@nvidia.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									c6f0b395b2
								
							
						
					
					
						commit
						0e79e3736d
					
				
					 1 changed files with 8 additions and 8 deletions
				
			
		
							
								
								
									
										16
									
								
								fs/dax.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								fs/dax.c
									
									
									
									
									
								
							|  | @ -1965,15 +1965,15 @@ int dax_dedupe_file_range_compare(struct inode *src, loff_t srcoff, | ||||||
| 		.len		= len, | 		.len		= len, | ||||||
| 		.flags		= IOMAP_DAX, | 		.flags		= IOMAP_DAX, | ||||||
| 	}; | 	}; | ||||||
| 	int ret; | 	int ret, compared = 0; | ||||||
| 
 | 
 | ||||||
| 	while ((ret = iomap_iter(&src_iter, ops)) > 0) { | 	while ((ret = iomap_iter(&src_iter, ops)) > 0 && | ||||||
| 		while ((ret = iomap_iter(&dst_iter, ops)) > 0) { | 	       (ret = iomap_iter(&dst_iter, ops)) > 0) { | ||||||
| 			dst_iter.processed = dax_range_compare_iter(&src_iter, | 		compared = dax_range_compare_iter(&src_iter, &dst_iter, len, | ||||||
| 						&dst_iter, len, same); | 						  same); | ||||||
| 		} | 		if (compared < 0) | ||||||
| 		if (ret <= 0) | 			return ret; | ||||||
| 			src_iter.processed = ret; | 		src_iter.processed = dst_iter.processed = compared; | ||||||
| 	} | 	} | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Shiyang Ruan
						Shiyang Ruan