mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
f2fs: support in-memory inode checksum when checking consistency
Enable in-memory inode checksum to protect metadata blocks from in-memory scribbles when checking consistency, which has no performance requirements. Signed-off-by: Weichao Guo <guoweichao@huawei.com> Reviewed-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
4e423832a6
commit
54c55c4e4f
@ -162,8 +162,12 @@ bool f2fs_inode_chksum_verify(struct f2fs_sb_info *sbi, struct page *page)
|
||||
if (unlikely(is_sbi_flag_set(sbi, SBI_IS_SHUTDOWN)))
|
||||
return true;
|
||||
|
||||
#ifdef CONFIG_F2FS_CHECK_FS
|
||||
if (!f2fs_enable_inode_chksum(sbi, page))
|
||||
#else
|
||||
if (!f2fs_enable_inode_chksum(sbi, page) ||
|
||||
PageDirty(page) || PageWriteback(page))
|
||||
#endif
|
||||
return true;
|
||||
|
||||
ri = &F2FS_NODE(page)->i;
|
||||
@ -477,6 +481,10 @@ void f2fs_update_inode(struct inode *inode, struct page *node_page)
|
||||
F2FS_I(inode)->i_disk_time[1] = timespec64_to_timespec(inode->i_ctime);
|
||||
F2FS_I(inode)->i_disk_time[2] = timespec64_to_timespec(inode->i_mtime);
|
||||
F2FS_I(inode)->i_disk_time[3] = F2FS_I(inode)->i_crtime;
|
||||
|
||||
#ifdef CONFIG_F2FS_CHECK_FS
|
||||
f2fs_inode_chksum_set(F2FS_I_SB(inode), node_page);
|
||||
#endif
|
||||
}
|
||||
|
||||
void f2fs_update_inode_page(struct inode *inode)
|
||||
|
@ -1141,8 +1141,12 @@ static int read_node_page(struct page *page, int op_flags)
|
||||
.encrypted_page = NULL,
|
||||
};
|
||||
|
||||
if (PageUptodate(page))
|
||||
if (PageUptodate(page)) {
|
||||
#ifdef CONFIG_F2FS_CHECK_FS
|
||||
f2fs_bug_on(sbi, !f2fs_inode_chksum_verify(sbi, page));
|
||||
#endif
|
||||
return LOCKED_PAGE;
|
||||
}
|
||||
|
||||
f2fs_get_node_info(sbi, page->index, &ni);
|
||||
|
||||
@ -1775,6 +1779,10 @@ static int f2fs_set_node_page_dirty(struct page *page)
|
||||
|
||||
if (!PageUptodate(page))
|
||||
SetPageUptodate(page);
|
||||
#ifdef CONFIG_F2FS_CHECK_FS
|
||||
if (IS_INODE(page))
|
||||
f2fs_inode_chksum_set(F2FS_P_SB(page), page);
|
||||
#endif
|
||||
if (!PageDirty(page)) {
|
||||
__set_page_dirty_nobuffers(page);
|
||||
inc_page_count(F2FS_P_SB(page), F2FS_DIRTY_NODES);
|
||||
|
@ -444,6 +444,10 @@ static inline void set_mark(struct page *page, int mark, int type)
|
||||
else
|
||||
flag &= ~(0x1 << type);
|
||||
rn->footer.flag = cpu_to_le32(flag);
|
||||
|
||||
#ifdef CONFIG_F2FS_CHECK_FS
|
||||
f2fs_inode_chksum_set(F2FS_P_SB(page), page);
|
||||
#endif
|
||||
}
|
||||
#define set_dentry_mark(page, mark) set_mark(page, mark, DENT_BIT_SHIFT)
|
||||
#define set_fsync_mark(page, mark) set_mark(page, mark, FSYNC_BIT_SHIFT)
|
||||
|
Loading…
Reference in New Issue
Block a user