diff options
author | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2014-01-16 16:20:40 +0900 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2014-01-16 16:20:40 +0900 |
commit | c33ec32692e1f2f4650f7bf5bb1108bb346b82a4 (patch) | |
tree | 166872644e29367c281e6d0a10e86eb5f39f8a72 /fs/f2fs/data.c | |
parent | 499046ab2c256c4b239cf389ff48e0c7478f3061 (diff) | |
download | linux-c33ec32692e1f2f4650f7bf5bb1108bb346b82a4.tar.gz |
f2fs: avoid f2fs_balance_fs call during pageout
This patch should resolve the following bug. ========================================================= [ INFO: possible irq lock inversion dependency detected ] 3.13.0-rc5.f2fs+ #6 Not tainted --------------------------------------------------------- kswapd0/41 just changed the state of lock: (&sbi->gc_mutex){+.+.-.}, at: [<ffffffffa030503e>] f2fs_balance_fs+0xae/0xd0 [f2fs] but this lock took another, RECLAIM_FS-READ-unsafe lock in the past: (&sbi->cp_rwsem){++++.?} and interrupts could create inverse lock ordering between them. other info that might help us debug this: Chain exists of: &sbi->gc_mutex --> &sbi->cp_mutex --> &sbi->cp_rwsem Possible interrupt unsafe locking scenario: CPU0 CPU1 ---- ---- lock(&sbi->cp_rwsem); local_irq_disable(); lock(&sbi->gc_mutex); lock(&sbi->cp_mutex); <Interrupt> lock(&sbi->gc_mutex); *** DEADLOCK *** This bug is due to the f2fs_balance_fs call in f2fs_write_data_page. If f2fs_write_data_page is triggered by wbc->for_reclaim via kswapd, it should not call f2fs_balance_fs which tries to get a mutex grabbed by original syscall flow. Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
Diffstat (limited to 'fs/f2fs/data.c')
-rw-r--r-- | fs/f2fs/data.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 19ad06694478..e57bde02e37f 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -842,8 +842,10 @@ write: else if (err) goto redirty_out; - if (wbc->for_reclaim) + if (wbc->for_reclaim) { f2fs_submit_merged_bio(sbi, DATA, WRITE); + need_balance_fs = false; + } clear_cold_data(page); out: |