linux/fs/f2fs
Chao Yu 638164a271 f2fs: fix potential panic during fstrim
As Ju Hyung Park reported:

"When 'fstrim' is called for manual trim, a BUG() can be triggered
randomly with this patch.

I'm seeing this issue on both x86 Desktop and arm64 Android phone.

On x86 Desktop, this was caused during Ubuntu boot-up. I have a
cronjob installed which calls 'fstrim -v /' during boot. On arm64
Android, this was caused during GC looping with 1ms gc_min_sleep_time
& gc_max_sleep_time."

Root cause of this issue is that f2fs_wait_discard_bios can only be
used by f2fs_put_super, because during put_super there must be no
other referrers, so it can ignore discard entry's reference count
when removing the entry, otherwise in other caller we will hit bug_on
in __remove_discard_cmd as there may be other issuer added reference
count in discard entry.

Thread A				Thread B
					- issue_discard_thread
- f2fs_ioc_fitrim
 - f2fs_trim_fs
  - f2fs_wait_discard_bios
   - __issue_discard_cmd
    - __submit_discard_cmd
					 - __wait_discard_cmd
					  - dc->ref++
					  - __wait_one_discard_bio
   - __wait_discard_cmd
    - __remove_discard_cmd
     - f2fs_bug_on(sbi, dc->ref)

Fixes: 969d1b180d
Reported-by: Ju Hyung Park <qkrwngud825@gmail.com>
Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2017-10-03 08:06:05 -07:00
..
Kconfig
Makefile f2fs: move sysfs code from super.c to fs/f2fs/sysfs.c 2017-07-04 02:11:45 -07:00
acl.c f2fs: preserve i_mode if __f2fs_set_acl() fails 2017-07-28 17:48:54 -07:00
acl.h
checkpoint.c f2fs: support journalled quota 2017-08-21 15:54:48 -07:00
data.c for-f2fs-4.14 2017-09-12 20:05:58 -07:00
debug.c
dir.c f2fs: clear radix tree dirty tag of pages whose dirty flag is cleared 2017-09-11 21:32:38 -07:00
extent_cache.c
f2fs.h f2fs: fix potential panic during fstrim 2017-10-03 08:06:05 -07:00
file.c for-f2fs-4.14 2017-09-12 20:05:58 -07:00
gc.c f2fs: use generic terms used for encrypted block management 2017-09-05 20:21:48 -07:00
gc.h f2fs: fix potential overflow when adjusting GC cycle 2017-08-15 10:40:14 -07:00
hash.c
inline.c f2fs: clear radix tree dirty tag of pages whose dirty flag is cleared 2017-09-11 21:32:38 -07:00
inode.c f2fs: detect dirty inode in evict_inode 2017-09-12 10:02:39 -07:00
namei.c f2fs: update i_flags correctly 2017-09-05 10:50:21 -07:00
node.c f2fs: don't check inode's checksum if it was dirtied or writebacked 2017-09-05 10:50:11 -07:00
node.h f2fs: simplify the way of calulating next nat address 2017-07-04 02:11:34 -07:00
recovery.c f2fs: check hot_data for roll-forward recovery 2017-08-21 15:55:06 -07:00
segment.c f2fs: fix potential panic during fstrim 2017-10-03 08:06:05 -07:00
segment.h f2fs: speed up gc_urgent mode with SSR 2017-09-11 17:22:18 -07:00
shrinker.c
super.c f2fs: fix potential panic during fstrim 2017-10-03 08:06:05 -07:00
sysfs.c f2fs: fix to show correct discard_granularity in sysfs 2017-09-12 10:02:47 -07:00
trace.c
trace.h
xattr.c f2fs: avoid race in between read xattr & write xattr 2017-09-07 20:57:20 -07:00
xattr.h