OpenCloudOS-Kernel/fs/f2fs
Chao Yu ef2a007134 f2fs: fix to recover cold bit of inode block during POR
Testcase to reproduce this bug:
1. mkfs.f2fs /dev/sdd
2. mount -t f2fs /dev/sdd /mnt/f2fs
3. touch /mnt/f2fs/file
4. sync
5. chattr +A /mnt/f2fs/file
6. xfs_io -f /mnt/f2fs/file -c "fsync"
7. godown /mnt/f2fs
8. umount /mnt/f2fs
9. mount -t f2fs /dev/sdd /mnt/f2fs
10. chattr -A /mnt/f2fs/file
11. xfs_io -f /mnt/f2fs/file -c "fsync"
12. umount /mnt/f2fs
13. mount -t f2fs /dev/sdd /mnt/f2fs
14. lsattr /mnt/f2fs/file

-----------------N- /mnt/f2fs/file

But actually, we expect the corrct result is:

-------A---------N- /mnt/f2fs/file

The reason is in step 9) we missed to recover cold bit flag in inode
block, so later, in fsync, we will skip write inode block due to below
condition check, result in lossing data in another SPOR.

f2fs_fsync_node_pages()
	if (!IS_DNODE(page) || !is_cold_node(page))
		continue;

Note that, I guess that some non-dir inode has already lost cold bit
during POR, so in order to reenable recovery for those inode, let's
try to recover cold bit in f2fs_iget() to save more fsynced data.

Fixes: c56675750d ("f2fs: remove unneeded set_cold_node()")
Cc: <stable@vger.kernel.org> 4.17+
Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2018-10-16 09:36:59 -07:00
..
Kconfig fs/*/Kconfig: drop links to 404-compliant http://acl.bestbits.at 2018-01-01 12:45:37 -07:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
acl.c f2fs: add SPDX license identifiers 2018-09-12 13:07:10 -07:00
acl.h f2fs: add SPDX license identifiers 2018-09-12 13:07:10 -07:00
checkpoint.c f2fs: checkpoint disabling 2018-10-16 09:36:39 -07:00
data.c f2fs: checkpoint disabling 2018-10-16 09:36:39 -07:00
debug.c f2fs: checkpoint disabling 2018-10-16 09:36:39 -07:00
dir.c f2fs: add SPDX license identifiers 2018-09-12 13:07:10 -07:00
extent_cache.c f2fs: add SPDX license identifiers 2018-09-12 13:07:10 -07:00
f2fs.h f2fs: submit cached bio to avoid endless PageWriteback 2018-10-16 09:36:59 -07:00
file.c f2fs: checkpoint disabling 2018-10-16 09:36:39 -07:00
gc.c f2fs: submit cached bio to avoid endless PageWriteback 2018-10-16 09:36:59 -07:00
gc.h f2fs: add SPDX license identifiers 2018-09-12 13:07:10 -07:00
hash.c f2fs: add SPDX license identifiers 2018-09-12 13:07:10 -07:00
inline.c f2fs: add SPDX license identifiers 2018-09-12 13:07:10 -07:00
inode.c f2fs: fix to recover cold bit of inode block during POR 2018-10-16 09:36:59 -07:00
namei.c f2fs: checkpoint disabling 2018-10-16 09:36:39 -07:00
node.c f2fs: fix to recover cold bit of inode block during POR 2018-10-16 09:36:59 -07:00
node.h f2fs: add SPDX license identifiers 2018-09-12 13:07:10 -07:00
recovery.c f2fs: avoid f2fs_bug_on if f2fs_get_meta_page_nofail got EIO 2018-09-28 10:39:58 -07:00
segment.c f2fs: checkpoint disabling 2018-10-16 09:36:39 -07:00
segment.h f2fs: checkpoint disabling 2018-10-16 09:36:39 -07:00
shrinker.c f2fs: add SPDX license identifiers 2018-09-12 13:07:10 -07:00
super.c f2fs: checkpoint disabling 2018-10-16 09:36:39 -07:00
sysfs.c f2fs: support superblock checksum 2018-09-30 18:34:18 -07:00
trace.c f2fs: add SPDX license identifiers 2018-09-12 13:07:10 -07:00
trace.h f2fs: add SPDX license identifiers 2018-09-12 13:07:10 -07:00
xattr.c f2fs: add SPDX license identifiers 2018-09-12 13:07:10 -07:00
xattr.h f2fs: add SPDX license identifiers 2018-09-12 13:07:10 -07:00