When the data layout is like this: dnode1: dnode2: [0] A [0] NEW_ADDR [1] A+1 [1] 0x0 ... .... [1016] A+1016 [1017] B (B!=A+1017) [1017] 0x0
We can build this kind of layout by following steps(with i_extra_isize:36): ./f2fs_io write 1 0 1881 rand dsync testfile ./f2fs_io write 1 1881 1 rand buffered testfile ./f2fs_io fallocate 0 7708672 4096 testfile And when we map first data block in dnode2, we will get wrong extent_info data: map->m_len = 1 ofs = start_pgofs - map->m_lblk = 1882 - 1881 = 1 ei.fofs = start_pgofs = 1882 ei.len = map->m_len - ofs = 1 - 1 = 0 Fix it by skipping updating this kind of extent info. Signed-off-by: wangzijie <wangzij...@honor.com> --- fs/f2fs/data.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 7961e0ddf..b8bb71852 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -1649,6 +1649,9 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, int flag) switch (flag) { case F2FS_GET_BLOCK_PRECACHE: + if (__is_valid_data_blkaddr(map->m_pblk) && + start_pgofs - map->m_lblk == map->m_len) + map->m_flags &= ~F2FS_MAP_MAPPED; goto sync_out; case F2FS_GET_BLOCK_BMAP: map->m_pblk = 0; -- 2.25.1 _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel