On 9/11/25 14:55, wangzijie wrote:
>> 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,
> 
> Hi, Chao
> I test it again with below steps:
> 
> ./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

Oh, I can reproduce the bug w/ above scripts, thanks.

Thanks,

> 
>          f2fs_io-8749    [003] .....    86.759281: f2fs_lookup_start: dev = 
> (254,57), pino = 45485, name:testfile, flags:257
>          f2fs_io-8749    [003] .....    86.759954: f2fs_iget: dev = (254,57), 
> ino = 501391, pino = 45485, i_mode = 0x81ed, i_size = 7712768, i_nlink = 1, 
> i_blocks = 15080, i_advise = 0x0
>          f2fs_io-8749    [003] .....    86.759968: f2fs_lookup_end: dev = 
> (254,57), pino = 45485, name:testfile, ino:501391, err:0
>          f2fs_io-8749    [003] .....    86.760000: 
> f2fs_lookup_extent_tree_start: dev = (254,57), ino = 501391, pgofs = 0, type 
> = Read
>          f2fs_io-8749    [003] .....    86.760020: 
> f2fs_lookup_read_extent_tree_end: dev = (254,57), ino = 501391, pgofs = 0, 
> read_ext_info(fofs: 0, len: 1881, blk: 3164707)
>          f2fs_io-8749    [003] .....    86.760020: f2fs_map_blocks: dev = 
> (254,57), ino = 501391, file offset = 0, start blkaddr = 0x304a23, len = 
> 0x759, flags = 2, seg_type = 8, may_create = 0, multidevice = 0, flag = 6, 
> err = 0
>          f2fs_io-8749    [003] .....    86.760021: 
> f2fs_lookup_extent_tree_start: dev = (254,57), ino = 501391, pgofs = 1881, 
> type = Read
>          f2fs_io-8749    [003] .....    86.760022: 
> f2fs_lookup_read_extent_tree_end: dev = (254,57), ino = 501391, pgofs = 1881, 
> read_ext_info(fofs: 0, len: 0, blk: 0)
>          f2fs_io-8749    [005] .....    86.760162: 
> f2fs_update_read_extent_tree_range: dev = (254,57), ino = 501391, pgofs = 
> 1881, len = 1, blkaddr = 2688335, c_len = 0
>     *****f2fs_io-8749    [005] .....    86.760324: 
> f2fs_update_read_extent_tree_range: dev = (254,57), ino = 501391, pgofs = 
> 1882, len = 0, blkaddr = 2688336, c_len = 0  ******
>          f2fs_io-8749    [005] .....    86.760326: f2fs_map_blocks: dev = 
> (254,57), ino = 501391, file offset = 1881, start blkaddr = 0x29054f, len = 
> 0x1, flags = 2, seg_type = 8, may_create = 0, multidevice = 0, flag = 6, err 
> = 0
> 
> 
> inode:
> i_ext: fofs:0 blkaddr:304a23 len:759
> i_addr[0x9]     [0x  304a23 : 3164707]
> ....
> i_addr[0x368]   [0x  304d82 : 3165570]
> 
> dnode1:
> [0]    [0x  304d83 : 3165571]
> [1016] [0x  30517b : 3166587]
> ...
> [1017] [0x  29054f : 2688335]
> 
> dnode2:
> [0]   NEW_ADDR
> [1]     [0x       0 : 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;
> 



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to