Messages in this thread Patch in this message | | | From | Hyeong-Jun Kim <> | Subject | [PATCH] F2FS: invalidate META_MAPPING before IPU/DIO write | Date | Mon, 1 Nov 2021 14:42:14 +0900 |
| |
Encrypted pages during GC are read and cached in META_MAPPING. However, due to cached pages in META_MAPPING, there is an issue where newly written pages are lost by IPU or DIO writes.
Thread A Thread B - f2fs_gc(): blk 0x10 -> 0x20 (a) - IPU or DIO write on blk 0x20 (b) - f2fs_gc(): blk 0x20 -> 0x30 (c)
(a) page for blk 0x20 is cached in META_MAPPING and page for blk 0x10 is invalidated from META_MAPPING. (b) write new data to blk 0x200 using IPU or DIO, but outdated data still remains in META_MAPPING. (c) f2fs_gc() try to move blk from 0x20 to 0x30 using cached page in META_MAPPING. In conclusion, the newly written data in (b) is lost.
To address this issue, invalidating pages in META_MAPPING before IPU or DIO write.
Signed-off-by: Hyeong-Jun Kim <hj514.kim@samsung.com> --- fs/f2fs/data.c | 2 ++ fs/f2fs/segment.c | 3 +++ 2 files changed, 5 insertions(+)
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 74e1a350c1d8..9f754aaef558 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -1708,6 +1708,8 @@ 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); if (map->m_multidev_dio) { block_t blk_addr = map->m_pblk; diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 526423fe84ce..f57c55190f9e 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -3652,6 +3652,9 @@ int f2fs_inplace_write_data(struct f2fs_io_info *fio) goto drop_bio; } + invalidate_mapping_pages(META_MAPPING(fio->sbi), + fio->new_blkaddr, fio->new_blkaddr); + stat_inc_inplace_blocks(fio->sbi); if (fio->bio && !(SM_I(sbi)->ipu_policy & (1 << F2FS_IPU_NOCACHE))) -- 2.25.1
| |