diff options
| -rw-r--r-- | fs/ocfs2/inode.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c index 0f39ce0a2d46..8d6c106bcb98 100644 --- a/fs/ocfs2/inode.c +++ b/fs/ocfs2/inode.c @@ -1515,6 +1515,8 @@ int ocfs2_validate_inode_block(struct super_block *sb, if (le32_to_cpu(di->i_flags) & OCFS2_CHAIN_FL) { struct ocfs2_chain_list *cl = &di->id2.i_chain; + u16 bpc = 1 << (OCFS2_SB(sb)->s_clustersize_bits - + sb->s_blocksize_bits); if (le16_to_cpu(cl->cl_count) != ocfs2_chain_recs_per_inode(sb)) { rc = ocfs2_error(sb, "Invalid dinode %llu: chain list count %u\n", @@ -1528,6 +1530,14 @@ int ocfs2_validate_inode_block(struct super_block *sb, le16_to_cpu(cl->cl_next_free_rec)); goto bail; } + if (OCFS2_SB(sb)->bitmap_blkno && + OCFS2_SB(sb)->bitmap_blkno != le64_to_cpu(di->i_blkno) && + le16_to_cpu(cl->cl_bpc) != bpc) { + rc = ocfs2_error(sb, "Invalid dinode %llu: bits per cluster %u\n", + (unsigned long long)bh->b_blocknr, + le16_to_cpu(cl->cl_bpc)); + goto bail; + } } rc = 0; |
