Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Yongpeng Yang and committed by
Jaegeuk Kim
db1a8a78 86c1cf05

+21 -5
+18 -4
fs/f2fs/data.c
··· 664 664 665 665 static void __submit_merged_write_cond(struct f2fs_sb_info *sbi, 666 666 struct inode *inode, struct folio *folio, 667 - nid_t ino, enum page_type type) 667 + nid_t ino, enum page_type type, bool writeback) 668 668 { 669 669 enum temp_type temp; 670 670 bool ret = true; ··· 679 679 ret = __has_merged_page(io->bio, inode, folio, ino); 680 680 f2fs_up_read(&io->io_rwsem); 681 681 } 682 - if (ret) 682 + if (ret) { 683 683 __f2fs_submit_merged_write(sbi, type, temp); 684 + /* 685 + * For waitting writebck case, if the bio owned by the 686 + * folio is already submitted, we do not need to submit 687 + * other types of bios. 688 + */ 689 + if (writeback) 690 + break; 691 + } 684 692 685 693 /* TODO: use HOT temp only for meta pages now. */ 686 694 if (type >= META) ··· 698 690 699 691 void f2fs_submit_merged_write(struct f2fs_sb_info *sbi, enum page_type type) 700 692 { 701 - __submit_merged_write_cond(sbi, NULL, NULL, 0, type); 693 + __submit_merged_write_cond(sbi, NULL, NULL, 0, type, false); 702 694 } 703 695 704 696 void f2fs_submit_merged_write_cond(struct f2fs_sb_info *sbi, 705 697 struct inode *inode, struct folio *folio, 706 698 nid_t ino, enum page_type type) 707 699 { 708 - __submit_merged_write_cond(sbi, inode, folio, ino, type); 700 + __submit_merged_write_cond(sbi, inode, folio, ino, type, false); 701 + } 702 + 703 + void f2fs_submit_merged_write_folio(struct f2fs_sb_info *sbi, 704 + struct folio *folio, enum page_type type) 705 + { 706 + __submit_merged_write_cond(sbi, NULL, folio, 0, type, true); 709 707 } 710 708 711 709 void f2fs_flush_merged_writes(struct f2fs_sb_info *sbi)
+2
fs/f2fs/f2fs.h
··· 4052 4052 void f2fs_submit_merged_write_cond(struct f2fs_sb_info *sbi, 4053 4053 struct inode *inode, struct folio *folio, 4054 4054 nid_t ino, enum page_type type); 4055 + void f2fs_submit_merged_write_folio(struct f2fs_sb_info *sbi, 4056 + struct folio *folio, enum page_type type); 4055 4057 void f2fs_submit_merged_ipu_write(struct f2fs_sb_info *sbi, 4056 4058 struct bio **bio, struct folio *folio); 4057 4059 void f2fs_flush_merged_writes(struct f2fs_sb_info *sbi);
+1 -1
fs/f2fs/segment.c
··· 4240 4240 struct f2fs_sb_info *sbi = F2FS_F_SB(folio); 4241 4241 4242 4242 /* submit cached LFS IO */ 4243 - f2fs_submit_merged_write_cond(sbi, NULL, folio, 0, type); 4243 + f2fs_submit_merged_write_folio(sbi, folio, type); 4244 4244 /* submit cached IPU IO */ 4245 4245 f2fs_submit_merged_ipu_write(sbi, NULL, folio); 4246 4246 if (ordered) {