f2fs: detect more inconsistent cases in sanity_check_node_footer()

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 <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
Chao Yu 2026-01-12 15:49:17 +08:00 committed by Jaegeuk Kim
parent 50ac3ecd8e
commit 93ffb6c28f

View File

@ -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: