Patch "f2fs: invalidate META_MAPPING before IPU/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: invalidate META_MAPPING before IPU/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-invalidate-meta_mapping-before-ipu-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 e8859acb23a33ce1eeee3c6cf6c15038198aa75a
Author: Hyeong-Jun Kim <hj514.kim@xxxxxxxxxxx>
Date:   Tue Nov 2 16:10:02 2021 +0900

    f2fs: invalidate META_MAPPING before IPU/DIO write
    
    [ Upstream commit e3b49ea36802053f312013fd4ccb6e59920a9f76 ]
    
    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.
    
    Fixes: 6aa58d8ad20a ("f2fs: readahead encrypted block during GC")
    Signed-off-by: Hyeong-Jun Kim <hj514.kim@xxxxxxxxxxx>
    Reviewed-by: Chao Yu <chao@xxxxxxxxxx>
    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 e005f97fd273e..25dafd1261d71 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -1711,6 +1711,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 25d53617a50e6..5eca50e50e16b 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -3622,6 +3622,9 @@ int f2fs_inplace_write_data(struct f2fs_io_info *fio)
 		goto drop_bio;
 	}
 
+	invalidate_mapping_pages(META_MAPPING(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)))




[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