Patch "f2fs: fix to invalidate META_MAPPING before DIO write" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    f2fs: fix to invalidate META_MAPPING before DIO write

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     f2fs-fix-to-invalidate-meta_mapping-before-dio-write.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit d60b914d413f36966b52d694f56847bb1bc2a469
Author: Chao Yu <chao@xxxxxxxxxx>
Date:   Wed Jul 6 14:30:15 2022 +0800

    f2fs: fix to invalidate META_MAPPING before DIO write
    
    [ Upstream commit 67ca06872eb02944b4c6f92cffa9242e92c63109 ]
    
    Quoted from commit e3b49ea36802 ("f2fs: invalidate META_MAPPING before
    IPU/DIO write")
    
    "
    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 - f2fs_gc()            Thread B
    /* phase 3 */
    down_write(i_gc_rwsem)
    ra_data_block()       ---- (a)
    up_write(i_gc_rwsem)
                                    f2fs_direct_IO() :
                                     - down_read(i_gc_rwsem)
                                     - __blockdev_direct_io()
                                     - get_data_block_dio_write()
                                     - f2fs_dio_submit_bio()  ---- (b)
                                     - up_read(i_gc_rwsem)
    /* phase 4 */
    down_write(i_gc_rwsem)
    move_data_block()     ---- (c)
    up_write(i_gc_rwsem)
    
    (a) In phase 3 of f2fs_gc(), up-to-date page is read from storage and
        cached in META_MAPPING.
    (b) In thread B, writing new data by IPU or DIO write on same blkaddr as
        read in (a). cached page in META_MAPPING become out-dated.
    (c) In phase 4 of f2fs_gc(), out-dated page in META_MAPPING is copied to
        new blkaddr. In conclusion, the newly written data in (b) is lost.
    
    To address this issue, invalidating pages in META_MAPPING before IPU or
    DIO write.
    "
    
    In previous commit, we missed to cover extent cache hit case, and passed
    wrong value for parameter @end of invalidate_mapping_pages(), fix both
    issues.
    
    Fixes: 6aa58d8ad20a ("f2fs: readahead encrypted block during GC")
    Fixes: e3b49ea36802 ("f2fs: invalidate META_MAPPING before IPU/DIO write")
    Cc: Hyeong-Jun Kim <hj514.kim@xxxxxxxxxxx>
    Signed-off-by: Chao Yu <chao.yu@xxxxxxxx>
    Signed-off-by: Jaegeuk Kim <jaegeuk@xxxxxxxxxx>
    Stable-dep-of: fd244524c2cf ("f2fs: compress: fix to cover normal cluster write with cp_rwsem")
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 19b595488a27b..222af7d5f91b7 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -1496,9 +1496,12 @@ 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;
@@ -1712,7 +1715,7 @@ 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_pblk, map->m_pblk + map->m_len - 1);
 
 		if (map->m_multidev_dio) {
 			block_t blk_addr = map->m_pblk;




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux