[Ocfs2-tools-devel] [PATCH 3/7] libocfs2: ocfs2_chain_add_group() adds new groups to the next logical chain

Sunil Mushran sunil.mushran at oracle.com
Fri Mar 5 11:59:53 PST 2010


Teach ocfs2_chain_add_group() to add the new group to the appropriate chain.

Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com>
---
 libocfs2/chainalloc.c |   24 +++++++++++++++++-------
 1 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/libocfs2/chainalloc.c b/libocfs2/chainalloc.c
index 39170dd..4287f69 100644
--- a/libocfs2/chainalloc.c
+++ b/libocfs2/chainalloc.c
@@ -504,6 +504,7 @@ errcode_t ocfs2_chain_add_group(ocfs2_filesys *fs,
 	errcode_t ret;
 	uint64_t blkno = 0, old_blkno = 0;
 	uint32_t found;
+	uint16_t chain_num;
 	struct ocfs2_group_desc *gd;
 	char *buf = NULL;
 	struct ocfs2_chain_rec *rec = NULL;
@@ -523,12 +524,21 @@ errcode_t ocfs2_chain_add_group(ocfs2_filesys *fs,
 	if (found != cinode->ci_inode->id2.i_chain.cl_cpg)
 		abort();
 
+	/* pick chain to add to */
+	if (cinode->ci_inode->id2.i_chain.cl_next_free_rec <
+	    cinode->ci_inode->id2.i_chain.cl_count)
+		chain_num = cinode->ci_inode->id2.i_chain.cl_next_free_rec;
+	else
+		chain_num = (cinode->ci_inode->i_clusters /
+			     cinode->ci_inode->id2.i_chain.cl_cpg) %
+			cinode->ci_inode->id2.i_chain.cl_count;
+
 	ocfs2_init_group_desc(fs, gd, blkno, fs->fs_super->i_fs_generation,
 			      cinode->ci_inode->i_blkno,
 			      cinode->ci_inode->id2.i_chain.cl_cpg *
-			      cinode->ci_inode->id2.i_chain.cl_bpc, 0);
+			      cinode->ci_inode->id2.i_chain.cl_bpc, chain_num);
 
-	rec = &cinode->ci_inode->id2.i_chain.cl_recs[0];
+	rec = &cinode->ci_inode->id2.i_chain.cl_recs[chain_num];
 	old_blkno = rec->c_blkno;
 	gd->bg_next_group = old_blkno;
 
@@ -547,15 +557,15 @@ errcode_t ocfs2_chain_add_group(ocfs2_filesys *fs,
 	cinode->ci_inode->id1.bitmap1.i_total += gd->bg_bits;
 	cinode->ci_inode->id1.bitmap1.i_used += gd->bg_bits -
 						gd->bg_free_bits_count;
-	if (cinode->ci_inode->id2.i_chain.cl_next_free_rec == 0)
-		cinode->ci_inode->id2.i_chain.cl_next_free_rec = 1;
+	if (cinode->ci_inode->id2.i_chain.cl_next_free_rec == chain_num)
+		cinode->ci_inode->id2.i_chain.cl_next_free_rec = chain_num + 1;
 
 	ret = ocfs2_write_cached_inode(fs, cinode);
 	if (ret)
 		goto out;
 
 	/* XXX this is probably too clever by half */ 
-	ret = chainalloc_process_group(fs, blkno, 0, cinode->ci_chains);
+	ret = chainalloc_process_group(fs, blkno, chain_num, cinode->ci_chains);
 	if (ret) {
 		ret = cb->cb_errcode;
 		goto out;
@@ -579,9 +589,9 @@ out:
 		cinode->ci_inode->id1.bitmap1.i_total -= gd->bg_bits;
 		cinode->ci_inode->id1.bitmap1.i_used -= gd->bg_bits -
 							gd->bg_free_bits_count;
-		if (cinode->ci_inode->id2.i_chain.cl_next_free_rec == 1 &&
+		if (cinode->ci_inode->id2.i_chain.cl_next_free_rec == (chain_num + 1) &&
 		    old_blkno == 0)
-			cinode->ci_inode->id2.i_chain.cl_next_free_rec = 0;
+			cinode->ci_inode->id2.i_chain.cl_next_free_rec = chain_num;
 
 		ocfs2_write_cached_inode(fs, cinode);
 	}
-- 
1.6.3.3




More information about the Ocfs2-tools-devel mailing list