iomap: add an iomap-based bmap implementation
This adds a simple iomap-based implementation of the legacy ->bmap interface. Note that we can't easily add checks for rt or reflink files, so these will have to remain in the callers. This interface just needs to die.. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
		
							parent
							
								
									57fc505d11
								
							
						
					
					
						commit
						89eb1906a9
					
				
							
								
								
									
										34
									
								
								fs/iomap.c
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								fs/iomap.c
									
									
									
									
									
								
							@ -1307,3 +1307,37 @@ int iomap_swapfile_activate(struct swap_info_struct *sis,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL_GPL(iomap_swapfile_activate);
 | 
					EXPORT_SYMBOL_GPL(iomap_swapfile_activate);
 | 
				
			||||||
#endif /* CONFIG_SWAP */
 | 
					#endif /* CONFIG_SWAP */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static loff_t
 | 
				
			||||||
 | 
					iomap_bmap_actor(struct inode *inode, loff_t pos, loff_t length,
 | 
				
			||||||
 | 
							void *data, struct iomap *iomap)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						sector_t *bno = data, addr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (iomap->type == IOMAP_MAPPED) {
 | 
				
			||||||
 | 
							addr = (pos - iomap->offset + iomap->addr) >> inode->i_blkbits;
 | 
				
			||||||
 | 
							if (addr > INT_MAX)
 | 
				
			||||||
 | 
								WARN(1, "would truncate bmap result\n");
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								*bno = addr;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* legacy ->bmap interface.  0 is the error return (!) */
 | 
				
			||||||
 | 
					sector_t
 | 
				
			||||||
 | 
					iomap_bmap(struct address_space *mapping, sector_t bno,
 | 
				
			||||||
 | 
							const struct iomap_ops *ops)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct inode *inode = mapping->host;
 | 
				
			||||||
 | 
						loff_t pos = bno >> inode->i_blkbits;
 | 
				
			||||||
 | 
						unsigned blocksize = i_blocksize(inode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (filemap_write_and_wait(mapping))
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bno = 0;
 | 
				
			||||||
 | 
						iomap_apply(inode, pos, blocksize, 0, ops, &bno, iomap_bmap_actor);
 | 
				
			||||||
 | 
						return bno;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EXPORT_SYMBOL_GPL(iomap_bmap);
 | 
				
			||||||
 | 
				
			|||||||
@ -4,6 +4,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <linux/types.h>
 | 
					#include <linux/types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct address_space;
 | 
				
			||||||
struct fiemap_extent_info;
 | 
					struct fiemap_extent_info;
 | 
				
			||||||
struct inode;
 | 
					struct inode;
 | 
				
			||||||
struct iov_iter;
 | 
					struct iov_iter;
 | 
				
			||||||
@ -100,6 +101,8 @@ loff_t iomap_seek_hole(struct inode *inode, loff_t offset,
 | 
				
			|||||||
		const struct iomap_ops *ops);
 | 
							const struct iomap_ops *ops);
 | 
				
			||||||
loff_t iomap_seek_data(struct inode *inode, loff_t offset,
 | 
					loff_t iomap_seek_data(struct inode *inode, loff_t offset,
 | 
				
			||||||
		const struct iomap_ops *ops);
 | 
							const struct iomap_ops *ops);
 | 
				
			||||||
 | 
					sector_t iomap_bmap(struct address_space *mapping, sector_t bno,
 | 
				
			||||||
 | 
							const struct iomap_ops *ops);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Flags for direct I/O ->end_io:
 | 
					 * Flags for direct I/O ->end_io:
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user