]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
f2fs: invalidate meta pages only for post_read required inode
authorChao Yu <chao@kernel.org>
Tue, 12 Jul 2022 15:26:43 +0000 (23:26 +0800)
committerSasha Levin <sashal@kernel.org>
Tue, 26 Mar 2024 22:21:32 +0000 (18:21 -0400)
[ Upstream commit 0d5b9d8156396bbe1c982708b38ab9e188c45ec9 ]

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 <chao.yu@oppo.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Stable-dep-of: fd244524c2cf ("f2fs: compress: fix to cover normal cluster write with cp_rwsem")
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/f2fs/data.c
fs/f2fs/f2fs.h
fs/f2fs/segment.c

index 25d57baf4f4da4b457ad53eb0a9d0d8991bc5e47..de648d656842166f51ed8e7350c44dc05a365abf 100644 (file)
@@ -1495,12 +1495,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;
@@ -1713,8 +1710,6 @@ sync_out:
                 */
                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;
@@ -2807,6 +2802,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,
index a82698ad0d9003c9bf18077b3796b76dc237ba8a..cf8871edf92e332003b0efde480fb3ce573698b7 100644 (file)
@@ -1177,6 +1177,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 */
index cbdd8d0ec89607e54564b8431f6accdea109f626..43fabd17bb4e7c24fe0d4f093150fdbfe4810307 100644 (file)
@@ -3620,7 +3620,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);
@@ -3803,10 +3804,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)