OSDN Git Service

f2fs: support in-memory inode checksum when checking consistency
authorWeichao Guo <guoweichao@huawei.com>
Fri, 9 Mar 2018 15:10:21 +0000 (23:10 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Fri, 27 Jul 2018 09:03:59 +0000 (18:03 +0900)
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>
fs/f2fs/inode.c
fs/f2fs/node.c
fs/f2fs/node.h

index f91dd01..ec672c7 100644 (file)
@@ -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)
index 1061dd1..3d12409 100644 (file)
@@ -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);
index b95e49e..8f34bdf 100644 (file)
@@ -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)