Let's enhance sanity_check_node_footer() to detect more inconsistent
cases as below:

Node Type                       Node Footer Info
===================             =============================
NODE_TYPE_REGULAR               inode = true and xnode = true
NODE_TYPE_INODE                 inode = false or xnode = true
NODE_TYPE_XATTR                 inode = true or xnode = false
NODE_TYPE_NON_INODE             inode = false

Signed-off-by: Chao Yu <[email protected]>
---
v5:
- split original patch 1/2 to two, in this patch, fix to not sanity check
on uninitialized i_mode for new inode page, instead, let's enhance
sanity_check_node_footer() to detect more inconsistent cases in node footer.
 fs/f2fs/node.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index e8b2618fcac7..c79af2bc5728 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -1515,20 +1515,29 @@ int f2fs_sanity_check_node_footer(struct f2fs_sb_info 
*sbi,
                                        struct folio *folio, pgoff_t nid,
                                        enum node_type ntype, bool in_irq)
 {
+       bool is_inode, is_xnode;
+
        if (unlikely(nid != nid_of_node(folio)))
                goto out_err;
 
+       is_inode = IS_INODE(folio);
+       is_xnode = f2fs_has_xattr_block(ofs_of_node(folio));
+
        switch (ntype) {
+       case NODE_TYPE_REGULAR:
+               if (is_inode && is_xnode)
+                       goto out_err;
+               break;
        case NODE_TYPE_INODE:
-               if (!IS_INODE(folio))
+               if (!is_inode || is_xnode)
                        goto out_err;
                break;
        case NODE_TYPE_XATTR:
-               if (!f2fs_has_xattr_block(ofs_of_node(folio)))
+               if (is_inode || !is_xnode)
                        goto out_err;
                break;
        case NODE_TYPE_NON_INODE:
-               if (IS_INODE(folio))
+               if (is_inode)
                        goto out_err;
                break;
        default:
-- 
2.40.1



_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to