f2fs: invalidate meta pages only for post_read required inode
After commit e3b49ea368
("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>
This commit is contained in:
parent
a8634ccf5d
commit
0d5b9d8156
@ -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,
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
.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 {
|
|||||||
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,7 +3433,8 @@ int f2fs_inplace_write_data(struct f2fs_io_info *fio)
|
|||||||
goto drop_bio;
|
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);
|
fio->new_blkaddr, fio->new_blkaddr);
|
||||||
|
|
||||||
stat_inc_inplace_blocks(fio->sbi);
|
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,
|
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)
|
||||||
|
Loading…
Reference in New Issue
Block a user