diff options
author | Li Zefan <lizf@cn.fujitsu.com> | 2011-11-20 07:33:38 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2011-11-20 07:42:15 -0500 |
commit | 52621cb6ed0e0e14358bb317bda7cd5fbd5c2a27 (patch) | |
tree | 5b4bc4c08c9f50e97779fcf527b1a8c7780a9e88 /fs | |
parent | 0f0fbf1d0e188d129756e9508090af4bdbfde00b (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.c | 42 |
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 | |||
2504 | search: | ||
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) |