• Chao Yu's avatar
    f2fs: fix to truncate meta inode pages forcely · 9f0c4a46
    Chao Yu authored
    Below race case can cause data corruption:
    
    Thread A				GC thread
    					- gc_data_segment
    					 - ra_data_block
    					  - locked meta_inode page
    - f2fs_inplace_write_data
     - invalidate_mapping_pages
     : fail to invalidate meta_inode page
       due to lock failure or dirty|writeback
       status
     - f2fs_submit_page_bio
     : write last dirty data to old blkaddr
    					 - move_data_block
    					  - load old data from meta_inode page
    					  - f2fs_submit_page_write
    					  : write old data to new blkaddr
    
    Because invalidate_mapping_pages() will skip invalidating page which
    has unclear status including locked, dirty, writeback and so on, so
    we need to use truncate_inode_pages_range() instead of
    invalidate_mapping_pages() to make sure meta_inode page will be dropped.
    
    Fixes: 6aa58d8a ("f2fs: readahead encrypted block during GC")
    Fixes: e3b49ea3 ("f2fs: invalidate META_MAPPING before IPU/DIO write")
    Signed-off-by: default avatarChao Yu <chao@kernel.org>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    9f0c4a46
segment.c 140 KB