Skip to content

Commit

Permalink
Btrfs: Optimize tree log block allocations
Browse files Browse the repository at this point in the history
Since tree log blocks get freed every transaction, they never really
need to be written to disk.  This skips the step where we update
metadata to record they were allocated.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
  • Loading branch information
Chris Mason committed Sep 25, 2008
1 parent 3a5f1d4 commit d00aff0
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 21 deletions.
5 changes: 2 additions & 3 deletions fs/btrfs/disk-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -829,9 +829,8 @@ int btrfs_free_log_root_tree(struct btrfs_trans_handle *trans,
WARN_ON(btrfs_header_level(eb) != 0);
WARN_ON(btrfs_header_nritems(eb) != 0);

ret = btrfs_free_extent(trans, fs_info->tree_root,
eb->start, eb->len,
BTRFS_TREE_LOG_OBJECTID, 0, 0, 0, 1);
ret = btrfs_free_reserved_extent(fs_info->tree_root,
eb->start, eb->len);
BUG_ON(ret);

free_extent_buffer(eb);
Expand Down
19 changes: 14 additions & 5 deletions fs/btrfs/extent-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -1872,8 +1872,15 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans,
return 0;
}
/* if metadata always pin */
if (owner_objectid < BTRFS_FIRST_FREE_OBJECTID)
if (owner_objectid < BTRFS_FIRST_FREE_OBJECTID) {
if (root->root_key.objectid == BTRFS_TREE_LOG_OBJECTID) {
/* btrfs_free_reserved_extent */
set_extent_dirty(&root->fs_info->free_space_cache,
bytenr, bytenr + num_bytes - 1, GFP_NOFS);
return 0;
}
pin = 1;
}

/* if data pin when any transaction has committed this */
if (ref_generation != trans->transid)
Expand Down Expand Up @@ -2361,11 +2368,13 @@ int btrfs_alloc_extent(struct btrfs_trans_handle *trans,
min_alloc_size, empty_size, hint_byte,
search_end, ins, data);
BUG_ON(ret);
ret = __btrfs_alloc_reserved_extent(trans, root, root_objectid,
ref_generation, owner,
owner_offset, ins);
BUG_ON(ret);
if (root_objectid != BTRFS_TREE_LOG_OBJECTID) {
ret = __btrfs_alloc_reserved_extent(trans, root, root_objectid,
ref_generation, owner,
owner_offset, ins);
BUG_ON(ret);

}
maybe_unlock_mutex(root);
return ret;
}
Expand Down
20 changes: 7 additions & 13 deletions fs/btrfs/tree-log.c
Original file line number Diff line number Diff line change
Expand Up @@ -1728,9 +1728,8 @@ static int noinline walk_down_log_tree(struct btrfs_trans_handle *trans,

WARN_ON(root_owner !=
BTRFS_TREE_LOG_OBJECTID);
ret = btrfs_free_extent(trans, root, bytenr,
blocksize, root_owner,
root_gen, 0, 0, 1);
ret = btrfs_free_reserved_extent(root,
bytenr, blocksize);
BUG_ON(ret);
}
free_extent_buffer(next);
Expand Down Expand Up @@ -1775,8 +1774,7 @@ static int noinline walk_down_log_tree(struct btrfs_trans_handle *trans,
BUG_ON(ret);
}
WARN_ON(root_owner != BTRFS_TREE_LOG_OBJECTID);
ret = btrfs_free_extent(trans, root, bytenr, blocksize,
root_owner, root_gen, 0, 0, 1);
ret = btrfs_free_reserved_extent(root, bytenr, blocksize);
BUG_ON(ret);
}
free_extent_buffer(path->nodes[*level]);
Expand Down Expand Up @@ -1837,10 +1835,9 @@ static int noinline walk_up_log_tree(struct btrfs_trans_handle *trans,
}

WARN_ON(root_owner != BTRFS_TREE_LOG_OBJECTID);
ret = btrfs_free_extent(trans, root,
ret = btrfs_free_reserved_extent(root,
path->nodes[*level]->start,
path->nodes[*level]->len,
root_owner, root_gen, 0, 0, 1);
path->nodes[*level]->len);
BUG_ON(ret);
}
free_extent_buffer(path->nodes[*level]);
Expand Down Expand Up @@ -1910,11 +1907,8 @@ static int walk_log_tree(struct btrfs_trans_handle *trans,
}
WARN_ON(log->root_key.objectid !=
BTRFS_TREE_LOG_OBJECTID);
ret = btrfs_free_extent(trans, log,
next->start, next->len,
log->root_key.objectid,
btrfs_header_generation(next),
0, 0, 1);
ret = btrfs_free_reserved_extent(log, next->start,
next->len);
BUG_ON(ret);
}
}
Expand Down

0 comments on commit d00aff0

Please sign in to comment.