aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJosef Bacik <josef@redhat.com>2011-05-13 10:32:11 -0400
committerJosef Bacik <josef@redhat.com>2011-05-23 13:03:14 -0400
commit026fd317828500524cdc7e5ff9e8e7923abb2868 (patch)
treed303bffbd895c307f49286cd90186cf58223dde2 /fs
parent589d8ade83f07c0f11c8191c0ca309f34d7a2c14 (diff)
Btrfs: don't always do readahead
Our readahead is sort of sloppy, and really isn't always needed. For example if ls is doing a stating ls (which is the default) it's going to stat in non-disk order, so if say you have a directory with a stupid amount of files, readahead is going to do nothing but waste time in the case of doing the stat. Taking the unconditional readahead out made my test go from 57 minutes to 36 minutes. This means that everywhere we do loop through the tree we want to make sure we do set path->reada properly, so I went through and found all of the places where we loop through the path and set reada to 1. Thanks, Signed-off-by: Josef Bacik <josef@redhat.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/ctree.c2
-rw-r--r--fs/btrfs/extent-tree.c3
-rw-r--r--fs/btrfs/inode.c14
-rw-r--r--fs/btrfs/relocation.c6
4 files changed, 20 insertions, 5 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index f7a0a64b868f..f61c16c1481a 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -48,8 +48,6 @@ struct btrfs_path *btrfs_alloc_path(void)
48{ 48{
49 struct btrfs_path *path; 49 struct btrfs_path *path;
50 path = kmem_cache_zalloc(btrfs_path_cachep, GFP_NOFS); 50 path = kmem_cache_zalloc(btrfs_path_cachep, GFP_NOFS);
51 if (path)
52 path->reada = 1;
53 return path; 51 return path;
54} 52}
55 53
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 96be62450318..1ba2cc58eab5 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -347,7 +347,7 @@ static int caching_kthread(void *data)
347 */ 347 */
348 path->skip_locking = 1; 348 path->skip_locking = 1;
349 path->search_commit_root = 1; 349 path->search_commit_root = 1;
350 path->reada = 2; 350 path->reada = 1;
351 351
352 key.objectid = last; 352 key.objectid = last;
353 key.offset = 0; 353 key.offset = 0;
@@ -8556,6 +8556,7 @@ int btrfs_read_block_groups(struct btrfs_root *root)
8556 path = btrfs_alloc_path(); 8556 path = btrfs_alloc_path();
8557 if (!path) 8557 if (!path)
8558 return -ENOMEM; 8558 return -ENOMEM;
8559 path->reada = 1;
8559 8560
8560 cache_gen = btrfs_super_cache_generation(&root->fs_info->super_copy); 8561 cache_gen = btrfs_super_cache_generation(&root->fs_info->super_copy);
8561 if (cache_gen != 0 && 8562 if (cache_gen != 0 &&
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index dd5938a7de21..6228a304b547 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -4242,7 +4242,9 @@ static int btrfs_real_readdir(struct file *filp, void *dirent,
4242 filp->f_pos = 2; 4242 filp->f_pos = 2;
4243 } 4243 }
4244 path = btrfs_alloc_path(); 4244 path = btrfs_alloc_path();
4245 path->reada = 2; 4245 if (!path)
4246 return -ENOMEM;
4247 path->reada = 1;
4246 4248
4247 btrfs_set_key_type(&key, key_type); 4249 btrfs_set_key_type(&key, key_type);
4248 key.offset = filp->f_pos; 4250 key.offset = filp->f_pos;
@@ -5043,7 +5045,15 @@ again:
5043 5045
5044 if (!path) { 5046 if (!path) {
5045 path = btrfs_alloc_path(); 5047 path = btrfs_alloc_path();
5046 BUG_ON(!path); 5048 if (!path) {
5049 err = -ENOMEM;
5050 goto out;
5051 }
5052 /*
5053 * Chances are we'll be called again, so go ahead and do
5054 * readahead
5055 */
5056 path->reada = 1;
5047 } 5057 }
5048 5058
5049 ret = btrfs_lookup_file_extent(trans, root, path, 5059 ret = btrfs_lookup_file_extent(trans, root, path,
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
index 09c30d37d43e..5872b41581f4 100644
--- a/fs/btrfs/relocation.c
+++ b/fs/btrfs/relocation.c
@@ -676,6 +676,8 @@ struct backref_node *build_backref_tree(struct reloc_control *rc,
676 err = -ENOMEM; 676 err = -ENOMEM;
677 goto out; 677 goto out;
678 } 678 }
679 path1->reada = 1;
680 path2->reada = 2;
679 681
680 node = alloc_backref_node(cache); 682 node = alloc_backref_node(cache);
681 if (!node) { 683 if (!node) {
@@ -1996,6 +1998,7 @@ static noinline_for_stack int merge_reloc_root(struct reloc_control *rc,
1996 path = btrfs_alloc_path(); 1998 path = btrfs_alloc_path();
1997 if (!path) 1999 if (!path)
1998 return -ENOMEM; 2000 return -ENOMEM;
2001 path->reada = 1;
1999 2002
2000 reloc_root = root->reloc_root; 2003 reloc_root = root->reloc_root;
2001 root_item = &reloc_root->root_item; 2004 root_item = &reloc_root->root_item;
@@ -3297,6 +3300,7 @@ static int find_data_references(struct reloc_control *rc,
3297 path = btrfs_alloc_path(); 3300 path = btrfs_alloc_path();
3298 if (!path) 3301 if (!path)
3299 return -ENOMEM; 3302 return -ENOMEM;
3303 path->reada = 1;
3300 3304
3301 root = read_fs_root(rc->extent_root->fs_info, ref_root); 3305 root = read_fs_root(rc->extent_root->fs_info, ref_root);
3302 if (IS_ERR(root)) { 3306 if (IS_ERR(root)) {
@@ -3665,6 +3669,7 @@ static noinline_for_stack int relocate_block_group(struct reloc_control *rc)
3665 path = btrfs_alloc_path(); 3669 path = btrfs_alloc_path();
3666 if (!path) 3670 if (!path)
3667 return -ENOMEM; 3671 return -ENOMEM;
3672 path->reada = 1;
3668 3673
3669 ret = prepare_to_relocate(rc); 3674 ret = prepare_to_relocate(rc);
3670 if (ret) { 3675 if (ret) {
@@ -4090,6 +4095,7 @@ int btrfs_recover_relocation(struct btrfs_root *root)
4090 path = btrfs_alloc_path(); 4095 path = btrfs_alloc_path();
4091 if (!path) 4096 if (!path)
4092 return -ENOMEM; 4097 return -ENOMEM;
4098 path->reada = -1;
4093 4099
4094 key.objectid = BTRFS_TREE_RELOC_OBJECTID; 4100 key.objectid = BTRFS_TREE_RELOC_OBJECTID;
4095 key.type = BTRFS_ROOT_ITEM_KEY; 4101 key.type = BTRFS_ROOT_ITEM_KEY;