linux/fs/f2fs
Chao Yu a949dc5f2c f2fs: compress: fix race condition of overwrite vs truncate
pos_fsstress testcase complains a panic as belew:

------------[ cut here ]------------
kernel BUG at fs/f2fs/compress.c:1082!
invalid opcode: 0000 [#1] SMP PTI
CPU: 4 PID: 2753477 Comm: kworker/u16:2 Tainted: G           OE     5.12.0-rc1-custom #1
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014
Workqueue: writeback wb_workfn (flush-252:16)
RIP: 0010:prepare_compress_overwrite+0x4c0/0x760 [f2fs]
Call Trace:
 f2fs_prepare_compress_overwrite+0x5f/0x80 [f2fs]
 f2fs_write_cache_pages+0x468/0x8a0 [f2fs]
 f2fs_write_data_pages+0x2a4/0x2f0 [f2fs]
 do_writepages+0x38/0xc0
 __writeback_single_inode+0x44/0x2a0
 writeback_sb_inodes+0x223/0x4d0
 __writeback_inodes_wb+0x56/0xf0
 wb_writeback+0x1dd/0x290
 wb_workfn+0x309/0x500
 process_one_work+0x220/0x3c0
 worker_thread+0x53/0x420
 kthread+0x12f/0x150
 ret_from_fork+0x22/0x30

The root cause is truncate() may race with overwrite as below,
so that one reference count left in page can not guarantee the
page attaching in mapping tree all the time, after truncation,
later find_lock_page() may return NULL pointer.

- prepare_compress_overwrite
 - f2fs_pagecache_get_page
 - unlock_page
					- f2fs_setattr
					 - truncate_setsize
					  - truncate_inode_page
					   - delete_from_page_cache
 - find_lock_page

Fix this by avoiding referencing updated page.

Fixes: 4c8ff7095b ("f2fs: support data compression")
Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2021-05-11 14:48:12 -07:00
..
acl.c f2fs: clean up build warnings 2021-04-10 10:36:39 -07:00
acl.h fs: make helpers idmap mount aware 2021-01-24 14:27:20 +01:00
checkpoint.c f2fs-for-5.13-rc1 2021-05-04 18:03:38 -07:00
compress.c f2fs: compress: fix race condition of overwrite vs truncate 2021-05-11 14:48:12 -07:00
data.c f2fs-for-5.13-rc1 2021-05-04 18:03:38 -07:00
debug.c f2fs: clean up build warnings 2021-04-10 10:36:39 -07:00
dir.c f2fs-for-5.13-rc1 2021-05-04 18:03:38 -07:00
extent_cache.c f2fs: support 64-bits key in f2fs rb-tree node entry 2020-09-10 14:03:30 -07:00
f2fs.h f2fs-for-5.13-rc1 2021-05-04 18:03:38 -07:00
file.c f2fs: support iflag change given the mask 2021-05-11 14:48:11 -07:00
gc.c f2fs: clean up build warnings 2021-04-10 10:36:39 -07:00
gc.h f2fs: introduce gc_merge mount option 2021-03-30 18:48:56 -07:00
hash.c f2fs: Handle casefolding with Encryption 2020-12-02 22:00:21 -08:00
inline.c f2fs: fix a redundant call to f2fs_balance_fs if an error occurs 2021-03-12 13:16:44 -08:00
inode.c f2fs: clean up build warnings 2021-04-10 10:36:39 -07:00
Kconfig f2fs: compress: Allow modular (de)compression algorithms 2021-03-12 13:16:42 -08:00
Makefile f2fs: deprecate f2fs_trace_io 2021-01-27 15:20:07 -08:00
namei.c f2fs-for-5.13-rc1 2021-05-04 18:03:38 -07:00
node.c f2fs: clean up build warnings 2021-04-10 10:36:39 -07:00
node.h f2fs: allow to change discard policy based on cached discard cmds 2021-03-26 10:27:44 -07:00
recovery.c f2fs: clean up build warnings 2021-04-10 10:36:39 -07:00
segment.c f2fs: avoid null pointer access when handling IPU error 2021-05-11 14:48:07 -07:00
segment.h f2fs-for-5.13-rc1 2021-05-04 18:03:38 -07:00
shrinker.c f2fs: avoid race condition for shrinker count 2020-12-03 00:59:26 -08:00
super.c f2fs-for-5.13-rc1 2021-05-04 18:03:38 -07:00
sysfs.c f2fs: add sysfs nodes to get runtime compression stat 2021-03-25 18:20:50 -07:00
verity.c f2fs-for-5.13-rc1 2021-05-04 18:03:38 -07:00
xattr.c f2fs: clean up build warnings 2021-04-10 10:36:39 -07:00
xattr.h f2fs: code cleanup by removing ifdef macro surrounding 2020-05-26 18:56:10 -07:00