linux-f2fs-devel.lists.sourceforge.net archive mirror
 help / color / mirror / Atom feed
* [f2fs-dev] [PATCH 1/3] f2fs: fix to update upper_p in __get_secs_required() correctly
@ 2025-07-24  8:01 Chao Yu via Linux-f2fs-devel
  2025-07-24  8:01 ` [f2fs-dev] [PATCH 2/3] f2fs: fix to calculate dirty data during has_not_enough_free_secs() Chao Yu via Linux-f2fs-devel
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Chao Yu via Linux-f2fs-devel @ 2025-07-24  8:01 UTC (permalink / raw)
  To: jaegeuk; +Cc: Daeho Jeong, linux-kernel, linux-f2fs-devel

Commit 1acd73edbbfe ("f2fs: fix to account dirty data in __get_secs_required()")
missed to calculate upper_p w/ data_secs, fix it.

Fixes: 1acd73edbbfe ("f2fs: fix to account dirty data in __get_secs_required()")
Cc: Daeho Jeong <daehojeong@google.com>
Signed-off-by: Chao Yu <chao@kernel.org>
---
 fs/f2fs/segment.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h
index d2c73f641134..2123645cf175 100644
--- a/fs/f2fs/segment.h
+++ b/fs/f2fs/segment.h
@@ -678,7 +678,7 @@ static inline void __get_secs_required(struct f2fs_sb_info *sbi,
 	if (lower_p)
 		*lower_p = node_secs + dent_secs + data_secs;
 	if (upper_p)
-		*upper_p = node_secs + dent_secs +
+		*upper_p = node_secs + dent_secs + data_secs +
 			(node_blocks ? 1 : 0) + (dent_blocks ? 1 : 0) +
 			(data_blocks ? 1 : 0);
 	if (curseg_p)
-- 
2.49.0



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

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [f2fs-dev] [PATCH 2/3] f2fs: fix to calculate dirty data during has_not_enough_free_secs()
  2025-07-24  8:01 [f2fs-dev] [PATCH 1/3] f2fs: fix to update upper_p in __get_secs_required() correctly Chao Yu via Linux-f2fs-devel
@ 2025-07-24  8:01 ` Chao Yu via Linux-f2fs-devel
  2025-07-24  8:01 ` [f2fs-dev] [PATCH 3/3] f2fs: fix to trigger foreground gc during f2fs_map_blocks() in lfs mode Chao Yu via Linux-f2fs-devel
  2025-07-28 16:50 ` [f2fs-dev] [PATCH 1/3] f2fs: fix to update upper_p in __get_secs_required() correctly patchwork-bot+f2fs--- via Linux-f2fs-devel
  2 siblings, 0 replies; 4+ messages in thread
From: Chao Yu via Linux-f2fs-devel @ 2025-07-24  8:01 UTC (permalink / raw)
  To: jaegeuk; +Cc: Daeho Jeong, linux-kernel, linux-f2fs-devel

In lfs mode, dirty data needs OPU, we'd better calculate lower_p and
upper_p w/ them during has_not_enough_free_secs(), otherwise we may
encounter out-of-space issue due to we missed to reclaim enough
free section w/ foreground gc.

Fixes: 36abef4e796d ("f2fs: introduce mode=lfs mount option")
Cc: Daeho Jeong <daehojeong@google.com>
Signed-off-by: Chao Yu <chao@kernel.org>
---
 fs/f2fs/segment.h | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h
index 2123645cf175..5e2ee5c686b1 100644
--- a/fs/f2fs/segment.h
+++ b/fs/f2fs/segment.h
@@ -668,8 +668,7 @@ static inline void __get_secs_required(struct f2fs_sb_info *sbi,
 	unsigned int dent_blocks = total_dent_blocks % CAP_BLKS_PER_SEC(sbi);
 	unsigned int data_blocks = 0;
 
-	if (f2fs_lfs_mode(sbi) &&
-		unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) {
+	if (f2fs_lfs_mode(sbi)) {
 		total_data_blocks = get_pages(sbi, F2FS_DIRTY_DATA);
 		data_secs = total_data_blocks / CAP_BLKS_PER_SEC(sbi);
 		data_blocks = total_data_blocks % CAP_BLKS_PER_SEC(sbi);
-- 
2.49.0



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

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [f2fs-dev] [PATCH 3/3] f2fs: fix to trigger foreground gc during f2fs_map_blocks() in lfs mode
  2025-07-24  8:01 [f2fs-dev] [PATCH 1/3] f2fs: fix to update upper_p in __get_secs_required() correctly Chao Yu via Linux-f2fs-devel
  2025-07-24  8:01 ` [f2fs-dev] [PATCH 2/3] f2fs: fix to calculate dirty data during has_not_enough_free_secs() Chao Yu via Linux-f2fs-devel
@ 2025-07-24  8:01 ` Chao Yu via Linux-f2fs-devel
  2025-07-28 16:50 ` [f2fs-dev] [PATCH 1/3] f2fs: fix to update upper_p in __get_secs_required() correctly patchwork-bot+f2fs--- via Linux-f2fs-devel
  2 siblings, 0 replies; 4+ messages in thread
From: Chao Yu via Linux-f2fs-devel @ 2025-07-24  8:01 UTC (permalink / raw)
  To: jaegeuk; +Cc: Daeho Jeong, linux-kernel, linux-f2fs-devel

w/ "mode=lfs" mount option, generic/299 will cause system panic as below:

------------[ cut here ]------------
kernel BUG at fs/f2fs/segment.c:2835!
Call Trace:
 <TASK>
 f2fs_allocate_data_block+0x6f4/0xc50
 f2fs_map_blocks+0x970/0x1550
 f2fs_iomap_begin+0xb2/0x1e0
 iomap_iter+0x1d6/0x430
 __iomap_dio_rw+0x208/0x9a0
 f2fs_file_write_iter+0x6b3/0xfa0
 aio_write+0x15d/0x2e0
 io_submit_one+0x55e/0xab0
 __x64_sys_io_submit+0xa5/0x230
 do_syscall_64+0x84/0x2f0
 entry_SYSCALL_64_after_hwframe+0x76/0x7e
RIP: 0010:new_curseg+0x70f/0x720

The root cause of we run out-of-space is: in f2fs_map_blocks(), f2fs may
trigger foreground gc only if it allocates any physical block, it will be
a little bit later when there is multiple threads writing data w/
aio/dio/bufio method in parallel, since we always use OPU in lfs mode, so
f2fs_map_blocks() does block allocations aggressively.

In order to fix this issue, let's give a chance to trigger foreground
gc in prior to block allocation in f2fs_map_blocks().

Fixes: 36abef4e796d ("f2fs: introduce mode=lfs mount option")
Cc: Daeho Jeong <daehojeong@google.com>
Signed-off-by: Chao Yu <chao@kernel.org>
---
 fs/f2fs/data.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 4e62f7f00b70..ffcaf91c1703 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -1573,8 +1573,11 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, int flag)
 	end = pgofs + maxblocks;
 
 next_dnode:
-	if (map->m_may_create)
+	if (map->m_may_create) {
+		if (f2fs_lfs_mode(sbi))
+			f2fs_balance_fs(sbi, true);
 		f2fs_map_lock(sbi, flag);
+	}
 
 	/* When reading holes, we need its node page */
 	set_new_dnode(&dn, inode, NULL, NULL, 0);
-- 
2.49.0



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

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [f2fs-dev] [PATCH 1/3] f2fs: fix to update upper_p in __get_secs_required() correctly
  2025-07-24  8:01 [f2fs-dev] [PATCH 1/3] f2fs: fix to update upper_p in __get_secs_required() correctly Chao Yu via Linux-f2fs-devel
  2025-07-24  8:01 ` [f2fs-dev] [PATCH 2/3] f2fs: fix to calculate dirty data during has_not_enough_free_secs() Chao Yu via Linux-f2fs-devel
  2025-07-24  8:01 ` [f2fs-dev] [PATCH 3/3] f2fs: fix to trigger foreground gc during f2fs_map_blocks() in lfs mode Chao Yu via Linux-f2fs-devel
@ 2025-07-28 16:50 ` patchwork-bot+f2fs--- via Linux-f2fs-devel
  2 siblings, 0 replies; 4+ messages in thread
From: patchwork-bot+f2fs--- via Linux-f2fs-devel @ 2025-07-28 16:50 UTC (permalink / raw)
  To: Chao Yu; +Cc: jaegeuk, linux-f2fs-devel, daehojeong, linux-kernel

Hello:

This series was applied to jaegeuk/f2fs.git (dev)
by Jaegeuk Kim <jaegeuk@kernel.org>:

On Thu, 24 Jul 2025 16:01:42 +0800 you wrote:
> Commit 1acd73edbbfe ("f2fs: fix to account dirty data in __get_secs_required()")
> missed to calculate upper_p w/ data_secs, fix it.
> 
> Fixes: 1acd73edbbfe ("f2fs: fix to account dirty data in __get_secs_required()")
> Cc: Daeho Jeong <daehojeong@google.com>
> Signed-off-by: Chao Yu <chao@kernel.org>
> 
> [...]

Here is the summary with links:
  - [f2fs-dev,1/3] f2fs: fix to update upper_p in __get_secs_required() correctly
    https://git.kernel.org/jaegeuk/f2fs/c/6840faddb656
  - [f2fs-dev,2/3] f2fs: fix to calculate dirty data during has_not_enough_free_secs()
    https://git.kernel.org/jaegeuk/f2fs/c/e194e140ab7d
  - [f2fs-dev,3/3] f2fs: fix to trigger foreground gc during f2fs_map_blocks() in lfs mode
    https://git.kernel.org/jaegeuk/f2fs/c/1005a3ca28e9

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html




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

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2025-07-28 16:50 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-24  8:01 [f2fs-dev] [PATCH 1/3] f2fs: fix to update upper_p in __get_secs_required() correctly Chao Yu via Linux-f2fs-devel
2025-07-24  8:01 ` [f2fs-dev] [PATCH 2/3] f2fs: fix to calculate dirty data during has_not_enough_free_secs() Chao Yu via Linux-f2fs-devel
2025-07-24  8:01 ` [f2fs-dev] [PATCH 3/3] f2fs: fix to trigger foreground gc during f2fs_map_blocks() in lfs mode Chao Yu via Linux-f2fs-devel
2025-07-28 16:50 ` [f2fs-dev] [PATCH 1/3] f2fs: fix to update upper_p in __get_secs_required() correctly patchwork-bot+f2fs--- via Linux-f2fs-devel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).