[Ocfs2-tools-devel] [PATCH 1/4] defrag.ocfs2: Fix alloc_cluster to allocate best clusters

Goldwyn Rodrigues rgoldwyn at gmail.com
Tue May 11 21:02:30 PDT 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>
---
 libocfs2/bitmap.c |   56 ++++++++++++++++++++++++----------------------------
 1 files changed, 26 insertions(+), 30 deletions(-)

diff --git a/libocfs2/bitmap.c b/libocfs2/bitmap.c
index a5fe511..cc6f761 100644
--- a/libocfs2/bitmap.c
+++ b/libocfs2/bitmap.c
@@ -640,8 +640,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;
 };

@@ -653,11 +654,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_total_bits - br->br_set_bits) < ar->ar_min_len)
-		goto out;
+		return 0;

 	for (start = 0; start + ar->ar_min_len <= br->br_total_bits; ) {
 		start = ocfs2_find_next_bit_clear(br->br_bitmap,
@@ -674,36 +674,25 @@ 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;
-	ar->ar_bits_found = end - start;
-
-	for (; start < end; start++)
-		set_generic_shared(ar->ar_bitmap, br,
-				   start + br->br_start_bit);
-
-	ar->ar_ret = 0;
-	ret = OCFS2_ET_ITERATION_COMPLETE;
-out:
 	return ret;
 }

@@ -718,6 +707,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,
 	};

@@ -727,8 +719,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;
-- 
1.6.4.2



More information about the Ocfs2-tools-devel mailing list