diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c index fcc89856ab95..1b30bf336961 100644 --- a/fs/ocfs2/inode.c +++ b/fs/ocfs2/inode.c @@ -1502,7 +1502,22 @@ int ocfs2_validate_inode_block(struct super_block *sb, le16_to_cpu(di->i_suballoc_slot)); goto bail; } - + /* Validate cl_bpc for chain allocator inodes */ + if (le32_to_cpu(di->i_flags) & OCFS2_CHAIN_FL) { + struct ocfs2_super *osb = OCFS2_SB(sb); + struct ocfs2_chain_list *cl = &di->id2.i_chain; + u16 cl_bpc = le16_to_cpu(cl->cl_bpc); + u16 expected_bpc = 1 << (osb->s_clustersize_bits - + sb->s_blocksize_bits); + + if (cl_bpc != expected_bpc) { + rc = ocfs2_error(sb, + "Inode %llu has corrupted cl_bpc: ondisk=%u expected=%u\n", + (unsigned long long)bh->b_blocknr, + cl_bpc, expected_bpc); + goto bail; + } + } rc = 0; bail: