diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/ctree.c | 6 | ||||
-rw-r--r-- | fs/btrfs/ctree.h | 1 | ||||
-rw-r--r-- | fs/btrfs/delayed-ref.c | 8 | ||||
-rw-r--r-- | fs/btrfs/disk-io.c | 2 | ||||
-rw-r--r-- | fs/btrfs/extent-tree.c | 77 |
5 files changed, 21 insertions, 73 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 9d7621f271ff..08e0b11ba0a1 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
@@ -421,12 +421,6 @@ void btrfs_put_tree_mod_seq(struct btrfs_fs_info *fs_info, | |||
421 | spin_unlock(&fs_info->tree_mod_seq_lock); | 421 | spin_unlock(&fs_info->tree_mod_seq_lock); |
422 | 422 | ||
423 | /* | 423 | /* |
424 | * we removed the lowest blocker from the blocker list, so there may be | ||
425 | * more processible delayed refs. | ||
426 | */ | ||
427 | wake_up(&fs_info->tree_mod_seq_wait); | ||
428 | |||
429 | /* | ||
430 | * anything that's lower than the lowest existing (read: blocked) | 424 | * anything that's lower than the lowest existing (read: blocked) |
431 | * sequence number can be removed from the tree. | 425 | * sequence number can be removed from the tree. |
432 | */ | 426 | */ |
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 348196350bf0..c38734a07a65 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -1252,7 +1252,6 @@ struct btrfs_fs_info { | |||
1252 | atomic_t tree_mod_seq; | 1252 | atomic_t tree_mod_seq; |
1253 | struct list_head tree_mod_seq_list; | 1253 | struct list_head tree_mod_seq_list; |
1254 | struct seq_list tree_mod_seq_elem; | 1254 | struct seq_list tree_mod_seq_elem; |
1255 | wait_queue_head_t tree_mod_seq_wait; | ||
1256 | 1255 | ||
1257 | /* this protects tree_mod_log */ | 1256 | /* this protects tree_mod_log */ |
1258 | rwlock_t tree_mod_log_lock; | 1257 | rwlock_t tree_mod_log_lock; |
diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c index da7419ed01bb..7561431af50d 100644 --- a/fs/btrfs/delayed-ref.c +++ b/fs/btrfs/delayed-ref.c | |||
@@ -662,9 +662,6 @@ int btrfs_add_delayed_tree_ref(struct btrfs_fs_info *fs_info, | |||
662 | add_delayed_tree_ref(fs_info, trans, &ref->node, bytenr, | 662 | add_delayed_tree_ref(fs_info, trans, &ref->node, bytenr, |
663 | num_bytes, parent, ref_root, level, action, | 663 | num_bytes, parent, ref_root, level, action, |
664 | for_cow); | 664 | for_cow); |
665 | if (!need_ref_seq(for_cow, ref_root) && | ||
666 | waitqueue_active(&fs_info->tree_mod_seq_wait)) | ||
667 | wake_up(&fs_info->tree_mod_seq_wait); | ||
668 | spin_unlock(&delayed_refs->lock); | 665 | spin_unlock(&delayed_refs->lock); |
669 | if (need_ref_seq(for_cow, ref_root)) | 666 | if (need_ref_seq(for_cow, ref_root)) |
670 | btrfs_qgroup_record_ref(trans, &ref->node, extent_op); | 667 | btrfs_qgroup_record_ref(trans, &ref->node, extent_op); |
@@ -713,9 +710,6 @@ int btrfs_add_delayed_data_ref(struct btrfs_fs_info *fs_info, | |||
713 | add_delayed_data_ref(fs_info, trans, &ref->node, bytenr, | 710 | add_delayed_data_ref(fs_info, trans, &ref->node, bytenr, |
714 | num_bytes, parent, ref_root, owner, offset, | 711 | num_bytes, parent, ref_root, owner, offset, |
715 | action, for_cow); | 712 | action, for_cow); |
716 | if (!need_ref_seq(for_cow, ref_root) && | ||
717 | waitqueue_active(&fs_info->tree_mod_seq_wait)) | ||
718 | wake_up(&fs_info->tree_mod_seq_wait); | ||
719 | spin_unlock(&delayed_refs->lock); | 713 | spin_unlock(&delayed_refs->lock); |
720 | if (need_ref_seq(for_cow, ref_root)) | 714 | if (need_ref_seq(for_cow, ref_root)) |
721 | btrfs_qgroup_record_ref(trans, &ref->node, extent_op); | 715 | btrfs_qgroup_record_ref(trans, &ref->node, extent_op); |
@@ -744,8 +738,6 @@ int btrfs_add_delayed_extent_op(struct btrfs_fs_info *fs_info, | |||
744 | num_bytes, BTRFS_UPDATE_DELAYED_HEAD, | 738 | num_bytes, BTRFS_UPDATE_DELAYED_HEAD, |
745 | extent_op->is_data); | 739 | extent_op->is_data); |
746 | 740 | ||
747 | if (waitqueue_active(&fs_info->tree_mod_seq_wait)) | ||
748 | wake_up(&fs_info->tree_mod_seq_wait); | ||
749 | spin_unlock(&delayed_refs->lock); | 741 | spin_unlock(&delayed_refs->lock); |
750 | return 0; | 742 | return 0; |
751 | } | 743 | } |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 502b20c56e84..a7ad8fc8dc53 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -2035,8 +2035,6 @@ int open_ctree(struct super_block *sb, | |||
2035 | fs_info->free_chunk_space = 0; | 2035 | fs_info->free_chunk_space = 0; |
2036 | fs_info->tree_mod_log = RB_ROOT; | 2036 | fs_info->tree_mod_log = RB_ROOT; |
2037 | 2037 | ||
2038 | init_waitqueue_head(&fs_info->tree_mod_seq_wait); | ||
2039 | |||
2040 | /* readahead state */ | 2038 | /* readahead state */ |
2041 | INIT_RADIX_TREE(&fs_info->reada_tree, GFP_NOFS & ~__GFP_WAIT); | 2039 | INIT_RADIX_TREE(&fs_info->reada_tree, GFP_NOFS & ~__GFP_WAIT); |
2042 | spin_lock_init(&fs_info->reada_lock); | 2040 | spin_lock_init(&fs_info->reada_lock); |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 45c69c4184c9..d3df65f83b5c 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -2318,12 +2318,6 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans, | |||
2318 | ref->in_tree = 0; | 2318 | ref->in_tree = 0; |
2319 | rb_erase(&ref->rb_node, &delayed_refs->root); | 2319 | rb_erase(&ref->rb_node, &delayed_refs->root); |
2320 | delayed_refs->num_entries--; | 2320 | delayed_refs->num_entries--; |
2321 | /* | ||
2322 | * we modified num_entries, but as we're currently running | ||
2323 | * delayed refs, skip | ||
2324 | * wake_up(&delayed_refs->seq_wait); | ||
2325 | * here. | ||
2326 | */ | ||
2327 | spin_unlock(&delayed_refs->lock); | 2321 | spin_unlock(&delayed_refs->lock); |
2328 | 2322 | ||
2329 | ret = run_one_delayed_ref(trans, root, ref, extent_op, | 2323 | ret = run_one_delayed_ref(trans, root, ref, extent_op, |
@@ -2350,22 +2344,6 @@ next: | |||
2350 | return count; | 2344 | return count; |
2351 | } | 2345 | } |
2352 | 2346 | ||
2353 | static void wait_for_more_refs(struct btrfs_fs_info *fs_info, | ||
2354 | struct btrfs_delayed_ref_root *delayed_refs, | ||
2355 | unsigned long num_refs, | ||
2356 | struct list_head *first_seq) | ||
2357 | { | ||
2358 | spin_unlock(&delayed_refs->lock); | ||
2359 | pr_debug("waiting for more refs (num %ld, first %p)\n", | ||
2360 | num_refs, first_seq); | ||
2361 | wait_event(fs_info->tree_mod_seq_wait, | ||
2362 | num_refs != delayed_refs->num_entries || | ||
2363 | fs_info->tree_mod_seq_list.next != first_seq); | ||
2364 | pr_debug("done waiting for more refs (num %ld, first %p)\n", | ||
2365 | delayed_refs->num_entries, fs_info->tree_mod_seq_list.next); | ||
2366 | spin_lock(&delayed_refs->lock); | ||
2367 | } | ||
2368 | |||
2369 | #ifdef SCRAMBLE_DELAYED_REFS | 2347 | #ifdef SCRAMBLE_DELAYED_REFS |
2370 | /* | 2348 | /* |
2371 | * Normally delayed refs get processed in ascending bytenr order. This | 2349 | * Normally delayed refs get processed in ascending bytenr order. This |
@@ -2460,13 +2438,11 @@ int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, | |||
2460 | struct btrfs_delayed_ref_root *delayed_refs; | 2438 | struct btrfs_delayed_ref_root *delayed_refs; |
2461 | struct btrfs_delayed_ref_node *ref; | 2439 | struct btrfs_delayed_ref_node *ref; |
2462 | struct list_head cluster; | 2440 | struct list_head cluster; |
2463 | struct list_head *first_seq = NULL; | ||
2464 | int ret; | 2441 | int ret; |
2465 | u64 delayed_start; | 2442 | u64 delayed_start; |
2466 | int run_all = count == (unsigned long)-1; | 2443 | int run_all = count == (unsigned long)-1; |
2467 | int run_most = 0; | 2444 | int run_most = 0; |
2468 | unsigned long num_refs = 0; | 2445 | int loops; |
2469 | int consider_waiting; | ||
2470 | 2446 | ||
2471 | /* We'll clean this up in btrfs_cleanup_transaction */ | 2447 | /* We'll clean this up in btrfs_cleanup_transaction */ |
2472 | if (trans->aborted) | 2448 | if (trans->aborted) |
@@ -2484,7 +2460,7 @@ int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, | |||
2484 | delayed_refs = &trans->transaction->delayed_refs; | 2460 | delayed_refs = &trans->transaction->delayed_refs; |
2485 | INIT_LIST_HEAD(&cluster); | 2461 | INIT_LIST_HEAD(&cluster); |
2486 | again: | 2462 | again: |
2487 | consider_waiting = 0; | 2463 | loops = 0; |
2488 | spin_lock(&delayed_refs->lock); | 2464 | spin_lock(&delayed_refs->lock); |
2489 | 2465 | ||
2490 | #ifdef SCRAMBLE_DELAYED_REFS | 2466 | #ifdef SCRAMBLE_DELAYED_REFS |
@@ -2512,31 +2488,6 @@ again: | |||
2512 | if (ret) | 2488 | if (ret) |
2513 | break; | 2489 | break; |
2514 | 2490 | ||
2515 | if (delayed_start >= delayed_refs->run_delayed_start) { | ||
2516 | if (consider_waiting == 0) { | ||
2517 | /* | ||
2518 | * btrfs_find_ref_cluster looped. let's do one | ||
2519 | * more cycle. if we don't run any delayed ref | ||
2520 | * during that cycle (because we can't because | ||
2521 | * all of them are blocked) and if the number of | ||
2522 | * refs doesn't change, we avoid busy waiting. | ||
2523 | */ | ||
2524 | consider_waiting = 1; | ||
2525 | num_refs = delayed_refs->num_entries; | ||
2526 | first_seq = root->fs_info->tree_mod_seq_list.next; | ||
2527 | } else { | ||
2528 | wait_for_more_refs(root->fs_info, delayed_refs, | ||
2529 | num_refs, first_seq); | ||
2530 | /* | ||
2531 | * after waiting, things have changed. we | ||
2532 | * dropped the lock and someone else might have | ||
2533 | * run some refs, built new clusters and so on. | ||
2534 | * therefore, we restart staleness detection. | ||
2535 | */ | ||
2536 | consider_waiting = 0; | ||
2537 | } | ||
2538 | } | ||
2539 | |||
2540 | ret = run_clustered_refs(trans, root, &cluster); | 2491 | ret = run_clustered_refs(trans, root, &cluster); |
2541 | if (ret < 0) { | 2492 | if (ret < 0) { |
2542 | spin_unlock(&delayed_refs->lock); | 2493 | spin_unlock(&delayed_refs->lock); |
@@ -2549,9 +2500,26 @@ again: | |||
2549 | if (count == 0) | 2500 | if (count == 0) |
2550 | break; | 2501 | break; |
2551 | 2502 | ||
2552 | if (ret || delayed_refs->run_delayed_start == 0) { | 2503 | if (delayed_start >= delayed_refs->run_delayed_start) { |
2504 | if (loops == 0) { | ||
2505 | /* | ||
2506 | * btrfs_find_ref_cluster looped. let's do one | ||
2507 | * more cycle. if we don't run any delayed ref | ||
2508 | * during that cycle (because we can't because | ||
2509 | * all of them are blocked), bail out. | ||
2510 | */ | ||
2511 | loops = 1; | ||
2512 | } else { | ||
2513 | /* | ||
2514 | * no runnable refs left, stop trying | ||
2515 | */ | ||
2516 | BUG_ON(run_all); | ||
2517 | break; | ||
2518 | } | ||
2519 | } | ||
2520 | if (ret) { | ||
2553 | /* refs were run, let's reset staleness detection */ | 2521 | /* refs were run, let's reset staleness detection */ |
2554 | consider_waiting = 0; | 2522 | loops = 0; |
2555 | } | 2523 | } |
2556 | } | 2524 | } |
2557 | 2525 | ||
@@ -5296,9 +5264,6 @@ static noinline int check_ref_cleanup(struct btrfs_trans_handle *trans, | |||
5296 | rb_erase(&head->node.rb_node, &delayed_refs->root); | 5264 | rb_erase(&head->node.rb_node, &delayed_refs->root); |
5297 | 5265 | ||
5298 | delayed_refs->num_entries--; | 5266 | delayed_refs->num_entries--; |
5299 | smp_mb(); | ||
5300 | if (waitqueue_active(&root->fs_info->tree_mod_seq_wait)) | ||
5301 | wake_up(&root->fs_info->tree_mod_seq_wait); | ||
5302 | 5267 | ||
5303 | /* | 5268 | /* |
5304 | * we don't take a ref on the node because we're removing it from the | 5269 | * we don't take a ref on the node because we're removing it from the |