• Chao Yu's avatar
    f2fs crypto: fix racing of accessing encrypted page among · 08b39fbd
    Chao Yu authored
     different competitors
    
    Since we use different page cache (normally inode's page cache for R/W
    and meta inode's page cache for GC) to cache the same physical block
    which is belong to an encrypted inode. Writeback of these two page
    cache should be exclusive, but now we didn't handle writeback state
    well, so there may be potential racing problem:
    
    a)
    kworker:				f2fs_gc:
     - f2fs_write_data_pages
      - f2fs_write_data_page
       - do_write_data_page
        - write_data_page
         - f2fs_submit_page_mbio
    (page#1 in inode's page cache was queued
    in f2fs bio cache, and be ready to write
    to new blkaddr)
    					 - gc_data_segment
    					  - move_encrypted_block
    					   - pagecache_get_page
    					(page#2 in meta inode's page cache
    					was cached with the invalid datas
    					of physical block located in new
    					blkaddr)
    					   - f2fs_submit_page_mbio
    					(page#1 was submitted, later, page#2
    					with invalid data will be submitted)
    
    b)
    f2fs_gc:
     - gc_data_segment
      - move_encrypted_block
       - f2fs_submit_page_mbio
    (page#1 in meta inode's page cache was
    queued in f2fs bio cache, and be ready
    to write to new blkaddr)
    					user thread:
    					 - f2fs_write_begin
    					  - f2fs_submit_page_bio
    					(we submit the request to block layer
    					to update page#2 in inode's page cache
    					with physical block located in new
    					blkaddr, so here we may read gabbage
    					data from new blkaddr since GC hasn't
    					writebacked the page#1 yet)
    
    This patch fixes above potential racing problem for encrypted inode.
    Signed-off-by: default avatarChao Yu <chao2.yu@samsung.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    08b39fbd
gc.c 21.7 KB