• Chao Yu's avatar
    f2fs: fix race condition in between free nid allocator/initializer · 30a61ddf
    Chao Yu authored
    In below concurrent case, allocated nid can be loaded into free nid cache
    and be allocated again.
    
    Thread A				Thread B
    - f2fs_create
     - f2fs_new_inode
      - alloc_nid
       - __insert_nid_to_list(ALLOC_NID_LIST)
    					- f2fs_balance_fs_bg
    					 - build_free_nids
    					  - __build_free_nids
    					   - scan_nat_page
    					    - add_free_nid
    					     - __lookup_nat_cache
     - f2fs_add_link
      - init_inode_metadata
       - new_inode_page
        - new_node_page
         - set_node_addr
     - alloc_nid_done
      - __remove_nid_from_list(ALLOC_NID_LIST)
    					     - __insert_nid_to_list(FREE_NID_LIST)
    
    This patch makes nat cache lookup and free nid list operation being atomical
    to avoid this race condition.
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    30a61ddf
node.c 66.5 KB