Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 360402
b: refs/heads/master
c: a1897fd
h: refs/heads/master
v: v3
  • Loading branch information
Liu Bo authored and Josef Bacik committed Feb 20, 2013
1 parent 609a22a commit 1cb5c3f
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 39f9d028c9906cc7b625df84442205f6bcc84477
refs/heads/master: a1897fddd28daf6b23d05a30dc2a18836f77f8e3
1 change: 1 addition & 0 deletions trunk/fs/btrfs/ctree.h
Original file line number Diff line number Diff line change
Expand Up @@ -1250,6 +1250,7 @@ struct btrfs_fs_info {

/* block group cache stuff */
spinlock_t block_group_cache_lock;
u64 first_logical_byte;
struct rb_root block_group_cache_tree;

/* keep track of unallocated space */
Expand Down
1 change: 1 addition & 0 deletions trunk/fs/btrfs/disk-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -2130,6 +2130,7 @@ int open_ctree(struct super_block *sb,

spin_lock_init(&fs_info->block_group_cache_lock);
fs_info->block_group_cache_tree = RB_ROOT;
fs_info->first_logical_byte = (u64)-1;

extent_io_tree_init(&fs_info->freed_extents[0],
fs_info->btree_inode->i_mapping);
Expand Down
19 changes: 18 additions & 1 deletion trunk/fs/btrfs/extent-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,10 @@ static int btrfs_add_block_group_cache(struct btrfs_fs_info *info,
rb_link_node(&block_group->cache_node, parent, p);
rb_insert_color(&block_group->cache_node,
&info->block_group_cache_tree);

if (info->first_logical_byte > block_group->key.objectid)
info->first_logical_byte = block_group->key.objectid;

spin_unlock(&info->block_group_cache_lock);

return 0;
Expand Down Expand Up @@ -202,8 +206,11 @@ block_group_cache_tree_search(struct btrfs_fs_info *info, u64 bytenr,
break;
}
}
if (ret)
if (ret) {
btrfs_get_block_group(ret);
if (bytenr == 0 && info->first_logical_byte > ret->key.objectid)
info->first_logical_byte = ret->key.objectid;
}
spin_unlock(&info->block_group_cache_lock);

return ret;
Expand Down Expand Up @@ -4848,6 +4855,13 @@ static u64 first_logical_byte(struct btrfs_root *root, u64 search_start)
struct btrfs_block_group_cache *cache;
u64 bytenr;

spin_lock(&root->fs_info->block_group_cache_lock);
bytenr = root->fs_info->first_logical_byte;
spin_unlock(&root->fs_info->block_group_cache_lock);

if (bytenr < (u64)-1)
return bytenr;

cache = btrfs_lookup_first_block_group(root->fs_info, search_start);
if (!cache)
return 0;
Expand Down Expand Up @@ -8059,6 +8073,9 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
spin_lock(&root->fs_info->block_group_cache_lock);
rb_erase(&block_group->cache_node,
&root->fs_info->block_group_cache_tree);

if (root->fs_info->first_logical_byte == block_group->key.objectid)
root->fs_info->first_logical_byte = (u64)-1;
spin_unlock(&root->fs_info->block_group_cache_lock);

down_write(&block_group->space_info->groups_sem);
Expand Down

0 comments on commit 1cb5c3f

Please sign in to comment.