aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorLi Zefan <lizf@cn.fujitsu.com>2011-11-20 07:33:38 -0500
committerChris Mason <chris.mason@oracle.com>2011-11-20 07:42:15 -0500
commit52621cb6ed0e0e14358bb317bda7cd5fbd5c2a27 (patch)
tree5b4bc4c08c9f50e97779fcf527b1a8c7780a9e88 /fs
parent0f0fbf1d0e188d129756e9508090af4bdbfde00b (diff)
Btrfs: avoid unnecessary bitmap search for cluster setup
setup_cluster_no_bitmap() searches all the extents and bitmaps starting from offset. Therefore if it returns -ENOSPC, all the bitmaps starting from offset are in the bitmaps list, so it's sufficient to search from this list in setup_cluser_bitmap(). Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/free-space-cache.c42
1 files changed, 4 insertions, 38 deletions
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c
index 8f792f41feab..8c32434da2cb 100644
--- a/fs/btrfs/free-space-cache.c
+++ b/fs/btrfs/free-space-cache.c
@@ -2451,7 +2451,6 @@ setup_cluster_bitmap(struct btrfs_block_group_cache *block_group,
2451{ 2451{
2452 struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl; 2452 struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
2453 struct btrfs_free_space *entry; 2453 struct btrfs_free_space *entry;
2454 struct rb_node *node;
2455 int ret = -ENOSPC; 2454 int ret = -ENOSPC;
2456 u64 bitmap_offset = offset_to_bitmap(ctl, offset); 2455 u64 bitmap_offset = offset_to_bitmap(ctl, offset);
2457 2456
@@ -2469,10 +2468,6 @@ setup_cluster_bitmap(struct btrfs_block_group_cache *block_group,
2469 list_add(&entry->list, bitmaps); 2468 list_add(&entry->list, bitmaps);
2470 } 2469 }
2471 2470
2472 /*
2473 * First check our cached list of bitmaps and see if there is an entry
2474 * here that will work.
2475 */
2476 list_for_each_entry(entry, bitmaps, list) { 2471 list_for_each_entry(entry, bitmaps, list) {
2477 if (entry->bytes < min_bytes) 2472 if (entry->bytes < min_bytes)
2478 continue; 2473 continue;
@@ -2483,38 +2478,10 @@ setup_cluster_bitmap(struct btrfs_block_group_cache *block_group,
2483 } 2478 }
2484 2479
2485 /* 2480 /*
2486 * If we do have entries on our list and we are here then we didn't find 2481 * The bitmaps list has all the bitmaps that record free space
2487 * anything, so go ahead and get the next entry after the last entry in 2482 * starting after offset, so no more search is required.
2488 * this list and start the search from there.
2489 */ 2483 */
2490 if (!list_empty(bitmaps)) { 2484 return -ENOSPC;
2491 entry = list_entry(bitmaps->prev, struct btrfs_free_space,
2492 list);
2493 node = rb_next(&entry->offset_index);
2494 if (!node)
2495 return -ENOSPC;
2496 entry = rb_entry(node, struct btrfs_free_space, offset_index);
2497 goto search;
2498 }
2499
2500 entry = tree_search_offset(ctl, offset_to_bitmap(ctl, offset), 0, 1);
2501 if (!entry)
2502 return -ENOSPC;
2503
2504search:
2505 node = &entry->offset_index;
2506 do {
2507 entry = rb_entry(node, struct btrfs_free_space, offset_index);
2508 node = rb_next(&entry->offset_index);
2509 if (!entry->bitmap)
2510 continue;
2511 if (entry->bytes < min_bytes)
2512 continue;
2513 ret = btrfs_bitmap_cluster(block_group, entry, cluster, offset,
2514 bytes, min_bytes);
2515 } while (ret && node);
2516
2517 return ret;
2518} 2485}
2519 2486
2520/* 2487/*
@@ -2532,8 +2499,8 @@ int btrfs_find_space_cluster(struct btrfs_trans_handle *trans,
2532 u64 offset, u64 bytes, u64 empty_size) 2499 u64 offset, u64 bytes, u64 empty_size)
2533{ 2500{
2534 struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl; 2501 struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
2535 struct list_head bitmaps;
2536 struct btrfs_free_space *entry, *tmp; 2502 struct btrfs_free_space *entry, *tmp;
2503 LIST_HEAD(bitmaps);
2537 u64 min_bytes; 2504 u64 min_bytes;
2538 int ret; 2505 int ret;
2539 2506
@@ -2572,7 +2539,6 @@ int btrfs_find_space_cluster(struct btrfs_trans_handle *trans,
2572 goto out; 2539 goto out;
2573 } 2540 }
2574 2541
2575 INIT_LIST_HEAD(&bitmaps);
2576 ret = setup_cluster_no_bitmap(block_group, cluster, &bitmaps, offset, 2542 ret = setup_cluster_no_bitmap(block_group, cluster, &bitmaps, offset,
2577 bytes, min_bytes); 2543 bytes, min_bytes);
2578 if (ret) 2544 if (ret)