Skip to content

Commit 8175c86

Browse files
wangzijieJaegeuk Kim
authored andcommitted
f2fs: fix zero-sized extent for precache extents
Script to reproduce: f2fs_io write 1 0 1881 rand dsync testfile f2fs_io fallocate 0 7708672 4096 testfile f2fs_io write 1 1881 1 rand buffered testfile fsync testfile umount mount f2fs_io precache_extents testfile When the data layout is something like this: dnode1: dnode2: [0] A [0] NEW_ADDR [1] A+1 [1] 0x0 ... [1016] A+1016 [1017] B (B!=A+1017) [1017] 0x0 During precache_extents, we map the last block(valid blkaddr) in dnode1: map->m_flags |= F2FS_MAP_MAPPED; map->m_pblk = blkaddr(valid blkaddr); map->m_len = 1; then we goto next_dnode, meet the first block in dnode2(hole), goto sync_out: map->m_flags & F2FS_MAP_MAPPED == true, and we make zero-sized extent: 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 Rebased on patch[1], this patch can cover these cases to avoid zero-sized extent: A,B,C is valid blkaddr case1: dnode1: dnode2: [0] A [0] NEW_ADDR [1] A+1 [1] 0x0 ... .... [1016] A+1016 [1017] B (B!=A+1017) [1017] 0x0 case2: dnode1: dnode2: [0] A [0] C (C!=B+1) [1] A+1 [1] C+1 ... .... [1016] A+1016 [1017] B (B!=A+1017) [1017] 0x0 case3: dnode1: dnode2: [0] A [0] C (C!=B+2) [1] A+1 [1] C+1 ... .... [1015] A+1015 [1016] B (B!=A+1016) [1017] B+1 [1017] 0x0 [1] https://lore.kernel.org/linux-f2fs-devel/[email protected]/ Fixes: c4020b2 ("f2fs: support F2FS_IOC_PRECACHE_EXTENTS") Signed-off-by: wangzijie <[email protected]> Reviewed-by: Chao Yu <[email protected]> Signed-off-by: Jaegeuk Kim <[email protected]>
1 parent c2f7c32 commit 8175c86

File tree

1 file changed

+4
-3
lines changed

1 file changed

+4
-3
lines changed

fs/f2fs/data.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1771,9 +1771,10 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, int flag)
17711771
if (map->m_flags & F2FS_MAP_MAPPED) {
17721772
unsigned int ofs = start_pgofs - map->m_lblk;
17731773

1774-
f2fs_update_read_extent_cache_range(&dn,
1775-
start_pgofs, map->m_pblk + ofs,
1776-
map->m_len - ofs);
1774+
if (map->m_len > ofs)
1775+
f2fs_update_read_extent_cache_range(&dn,
1776+
start_pgofs, map->m_pblk + ofs,
1777+
map->m_len - ofs);
17771778
}
17781779
if (map->m_next_extent)
17791780
*map->m_next_extent = is_hole ? pgofs + 1 : pgofs;

0 commit comments

Comments
 (0)