• Jaegeuk Kim's avatar
    f2fs: avoid deadlock during evict after f2fs_gc · 531ad7d5
    Jaegeuk Kim authored
    o Deadlock case #1
    
    Thread 1:
    - writeback_sb_inodes
     - do_writepages
      - f2fs_write_data_pages
       - write_cache_pages
        - f2fs_write_data_page
         - f2fs_balance_fs
          - wait mutex_lock(gc_mutex)
    
    Thread 2:
    - f2fs_balance_fs
     - mutex_lock(gc_mutex)
     - f2fs_gc
      - f2fs_iget
       - wait iget_locked(inode->i_lock)
    
    Thread 3:
    - do_unlinkat
     - iput
      - lock(inode->i_lock)
       - evict
        - inode_wait_for_writeback
    
    o Deadlock case #2
    
    Thread 1:
    - __writeback_single_inode
     : set I_SYNC
      - do_writepages
       - f2fs_write_data_page
        - f2fs_balance_fs
         - f2fs_gc
          - iput
           - evict
            - inode_wait_for_writeback(I_SYNC)
    
    In order to avoid this, even though iput is called with the zero-reference
    count, we need to stop the eviction procedure if the inode is on writeback.
    So this patch links f2fs_drop_inode which checks the I_SYNC flag.
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
    531ad7d5
data.c 17.7 KB