summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorDaeho Jeong <daehojeong@google.com>2020-08-31 02:24:01 +0200
committerJaegeuk Kim <jaegeuk@kernel.org>2020-09-11 20:11:25 +0200
commit4eda1682cd0bf4a300d0b4e3ce2187dd8fccafde (patch)
treeb25b02f457c89280bd9b5996c465693f7758b10d /fs
parentf2fs: check position in move range ioctl (diff)
downloadlinux-4eda1682cd0bf4a300d0b4e3ce2187dd8fccafde.tar.xz
linux-4eda1682cd0bf4a300d0b4e3ce2187dd8fccafde.zip
f2fs: add block address limit check to compressed file
Need to add block address range check to compressed file case and avoid calling get_data_block_bmap() for compressed file. Signed-off-by: Daeho Jeong <daehojeong@google.com> Reviewed-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs')
-rw-r--r--fs/f2fs/data.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index a490e1b21930..c31ec408bd4f 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -1803,10 +1803,6 @@ static int get_data_block_dio(struct inode *inode, sector_t iblock,
static int get_data_block_bmap(struct inode *inode, sector_t iblock,
struct buffer_head *bh_result, int create)
{
- /* Block number less than F2FS MAX BLOCKS */
- if (unlikely(iblock >= F2FS_I_SB(inode)->max_file_blocks))
- return -EFBIG;
-
return __get_data_block(inode, iblock, bh_result, create,
F2FS_GET_BLOCK_BMAP, NULL,
NO_CHECK_TYPE, create);
@@ -3813,11 +3809,16 @@ static sector_t f2fs_bmap(struct address_space *mapping, sector_t block)
if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY))
filemap_write_and_wait(mapping);
- if (f2fs_compressed_file(inode))
- blknr = f2fs_bmap_compress(inode, block);
+ /* Block number less than F2FS MAX BLOCKS */
+ if (unlikely(block >= F2FS_I_SB(inode)->max_file_blocks))
+ goto out;
- if (!get_data_block_bmap(inode, block, &tmp, 0))
- blknr = tmp.b_blocknr;
+ if (f2fs_compressed_file(inode)) {
+ blknr = f2fs_bmap_compress(inode, block);
+ } else {
+ if (!get_data_block_bmap(inode, block, &tmp, 0))
+ blknr = tmp.b_blocknr;
+ }
out:
trace_f2fs_bmap(inode, block, blknr);
return blknr;