[PATCH 01/30] ocfs2: abstract the zero nlink or mode dinode check

From: Joseph Qi

Date: Thu Nov 05 2026 - 04:49:57 EST


ocfs2_validate_inode_block() open-codes the test for a dinode that has
no links or no mode. Fold the condition into a predicate so it reads
like the neighbouring ocfs2_dinode_has_*() helpers, and so the filecheck
variant can share it.

Reuse ocfs2_read_links_count() rather than testing i_links_count and
i_links_count_hi separately. OCFS2_LINKS_HI_SHIFT is 16 and both fields
are 16 bits wide, so the combined count is zero exactly when both raw
fields are zero.

The return code and the log message stay at the call site: filecheck
reports the same conditions with a different code and must not call
ocfs2_error().

No functional change intended.

Signed-off-by: Joseph Qi <joseph.qi@xxxxxxxxxxxxxxxxx>
---
fs/ocfs2/inode.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c
index 8bbebcafa7a1..bffd64e0a1c0 100644
--- a/fs/ocfs2/inode.c
+++ b/fs/ocfs2/inode.c
@@ -67,6 +67,11 @@ static int ocfs2_filecheck_validate_inode_block(struct super_block *sb,
static int ocfs2_filecheck_repair_inode_block(struct super_block *sb,
struct buffer_head *bh);

+static bool ocfs2_dinode_has_zero_nlink_or_mode(struct ocfs2_dinode *di)
+{
+ return !ocfs2_read_links_count(di) || !di->i_mode;
+}
+
static bool ocfs2_valid_inode_mode(umode_t mode)
{
return fs_umode_to_ftype(mode) != FT_UNKNOWN;
@@ -1481,7 +1486,7 @@ int ocfs2_validate_inode_block(struct super_block *sb,
goto bail;
}

- if ((!di->i_links_count && !di->i_links_count_hi) || !di->i_mode) {
+ if (ocfs2_dinode_has_zero_nlink_or_mode(di)) {
mlog(ML_ERROR, "Invalid dinode #%llu: "
"Corrupt state (nlink = %u or mode = %u) detected!\n",
(unsigned long long)bh->b_blocknr,
--
2.39.3