ext2: use iomap_fiemap to implement ->fiemap
authorChristoph Hellwig <hch@lst.de>
Tue, 20 Jul 2021 13:33:39 +0000 (15:33 +0200)
committerJan Kara <jack@suse.cz>
Tue, 27 Jul 2021 09:00:32 +0000 (11:00 +0200)
Switch from generic_block_fiemap to use the iomap version.  The only
interesting part is that ext2_get_blocks gets confused when being
asked for overly long ranges, so copy over the limit to the inode
size from generic_block_fiemap into ext2_fiemap.

Link: https://lore.kernel.org/r/20210720133341.405438-3-hch@lst.de
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/ext2/Kconfig
fs/ext2/inode.c

index 54eec918562756007916f7e4182b90a204184c5e..1248ff4ef56254dd1fbe04e3bfd1d66ded0b3ba1 100644 (file)
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 config EXT2_FS
        tristate "Second extended fs support"
+       select FS_IOMAP
        help
          Ext2 is a standard Linux file system for hard disks.
 
index 3e9a04770f49f9e9aed5bc6aa4ae12f6916099d1..04f0def0f5ebe8b8c63a5ef31438e6c66bf4a7c5 100644 (file)
@@ -855,8 +855,14 @@ const struct iomap_ops ext2_iomap_ops = {
 int ext2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
                u64 start, u64 len)
 {
-       return generic_block_fiemap(inode, fieinfo, start, len,
-                                   ext2_get_block);
+       int ret;
+
+       inode_lock(inode);
+       len = min_t(u64, len, i_size_read(inode));
+       ret = iomap_fiemap(inode, fieinfo, start, len, &ext2_iomap_ops);
+       inode_unlock(inode);
+
+       return ret;
 }
 
 static int ext2_writepage(struct page *page, struct writeback_control *wbc)