Commit 0d5b9d81 authored by Chao Yu's avatar Chao Yu Committed by Jaegeuk Kim

f2fs: invalidate meta pages only for post_read required inode

After commit e3b49ea3 ("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: default avatarChao Yu <chao.yu@oppo.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent a8634ccf
...@@ -1463,12 +1463,9 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, ...@@ -1463,12 +1463,9 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
*map->m_next_extent = pgofs + map->m_len; *map->m_next_extent = pgofs + map->m_len;
/* for hardware encryption, but to avoid potential issue in future */ /* 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, f2fs_wait_on_block_writeback_range(inode,
map->m_pblk, map->m_len); 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) { if (map->m_multidev_dio) {
block_t blk_addr = map->m_pblk; block_t blk_addr = map->m_pblk;
...@@ -1684,8 +1681,6 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, ...@@ -1684,8 +1681,6 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
*/ */
f2fs_wait_on_block_writeback_range(inode, f2fs_wait_on_block_writeback_range(inode,
map->m_pblk, map->m_len); 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) { if (map->m_multidev_dio) {
block_t blk_addr = map->m_pblk; block_t blk_addr = map->m_pblk;
...@@ -2733,6 +2728,7 @@ int f2fs_write_single_data_page(struct page *page, int *submitted, ...@@ -2733,6 +2728,7 @@ int f2fs_write_single_data_page(struct page *page, int *submitted,
.submitted = false, .submitted = false,
.compr_blocks = compr_blocks, .compr_blocks = compr_blocks,
.need_lock = LOCK_RETRY, .need_lock = LOCK_RETRY,
.post_read = f2fs_post_read_required(inode),
.io_type = io_type, .io_type = io_type,
.io_wbc = wbc, .io_wbc = wbc,
.bio = bio, .bio = bio,
......
...@@ -1199,6 +1199,7 @@ struct f2fs_io_info { ...@@ -1199,6 +1199,7 @@ struct f2fs_io_info {
bool retry; /* need to reallocate block address */ bool retry; /* need to reallocate block address */
int compr_blocks; /* # of compressed block addresses */ int compr_blocks; /* # of compressed block addresses */
bool encrypted; /* indicate file is encrypted */ bool encrypted; /* indicate file is encrypted */
bool post_read; /* require post read */
enum iostat_type io_type; /* io type */ enum iostat_type io_type; /* io type */
struct writeback_control *io_wbc; /* writeback control */ struct writeback_control *io_wbc; /* writeback control */
struct bio **bio; /* bio for ipu */ struct bio **bio; /* bio for ipu */
......
...@@ -3433,6 +3433,7 @@ int f2fs_inplace_write_data(struct f2fs_io_info *fio) ...@@ -3433,6 +3433,7 @@ int f2fs_inplace_write_data(struct f2fs_io_info *fio)
goto drop_bio; goto drop_bio;
} }
if (fio->post_read)
invalidate_mapping_pages(META_MAPPING(sbi), invalidate_mapping_pages(META_MAPPING(sbi),
fio->new_blkaddr, fio->new_blkaddr); fio->new_blkaddr, fio->new_blkaddr);
...@@ -3616,10 +3617,16 @@ void f2fs_wait_on_block_writeback(struct inode *inode, block_t blkaddr) ...@@ -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, void f2fs_wait_on_block_writeback_range(struct inode *inode, block_t blkaddr,
block_t len) block_t len)
{ {
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
block_t i; block_t i;
if (!f2fs_post_read_required(inode))
return;
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
f2fs_wait_on_block_writeback(inode, blkaddr + 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) static int read_compacted_summaries(struct f2fs_sb_info *sbi)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment