Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 128417
b: refs/heads/master
c: f2654de
h: refs/heads/master
i:
  128415: 4763d7b
v: v3
  • Loading branch information
Chris Mason authored and David Woodhouse committed Jun 26, 2007
1 parent a01024f commit d96f39b
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 50 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: 4b52dff6d371b9b93bc99f64c32831ea9a8ec3ac
refs/heads/master: f2654de42a759127cb1f1e8a626ec94178732e20
79 changes: 30 additions & 49 deletions trunk/fs/btrfs/extent-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
static int find_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
*orig_root, u64 num_blocks, u64 search_start,
u64 search_end, u64 hint_block,
struct btrfs_key *ins, int data);
struct btrfs_key *ins, u64 exclude_start,
u64 exclude_nr, int data);
static int finish_current_insert(struct btrfs_trans_handle *trans, struct
btrfs_root *extent_root);
static int del_pending_extents(struct btrfs_trans_handle *trans, struct
Expand Down Expand Up @@ -407,7 +408,7 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
if (!path)
return -ENOMEM;
ret = find_free_extent(trans, root->fs_info->extent_root, 0, 0,
(u64)-1, 0, &ins, 0);
(u64)-1, 0, &ins, 0, 0, 0);
if (ret) {
btrfs_free_path(path);
return ret;
Expand Down Expand Up @@ -559,7 +560,8 @@ static int write_one_cache_group(struct btrfs_trans_handle *trans,
struct btrfs_block_group_item *bi;
struct btrfs_key ins;

ret = find_free_extent(trans, extent_root, 0, 0, (u64)-1, 0, &ins, 0);
ret = find_free_extent(trans, extent_root, 0, 0, (u64)-1, 0, &ins,
0, 0, 0);
/* FIXME, set bit to recalc cache groups on next mount */
if (ret)
return ret;
Expand Down Expand Up @@ -868,7 +870,7 @@ static int __free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
if (!path)
return -ENOMEM;

ret = find_free_extent(trans, root, 0, 0, (u64)-1, 0, &ins, 0);
ret = find_free_extent(trans, root, 0, 0, (u64)-1, 0, &ins, 0, 0, 0);
if (ret) {
btrfs_free_path(path);
return ret;
Expand Down Expand Up @@ -987,7 +989,8 @@ int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
static int find_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
*orig_root, u64 num_blocks, u64 search_start, u64
search_end, u64 hint_block,
struct btrfs_key *ins, int data)
struct btrfs_key *ins, u64 exclude_start,
u64 exclude_nr, int data)
{
struct btrfs_path *path;
struct btrfs_key key;
Expand Down Expand Up @@ -1191,6 +1194,11 @@ static int find_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
goto new_group;
}
}
if (exclude_nr > 0 && (ins->objectid + num_blocks > exclude_start &&
ins->objectid < exclude_start + exclude_nr)) {
search_start = exclude_start + exclude_nr;
goto new_group;
}
if (fill_prealloc) {
int nr;
test_block = ins->objectid;
Expand Down Expand Up @@ -1267,6 +1275,8 @@ int btrfs_alloc_extent(struct btrfs_trans_handle *trans,
int pending_ret;
u64 super_blocks_used;
u64 search_start = 0;
u64 exclude_start = 0;
u64 exclude_nr = 0;
struct btrfs_fs_info *info = root->fs_info;
struct btrfs_root *extent_root = info->extent_root;
struct btrfs_extent_item extent_item;
Expand Down Expand Up @@ -1298,33 +1308,19 @@ int btrfs_alloc_extent(struct btrfs_trans_handle *trans,
*/
if (data) {
ret = find_free_extent(trans, root, 0, 0,
search_end, 0, &prealloc_key, 0);
if (ret) {
search_end, 0, &prealloc_key, 0, 0, 0);
if (ret)
return ret;
}
if (prealloc_key.objectid + prealloc_key.offset >= search_end) {
int nr = info->extent_tree_prealloc_nr;
search_end = info->extent_tree_prealloc[nr - 1] - 1;
} else {
search_start = info->extent_tree_prealloc[0] + 1;
}
exclude_nr = info->extent_tree_prealloc_nr;
exclude_start = info->extent_tree_prealloc[exclude_nr - 1];
}
if (hint_block < search_start)
hint_block = search_start;

/* do the real allocation */
ret = find_free_extent(trans, root, num_blocks, search_start,
search_end, hint_block, ins, data);
if (ret) {
if (search_start == 0)
return ret;
search_end = search_start - 1;
search_start = 0;
hint_block = search_start;
ret = find_free_extent(trans, root, num_blocks, search_start,
search_end, hint_block, ins, data);
if (ret)
return ret;
}
search_end, hint_block, ins,
exclude_start, exclude_nr, data);
if (ret)
return ret;

/*
* if we're doing a metadata allocation, preallocate space in the
Expand All @@ -1336,29 +1332,14 @@ int btrfs_alloc_extent(struct btrfs_trans_handle *trans,
* The unused prealloc will get reused the next time around.
*/
if (!data) {
if (ins->objectid + ins->offset >= search_end)
search_end = ins->objectid - 1;
else
search_start = ins->objectid + ins->offset;

if (hint_block < search_start)
hint_block = search_start;

exclude_start = ins->objectid;
exclude_nr = ins->offset;
ret = find_free_extent(trans, root, 0, search_start,
search_end, hint_block,
&prealloc_key, 0);
if (ret) {
if (search_start == 0)
return ret;
search_end = search_start - 1;
search_start = 0;
hint_block = search_start;
ret = find_free_extent(trans, root, 0, search_start,
search_end, hint_block,
&prealloc_key, 0);
if (ret)
return ret;
}
&prealloc_key, exclude_start,
exclude_nr, 0);
if (ret)
return ret;
}

super_blocks_used = btrfs_super_blocks_used(&info->super_copy);
Expand Down

0 comments on commit d96f39b

Please sign in to comment.