On 9/10/25 21:58, wangzijie wrote:
> 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
Hi Zijie,
I tried to reproduce w/ below steps:
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
umount
mount
f2fs_io precache_extents testfile
f2fs_io-921 [013] ..... 1049.855817: f2fs_lookup_start: dev =
(253,16), pino = 3, name:testfile, flags:65537
f2fs_io-921 [013] ..... 1049.855870: f2fs_submit_read_bio: dev =
(253,16)/(253,16), rw = READ(), DATA, sector = 139280, size = 4096
f2fs_io-921 [013] ..... 1049.856116: f2fs_submit_folio_bio: dev =
(253,16), ino = 1, folio_index = 0x5, oldaddr = 0x5553, newaddr = 0x5553, rw =
READ(), type = HOT_NODE
f2fs_io-921 [013] ..... 1049.856147: f2fs_submit_read_bio: dev =
(253,16)/(253,16), rw = READ(), NODE, sector = 174744, size = 4096
f2fs_io-921 [013] ..... 1049.856273: f2fs_iget: dev = (253,16),
ino = 5, pino = 3, i_mode = 0x81ed, i_size = 7712768, i_nlink = 1, i_blocks =
15080, i_advise = 0x0
f2fs_io-921 [013] ..... 1049.856305: f2fs_lookup_end: dev =
(253,16), pino = 3, name:testfile, ino:5, err:0
f2fs_io-921 [013] ..... 1049.856316:
f2fs_lookup_extent_tree_start: dev = (253,16), ino = 5, pgofs = 0, type = Read
f2fs_io-921 [013] ..... 1049.856317:
f2fs_lookup_read_extent_tree_end: dev = (253,16), ino = 5, pgofs = 0,
read_ext_info(fofs: 0, len: 512, blk: 1055744)
f2fs_io-921 [013] ..... 1049.856317: f2fs_map_blocks: dev =
(253,16), ino = 5, file offset = 0, start blkaddr = 0x101c00, len = 0x200,
flags = 2, seg_type = 8, may_create = 0, multidevice = 0, flag = 6, err = 0
f2fs_io-921 [013] ..... 1049.856318:
f2fs_lookup_extent_tree_start: dev = (253,16), ino = 5, pgofs = 512, type = Read
f2fs_io-921 [013] ..... 1049.856318:
f2fs_lookup_read_extent_tree_end: dev = (253,16), ino = 5, pgofs = 512,
read_ext_info(fofs: 0, len: 0, blk: 0)
f2fs_io-921 [013] ..... 1049.856323:
f2fs_update_read_extent_tree_range: dev = (253,16), ino = 5, pgofs = 512, len =
352, blkaddr = 18432, c_len = 0
f2fs_io-921 [013] ..... 1049.856328: f2fs_submit_folio_bio: dev =
(253,16), ino = 1, folio_index = 0x6, oldaddr = 0x5556, newaddr = 0x5556, rw =
READ(), type = HOT_NODE
f2fs_io-921 [013] ..... 1049.856329: f2fs_submit_read_bio: dev =
(253,16)/(253,16), rw = READ(), NODE, sector = 174768, size = 4096
f2fs_io-921 [021] ..... 1049.856968:
f2fs_update_read_extent_tree_range: dev = (253,16), ino = 5, pgofs = 864, len =
160, blkaddr = 18784, c_len = 0
f2fs_io-921 [021] ..... 1049.857002: f2fs_map_blocks: dev =
(253,16), ino = 5, file offset = 512, start blkaddr = 0x4800, len = 0x200,
flags = 2, seg_type = 8, may_create = 0, multidevice = 0, flag = 6, err = 0
f2fs_io-921 [021] ..... 1049.857003:
f2fs_lookup_extent_tree_start: dev = (253,16), ino = 5, pgofs = 1025, type =
Read
f2fs_io-921 [021] ..... 1049.857004:
f2fs_lookup_read_extent_tree_end: dev = (253,16), ino = 5, pgofs = 1025,
read_ext_info(fofs: 0, len: 0, blk: 0)
f2fs_io-921 [021] ..... 1049.857010:
f2fs_update_read_extent_tree_range: dev = (253,16), ino = 5, pgofs = 1025, len
= 511, blkaddr = 19457, c_len = 0
f2fs_io-921 [021] ..... 1049.857011: f2fs_map_blocks: dev =
(253,16), ino = 5, file offset = 1025, start blkaddr = 0x4c01, len = 0x1ff,
flags = 2, seg_type = 8, may_create = 0, multidevice = 0, flag = 6, err = 0
f2fs_io-921 [021] ..... 1049.857012:
f2fs_lookup_extent_tree_start: dev = (253,16), ino = 5, pgofs = 1537, type =
Read
f2fs_io-921 [021] ..... 1049.857012:
f2fs_lookup_read_extent_tree_end: dev = (253,16), ino = 5, pgofs = 1537,
read_ext_info(fofs: 0, len: 0, blk: 0)
f2fs_io-921 [021] ..... 1049.857016:
f2fs_update_read_extent_tree_range: dev = (253,16), ino = 5, pgofs = 1537, len
= 344, blkaddr = 20993, c_len = 0
f2fs_io-921 [021] ..... 1049.857016: f2fs_map_blocks: dev =
(253,16), ino = 5, file offset = 1537, start blkaddr = 0x5201, len = 0x158,
flags = 2, seg_type = 8, may_create = 0, multidevice = 0, flag = 6, err = 0
f2fs_io-921 [021] ..... 1049.857017:
f2fs_lookup_extent_tree_start: dev = (253,16), ino = 5, pgofs = 1882, type =
Read
f2fs_io-921 [021] ..... 1049.857017:
f2fs_lookup_read_extent_tree_end: dev = (253,16), ino = 5, pgofs = 1882,
read_ext_info(fofs: 0, len: 0, blk: 0)
f2fs_io-921 [021] ..... 1049.857024: f2fs_submit_folio_bio: dev =
(253,16), ino = 1, folio_index = 0x7, oldaddr = 0x5555, newaddr = 0x5555, rw =
READ(), type = HOT_NODE
f2fs_io-921 [021] ..... 1049.857026: f2fs_submit_read_bio: dev =
(253,16)/(253,16), rw = READ(), NODE, sector = 174760, size = 4096
f2fs_io-921 [021] ..... 1049.857156: f2fs_map_blocks: dev =
(253,16), ino = 5, file offset = 1882, start blkaddr = 0x5201, len = 0x0, flags
= 0, seg_type = 8, may_create = 0, multidevice = 0, flag = 6, err = 0
It seems f2fs_update_read_extent_tree_range() won't insert a zero-sized extent?
Or am I missing something?
Thanks,
>
> Fix it by skipping updating this kind of extent info.
>
> Signed-off-by: wangzijie <[email protected]>
> ---
> 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;
_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel