[Ocfs2-devel] [PATCH 1/2] ocfs2: return EROFS instead of BUG in ocfs2_insert_at_leaf.

Tao Ma tao.ma at oracle.com
Thu Jun 11 23:18:35 PDT 2009


As Mark's suggestion, change BUG to EROFS in ocfs2_insert_at_leaf.

Signed-off-by: Tao Ma <tao.ma at oracle.com>
---
 fs/ocfs2/alloc.c |   67 +++++++++++++++++++++++++++++++++---------------------
 1 files changed, 41 insertions(+), 26 deletions(-)

diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c
index 19e3a96..4ac408b 100644
--- a/fs/ocfs2/alloc.c
+++ b/fs/ocfs2/alloc.c
@@ -3648,12 +3648,12 @@ static void ocfs2_subtract_from_rec(struct super_block *sb,
  * list. If this leaf is part of an allocation tree, it is assumed
  * that the tree above has been prepared.
  */
-static void ocfs2_insert_at_leaf(struct ocfs2_extent_rec *insert_rec,
-				 struct ocfs2_extent_list *el,
-				 struct ocfs2_insert_type *insert,
-				 struct inode *inode)
+static int ocfs2_insert_at_leaf(struct ocfs2_extent_rec *insert_rec,
+				struct ocfs2_extent_list *el,
+				struct ocfs2_insert_type *insert,
+				struct inode *inode)
 {
-	int i = insert->ins_contig_index;
+	int ret = 0, i = insert->ins_contig_index;
 	unsigned int range;
 	struct ocfs2_extent_rec *rec;
 
@@ -3679,7 +3679,7 @@ static void ocfs2_insert_at_leaf(struct ocfs2_extent_rec *insert_rec,
 		}
 		le16_add_cpu(&rec->e_leaf_clusters,
 			     le16_to_cpu(insert_rec->e_leaf_clusters));
-		return;
+		goto out;
 	}
 
 	/*
@@ -3690,7 +3690,7 @@ static void ocfs2_insert_at_leaf(struct ocfs2_extent_rec *insert_rec,
 	     ocfs2_is_empty_extent(&el->l_recs[0]))) {
 		el->l_recs[0] = *insert_rec;
 		el->l_next_free_rec = cpu_to_le16(1);
-		return;
+		goto out;
 	}
 
 	/*
@@ -3703,23 +3703,28 @@ static void ocfs2_insert_at_leaf(struct ocfs2_extent_rec *insert_rec,
 			+ le16_to_cpu(rec->e_leaf_clusters);
 		BUG_ON(le32_to_cpu(insert_rec->e_cpos) < range);
 
-		mlog_bug_on_msg(le16_to_cpu(el->l_next_free_rec) >=
-				le16_to_cpu(el->l_count),
-				"inode %lu, depth %u, count %u, next free %u, "
-				"rec.cpos %u, rec.clusters %u, "
-				"insert.cpos %u, insert.clusters %u\n",
-				inode->i_ino,
-				le16_to_cpu(el->l_tree_depth),
-				le16_to_cpu(el->l_count),
-				le16_to_cpu(el->l_next_free_rec),
-				le32_to_cpu(el->l_recs[i].e_cpos),
-				le16_to_cpu(el->l_recs[i].e_leaf_clusters),
-				le32_to_cpu(insert_rec->e_cpos),
-				le16_to_cpu(insert_rec->e_leaf_clusters));
+		if (le16_to_cpu(el->l_next_free_rec) >=
+		    le16_to_cpu(el->l_count)) {
+			mlog(ML_ERROR, "l_next_free_rec > l_count, "
+			     "inode %lu, depth %u, count %u, next free %u, "
+			     "rec.cpos %u, rec.clusters %u, "
+			     "insert.cpos %u, insert.clusters %u\n",
+			     inode->i_ino,
+			     le16_to_cpu(el->l_tree_depth),
+			     le16_to_cpu(el->l_count),
+			     le16_to_cpu(el->l_next_free_rec),
+			     le32_to_cpu(el->l_recs[i].e_cpos),
+			     le16_to_cpu(el->l_recs[i].e_leaf_clusters),
+			     le32_to_cpu(insert_rec->e_cpos),
+			     le16_to_cpu(insert_rec->e_leaf_clusters));
+			ret = -EROFS;
+			goto out;
+		}
+
 		i++;
 		el->l_recs[i] = *insert_rec;
 		le16_add_cpu(&el->l_next_free_rec, 1);
-		return;
+		goto out;
 	}
 
 rotate:
@@ -3734,6 +3739,8 @@ rotate:
 	 * extent record, or by virtue of an l_next_rec < l_count.
 	 */
 	ocfs2_rotate_leaf(el, insert_rec);
+out:
+	return ret;
 }
 
 static void ocfs2_adjust_rightmost_records(struct inode *inode,
@@ -4006,10 +4013,14 @@ static int ocfs2_insert_path(struct inode *inode,
 						  path_leaf_bh(left_path));
 			if (ret)
 				mlog_errno(ret);
-	} else
-		ocfs2_insert_at_leaf(insert_rec, path_leaf_el(right_path),
-				     insert, inode);
-
+	} else {
+		ret = ocfs2_insert_at_leaf(insert_rec, path_leaf_el(right_path),
+					   insert, inode);
+		if (ret) {
+			mlog_errno(ret);
+			goto out;
+		}
+	}
 	ret = ocfs2_journal_dirty(handle, leaf_bh);
 	if (ret)
 		mlog_errno(ret);
@@ -4054,7 +4065,11 @@ static int ocfs2_do_insert_extent(struct inode *inode,
 	}
 
 	if (le16_to_cpu(el->l_tree_depth) == 0) {
-		ocfs2_insert_at_leaf(insert_rec, el, type, inode);
+		ret = ocfs2_insert_at_leaf(insert_rec, el, type, inode);
+		if (ret) {
+			mlog_errno(ret);
+			goto out;
+		}
 		goto out_update_clusters;
 	}
 
-- 
1.6.2.rc2.16.gf474c




More information about the Ocfs2-devel mailing list