diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r-- | fs/btrfs/extent-tree.c | 119 |
1 files changed, 110 insertions, 9 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 71b2d1c7da69..44f06201f376 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -34,6 +34,8 @@ | |||
34 | #include "locking.h" | 34 | #include "locking.h" |
35 | #include "free-space-cache.h" | 35 | #include "free-space-cache.h" |
36 | 36 | ||
37 | #undef SCRAMBLE_DELAYED_REFS | ||
38 | |||
37 | /* | 39 | /* |
38 | * control flags for do_chunk_alloc's force field | 40 | * control flags for do_chunk_alloc's force field |
39 | * CHUNK_ALLOC_NO_FORCE means to only allocate a chunk | 41 | * CHUNK_ALLOC_NO_FORCE means to only allocate a chunk |
@@ -2217,6 +2219,7 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans, | |||
2217 | struct btrfs_delayed_ref_node *ref; | 2219 | struct btrfs_delayed_ref_node *ref; |
2218 | struct btrfs_delayed_ref_head *locked_ref = NULL; | 2220 | struct btrfs_delayed_ref_head *locked_ref = NULL; |
2219 | struct btrfs_delayed_extent_op *extent_op; | 2221 | struct btrfs_delayed_extent_op *extent_op; |
2222 | struct btrfs_fs_info *fs_info = root->fs_info; | ||
2220 | int ret; | 2223 | int ret; |
2221 | int count = 0; | 2224 | int count = 0; |
2222 | int must_insert_reserved = 0; | 2225 | int must_insert_reserved = 0; |
@@ -2255,7 +2258,7 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans, | |||
2255 | ref = select_delayed_ref(locked_ref); | 2258 | ref = select_delayed_ref(locked_ref); |
2256 | 2259 | ||
2257 | if (ref && ref->seq && | 2260 | if (ref && ref->seq && |
2258 | btrfs_check_delayed_seq(delayed_refs, ref->seq)) { | 2261 | btrfs_check_delayed_seq(fs_info, delayed_refs, ref->seq)) { |
2259 | /* | 2262 | /* |
2260 | * there are still refs with lower seq numbers in the | 2263 | * there are still refs with lower seq numbers in the |
2261 | * process of being added. Don't run this ref yet. | 2264 | * process of being added. Don't run this ref yet. |
@@ -2337,7 +2340,7 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans, | |||
2337 | } | 2340 | } |
2338 | 2341 | ||
2339 | next: | 2342 | next: |
2340 | do_chunk_alloc(trans, root->fs_info->extent_root, | 2343 | do_chunk_alloc(trans, fs_info->extent_root, |
2341 | 2 * 1024 * 1024, | 2344 | 2 * 1024 * 1024, |
2342 | btrfs_get_alloc_profile(root, 0), | 2345 | btrfs_get_alloc_profile(root, 0), |
2343 | CHUNK_ALLOC_NO_FORCE); | 2346 | CHUNK_ALLOC_NO_FORCE); |
@@ -2347,21 +2350,99 @@ next: | |||
2347 | return count; | 2350 | return count; |
2348 | } | 2351 | } |
2349 | 2352 | ||
2350 | static void wait_for_more_refs(struct btrfs_delayed_ref_root *delayed_refs, | 2353 | static void wait_for_more_refs(struct btrfs_fs_info *fs_info, |
2354 | struct btrfs_delayed_ref_root *delayed_refs, | ||
2351 | unsigned long num_refs, | 2355 | unsigned long num_refs, |
2352 | struct list_head *first_seq) | 2356 | struct list_head *first_seq) |
2353 | { | 2357 | { |
2354 | spin_unlock(&delayed_refs->lock); | 2358 | spin_unlock(&delayed_refs->lock); |
2355 | pr_debug("waiting for more refs (num %ld, first %p)\n", | 2359 | pr_debug("waiting for more refs (num %ld, first %p)\n", |
2356 | num_refs, first_seq); | 2360 | num_refs, first_seq); |
2357 | wait_event(delayed_refs->seq_wait, | 2361 | wait_event(fs_info->tree_mod_seq_wait, |
2358 | num_refs != delayed_refs->num_entries || | 2362 | num_refs != delayed_refs->num_entries || |
2359 | delayed_refs->seq_head.next != first_seq); | 2363 | fs_info->tree_mod_seq_list.next != first_seq); |
2360 | pr_debug("done waiting for more refs (num %ld, first %p)\n", | 2364 | pr_debug("done waiting for more refs (num %ld, first %p)\n", |
2361 | delayed_refs->num_entries, delayed_refs->seq_head.next); | 2365 | delayed_refs->num_entries, fs_info->tree_mod_seq_list.next); |
2362 | spin_lock(&delayed_refs->lock); | 2366 | spin_lock(&delayed_refs->lock); |
2363 | } | 2367 | } |
2364 | 2368 | ||
2369 | #ifdef SCRAMBLE_DELAYED_REFS | ||
2370 | /* | ||
2371 | * Normally delayed refs get processed in ascending bytenr order. This | ||
2372 | * correlates in most cases to the order added. To expose dependencies on this | ||
2373 | * order, we start to process the tree in the middle instead of the beginning | ||
2374 | */ | ||
2375 | static u64 find_middle(struct rb_root *root) | ||
2376 | { | ||
2377 | struct rb_node *n = root->rb_node; | ||
2378 | struct btrfs_delayed_ref_node *entry; | ||
2379 | int alt = 1; | ||
2380 | u64 middle; | ||
2381 | u64 first = 0, last = 0; | ||
2382 | |||
2383 | n = rb_first(root); | ||
2384 | if (n) { | ||
2385 | entry = rb_entry(n, struct btrfs_delayed_ref_node, rb_node); | ||
2386 | first = entry->bytenr; | ||
2387 | } | ||
2388 | n = rb_last(root); | ||
2389 | if (n) { | ||
2390 | entry = rb_entry(n, struct btrfs_delayed_ref_node, rb_node); | ||
2391 | last = entry->bytenr; | ||
2392 | } | ||
2393 | n = root->rb_node; | ||
2394 | |||
2395 | while (n) { | ||
2396 | entry = rb_entry(n, struct btrfs_delayed_ref_node, rb_node); | ||
2397 | WARN_ON(!entry->in_tree); | ||
2398 | |||
2399 | middle = entry->bytenr; | ||
2400 | |||
2401 | if (alt) | ||
2402 | n = n->rb_left; | ||
2403 | else | ||
2404 | n = n->rb_right; | ||
2405 | |||
2406 | alt = 1 - alt; | ||
2407 | } | ||
2408 | return middle; | ||
2409 | } | ||
2410 | #endif | ||
2411 | |||
2412 | int btrfs_delayed_refs_qgroup_accounting(struct btrfs_trans_handle *trans, | ||
2413 | struct btrfs_fs_info *fs_info) | ||
2414 | { | ||
2415 | struct qgroup_update *qgroup_update; | ||
2416 | int ret = 0; | ||
2417 | |||
2418 | if (list_empty(&trans->qgroup_ref_list) != | ||
2419 | !trans->delayed_ref_elem.seq) { | ||
2420 | /* list without seq or seq without list */ | ||
2421 | printk(KERN_ERR "btrfs: qgroup accounting update error, list is%s empty, seq is %llu\n", | ||
2422 | list_empty(&trans->qgroup_ref_list) ? "" : " not", | ||
2423 | trans->delayed_ref_elem.seq); | ||
2424 | BUG(); | ||
2425 | } | ||
2426 | |||
2427 | if (!trans->delayed_ref_elem.seq) | ||
2428 | return 0; | ||
2429 | |||
2430 | while (!list_empty(&trans->qgroup_ref_list)) { | ||
2431 | qgroup_update = list_first_entry(&trans->qgroup_ref_list, | ||
2432 | struct qgroup_update, list); | ||
2433 | list_del(&qgroup_update->list); | ||
2434 | if (!ret) | ||
2435 | ret = btrfs_qgroup_account_ref( | ||
2436 | trans, fs_info, qgroup_update->node, | ||
2437 | qgroup_update->extent_op); | ||
2438 | kfree(qgroup_update); | ||
2439 | } | ||
2440 | |||
2441 | btrfs_put_tree_mod_seq(fs_info, &trans->delayed_ref_elem); | ||
2442 | |||
2443 | return ret; | ||
2444 | } | ||
2445 | |||
2365 | /* | 2446 | /* |
2366 | * this starts processing the delayed reference count updates and | 2447 | * this starts processing the delayed reference count updates and |
2367 | * extent insertions we have queued up so far. count can be | 2448 | * extent insertions we have queued up so far. count can be |
@@ -2398,11 +2479,18 @@ int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, | |||
2398 | 2 * 1024 * 1024, btrfs_get_alloc_profile(root, 0), | 2479 | 2 * 1024 * 1024, btrfs_get_alloc_profile(root, 0), |
2399 | CHUNK_ALLOC_NO_FORCE); | 2480 | CHUNK_ALLOC_NO_FORCE); |
2400 | 2481 | ||
2482 | btrfs_delayed_refs_qgroup_accounting(trans, root->fs_info); | ||
2483 | |||
2401 | delayed_refs = &trans->transaction->delayed_refs; | 2484 | delayed_refs = &trans->transaction->delayed_refs; |
2402 | INIT_LIST_HEAD(&cluster); | 2485 | INIT_LIST_HEAD(&cluster); |
2403 | again: | 2486 | again: |
2404 | consider_waiting = 0; | 2487 | consider_waiting = 0; |
2405 | spin_lock(&delayed_refs->lock); | 2488 | spin_lock(&delayed_refs->lock); |
2489 | |||
2490 | #ifdef SCRAMBLE_DELAYED_REFS | ||
2491 | delayed_refs->run_delayed_start = find_middle(&delayed_refs->root); | ||
2492 | #endif | ||
2493 | |||
2406 | if (count == 0) { | 2494 | if (count == 0) { |
2407 | count = delayed_refs->num_entries * 2; | 2495 | count = delayed_refs->num_entries * 2; |
2408 | run_most = 1; | 2496 | run_most = 1; |
@@ -2437,7 +2525,7 @@ again: | |||
2437 | num_refs = delayed_refs->num_entries; | 2525 | num_refs = delayed_refs->num_entries; |
2438 | first_seq = root->fs_info->tree_mod_seq_list.next; | 2526 | first_seq = root->fs_info->tree_mod_seq_list.next; |
2439 | } else { | 2527 | } else { |
2440 | wait_for_more_refs(delayed_refs, | 2528 | wait_for_more_refs(root->fs_info, delayed_refs, |
2441 | num_refs, first_seq); | 2529 | num_refs, first_seq); |
2442 | /* | 2530 | /* |
2443 | * after waiting, things have changed. we | 2531 | * after waiting, things have changed. we |
@@ -2502,6 +2590,7 @@ again: | |||
2502 | } | 2590 | } |
2503 | out: | 2591 | out: |
2504 | spin_unlock(&delayed_refs->lock); | 2592 | spin_unlock(&delayed_refs->lock); |
2593 | assert_qgroups_uptodate(trans); | ||
2505 | return 0; | 2594 | return 0; |
2506 | } | 2595 | } |
2507 | 2596 | ||
@@ -4479,6 +4568,13 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) | |||
4479 | csum_bytes = BTRFS_I(inode)->csum_bytes; | 4568 | csum_bytes = BTRFS_I(inode)->csum_bytes; |
4480 | spin_unlock(&BTRFS_I(inode)->lock); | 4569 | spin_unlock(&BTRFS_I(inode)->lock); |
4481 | 4570 | ||
4571 | if (root->fs_info->quota_enabled) { | ||
4572 | ret = btrfs_qgroup_reserve(root, num_bytes + | ||
4573 | nr_extents * root->leafsize); | ||
4574 | if (ret) | ||
4575 | return ret; | ||
4576 | } | ||
4577 | |||
4482 | ret = reserve_metadata_bytes(root, block_rsv, to_reserve, flush); | 4578 | ret = reserve_metadata_bytes(root, block_rsv, to_reserve, flush); |
4483 | if (ret) { | 4579 | if (ret) { |
4484 | u64 to_free = 0; | 4580 | u64 to_free = 0; |
@@ -4557,6 +4653,11 @@ void btrfs_delalloc_release_metadata(struct inode *inode, u64 num_bytes) | |||
4557 | 4653 | ||
4558 | trace_btrfs_space_reservation(root->fs_info, "delalloc", | 4654 | trace_btrfs_space_reservation(root->fs_info, "delalloc", |
4559 | btrfs_ino(inode), to_free, 0); | 4655 | btrfs_ino(inode), to_free, 0); |
4656 | if (root->fs_info->quota_enabled) { | ||
4657 | btrfs_qgroup_free(root, num_bytes + | ||
4658 | dropped * root->leafsize); | ||
4659 | } | ||
4660 | |||
4560 | btrfs_block_rsv_release(root, &root->fs_info->delalloc_block_rsv, | 4661 | btrfs_block_rsv_release(root, &root->fs_info->delalloc_block_rsv, |
4561 | to_free); | 4662 | to_free); |
4562 | } | 4663 | } |
@@ -5193,8 +5294,8 @@ static noinline int check_ref_cleanup(struct btrfs_trans_handle *trans, | |||
5193 | rb_erase(&head->node.rb_node, &delayed_refs->root); | 5294 | rb_erase(&head->node.rb_node, &delayed_refs->root); |
5194 | 5295 | ||
5195 | delayed_refs->num_entries--; | 5296 | delayed_refs->num_entries--; |
5196 | if (waitqueue_active(&delayed_refs->seq_wait)) | 5297 | if (waitqueue_active(&root->fs_info->tree_mod_seq_wait)) |
5197 | wake_up(&delayed_refs->seq_wait); | 5298 | wake_up(&root->fs_info->tree_mod_seq_wait); |
5198 | 5299 | ||
5199 | /* | 5300 | /* |
5200 | * we don't take a ref on the node because we're removing it from the | 5301 | * we don't take a ref on the node because we're removing it from the |