• LiFan's avatar
    f2fs: fix concurrent problem for updating free bitmap · 5921aaa1
    LiFan authored
    alloc_nid_failed and scan_nat_page can be called at the same time,
    and we haven't protected add_free_nid and update_free_nid_bitmap
    with the same nid_list_lock. That could lead to
    
    Thread A				Thread B
    - __build_free_nids
     - scan_nat_page
      - add_free_nid
    					- alloc_nid_failed
    					 - update_free_nid_bitmap
      - update_free_nid_bitmap
    
    scan_nat_page will clear the free bitmap since the nid is PREALLOC_NID,
    but alloc_nid_failed needs to set the free bitmap. This results in
    free nid with free bitmap cleared.
    This patch update the bitmap under the same nid_list_lock in add_free_nid.
    And use __GFP_NOFAIL to make sure to update status of free nid correctly.
    Signed-off-by: default avatarFan li <fanofcode.li@samsung.com>
    Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    5921aaa1
node.c 67.7 KB