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:
@@ -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)))
|
if (unlikely(is_sbi_flag_set(sbi, SBI_IS_SHUTDOWN)))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
#ifdef CONFIG_F2FS_CHECK_FS
|
||||||
|
if (!f2fs_enable_inode_chksum(sbi, page))
|
||||||
|
#else
|
||||||
if (!f2fs_enable_inode_chksum(sbi, page) ||
|
if (!f2fs_enable_inode_chksum(sbi, page) ||
|
||||||
PageDirty(page) || PageWriteback(page))
|
PageDirty(page) || PageWriteback(page))
|
||||||
|
#endif
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
ri = &F2FS_NODE(page)->i;
|
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[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[2] = timespec64_to_timespec(inode->i_mtime);
|
||||||
F2FS_I(inode)->i_disk_time[3] = F2FS_I(inode)->i_crtime;
|
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)
|
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,
|
.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;
|
return LOCKED_PAGE;
|
||||||
|
}
|
||||||
|
|
||||||
f2fs_get_node_info(sbi, page->index, &ni);
|
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))
|
if (!PageUptodate(page))
|
||||||
SetPageUptodate(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)) {
|
if (!PageDirty(page)) {
|
||||||
__set_page_dirty_nobuffers(page);
|
__set_page_dirty_nobuffers(page);
|
||||||
inc_page_count(F2FS_P_SB(page), F2FS_DIRTY_NODES);
|
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
|
else
|
||||||
flag &= ~(0x1 << type);
|
flag &= ~(0x1 << type);
|
||||||
rn->footer.flag = cpu_to_le32(flag);
|
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_dentry_mark(page, mark) set_mark(page, mark, DENT_BIT_SHIFT)
|
||||||
#define set_fsync_mark(page, mark) set_mark(page, mark, FSYNC_BIT_SHIFT)
|
#define set_fsync_mark(page, mark) set_mark(page, mark, FSYNC_BIT_SHIFT)
|
||||||
|
|||||||
Reference in New Issue
Block a user