mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 16:24:13 +08:00
Btrfs: Optimize tree log block allocations
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>
This commit is contained in:
parent
3a5f1d458a
commit
d00aff0013
@ -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);
|
||||
|
@ -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)
|
||||
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
@ -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]);
|
||||
@ -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]);
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user