aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorLiu Bo <bo.li.liu@oracle.com>2012-12-27 04:01:23 -0500
committerJosef Bacik <jbacik@fusionio.com>2013-02-20 09:37:18 -0500
commita1897fddd28daf6b23d05a30dc2a18836f77f8e3 (patch)
tree801697e69b202721e861ab33d78d7f3bcb6235c5 /fs
parent39f9d028c9906cc7b625df84442205f6bcc84477 (diff)
Btrfs: record first logical byte in memory
This'd save us a rbtree search which may become expensive in large filesystem. Signed-off-by: Liu Bo <bo.li.liu@oracle.com> Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/ctree.h1
-rw-r--r--fs/btrfs/disk-io.c1
-rw-r--r--fs/btrfs/extent-tree.c19
3 files changed, 20 insertions, 1 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index 22f012d41fd0..9ee099f3f834 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -1250,6 +1250,7 @@ struct btrfs_fs_info {
1250 1250
1251 /* block group cache stuff */ 1251 /* block group cache stuff */
1252 spinlock_t block_group_cache_lock; 1252 spinlock_t block_group_cache_lock;
1253 u64 first_logical_byte;
1253 struct rb_root block_group_cache_tree; 1254 struct rb_root block_group_cache_tree;
1254 1255
1255 /* keep track of unallocated space */ 1256 /* keep track of unallocated space */
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 1db8a9938829..04f98e3ffd90 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -2130,6 +2130,7 @@ int open_ctree(struct super_block *sb,
2130 2130
2131 spin_lock_init(&fs_info->block_group_cache_lock); 2131 spin_lock_init(&fs_info->block_group_cache_lock);
2132 fs_info->block_group_cache_tree = RB_ROOT; 2132 fs_info->block_group_cache_tree = RB_ROOT;
2133 fs_info->first_logical_byte = (u64)-1;
2133 2134
2134 extent_io_tree_init(&fs_info->freed_extents[0], 2135 extent_io_tree_init(&fs_info->freed_extents[0],
2135 fs_info->btree_inode->i_mapping); 2136 fs_info->btree_inode->i_mapping);
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 825f23b13b58..82400b2b2517 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -161,6 +161,10 @@ static int btrfs_add_block_group_cache(struct btrfs_fs_info *info,
161 rb_link_node(&block_group->cache_node, parent, p); 161 rb_link_node(&block_group->cache_node, parent, p);
162 rb_insert_color(&block_group->cache_node, 162 rb_insert_color(&block_group->cache_node,
163 &info->block_group_cache_tree); 163 &info->block_group_cache_tree);
164
165 if (info->first_logical_byte > block_group->key.objectid)
166 info->first_logical_byte = block_group->key.objectid;
167
164 spin_unlock(&info->block_group_cache_lock); 168 spin_unlock(&info->block_group_cache_lock);
165 169
166 return 0; 170 return 0;
@@ -202,8 +206,11 @@ block_group_cache_tree_search(struct btrfs_fs_info *info, u64 bytenr,
202 break; 206 break;
203 } 207 }
204 } 208 }
205 if (ret) 209 if (ret) {
206 btrfs_get_block_group(ret); 210 btrfs_get_block_group(ret);
211 if (bytenr == 0 && info->first_logical_byte > ret->key.objectid)
212 info->first_logical_byte = ret->key.objectid;
213 }
207 spin_unlock(&info->block_group_cache_lock); 214 spin_unlock(&info->block_group_cache_lock);
208 215
209 return ret; 216 return ret;
@@ -4848,6 +4855,13 @@ static u64 first_logical_byte(struct btrfs_root *root, u64 search_start)
4848 struct btrfs_block_group_cache *cache; 4855 struct btrfs_block_group_cache *cache;
4849 u64 bytenr; 4856 u64 bytenr;
4850 4857
4858 spin_lock(&root->fs_info->block_group_cache_lock);
4859 bytenr = root->fs_info->first_logical_byte;
4860 spin_unlock(&root->fs_info->block_group_cache_lock);
4861
4862 if (bytenr < (u64)-1)
4863 return bytenr;
4864
4851 cache = btrfs_lookup_first_block_group(root->fs_info, search_start); 4865 cache = btrfs_lookup_first_block_group(root->fs_info, search_start);
4852 if (!cache) 4866 if (!cache)
4853 return 0; 4867 return 0;
@@ -8059,6 +8073,9 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
8059 spin_lock(&root->fs_info->block_group_cache_lock); 8073 spin_lock(&root->fs_info->block_group_cache_lock);
8060 rb_erase(&block_group->cache_node, 8074 rb_erase(&block_group->cache_node,
8061 &root->fs_info->block_group_cache_tree); 8075 &root->fs_info->block_group_cache_tree);
8076
8077 if (root->fs_info->first_logical_byte == block_group->key.objectid)
8078 root->fs_info->first_logical_byte = (u64)-1;
8062 spin_unlock(&root->fs_info->block_group_cache_lock); 8079 spin_unlock(&root->fs_info->block_group_cache_lock);
8063 8080
8064 down_write(&block_group->space_info->groups_sem); 8081 down_write(&block_group->space_info->groups_sem);