f2fs: fix to use per-inode maxbytes in f2fs_fiemap
authorChengguang Xu <cgxu519@mykernel.net>
Tue, 9 Mar 2021 05:21:18 +0000 (13:21 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Fri, 26 Mar 2021 01:20:50 +0000 (18:20 -0700)
F2FS inode may have different max size,
so change to use per-inode maxbytes.

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

index 0e749cf60e1159785eddf64064b9f2214c6c608e..4bf7e79c8342083ddbe79be970a325cb192f9b2a 100644 (file)
@@ -1837,6 +1837,7 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
        int ret = 0;
        bool compr_cluster = false;
        unsigned int cluster_size = F2FS_I(inode)->i_cluster_size;
+       loff_t maxbytes;
 
        if (fieinfo->fi_flags & FIEMAP_FLAG_CACHE) {
                ret = f2fs_precache_extents(inode);
@@ -1850,6 +1851,15 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
 
        inode_lock(inode);
 
+       maxbytes = max_file_blocks(inode) << F2FS_BLKSIZE_BITS;
+       if (start > maxbytes) {
+               ret = -EFBIG;
+               goto out;
+       }
+
+       if (len > maxbytes || (maxbytes - len) < start)
+               len = maxbytes - start;
+
        if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR) {
                ret = f2fs_xattr_fiemap(inode, fieinfo);
                goto out;