linux/fs/f2fs
Jin Xu a569469e96 f2fs: fix a deadlock in fsync
This patch fixes a deadlock bug that occurs quite often when there are
concurrent write and fsync on a same file.

Following is the simplified call trace when tasks get hung.

fsync thread:
- f2fs_sync_file
 ...
 - f2fs_write_data_pages
 ...
  - update_extent_cache
  ...
   - update_inode
    - wait_on_page_writeback

bdi writeback thread
- __writeback_single_inode
 - f2fs_write_data_pages
  - mutex_lock(sbi->writepages)

The deadlock happens when the fsync thread waits on a inode page that has
been added to the f2fs' cached bio sbi->bio[NODE], and unfortunately,
no one else could be able to submit the cached bio to block layer for
writeback. This is because the fsync thread already hold a sbi->fs_lock and
the sbi->writepages lock, causing the bdi thread being blocked when attempt
to write data pages for the same inode. At the same time, f2fs_gc thread
does not notice the situation and could not help. Even the sync syscall
gets blocked.

To fix it, we could submit the cached bio first before waiting on a inode page
that is being written back.

Signed-off-by: Jin Xu <jinuxstyle@gmail.com>
[Jaegeuk Kim: add more cases to use f2fs_wait_on_page_writeback]
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2013-08-06 22:00:36 +09:00
..
acl.c f2fs: support xattr security labels 2013-06-11 16:01:03 +09:00
acl.h f2fs: adjust kernel coding style 2012-12-11 13:43:42 +09:00
checkpoint.c f2fs: fix handling orphan inodes 2013-07-30 15:17:03 +09:00
data.c f2fs: fix a deadlock in fsync 2013-08-06 22:00:36 +09:00
debug.c f2fs: use seq_puts()/seq_putc() rather than seq_printf() where possible 2013-07-30 15:17:03 +09:00
dir.c f2fs: fix handling orphan inodes 2013-07-30 15:17:03 +09:00
f2fs.h f2fs: fix a deadlock in fsync 2013-08-06 22:00:36 +09:00
file.c f2fs: fix i_name during f2fs_sync_file 2013-07-30 15:17:03 +09:00
gc.c f2fs: fix a deadlock in fsync 2013-08-06 22:00:36 +09:00
gc.h f2fs: add sysfs entries to select the gc policy 2013-08-06 22:00:18 +09:00
hash.c f2fs: unify string length declarations and usage 2012-12-28 11:27:53 +09:00
inode.c f2fs: fix a deadlock in fsync 2013-08-06 22:00:36 +09:00
Kconfig f2fs: support xattr security labels 2013-06-11 16:01:03 +09:00
Makefile f2fs: update Kconfig and Makefile 2012-12-11 13:43:42 +09:00
namei.c f2fs: fix handling orphan inodes 2013-07-30 15:17:03 +09:00
node.c f2fs: introduce help function F2FS_NODE() 2013-07-30 15:17:02 +09:00
node.h f2fs: introduce help function F2FS_NODE() 2013-07-30 15:17:02 +09:00
recovery.c f2fs: introduce help function F2FS_NODE() 2013-07-30 15:17:02 +09:00
segment.c f2fs: fix a deadlock in fsync 2013-08-06 22:00:36 +09:00
segment.h f2fs: modify the number of issued pages to merge IOs 2013-04-30 12:07:32 +09:00
super.c f2fs: add sysfs entries to select the gc policy 2013-08-06 22:00:18 +09:00
xattr.c f2fs: support xattr security labels 2013-06-11 16:01:03 +09:00
xattr.h f2fs: support xattr security labels 2013-06-11 16:01:03 +09:00