[Btrfs-devel][PATCH]Minor fix for find_search_start

Yan Zheng yanzheng at 21cn.com
Mon Nov 12 02:45:56 PST 2007


Hello,

This patch adds a new parameter 'full_scan' to 'find_search_start',
thereby 'find_search_start' can know whether 'find_free_extent' is in
full scan phrase. I feel that 'find_search_start' should skip calling
'btrfs_find_block_group' when 'find_free_extent' is in full scan
phrase. In my test on a 2GB volume, Oops occurs when space usage is
about 76%. After apply the patch,  Oops occurs when space usage is
near 100%.

Regards
YZ
----
diff -r 433cf4043126 extent-tree.c
--- a/extent-tree.c	Sun Nov 11 08:22:00 2007 -0500
+++ b/extent-tree.c	Mon Nov 12 18:44:36 2007 +0800
@@ -161,7 +161,8 @@ struct btrfs_block_group_cache *btrfs_lo

 static u64 find_search_start(struct btrfs_root *root,
 			     struct btrfs_block_group_cache **cache_ret,
-			     u64 search_start, int num, int data)
+			     u64 search_start, int num,
+			     int data, int full_scan)
 {
 	int ret;
 	struct btrfs_block_group_cache *cache = *cache_ret;
@@ -221,7 +222,8 @@ wrapped:

 		cache = btrfs_lookup_block_group(root->fs_info, last);
 	}
-	cache = btrfs_find_block_group(root, cache, last, data, 0);
+	if (!full_scan)
+		cache = btrfs_find_block_group(root, cache, last, data, 0);
 	*cache_ret = cache;
 	cache_miss = 0;
 	goto again;
@@ -955,8 +957,8 @@ static int find_free_extent(struct btrfs
 	path = btrfs_alloc_path();

 check_failed:
-	search_start = find_search_start(root, &block_group,
-					 search_start, total_needed, data);
+	search_start = find_search_start(root, &block_group, search_start,
+					 total_needed, data, full_scan);
 	cached_start = search_start;

 	btrfs_init_path(path);



More information about the Btrfs-devel mailing list