提交 8f662a76 编写于 作者: C Chris Mason

Btrfs: Add readahead to the online shrinker, and a mount -o alloc_start= for testing

Signed-off-by: NChris Mason <chris.mason@oracle.com>
上级 e52ec0eb
...@@ -2654,9 +2654,9 @@ int btrfs_del_item(struct btrfs_trans_handle *trans, struct btrfs_root *root, ...@@ -2654,9 +2654,9 @@ int btrfs_del_item(struct btrfs_trans_handle *trans, struct btrfs_root *root,
*/ */
int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path) int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path)
{ {
u64 bytenr;
int slot; int slot;
int level = 1; int level = 1;
u64 bytenr;
struct extent_buffer *c; struct extent_buffer *c;
struct extent_buffer *next = NULL; struct extent_buffer *next = NULL;
...@@ -2687,11 +2687,14 @@ int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path) ...@@ -2687,11 +2687,14 @@ int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path)
level--; level--;
c = path->nodes[level]; c = path->nodes[level];
free_extent_buffer(c); free_extent_buffer(c);
slot = btrfs_header_nritems(next);
if (slot != 0)
slot--;
path->nodes[level] = next; path->nodes[level] = next;
path->slots[level] = 0; path->slots[level] = slot;
if (!level) if (!level)
break; break;
next = read_tree_block(root, btrfs_node_blockptr(next, 0), next = read_tree_block(root, btrfs_node_blockptr(next, slot),
btrfs_level_size(root, level - 1)); btrfs_level_size(root, level - 1));
} }
return 0; return 0;
......
...@@ -324,6 +324,7 @@ struct btrfs_fs_info { ...@@ -324,6 +324,7 @@ struct btrfs_fs_info {
u64 last_trans_committed; u64 last_trans_committed;
unsigned long mount_opt; unsigned long mount_opt;
u64 max_extent; u64 max_extent;
u64 alloc_start;
struct btrfs_transaction *running_transaction; struct btrfs_transaction *running_transaction;
struct btrfs_super_block super_copy; struct btrfs_super_block super_copy;
struct extent_buffer *sb_buffer; struct extent_buffer *sb_buffer;
......
...@@ -1630,11 +1630,11 @@ int btrfs_alloc_extent(struct btrfs_trans_handle *trans, ...@@ -1630,11 +1630,11 @@ int btrfs_alloc_extent(struct btrfs_trans_handle *trans,
struct btrfs_path *path; struct btrfs_path *path;
btrfs_set_stack_extent_refs(&extent_item, 1); btrfs_set_stack_extent_refs(&extent_item, 1);
#if 0
new_hint = max(hint_byte, 16ULL * 1024 * 1024 * 1024); new_hint = max(hint_byte, root->fs_info->alloc_start);
if (new_hint < btrfs_super_total_bytes(&info->super_copy)) if (new_hint < btrfs_super_total_bytes(&info->super_copy))
hint_byte = new_hint; hint_byte = new_hint;
#endif
WARN_ON(num_bytes < root->sectorsize); WARN_ON(num_bytes < root->sectorsize);
ret = find_free_extent(trans, root, num_bytes, empty_size, ret = find_free_extent(trans, root, num_bytes, empty_size,
search_start, search_end, hint_byte, ins, search_start, search_end, hint_byte, ins,
...@@ -2239,7 +2239,7 @@ static int relocate_one_reference(struct btrfs_root *extent_root, ...@@ -2239,7 +2239,7 @@ static int relocate_one_reference(struct btrfs_root *extent_root,
free_extent_buffer(eb); free_extent_buffer(eb);
path->lowest_level = level; path->lowest_level = level;
path->reada = 0; path->reada = 2;
ret = btrfs_search_slot(trans, found_root, &found_key, path, ret = btrfs_search_slot(trans, found_root, &found_key, path,
0, 1); 0, 1);
path->lowest_level = 0; path->lowest_level = 0;
...@@ -2372,6 +2372,7 @@ int btrfs_shrink_extent_tree(struct btrfs_root *root, u64 new_size) ...@@ -2372,6 +2372,7 @@ int btrfs_shrink_extent_tree(struct btrfs_root *root, u64 new_size)
block_group_cache = &info->block_group_cache; block_group_cache = &info->block_group_cache;
path = btrfs_alloc_path(); path = btrfs_alloc_path();
root = root->fs_info->extent_root; root = root->fs_info->extent_root;
path->reada = 2;
again: again:
total_found = 0; total_found = 0;
......
...@@ -2058,7 +2058,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct page *page) ...@@ -2058,7 +2058,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct page *page)
mutex_lock(&root->fs_info->fs_mutex); mutex_lock(&root->fs_info->fs_mutex);
ret = btrfs_check_free_space(root, PAGE_CACHE_SIZE, 0); ret = btrfs_check_free_space(root, PAGE_CACHE_SIZE, 0);
mutex_lock(&root->fs_info->fs_mutex); mutex_unlock(&root->fs_info->fs_mutex);
if (ret) if (ret)
goto out; goto out;
......
...@@ -63,7 +63,8 @@ static void btrfs_put_super (struct super_block * sb) ...@@ -63,7 +63,8 @@ static void btrfs_put_super (struct super_block * sb)
} }
enum { enum {
Opt_subvol, Opt_nodatasum, Opt_nodatacow, Opt_max_extent, Opt_err, Opt_subvol, Opt_nodatasum, Opt_nodatacow, Opt_max_extent,
Opt_alloc_start, Opt_err,
}; };
static match_table_t tokens = { static match_table_t tokens = {
...@@ -71,6 +72,7 @@ static match_table_t tokens = { ...@@ -71,6 +72,7 @@ static match_table_t tokens = {
{Opt_nodatasum, "nodatasum"}, {Opt_nodatasum, "nodatasum"},
{Opt_nodatacow, "nodatacow"}, {Opt_nodatacow, "nodatacow"},
{Opt_max_extent, "max_extent=%s"}, {Opt_max_extent, "max_extent=%s"},
{Opt_alloc_start, "alloc_start=%s"},
{Opt_err, NULL} {Opt_err, NULL}
}; };
...@@ -162,6 +164,18 @@ static int parse_options (char * options, ...@@ -162,6 +164,18 @@ static int parse_options (char * options,
} }
} }
break; break;
case Opt_alloc_start:
if (info) {
char *num = match_strdup(&args[0]);
if (num) {
info->alloc_start =
btrfs_parse_size(num);
kfree(num);
printk("btrfs: allocations start at "
"%Lu\n", info->alloc_start);
}
}
break;
default: default:
break; break;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册