[Ocfs2-devel] [PATCH] ocfs2: detect chain loop in ocfs2_search_chain

Xue jiufei xuejiufei at huawei.com
Fri Dec 21 23:04:44 PST 2012


  Detects a chain loop by keeping a count of the descriptores read. 
If a loop is found, flag an error and set filesystem readonly.

Signed-off-by: xuejiufei <xuejiufei at huawei.com>
---
 fs/ocfs2/suballoc.c |   15 ++++++++++++++-
 1 files changed, 14 insertions(+), 1 deletions(-)

diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c
index f169da4..de1f947 100644
--- a/fs/ocfs2/suballoc.c
+++ b/fs/ocfs2/suballoc.c
@@ -1742,7 +1742,7 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac,
 			      u16 *bits_left)
 {
 	int status;
-	u16 chain;
+	u16 chain, num_gds, max_chain_len, chain_len = 0;
 	u64 next_group;
 	struct inode *alloc_inode = ac->ac_inode;
 	struct buffer_head *group_bh = NULL;
@@ -1751,6 +1751,10 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac,
 	struct ocfs2_chain_list *cl = (struct ocfs2_chain_list *) &fe->id2.i_chain;
 	struct ocfs2_group_desc *bg;
 
+	/* Calculate the max chain length */
+	num_gds = (fe->i_clusters + cl->cl_cpg) / cl->cl_cpg;
+	max_chain_len = (num_gds + cl->cl_count) / cl->cl_count;
+
 	chain = ac->ac_chain;
 	trace_ocfs2_search_chain_begin(
 		(unsigned long long)OCFS2_I(alloc_inode)->ip_blkno,
@@ -1775,6 +1779,15 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac,
 		if (!bg->bg_next_group)
 			break;
 
+		if (++chain_len > max_chain_len) {
+			ocfs2_error(alloc_inode->i_sb, "chain %d "
+					"exceeds the max chain length %d, group block (%llu)",
+					chain, max_chain_len,
+					(unsigned long long)group_bh->b_blocknr);
+			status = -EIO;
+			goto bail;
+		}
+
 		brelse(prev_group_bh);
 		prev_group_bh = NULL;
 
-- 
1.7.8.6



More information about the Ocfs2-devel mailing list