diff options
author | Josef Bacik <josef@redhat.com> | 2011-05-13 16:32:11 +0200 |
---|---|---|
committer | Josef Bacik <josef@redhat.com> | 2011-05-23 19:03:14 +0200 |
commit | 026fd317828500524cdc7e5ff9e8e7923abb2868 (patch) | |
tree | d303bffbd895c307f49286cd90186cf58223dde2 /fs/btrfs/inode.c | |
parent | Btrfs: try not to sleep as much when doing slow caching (diff) | |
download | linux-026fd317828500524cdc7e5ff9e8e7923abb2868.tar.xz linux-026fd317828500524cdc7e5ff9e8e7923abb2868.zip |
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/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 14 |
1 files changed, 12 insertions, 2 deletions
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, filp->f_pos = 2; } path = btrfs_alloc_path(); - path->reada = 2; + if (!path) + return -ENOMEM; + path->reada = 1; btrfs_set_key_type(&key, key_type); key.offset = filp->f_pos; @@ -5043,7 +5045,15 @@ again: if (!path) { path = btrfs_alloc_path(); - BUG_ON(!path); + if (!path) { + err = -ENOMEM; + goto out; + } + /* + * Chances are we'll be called again, so go ahead and do + * readahead + */ + path->reada = 1; } ret = btrfs_lookup_file_extent(trans, root, path, |