After commit e3b49ea36802 ("f2fs: invalidate META_MAPPING before
IPU/DIO write"), invalidate_mapping_pages() will be called to
avoid race condition in between IPU/DIO and readahead for GC.

However, readahead flow is only used for post_read required inode,
so this patch adds check condition to avoids unnecessary page cache
invalidating for non-post_read inode.

Signed-off-by: Chao Yu <[email protected]>
---
 fs/f2fs/data.c    | 8 ++------
 fs/f2fs/f2fs.h    | 1 +
 fs/f2fs/segment.c | 9 ++++++++-
 3 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 2d027505d5f6..a54b91b3a8d4 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -1479,12 +1479,9 @@ int f2fs_map_blocks(struct inode *inode, struct 
f2fs_map_blocks *map,
                        *map->m_next_extent = pgofs + map->m_len;
 
                /* for hardware encryption, but to avoid potential issue in 
future */
-               if (flag == F2FS_GET_BLOCK_DIO) {
+               if (flag == F2FS_GET_BLOCK_DIO)
                        f2fs_wait_on_block_writeback_range(inode,
                                                map->m_pblk, map->m_len);
-                       invalidate_mapping_pages(META_MAPPING(sbi),
-                               map->m_pblk, map->m_pblk + map->m_len - 1);
-               }
 
                if (map->m_multidev_dio) {
                        block_t blk_addr = map->m_pblk;
@@ -1700,8 +1697,6 @@ int f2fs_map_blocks(struct inode *inode, struct 
f2fs_map_blocks *map,
                 */
                f2fs_wait_on_block_writeback_range(inode,
                                                map->m_pblk, map->m_len);
-               invalidate_mapping_pages(META_MAPPING(sbi),
-                               map->m_pblk, map->m_pblk + map->m_len - 1);
 
                if (map->m_multidev_dio) {
                        block_t blk_addr = map->m_pblk;
@@ -2749,6 +2744,7 @@ int f2fs_write_single_data_page(struct page *page, int 
*submitted,
                .submitted = false,
                .compr_blocks = compr_blocks,
                .need_lock = LOCK_RETRY,
+               .post_read = f2fs_post_read_required(inode),
                .io_type = io_type,
                .io_wbc = wbc,
                .bio = bio,
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 1d97d06e0d87..87e96f612582 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -1199,6 +1199,7 @@ struct f2fs_io_info {
        bool retry;             /* need to reallocate block address */
        int compr_blocks;       /* # of compressed block addresses */
        bool encrypted;         /* indicate file is encrypted */
+       bool post_read;         /* require post read */
        enum iostat_type io_type;       /* io type */
        struct writeback_control *io_wbc; /* writeback control */
        struct bio **bio;               /* bio for ipu */
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index ce571c0d7126..12b0edc48f7b 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -3433,7 +3433,8 @@ int f2fs_inplace_write_data(struct f2fs_io_info *fio)
                goto drop_bio;
        }
 
-       invalidate_mapping_pages(META_MAPPING(sbi),
+       if (fio->post_read)
+               invalidate_mapping_pages(META_MAPPING(sbi),
                                fio->new_blkaddr, fio->new_blkaddr);
 
        stat_inc_inplace_blocks(fio->sbi);
@@ -3616,10 +3617,16 @@ void f2fs_wait_on_block_writeback(struct inode *inode, 
block_t blkaddr)
 void f2fs_wait_on_block_writeback_range(struct inode *inode, block_t blkaddr,
                                                                block_t len)
 {
+       struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
        block_t i;
 
+       if (!f2fs_post_read_required(inode))
+               return;
+
        for (i = 0; i < len; i++)
                f2fs_wait_on_block_writeback(inode, blkaddr + i);
+
+       invalidate_mapping_pages(META_MAPPING(sbi), blkaddr, blkaddr + len - 1);
 }
 
 static int read_compacted_summaries(struct f2fs_sb_info *sbi)
-- 
2.36.1



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

Reply via email to