f2fs: be aware of extent beyond EOF in fiemap
authorChao Yu <yuchao0@huawei.com>
Tue, 11 Oct 2016 14:57:04 +0000 (22:57 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 23 Nov 2016 20:10:54 +0000 (12:10 -0800)
f2fs can support fallocating blocks beyond file size without changing the
size, but ->fiemap of f2fs was restricted and can't detect these extents
fallocated past EOF, now relieve the restriction.

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/data.c

index 7fb081516f5f44ea49e5af93dbce009a4f095c2e..b544e0b2e7e5174a1bfadd4f74ffad76a9217427 100644 (file)
@@ -886,7 +886,6 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
        struct buffer_head map_bh;
        sector_t start_blk, last_blk;
        pgoff_t next_pgofs;
-       loff_t isize;
        u64 logical = 0, phys = 0, size = 0;
        u32 flags = 0;
        int ret = 0;
@@ -903,13 +902,6 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
 
        inode_lock(inode);
 
-       isize = i_size_read(inode);
-       if (start >= isize)
-               goto out;
-
-       if (start + len > isize)
-               len = isize - start;
-
        if (logical_to_blk(inode, len) == 0)
                len = blk_to_logical(inode, 1);
 
@@ -928,13 +920,11 @@ next:
        /* HOLE */
        if (!buffer_mapped(&map_bh)) {
                start_blk = next_pgofs;
-               /* Go through holes util pass the EOF */
-               if (blk_to_logical(inode, start_blk) < isize)
+
+               if (blk_to_logical(inode, start_blk) < blk_to_logical(inode,
+                                       F2FS_I_SB(inode)->max_file_blocks))
                        goto prep_next;
-               /* Found a hole beyond isize means no more extents.
-                * Note that the premise is that filesystems don't
-                * punch holes beyond isize and keep size unchanged.
-                */
+
                flags |= FIEMAP_EXTENT_LAST;
        }