[Ocfs2-tools-commits] jlbec commits r410 - trunk/libocfs2

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Thu Nov 18 16:00:09 CST 2004


Author: jlbec
Date: 2004-11-18 16:00:07 -0600 (Thu, 18 Nov 2004)
New Revision: 410

Modified:
   trunk/libocfs2/chainalloc.c
Log:
I think I got this chain allocator scaling thing down

Modified: trunk/libocfs2/chainalloc.c
===================================================================
--- trunk/libocfs2/chainalloc.c	2004-11-18 21:31:07 UTC (rev 409)
+++ trunk/libocfs2/chainalloc.c	2004-11-18 22:00:07 UTC (rev 410)
@@ -67,6 +67,20 @@
 	ocfs2_free(&bitmap->b_private);
 }
 
+static uint64_t chainalloc_scale_start_bit(ocfs2_filesys *fs,
+					   uint64_t blkno,
+					   int bpc)
+{
+	int bitsize = fs->fs_clustersize / bpc;
+
+	if (bitsize == fs->fs_blocksize)
+		return blkno;
+	if (bitsize < fs->fs_blocksize)
+		return blkno * (fs->fs_blocksize / bitsize);
+	else
+		return blkno / (bitsize / fs->fs_blocksize);
+}
+
 static int chainalloc_process_group(ocfs2_filesys *fs,
 				    uint64_t gd_blkno,
 				    int chain_num,
@@ -76,6 +90,7 @@
 	struct ocfs2_bitmap_region *br;
 	struct chainalloc_bitmap_private *cb = bitmap->b_private;
 	struct chainalloc_region_private *cr;
+	uint64_t start_bit;
 	char *gd_buf;
 
 	cb->cb_errcode = ocfs2_malloc_block(fs->fs_io, &gd_buf);
@@ -101,8 +116,10 @@
 	if (gd_blkno == OCFS2_RAW_SB(fs->fs_super)->s_first_cluster_group)
 		gd_blkno = 0;
 
+	start_bit = chainalloc_scale_start_bit(fs, gd_blkno,
+					       cb->cb_cinode->ci_inode->id2.i_chain.cl_bpc);
 	cb->cb_errcode = ocfs2_bitmap_alloc_region(bitmap,
-						   gd_blkno,
+						   start_bit,
 						   cr->cr_ag->bg_bits,
 						   &br);
 	if (cb->cb_errcode)
@@ -243,6 +260,7 @@
 
 static errcode_t ocfs2_chainalloc_bitmap_new(ocfs2_filesys *fs,
 					     const char *description,
+					     uint64_t total_bits,
 					     ocfs2_bitmap **ret_bitmap)
 {
 	errcode_t ret;
@@ -255,7 +273,7 @@
 		return ret;
 
 	ret = ocfs2_bitmap_new(fs,
-			       fs->fs_blocks,
+			       total_bits,
 			       description ? description :
 			       "Generic chain allocator bitmap",
 			       &chainalloc_bitmap_ops,
@@ -281,14 +299,19 @@
 				     ocfs2_cached_inode *cinode)
 {
 	errcode_t ret;
+	uint64_t total_bits;
 	char name[256];
 
 	if (cinode->ci_chains)
 		ocfs2_bitmap_free(cinode->ci_chains);
 
+	total_bits = fs->fs_clusters *
+		cinode->ci_inode->id2.i_chain.cl_bpc;
+
 	snprintf(name, sizeof(name),
 		 "Chain allocator inode %"PRIu64, cinode->ci_blkno);
-	ret = ocfs2_chainalloc_bitmap_new(fs, name, &cinode->ci_chains);
+	ret = ocfs2_chainalloc_bitmap_new(fs, name, total_bits,
+					  &cinode->ci_chains);
 	if (ret)
 		return ret;
 



More information about the Ocfs2-tools-commits mailing list