• Chao Yu's avatar
    f2fs: fix to account total free nid correctly · 04d47e67
    Chao Yu authored
    Thread A		Thread B		Thread C
    - f2fs_create
     - f2fs_new_inode
      - f2fs_lock_op
       - alloc_nid
        alloc last nid
      - f2fs_unlock_op
    			- f2fs_create
    			 - f2fs_new_inode
    			  - f2fs_lock_op
    			   - alloc_nid
    			    as node count still not
    			    be increased, we will
    			    loop in alloc_nid
    						- f2fs_write_node_pages
    						 - f2fs_balance_fs_bg
    						  - f2fs_sync_fs
    						   - write_checkpoint
    						    - block_operations
    						     - f2fs_lock_all
     - f2fs_lock_op
    
    While creating new inode, we do not allocate and account nid atomically,
    so that when there is almost no free nids left, we may encounter deadloop
    like above stack.
    
    In order to avoid that, reuse nm_i::available_nids for accounting free nids
    and make nid allocation and counting being atomical during node creation.
    Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    04d47e67
f2fs.h 75.9 KB