aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ocfs2/alloc.c
diff options
context:
space:
mode:
authorJoel Becker <joel.becker@oracle.com>2008-11-13 17:49:12 -0500
committerMark Fasheh <mfasheh@suse.com>2009-01-05 11:36:52 -0500
commit10995aa2451afa20b721cc7de856cae1a13dba57 (patch)
tree63129e7d752fb018dc76aa42de136baa4a8a4232 /fs/ocfs2/alloc.c
parentb657c95c11088d77fc1bfc9c84d940f778bf9d12 (diff)
ocfs2: Morph the haphazard OCFS2_IS_VALID_DINODE() checks.
Random places in the code would check a dinode bh to see if it was valid. Not only did they do different levels of validation, they handled errors in different ways. The previous commit unified inode block reads, validating all block reads in the same place. Thus, these haphazard checks are no longer necessary. Rather than eliminate them, however, we change them to BUG_ON() checks. This ensures the assumptions remain true. All of the code paths to these checks have been audited to ensure they come from a validated inode read. Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mfasheh@suse.com>
Diffstat (limited to 'fs/ocfs2/alloc.c')
-rw-r--r--fs/ocfs2/alloc.c50
1 files changed, 21 insertions, 29 deletions
diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c
index 9c598adc9475..320545b9fe12 100644
--- a/fs/ocfs2/alloc.c
+++ b/fs/ocfs2/alloc.c
@@ -187,20 +187,12 @@ static int ocfs2_dinode_insert_check(struct inode *inode,
187static int ocfs2_dinode_sanity_check(struct inode *inode, 187static int ocfs2_dinode_sanity_check(struct inode *inode,
188 struct ocfs2_extent_tree *et) 188 struct ocfs2_extent_tree *et)
189{ 189{
190 int ret = 0; 190 struct ocfs2_dinode *di = et->et_object;
191 struct ocfs2_dinode *di;
192 191
193 BUG_ON(et->et_ops != &ocfs2_dinode_et_ops); 192 BUG_ON(et->et_ops != &ocfs2_dinode_et_ops);
193 BUG_ON(!OCFS2_IS_VALID_DINODE(di));
194 194
195 di = et->et_object; 195 return 0;
196 if (!OCFS2_IS_VALID_DINODE(di)) {
197 ret = -EIO;
198 ocfs2_error(inode->i_sb,
199 "Inode %llu has invalid path root",
200 (unsigned long long)OCFS2_I(inode)->ip_blkno);
201 }
202
203 return ret;
204} 196}
205 197
206static void ocfs2_dinode_fill_root_el(struct ocfs2_extent_tree *et) 198static void ocfs2_dinode_fill_root_el(struct ocfs2_extent_tree *et)
@@ -5380,13 +5372,13 @@ int ocfs2_truncate_log_append(struct ocfs2_super *osb,
5380 start_cluster = ocfs2_blocks_to_clusters(osb->sb, start_blk); 5372 start_cluster = ocfs2_blocks_to_clusters(osb->sb, start_blk);
5381 5373
5382 di = (struct ocfs2_dinode *) tl_bh->b_data; 5374 di = (struct ocfs2_dinode *) tl_bh->b_data;
5383 tl = &di->id2.i_dealloc;
5384 if (!OCFS2_IS_VALID_DINODE(di)) {
5385 OCFS2_RO_ON_INVALID_DINODE(osb->sb, di);
5386 status = -EIO;
5387 goto bail;
5388 }
5389 5375
5376 /* tl_bh is loaded from ocfs2_truncate_log_init(). It's validated
5377 * by the underlying call to ocfs2_read_inode_block(), so any
5378 * corruption is a code bug */
5379 BUG_ON(!OCFS2_IS_VALID_DINODE(di));
5380
5381 tl = &di->id2.i_dealloc;
5390 tl_count = le16_to_cpu(tl->tl_count); 5382 tl_count = le16_to_cpu(tl->tl_count);
5391 mlog_bug_on_msg(tl_count > ocfs2_truncate_recs_per_inode(osb->sb) || 5383 mlog_bug_on_msg(tl_count > ocfs2_truncate_recs_per_inode(osb->sb) ||
5392 tl_count == 0, 5384 tl_count == 0,
@@ -5536,13 +5528,13 @@ int __ocfs2_flush_truncate_log(struct ocfs2_super *osb)
5536 BUG_ON(mutex_trylock(&tl_inode->i_mutex)); 5528 BUG_ON(mutex_trylock(&tl_inode->i_mutex));
5537 5529
5538 di = (struct ocfs2_dinode *) tl_bh->b_data; 5530 di = (struct ocfs2_dinode *) tl_bh->b_data;
5539 tl = &di->id2.i_dealloc;
5540 if (!OCFS2_IS_VALID_DINODE(di)) {
5541 OCFS2_RO_ON_INVALID_DINODE(osb->sb, di);
5542 status = -EIO;
5543 goto out;
5544 }
5545 5531
5532 /* tl_bh is loaded from ocfs2_truncate_log_init(). It's validated
5533 * by the underlying call to ocfs2_read_inode_block(), so any
5534 * corruption is a code bug */
5535 BUG_ON(!OCFS2_IS_VALID_DINODE(di));
5536
5537 tl = &di->id2.i_dealloc;
5546 num_to_flush = le16_to_cpu(tl->tl_used); 5538 num_to_flush = le16_to_cpu(tl->tl_used);
5547 mlog(0, "Flush %u records from truncate log #%llu\n", 5539 mlog(0, "Flush %u records from truncate log #%llu\n",
5548 num_to_flush, (unsigned long long)OCFS2_I(tl_inode)->ip_blkno); 5540 num_to_flush, (unsigned long long)OCFS2_I(tl_inode)->ip_blkno);
@@ -5697,13 +5689,13 @@ int ocfs2_begin_truncate_log_recovery(struct ocfs2_super *osb,
5697 } 5689 }
5698 5690
5699 di = (struct ocfs2_dinode *) tl_bh->b_data; 5691 di = (struct ocfs2_dinode *) tl_bh->b_data;
5700 tl = &di->id2.i_dealloc;
5701 if (!OCFS2_IS_VALID_DINODE(di)) {
5702 OCFS2_RO_ON_INVALID_DINODE(tl_inode->i_sb, di);
5703 status = -EIO;
5704 goto bail;
5705 }
5706 5692
5693 /* tl_bh is loaded from ocfs2_get_truncate_log_info(). It's
5694 * validated by the underlying call to ocfs2_read_inode_block(),
5695 * so any corruption is a code bug */
5696 BUG_ON(!OCFS2_IS_VALID_DINODE(di));
5697
5698 tl = &di->id2.i_dealloc;
5707 if (le16_to_cpu(tl->tl_used)) { 5699 if (le16_to_cpu(tl->tl_used)) {
5708 mlog(0, "We'll have %u logs to recover\n", 5700 mlog(0, "We'll have %u logs to recover\n",
5709 le16_to_cpu(tl->tl_used)); 5701 le16_to_cpu(tl->tl_used));