[Ocfs2-tools-devel] [PATCH] Fix alloc_cluster to allocate the best size cluster

Goldwyn Rodrigues rgoldwyn at gmail.com
Mon Nov 22 19:47:04 PST 2010


alloc_clusters (alloc_range_func) currently scans all bitmap regions.
However, if it finds a cluster smaller than requested, it stops and
returns the allocation, instead of checking the rest of the bitmap
regions to check for a better cluster.

This fix checks the rest of the bitmap regions to find the best
possible cluster allocation.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn at suse.de>
---
diff --git a/libocfs2/bitmap.c b/libocfs2/bitmap.c
index e26bebb..b6ea9a8 100644
--- a/libocfs2/bitmap.c
+++ b/libocfs2/bitmap.c
@@ -650,8 +650,9 @@ struct alloc_range_args {
 	ocfs2_bitmap	*ar_bitmap;
 	uint64_t	ar_min_len;
 	uint64_t	ar_len;
-	uint64_t	ar_first_bit;
-	uint64_t	ar_bits_found;
+	struct ocfs2_bitmap_region *ar_br;
+	int 		ar_start;
+	int		ar_end;
 	errcode_t	ar_ret;
 };

@@ -663,11 +664,10 @@ static errcode_t alloc_range_func(struct
ocfs2_bitmap_region *br,
 {
 	struct alloc_range_args *ar = private_data;
 	errcode_t ret = 0;
-	uint64_t best_start = UINT64_MAX, best_len = 0;
 	int start, end;

 	if ((br->br_valid_bits - br->br_set_bits) < ar->ar_min_len)
-		goto out;
+		return 0;

 	for (start = br->br_bitmap_start;
 	     start + ar->ar_min_len <= br->br_total_bits;) {
@@ -685,36 +685,26 @@ static errcode_t alloc_range_func(struct
ocfs2_bitmap_region *br,

 		/* We've found a region large enough to hold our max. */
 		if ((end - start) >= ar->ar_len) {
-			end = start + ar->ar_len;
-			goto found;
+			ar->ar_br = br;
+			ar->ar_start = start;
+			ar->ar_end = start + ar->ar_len;
+			ar->ar_ret = 0;
+			ret = OCFS2_ET_ITERATION_COMPLETE;
+			break;
 		}

-		if ((end - start) > best_len) {
-			best_len = end - start;
-			best_start = start;
+		/* check and collect best fit */
+		if (((end - start) > (ar->ar_end - ar->ar_start)) &&
+				((end - start) >= (ar->ar_min_len))) {
+			ar->ar_br = br;
+			ar->ar_start = start;
+			ar->ar_end = end;
+			ar->ar_ret = 0;
 		}

 		start = end + 1;
 	}

-	/* Nothing found at all */
-	if (best_start == UINT64_MAX || best_len < ar->ar_min_len)
-		goto out;
-
-	/* Best fit works */
-	start = best_start;
-	end = best_start + best_len;
-found:
-	ar->ar_first_bit = br->br_start_bit + start - br->br_bitmap_start;
-	ar->ar_bits_found = end - start;
-
-	for (; start < end; start++)
-		set_generic_shared(ar->ar_bitmap, br,
-				br->br_start_bit + start - br->br_bitmap_start);
-
-	ar->ar_ret = 0;
-	ret = OCFS2_ET_ITERATION_COMPLETE;
-out:
 	return ret;
 }

@@ -729,6 +719,9 @@ errcode_t
ocfs2_bitmap_alloc_range_generic(ocfs2_bitmap *bitmap,
 		.ar_bitmap = bitmap,
 		.ar_min_len = min_len,
 		.ar_len = len,
+		.ar_br = NULL,
+		.ar_start = 0,
+		.ar_end = 0,
 		.ar_ret = OCFS2_ET_BIT_NOT_FOUND,
 	};

@@ -738,8 +731,12 @@ errcode_t
ocfs2_bitmap_alloc_range_generic(ocfs2_bitmap *bitmap,
 		ret = ar.ar_ret;

 	if (ret == 0) {
-		*first_bit = ar.ar_first_bit;
-		*bits_found = ar.ar_bits_found;
+		int i = ar.ar_start;
+		for (; i < ar.ar_end; i++)
+			set_generic_shared(bitmap, ar.ar_br,
+					ar.ar_br->br_start_bit + i);
+		*first_bit = ar.ar_br->br_start_bit + ar.ar_start;
+		*bits_found = ar.ar_end - ar.ar_start;
 	}

 	return ret;

-- 
Goldwyn



More information about the Ocfs2-tools-devel mailing list