summaryrefslogtreecommitdiff
path: root/fs/btrfs/free-space-cache.c
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@redhat.com>2008-10-10 18:24:32 +0400
committerChris Mason <chris.mason@oracle.com>2008-10-10 18:24:32 +0400
commit37d3cdddf5378606f6eab99982ca16819745d8f4 (patch)
treea4bb82fec6ea41b6a933fd781571d3995f2dcf6c /fs/btrfs/free-space-cache.c
parenta3dddf3fc82a1f5942c0928abfd114e9a8c0d0c8 (diff)
downloadlinux-37d3cdddf5378606f6eab99982ca16819745d8f4.tar.xz
Btrfs: make tree_search_offset more flexible in its searching
Sometimes we end up freeing a reserved extent because we don't need it, however this means that its possible for transaction->last_alloc to point to the middle of a free area. When we search for free space in find_free_space we do a tree_search_offset with contains set to 0, because we want it to find the next best free area if we do not have an offset starting on the given offset. Unfortunately that currently means that if the offset we were given as a hint points to the middle of a free area, we won't find anything. This is especially bad if we happened to last allocate from the big huge chunk of a newly formed block group, since we won't find anything and have to go back and search the long way around. This fixes this problem by making it so that we return the free space area regardless of the contains variable. This made cache missing happen _alot_ less, and speeds things up considerably. Signed-off-by: Josef Bacik <jbacik@redhat.com>
Diffstat (limited to 'fs/btrfs/free-space-cache.c')
-rw-r--r--fs/btrfs/free-space-cache.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c
index f1d9b6bc23ba..96241f01fa0a 100644
--- a/fs/btrfs/free-space-cache.c
+++ b/fs/btrfs/free-space-cache.c
@@ -90,8 +90,8 @@ static struct btrfs_free_space *tree_search_offset(struct rb_root *root,
ret = entry;
n = n->rb_left;
} else if (offset > entry->offset) {
- if (contains &&
- (entry->offset + entry->bytes - 1) >= offset) {
+ if ((entry->offset + entry->bytes - 1) >= offset &&
+ bytes <= entry->bytes) {
ret = entry;
break;
}