• Chao Yu's avatar
    f2fs: fix to avoid race in between atomic write and background GC · 1dc0f899
    Chao Yu authored
    Sqlite user			Background GC
    				- move_data_block
    				  : move page #1
    				 - f2fs_is_atomic_file
    - f2fs_ioc_start_atomic_write
    - f2fs_ioc_commit_atomic_write
     - commit_inmem_pages
       : commit page #1 & set node #2 dirty
    				 - f2fs_submit_page_write
    				  - f2fs_update_data_blkaddr
    				   - set_page_dirty
    				     : set node #2 dirty
     - f2fs_do_sync_file
      - fsync_node_pages
       : commit node #1 & node #2, then sudden power-cut
    
    In a race case, we may check FI_ATOMIC_FILE flag before starting atomic
    write flow, then we will commit meta data before data with reversed
    order, after a sudden pow-cut, database transaction will be inconsistent.
    
    So we'd better to exclude gc/atomic_write to each other by using lock
    instead of flag checking.
    Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    1dc0f899
file.c 69.3 KB