mirror of
https://github.com/torvalds/linux.git
synced 2025-11-02 17:49:03 +02:00
btrfs: Rename and export clear_btree_io_tree
This function is going to be used to clear out the device extent allocation information. Give it a more generic name and export it. This is in preparation to replacing the pending/pinned chunk lists with an extent tree. No functional changes. Signed-off-by: Nikolay Borisov <nborisov@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
61d0d0d2cb
commit
41e7acd38c
3 changed files with 34 additions and 33 deletions
|
|
@ -266,6 +266,35 @@ void extent_io_tree_init(struct btrfs_fs_info *fs_info,
|
||||||
tree->owner = owner;
|
tree->owner = owner;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void extent_io_tree_release(struct extent_io_tree *tree)
|
||||||
|
{
|
||||||
|
spin_lock(&tree->lock);
|
||||||
|
/*
|
||||||
|
* Do a single barrier for the waitqueue_active check here, the state
|
||||||
|
* of the waitqueue should not change once extent_io_tree_release is
|
||||||
|
* called.
|
||||||
|
*/
|
||||||
|
smp_mb();
|
||||||
|
while (!RB_EMPTY_ROOT(&tree->state)) {
|
||||||
|
struct rb_node *node;
|
||||||
|
struct extent_state *state;
|
||||||
|
|
||||||
|
node = rb_first(&tree->state);
|
||||||
|
state = rb_entry(node, struct extent_state, rb_node);
|
||||||
|
rb_erase(&state->rb_node, &tree->state);
|
||||||
|
RB_CLEAR_NODE(&state->rb_node);
|
||||||
|
/*
|
||||||
|
* btree io trees aren't supposed to have tasks waiting for
|
||||||
|
* changes in the flags of extent states ever.
|
||||||
|
*/
|
||||||
|
ASSERT(!waitqueue_active(&state->wq));
|
||||||
|
free_extent_state(state);
|
||||||
|
|
||||||
|
cond_resched_lock(&tree->lock);
|
||||||
|
}
|
||||||
|
spin_unlock(&tree->lock);
|
||||||
|
}
|
||||||
|
|
||||||
static struct extent_state *alloc_extent_state(gfp_t mask)
|
static struct extent_state *alloc_extent_state(gfp_t mask)
|
||||||
{
|
{
|
||||||
struct extent_state *state;
|
struct extent_state *state;
|
||||||
|
|
|
||||||
|
|
@ -255,6 +255,7 @@ typedef struct extent_map *(get_extent_t)(struct btrfs_inode *inode,
|
||||||
void extent_io_tree_init(struct btrfs_fs_info *fs_info,
|
void extent_io_tree_init(struct btrfs_fs_info *fs_info,
|
||||||
struct extent_io_tree *tree, unsigned int owner,
|
struct extent_io_tree *tree, unsigned int owner,
|
||||||
void *private_data);
|
void *private_data);
|
||||||
|
void extent_io_tree_release(struct extent_io_tree *tree);
|
||||||
int try_release_extent_mapping(struct page *page, gfp_t mask);
|
int try_release_extent_mapping(struct page *page, gfp_t mask);
|
||||||
int try_release_extent_buffer(struct page *page);
|
int try_release_extent_buffer(struct page *page);
|
||||||
int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
|
int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
|
||||||
|
|
|
||||||
|
|
@ -80,35 +80,6 @@ void btrfs_put_transaction(struct btrfs_transaction *transaction)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clear_btree_io_tree(struct extent_io_tree *tree)
|
|
||||||
{
|
|
||||||
spin_lock(&tree->lock);
|
|
||||||
/*
|
|
||||||
* Do a single barrier for the waitqueue_active check here, the state
|
|
||||||
* of the waitqueue should not change once clear_btree_io_tree is
|
|
||||||
* called.
|
|
||||||
*/
|
|
||||||
smp_mb();
|
|
||||||
while (!RB_EMPTY_ROOT(&tree->state)) {
|
|
||||||
struct rb_node *node;
|
|
||||||
struct extent_state *state;
|
|
||||||
|
|
||||||
node = rb_first(&tree->state);
|
|
||||||
state = rb_entry(node, struct extent_state, rb_node);
|
|
||||||
rb_erase(&state->rb_node, &tree->state);
|
|
||||||
RB_CLEAR_NODE(&state->rb_node);
|
|
||||||
/*
|
|
||||||
* btree io trees aren't supposed to have tasks waiting for
|
|
||||||
* changes in the flags of extent states ever.
|
|
||||||
*/
|
|
||||||
ASSERT(!waitqueue_active(&state->wq));
|
|
||||||
free_extent_state(state);
|
|
||||||
|
|
||||||
cond_resched_lock(&tree->lock);
|
|
||||||
}
|
|
||||||
spin_unlock(&tree->lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
static noinline void switch_commit_roots(struct btrfs_transaction *trans)
|
static noinline void switch_commit_roots(struct btrfs_transaction *trans)
|
||||||
{
|
{
|
||||||
struct btrfs_fs_info *fs_info = trans->fs_info;
|
struct btrfs_fs_info *fs_info = trans->fs_info;
|
||||||
|
|
@ -122,7 +93,7 @@ static noinline void switch_commit_roots(struct btrfs_transaction *trans)
|
||||||
root->commit_root = btrfs_root_node(root);
|
root->commit_root = btrfs_root_node(root);
|
||||||
if (is_fstree(root->root_key.objectid))
|
if (is_fstree(root->root_key.objectid))
|
||||||
btrfs_unpin_free_ino(root);
|
btrfs_unpin_free_ino(root);
|
||||||
clear_btree_io_tree(&root->dirty_log_pages);
|
extent_io_tree_release(&root->dirty_log_pages);
|
||||||
btrfs_qgroup_clean_swapped_blocks(root);
|
btrfs_qgroup_clean_swapped_blocks(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -930,7 +901,7 @@ int btrfs_write_marked_extents(struct btrfs_fs_info *fs_info,
|
||||||
* superblock that points to btree nodes/leafs for which
|
* superblock that points to btree nodes/leafs for which
|
||||||
* writeback hasn't finished yet (and without errors).
|
* writeback hasn't finished yet (and without errors).
|
||||||
* We cleanup any entries left in the io tree when committing
|
* We cleanup any entries left in the io tree when committing
|
||||||
* the transaction (through clear_btree_io_tree()).
|
* the transaction (through extent_io_tree_release()).
|
||||||
*/
|
*/
|
||||||
if (err == -ENOMEM) {
|
if (err == -ENOMEM) {
|
||||||
err = 0;
|
err = 0;
|
||||||
|
|
@ -975,7 +946,7 @@ static int __btrfs_wait_marked_extents(struct btrfs_fs_info *fs_info,
|
||||||
* left in the io tree. For a log commit, we don't remove them
|
* left in the io tree. For a log commit, we don't remove them
|
||||||
* after committing the log because the tree can be accessed
|
* after committing the log because the tree can be accessed
|
||||||
* concurrently - we do it only at transaction commit time when
|
* concurrently - we do it only at transaction commit time when
|
||||||
* it's safe to do it (through clear_btree_io_tree()).
|
* it's safe to do it (through extent_io_tree_release()).
|
||||||
*/
|
*/
|
||||||
err = clear_extent_bit(dirty_pages, start, end,
|
err = clear_extent_bit(dirty_pages, start, end,
|
||||||
EXTENT_NEED_WAIT, 0, 0, &cached_state);
|
EXTENT_NEED_WAIT, 0, 0, &cached_state);
|
||||||
|
|
@ -1053,7 +1024,7 @@ static int btrfs_write_and_wait_transaction(struct btrfs_trans_handle *trans)
|
||||||
blk_finish_plug(&plug);
|
blk_finish_plug(&plug);
|
||||||
ret2 = btrfs_wait_extents(fs_info, dirty_pages);
|
ret2 = btrfs_wait_extents(fs_info, dirty_pages);
|
||||||
|
|
||||||
clear_btree_io_tree(&trans->transaction->dirty_pages);
|
extent_io_tree_release(&trans->transaction->dirty_pages);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue