summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYongpeng Yang <yangyongpeng@xiaomi.com>2025-12-27 17:46:10 +0800
committerJaegeuk Kim <jaegeuk@kernel.org>2026-01-01 03:29:40 +0000
commitdb1a8a7813f74968f79bd510fd5f0ae866bf8efd (patch)
tree4bb0cc7afb7de4ea82a68c8ee2478ca994d7fea0
parent86c1cf0578c59c8e68185d86d03be846bcaef0e2 (diff)
f2fs: return immediately after submitting the specified folio in __submit_merged_write_cond
f2fs_folio_wait_writeback ensures the folio write is submitted to the block layer via __submit_merged_write_cond, then waits for the folio to complete. Other I/O submissions are irrelevant to f2fs_folio_wait_writeback. Thus, if the folio write bio is already submitted, the function can return immediately. This patch adds a writeback parameter to __submit_merged_write_cond(), which signals an immediate return after submitting the target folio, and waitting writeback can use this parameter. Signed-off-by: Yongpeng Yang <yangyongpeng@xiaomi.com> Reviewed-by: Chao Yu <chao@kernel.org> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r--fs/f2fs/data.c22
-rw-r--r--fs/f2fs/f2fs.h2
-rw-r--r--fs/f2fs/segment.c2
3 files changed, 21 insertions, 5 deletions
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index d4ef26beadbc..471e52c6c1e0 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -664,7 +664,7 @@ unlock_out:
static void __submit_merged_write_cond(struct f2fs_sb_info *sbi,
struct inode *inode, struct folio *folio,
- nid_t ino, enum page_type type)
+ nid_t ino, enum page_type type, bool writeback)
{
enum temp_type temp;
bool ret = true;
@@ -679,8 +679,16 @@ static void __submit_merged_write_cond(struct f2fs_sb_info *sbi,
ret = __has_merged_page(io->bio, inode, folio, ino);
f2fs_up_read(&io->io_rwsem);
}
- if (ret)
+ if (ret) {
__f2fs_submit_merged_write(sbi, type, temp);
+ /*
+ * For waitting writebck case, if the bio owned by the
+ * folio is already submitted, we do not need to submit
+ * other types of bios.
+ */
+ if (writeback)
+ break;
+ }
/* TODO: use HOT temp only for meta pages now. */
if (type >= META)
@@ -690,14 +698,20 @@ static void __submit_merged_write_cond(struct f2fs_sb_info *sbi,
void f2fs_submit_merged_write(struct f2fs_sb_info *sbi, enum page_type type)
{
- __submit_merged_write_cond(sbi, NULL, NULL, 0, type);
+ __submit_merged_write_cond(sbi, NULL, NULL, 0, type, false);
}
void f2fs_submit_merged_write_cond(struct f2fs_sb_info *sbi,
struct inode *inode, struct folio *folio,
nid_t ino, enum page_type type)
{
- __submit_merged_write_cond(sbi, inode, folio, ino, type);
+ __submit_merged_write_cond(sbi, inode, folio, ino, type, false);
+}
+
+void f2fs_submit_merged_write_folio(struct f2fs_sb_info *sbi,
+ struct folio *folio, enum page_type type)
+{
+ __submit_merged_write_cond(sbi, NULL, folio, 0, type, true);
}
void f2fs_flush_merged_writes(struct f2fs_sb_info *sbi)
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 291a694fdaf0..5d81de7cee70 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -4052,6 +4052,8 @@ void f2fs_submit_merged_write(struct f2fs_sb_info *sbi, enum page_type type);
void f2fs_submit_merged_write_cond(struct f2fs_sb_info *sbi,
struct inode *inode, struct folio *folio,
nid_t ino, enum page_type type);
+void f2fs_submit_merged_write_folio(struct f2fs_sb_info *sbi,
+ struct folio *folio, enum page_type type);
void f2fs_submit_merged_ipu_write(struct f2fs_sb_info *sbi,
struct bio **bio, struct folio *folio);
void f2fs_flush_merged_writes(struct f2fs_sb_info *sbi);
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index c26424f47686..c0c5b7075b04 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -4240,7 +4240,7 @@ void f2fs_folio_wait_writeback(struct folio *folio, enum page_type type,
struct f2fs_sb_info *sbi = F2FS_F_SB(folio);
/* submit cached LFS IO */
- f2fs_submit_merged_write_cond(sbi, NULL, folio, 0, type);
+ f2fs_submit_merged_write_folio(sbi, folio, type);
/* submit cached IPU IO */
f2fs_submit_merged_ipu_write(sbi, NULL, folio);
if (ordered) {