• Chao Yu's avatar
    f2fs: compress: fix potential deadlock · 3afae09f
    Chao Yu authored
    generic/269 reports a hangtask issue, the root cause is ABBA deadlock
    described as below:
    
    Thread A			Thread B
    - down_write(&sbi->gc_lock) -- A
    				- f2fs_write_data_pages
    				 - lock all pages in cluster -- B
    				 - f2fs_write_multi_pages
    				  - f2fs_write_raw_pages
    				   - f2fs_write_single_data_page
    				    - f2fs_balance_fs
    				     - down_write(&sbi->gc_lock) -- A
    - f2fs_gc
     - do_garbage_collect
      - ra_data_block
       - pagecache_get_page -- B
    
    To fix this, it needs to avoid calling f2fs_balance_fs() if there is
    still cluster pages been locked in context of cluster writeback, so
    instead, let's call f2fs_balance_fs() in the end of
    f2fs_write_raw_pages() when all cluster pages were unlocked.
    
    Fixes: 4c8ff709 ("f2fs: support data compression")
    Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    3afae09f
compress.c 41.1 KB