linux/fs/f2fs
Chao Yu 2b60311dd1 f2fs: fix summary info corruption
Sometimes, after running generic/270 of fstest, fsck reports summary
info and actual position of block address in direct node becoming
inconsistent.

The root cause is race in between __f2fs_replace_block and change_curseg
as below:

Thread A				Thread B
- __clone_blkaddrs
 - f2fs_replace_block
  - __f2fs_replace_block
   - segnoA = GET_SEGNO(sbi, blkaddrA);
   - type = se->type:=CURSEG_HOT_DATA
   - if (!IS_CURSEG(sbi, segnoA))
         type = CURSEG_WARM_DATA
					- allocate_data_block
					 - allocate_segment
					  - get_ssr_segment
					  - change_curseg(segnoA, CURSEG_HOT_DATA)
   - change_curseg(segnoA, CURSEG_WARM_DATA)
    - reset_curseg
     - __set_sit_entry_type
      - change se->type from CURSEG_HOT_DATA to CURSEG_WARM_DATA

So finally, hot curseg locates in segnoA, but type of segnoA becomes
CURSEG_WARM_DATA.

Then if we invoke __f2fs_replace_block(blkaddrB, blkaddrA, true, false),
as blkaddrA locates in segnoA, so we will move warm type curseg to segnoA,
then change its summary cache and writeback it to summary block.

But segnoA is used by hot type curseg too, once it moves or persist, it
will cover summary block content with inner old summary cache, result in
inconsistent status.

This patch tries to fix this issue by introduce global curseg lock to avoid
race in between __f2fs_replace_block and change_curseg.

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2017-11-05 16:42:08 -08:00
..
acl.c f2fs: stop all the operations by cp_error flag 2017-11-05 16:41:43 -08:00
acl.h f2fs: remove dead code f2fs_check_acl 2016-09-14 16:52:36 -07:00
checkpoint.c f2fs: remove unneeded semicolon 2017-11-05 16:42:06 -08:00
data.c f2fs: support bio allocation error injection 2017-11-05 16:41:55 -08:00
debug.c f2fs: show current cp state 2017-11-05 16:41:49 -08:00
dir.c f2fs: update ctx->pos correctly when hitting hole in directory 2017-10-26 10:44:20 +02:00
extent_cache.c f2fs: fix a bug caused by NULL extent tree 2017-05-23 21:07:18 -07:00
f2fs.h f2fs: fix summary info corruption 2017-11-05 16:42:08 -08:00
file.c f2fs: stop all the operations by cp_error flag 2017-11-05 16:41:43 -08:00
gc.c f2fs: use rw_semaphore to protect SIT cache 2017-11-05 16:42:03 -08:00
gc.h f2fs: fix potential overflow when adjusting GC cycle 2017-08-15 10:40:14 -07:00
hash.c f2fs: check entire encrypted bigname when finding a dentry 2017-05-04 11:44:35 -04:00
inline.c f2fs: enhance multiple device flush 2017-10-10 12:49:53 -07:00
inode.c f2fs: support flexible inline xattr size 2017-11-05 16:41:50 -08:00
Kconfig f2fs: add mount option to select fault injection ratio 2016-05-07 10:32:22 -07:00
Makefile f2fs: move sysfs code from super.c to fs/f2fs/sysfs.c 2017-07-04 02:11:45 -07:00
namei.c f2fs: support flexible inline xattr size 2017-11-05 16:41:50 -08:00
node.c f2fs: optimize __update_nat_bits 2017-11-05 16:42:00 -08:00
node.h f2fs: limit # of inmemory pages 2017-10-26 10:44:21 +02:00
recovery.c f2fs: support quota sys files 2017-11-05 16:42:02 -08:00
segment.c f2fs: fix summary info corruption 2017-11-05 16:42:08 -08:00
segment.h f2fs: check curseg space before foreground GC 2017-11-05 16:42:04 -08:00
shrinker.c f2fs: obsolete ALLOC_NID_LIST list 2017-10-10 12:49:53 -07:00
super.c f2fs: don't bother with inode->i_version 2017-11-05 16:42:05 -08:00
sysfs.c f2fs: add quota_ino feature infra 2017-11-05 16:42:01 -08:00
trace.c f2fs: use set_page_private marcro in f2fs_trace_pid 2017-03-24 15:10:49 -04:00
trace.h f2fs: add sbi and page pointer in f2fs_io_info 2015-05-28 15:41:32 -07:00
xattr.c f2fs: handle error case when adding xattr entry 2017-11-05 16:41:51 -08:00
xattr.h f2fs: guard macro variables with braces 2017-04-10 19:48:10 -07:00