From: Yongpeng Yang <[email protected]>

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 <[email protected]>
---
 fs/f2fs/data.c    | 22 ++++++++++++++++++----
 fs/f2fs/f2fs.h    |  2 ++
 fs/f2fs/segment.c |  2 +-
 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 @@ static void __f2fs_submit_merged_write(struct f2fs_sb_info 
*sbi,
 
 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 53cbce96f126..6c5b901a5d27 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) {
-- 
2.43.0



_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to