From: Chao Yu via Linux-f2fs-devel <linux-f2fs-devel@lists.sourceforge.net>
To: wangzijie <wangzijie1@honor.com>, jaegeuk@kernel.org
Cc: linux-kernel@vger.kernel.org, feng.han@honor.com,
linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [f2fs-dev] [PATCH 1/2] f2fs: fix wrong extent_info data for precache extents
Date: Thu, 11 Sep 2025 16:19:06 +0800 [thread overview]
Message-ID: <228203f5-d3bf-46fb-b990-3de2eb2ff3e8@kernel.org> (raw)
In-Reply-To: <20250910135835.2751574-1-wangzijie1@honor.com>
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
>
> Fix it by skipping updating this kind of extent info.
>
> Signed-off-by: wangzijie <wangzijie1@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;
It looks we missed to reset value for map variable in f2fs_precache_extents(),
what do you think of this?
---
fs/f2fs/file.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 1aae4361d0a8..2b14151d4130 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -3599,7 +3599,7 @@ static int f2fs_ioc_io_prio(struct file *filp, unsigned long arg)
int f2fs_precache_extents(struct inode *inode)
{
struct f2fs_inode_info *fi = F2FS_I(inode);
- struct f2fs_map_blocks map;
+ struct f2fs_map_blocks map = { 0 };
pgoff_t m_next_extent;
loff_t end;
int err;
@@ -3617,6 +3617,8 @@ int f2fs_precache_extents(struct inode *inode)
while (map.m_lblk < end) {
map.m_len = end - map.m_lblk;
+ map.m_pblk = 0;
+ map.m_flags = 0;
f2fs_down_write(&fi->i_gc_rwsem[WRITE]);
err = f2fs_map_blocks(inode, &map, F2FS_GET_BLOCK_PRECACHE);
--
2.49.0
Thanks,
> 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
WARNING: multiple messages have this Message-ID (diff)
From: Chao Yu <chao@kernel.org>
To: wangzijie <wangzijie1@honor.com>, jaegeuk@kernel.org
Cc: chao@kernel.org, bintian.wang@honor.com, feng.han@honor.com,
linux-kernel@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [f2fs-dev] [PATCH 1/2] f2fs: fix wrong extent_info data for precache extents
Date: Thu, 11 Sep 2025 16:19:06 +0800 [thread overview]
Message-ID: <228203f5-d3bf-46fb-b990-3de2eb2ff3e8@kernel.org> (raw)
In-Reply-To: <20250910135835.2751574-1-wangzijie1@honor.com>
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
>
> Fix it by skipping updating this kind of extent info.
>
> Signed-off-by: wangzijie <wangzijie1@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;
It looks we missed to reset value for map variable in f2fs_precache_extents(),
what do you think of this?
---
fs/f2fs/file.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 1aae4361d0a8..2b14151d4130 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -3599,7 +3599,7 @@ static int f2fs_ioc_io_prio(struct file *filp, unsigned long arg)
int f2fs_precache_extents(struct inode *inode)
{
struct f2fs_inode_info *fi = F2FS_I(inode);
- struct f2fs_map_blocks map;
+ struct f2fs_map_blocks map = { 0 };
pgoff_t m_next_extent;
loff_t end;
int err;
@@ -3617,6 +3617,8 @@ int f2fs_precache_extents(struct inode *inode)
while (map.m_lblk < end) {
map.m_len = end - map.m_lblk;
+ map.m_pblk = 0;
+ map.m_flags = 0;
f2fs_down_write(&fi->i_gc_rwsem[WRITE]);
err = f2fs_map_blocks(inode, &map, F2FS_GET_BLOCK_PRECACHE);
--
2.49.0
Thanks,
> goto sync_out;
> case F2FS_GET_BLOCK_BMAP:
> map->m_pblk = 0;
next prev parent reply other threads:[~2025-09-11 8:19 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-10 13:58 [f2fs-dev] [PATCH 1/2] f2fs: fix wrong extent_info data for precache extents wangzijie
2025-09-10 13:58 ` wangzijie
2025-09-10 13:58 ` [f2fs-dev] [PATCH 2/2] f2fs: fix infinite loop in __insert_extent_tree() wangzijie
2025-09-10 13:58 ` wangzijie
2025-09-11 3:34 ` [f2fs-dev] [PATCH 1/2] f2fs: fix wrong extent_info data for precache extents Chao Yu via Linux-f2fs-devel
2025-09-11 3:34 ` Chao Yu
2025-09-11 6:55 ` wangzijie
2025-09-11 6:55 ` wangzijie
2025-09-11 7:47 ` Chao Yu via Linux-f2fs-devel
2025-09-11 7:47 ` Chao Yu
2025-09-11 7:42 ` wangzijie
2025-09-11 7:42 ` wangzijie
2025-09-11 8:19 ` Chao Yu via Linux-f2fs-devel [this message]
2025-09-11 8:19 ` Chao Yu
2025-09-11 9:07 ` wangzijie
2025-09-11 9:07 ` wangzijie
2025-09-12 1:52 ` Chao Yu via Linux-f2fs-devel
2025-09-12 1:52 ` Chao Yu
2025-09-12 3:36 ` wangzijie
2025-09-12 3:36 ` wangzijie
2025-09-12 3:41 ` Chao Yu via Linux-f2fs-devel
2025-09-12 3:41 ` Chao Yu
2025-09-12 10:06 ` wangzijie
2025-09-12 10:06 ` wangzijie
2025-09-12 10:38 ` Chao Yu via Linux-f2fs-devel
2025-09-12 10:38 ` Chao Yu
2025-09-12 10:48 ` wangzijie
2025-09-12 10:48 ` wangzijie
2025-09-12 10:39 ` wangzijie
2025-09-12 10:39 ` wangzijie
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=228203f5-d3bf-46fb-b990-3de2eb2ff3e8@kernel.org \
--to=linux-f2fs-devel@lists.sourceforge.net \
--cc=chao@kernel.org \
--cc=feng.han@honor.com \
--cc=jaegeuk@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=wangzijie1@honor.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.