• Chao Yu's avatar
    f2fs: fix to avoid data update racing between GC and DIO · 82e0a5aa
    Chao Yu authored
    Datas in file can be operated by GC and DIO simultaneously, so we will
    face race case as below:
    
    For write case:
    Thread A				Thread B
    - generic_file_direct_write
     - invalidate_inode_pages2_range
     - f2fs_direct_IO
      - do_blockdev_direct_IO
       - do_direct_IO
        - get_more_blocks
    					- f2fs_gc
    					 - do_garbage_collect
    					  - gc_data_segment
    					   - move_data_page
    					    - do_write_data_page
    					    migrate data block to new block address
       - dio_bio_submit
       update user data to old block address
    
    For read case:
    Thread A                                Thread B
    - generic_file_direct_write
     - invalidate_inode_pages2_range
     - f2fs_direct_IO
      - do_blockdev_direct_IO
       - do_direct_IO
        - get_more_blocks
    					- f2fs_balance_fs
    					 - f2fs_gc
    					  - do_garbage_collect
    					   - gc_data_segment
    					    - move_data_page
    					     - do_write_data_page
    					     migrate data block to new block address
    					  - write_checkpoint
    					   - do_checkpoint
    					    - clear_prefree_segments
    					     - f2fs_issue_discard
                                                 discard old block adress
       - dio_bio_submit
       update user buffer from obsolete block address
    
    In order to fix this, for one file, we should let DIO and GC getting exclusion
    against with each other.
    Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    82e0a5aa
super.c 52.3 KB