f2fs: avoid f2fs_balance_fs call during pageout
authorJaegeuk Kim <jaegeuk.kim@samsung.com>
Thu, 16 Jan 2014 07:20:40 +0000 (16:20 +0900)
committerJaegeuk Kim <jaegeuk.kim@samsung.com>
Thu, 16 Jan 2014 07:20:40 +0000 (16:20 +0900)
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>
fs/f2fs/data.c

index 19ad0669447876afc5cdadc5bee82dd9a05a3952..e57bde02e37f662fc37253a82d07617d41fd6e7a 100644 (file)
@@ -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: