diff options
author | Chris Mason <chris.mason@oracle.com> | 2008-01-02 10:01:11 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2008-09-25 11:03:58 -0400 |
commit | 8f662a76c6af8eb367fa519e9bb9766040d9cea8 (patch) | |
tree | 3072a4d35c49e2c884f41d044dec4950bf95c3b3 /fs | |
parent | e52ec0eb62e76ea584c8438ef92933e9b815db80 (diff) |
Btrfs: Add readahead to the online shrinker, and a mount -o alloc_start= for testing
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/ctree.c | 9 | ||||
-rw-r--r-- | fs/btrfs/ctree.h | 1 | ||||
-rw-r--r-- | fs/btrfs/extent-tree.c | 9 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 2 | ||||
-rw-r--r-- | fs/btrfs/super.c | 16 |
5 files changed, 28 insertions, 9 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 2b3ffa707eae..8fa92a2d9819 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
@@ -2654,9 +2654,9 @@ int btrfs_del_item(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
2654 | */ | 2654 | */ |
2655 | int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path) | 2655 | int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path) |
2656 | { | 2656 | { |
2657 | u64 bytenr; | ||
2657 | int slot; | 2658 | int slot; |
2658 | int level = 1; | 2659 | int level = 1; |
2659 | u64 bytenr; | ||
2660 | struct extent_buffer *c; | 2660 | struct extent_buffer *c; |
2661 | struct extent_buffer *next = NULL; | 2661 | struct extent_buffer *next = NULL; |
2662 | 2662 | ||
@@ -2687,11 +2687,14 @@ int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path) | |||
2687 | level--; | 2687 | level--; |
2688 | c = path->nodes[level]; | 2688 | c = path->nodes[level]; |
2689 | free_extent_buffer(c); | 2689 | free_extent_buffer(c); |
2690 | slot = btrfs_header_nritems(next); | ||
2691 | if (slot != 0) | ||
2692 | slot--; | ||
2690 | path->nodes[level] = next; | 2693 | path->nodes[level] = next; |
2691 | path->slots[level] = 0; | 2694 | path->slots[level] = slot; |
2692 | if (!level) | 2695 | if (!level) |
2693 | break; | 2696 | break; |
2694 | next = read_tree_block(root, btrfs_node_blockptr(next, 0), | 2697 | next = read_tree_block(root, btrfs_node_blockptr(next, slot), |
2695 | btrfs_level_size(root, level - 1)); | 2698 | btrfs_level_size(root, level - 1)); |
2696 | } | 2699 | } |
2697 | return 0; | 2700 | return 0; |
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index b83a1bec346f..d6e5c19969b0 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -324,6 +324,7 @@ struct btrfs_fs_info { | |||
324 | u64 last_trans_committed; | 324 | u64 last_trans_committed; |
325 | unsigned long mount_opt; | 325 | unsigned long mount_opt; |
326 | u64 max_extent; | 326 | u64 max_extent; |
327 | u64 alloc_start; | ||
327 | struct btrfs_transaction *running_transaction; | 328 | struct btrfs_transaction *running_transaction; |
328 | struct btrfs_super_block super_copy; | 329 | struct btrfs_super_block super_copy; |
329 | struct extent_buffer *sb_buffer; | 330 | struct extent_buffer *sb_buffer; |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index a421069e998b..d6243c2afc73 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -1630,11 +1630,11 @@ int btrfs_alloc_extent(struct btrfs_trans_handle *trans, | |||
1630 | struct btrfs_path *path; | 1630 | struct btrfs_path *path; |
1631 | 1631 | ||
1632 | btrfs_set_stack_extent_refs(&extent_item, 1); | 1632 | btrfs_set_stack_extent_refs(&extent_item, 1); |
1633 | #if 0 | 1633 | |
1634 | new_hint = max(hint_byte, 16ULL * 1024 * 1024 * 1024); | 1634 | new_hint = max(hint_byte, root->fs_info->alloc_start); |
1635 | if (new_hint < btrfs_super_total_bytes(&info->super_copy)) | 1635 | if (new_hint < btrfs_super_total_bytes(&info->super_copy)) |
1636 | hint_byte = new_hint; | 1636 | hint_byte = new_hint; |
1637 | #endif | 1637 | |
1638 | WARN_ON(num_bytes < root->sectorsize); | 1638 | WARN_ON(num_bytes < root->sectorsize); |
1639 | ret = find_free_extent(trans, root, num_bytes, empty_size, | 1639 | ret = find_free_extent(trans, root, num_bytes, empty_size, |
1640 | search_start, search_end, hint_byte, ins, | 1640 | search_start, search_end, hint_byte, ins, |
@@ -2239,7 +2239,7 @@ static int relocate_one_reference(struct btrfs_root *extent_root, | |||
2239 | free_extent_buffer(eb); | 2239 | free_extent_buffer(eb); |
2240 | 2240 | ||
2241 | path->lowest_level = level; | 2241 | path->lowest_level = level; |
2242 | path->reada = 0; | 2242 | path->reada = 2; |
2243 | ret = btrfs_search_slot(trans, found_root, &found_key, path, | 2243 | ret = btrfs_search_slot(trans, found_root, &found_key, path, |
2244 | 0, 1); | 2244 | 0, 1); |
2245 | path->lowest_level = 0; | 2245 | path->lowest_level = 0; |
@@ -2372,6 +2372,7 @@ int btrfs_shrink_extent_tree(struct btrfs_root *root, u64 new_size) | |||
2372 | block_group_cache = &info->block_group_cache; | 2372 | block_group_cache = &info->block_group_cache; |
2373 | path = btrfs_alloc_path(); | 2373 | path = btrfs_alloc_path(); |
2374 | root = root->fs_info->extent_root; | 2374 | root = root->fs_info->extent_root; |
2375 | path->reada = 2; | ||
2375 | 2376 | ||
2376 | again: | 2377 | again: |
2377 | total_found = 0; | 2378 | total_found = 0; |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 3c7bf3bddcad..d6de46961887 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -2058,7 +2058,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct page *page) | |||
2058 | 2058 | ||
2059 | mutex_lock(&root->fs_info->fs_mutex); | 2059 | mutex_lock(&root->fs_info->fs_mutex); |
2060 | ret = btrfs_check_free_space(root, PAGE_CACHE_SIZE, 0); | 2060 | ret = btrfs_check_free_space(root, PAGE_CACHE_SIZE, 0); |
2061 | mutex_lock(&root->fs_info->fs_mutex); | 2061 | mutex_unlock(&root->fs_info->fs_mutex); |
2062 | if (ret) | 2062 | if (ret) |
2063 | goto out; | 2063 | goto out; |
2064 | 2064 | ||
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 3bbd7f665694..f1b56eb77b1d 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -63,7 +63,8 @@ static void btrfs_put_super (struct super_block * sb) | |||
63 | } | 63 | } |
64 | 64 | ||
65 | enum { | 65 | enum { |
66 | Opt_subvol, Opt_nodatasum, Opt_nodatacow, Opt_max_extent, Opt_err, | 66 | Opt_subvol, Opt_nodatasum, Opt_nodatacow, Opt_max_extent, |
67 | Opt_alloc_start, Opt_err, | ||
67 | }; | 68 | }; |
68 | 69 | ||
69 | static match_table_t tokens = { | 70 | static match_table_t tokens = { |
@@ -71,6 +72,7 @@ static match_table_t tokens = { | |||
71 | {Opt_nodatasum, "nodatasum"}, | 72 | {Opt_nodatasum, "nodatasum"}, |
72 | {Opt_nodatacow, "nodatacow"}, | 73 | {Opt_nodatacow, "nodatacow"}, |
73 | {Opt_max_extent, "max_extent=%s"}, | 74 | {Opt_max_extent, "max_extent=%s"}, |
75 | {Opt_alloc_start, "alloc_start=%s"}, | ||
74 | {Opt_err, NULL} | 76 | {Opt_err, NULL} |
75 | }; | 77 | }; |
76 | 78 | ||
@@ -162,6 +164,18 @@ static int parse_options (char * options, | |||
162 | } | 164 | } |
163 | } | 165 | } |
164 | break; | 166 | break; |
167 | case Opt_alloc_start: | ||
168 | if (info) { | ||
169 | char *num = match_strdup(&args[0]); | ||
170 | if (num) { | ||
171 | info->alloc_start = | ||
172 | btrfs_parse_size(num); | ||
173 | kfree(num); | ||
174 | printk("btrfs: allocations start at " | ||
175 | "%Lu\n", info->alloc_start); | ||
176 | } | ||
177 | } | ||
178 | break; | ||
165 | default: | 179 | default: |
166 | break; | 180 | break; |
167 | } | 181 | } |