btrfs: Introduce extent_io_tree::owner to distinguish different io_trees
Btrfs has the following different extent_io_trees used: - fs_info::free_extents[2] - btrfs_inode::io_tree - for both normal inodes and the btree inode - btrfs_inode::io_failure_tree - btrfs_transaction::dirty_pages - btrfs_root::dirty_log_pages If we want to trace changes in those trees, it will be pretty hard to distinguish them. Instead of using hard-to-read pointer address, this patch will introduce a new member extent_io_tree::owner to track the owner. This modification needs all the callers of extent_io_tree_init() to accept a new parameter @owner. This patch provides the basis for later trace events. Signed-off-by: Qu Wenruo <wqu@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
7b4397386f
commit
43eb5f2975
|
@ -1211,7 +1211,8 @@ static void __setup_root(struct btrfs_root *root, struct btrfs_fs_info *fs_info,
|
||||||
root->log_transid_committed = -1;
|
root->log_transid_committed = -1;
|
||||||
root->last_log_commit = 0;
|
root->last_log_commit = 0;
|
||||||
if (!dummy)
|
if (!dummy)
|
||||||
extent_io_tree_init(fs_info, &root->dirty_log_pages, NULL);
|
extent_io_tree_init(fs_info, &root->dirty_log_pages,
|
||||||
|
IO_TREE_ROOT_DIRTY_LOG_PAGES, NULL);
|
||||||
|
|
||||||
memset(&root->root_key, 0, sizeof(root->root_key));
|
memset(&root->root_key, 0, sizeof(root->root_key));
|
||||||
memset(&root->root_item, 0, sizeof(root->root_item));
|
memset(&root->root_item, 0, sizeof(root->root_item));
|
||||||
|
@ -2141,7 +2142,8 @@ static void btrfs_init_btree_inode(struct btrfs_fs_info *fs_info)
|
||||||
inode->i_mapping->a_ops = &btree_aops;
|
inode->i_mapping->a_ops = &btree_aops;
|
||||||
|
|
||||||
RB_CLEAR_NODE(&BTRFS_I(inode)->rb_node);
|
RB_CLEAR_NODE(&BTRFS_I(inode)->rb_node);
|
||||||
extent_io_tree_init(fs_info, &BTRFS_I(inode)->io_tree, inode);
|
extent_io_tree_init(fs_info, &BTRFS_I(inode)->io_tree,
|
||||||
|
IO_TREE_INODE_IO, inode);
|
||||||
BTRFS_I(inode)->io_tree.track_uptodate = false;
|
BTRFS_I(inode)->io_tree.track_uptodate = false;
|
||||||
extent_map_tree_init(&BTRFS_I(inode)->extent_tree);
|
extent_map_tree_init(&BTRFS_I(inode)->extent_tree);
|
||||||
|
|
||||||
|
@ -2751,8 +2753,10 @@ int open_ctree(struct super_block *sb,
|
||||||
fs_info->block_group_cache_tree = RB_ROOT;
|
fs_info->block_group_cache_tree = RB_ROOT;
|
||||||
fs_info->first_logical_byte = (u64)-1;
|
fs_info->first_logical_byte = (u64)-1;
|
||||||
|
|
||||||
extent_io_tree_init(fs_info, &fs_info->freed_extents[0], NULL);
|
extent_io_tree_init(fs_info, &fs_info->freed_extents[0],
|
||||||
extent_io_tree_init(fs_info, &fs_info->freed_extents[1], NULL);
|
IO_TREE_FS_INFO_FREED_EXTENTS0, NULL);
|
||||||
|
extent_io_tree_init(fs_info, &fs_info->freed_extents[1],
|
||||||
|
IO_TREE_FS_INFO_FREED_EXTENTS1, NULL);
|
||||||
fs_info->pinned_extents = &fs_info->freed_extents[0];
|
fs_info->pinned_extents = &fs_info->freed_extents[0];
|
||||||
set_bit(BTRFS_FS_BARRIER, &fs_info->flags);
|
set_bit(BTRFS_FS_BARRIER, &fs_info->flags);
|
||||||
|
|
||||||
|
|
|
@ -233,7 +233,8 @@ void __cold extent_io_exit(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
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, void *private_data)
|
struct extent_io_tree *tree, unsigned int owner,
|
||||||
|
void *private_data)
|
||||||
{
|
{
|
||||||
tree->fs_info = fs_info;
|
tree->fs_info = fs_info;
|
||||||
tree->state = RB_ROOT;
|
tree->state = RB_ROOT;
|
||||||
|
@ -241,6 +242,7 @@ void extent_io_tree_init(struct btrfs_fs_info *fs_info,
|
||||||
tree->dirty_bytes = 0;
|
tree->dirty_bytes = 0;
|
||||||
spin_lock_init(&tree->lock);
|
spin_lock_init(&tree->lock);
|
||||||
tree->private_data = private_data;
|
tree->private_data = private_data;
|
||||||
|
tree->owner = owner;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct extent_state *alloc_extent_state(gfp_t mask)
|
static struct extent_state *alloc_extent_state(gfp_t mask)
|
||||||
|
|
|
@ -106,12 +106,27 @@ struct extent_io_ops {
|
||||||
int mirror);
|
int mirror);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
IO_TREE_FS_INFO_FREED_EXTENTS0,
|
||||||
|
IO_TREE_FS_INFO_FREED_EXTENTS1,
|
||||||
|
IO_TREE_INODE_IO,
|
||||||
|
IO_TREE_INODE_IO_FAILURE,
|
||||||
|
IO_TREE_RELOC_BLOCKS,
|
||||||
|
IO_TREE_TRANS_DIRTY_PAGES,
|
||||||
|
IO_TREE_ROOT_DIRTY_LOG_PAGES,
|
||||||
|
IO_TREE_SELFTEST,
|
||||||
|
};
|
||||||
|
|
||||||
struct extent_io_tree {
|
struct extent_io_tree {
|
||||||
struct rb_root state;
|
struct rb_root state;
|
||||||
struct btrfs_fs_info *fs_info;
|
struct btrfs_fs_info *fs_info;
|
||||||
void *private_data;
|
void *private_data;
|
||||||
u64 dirty_bytes;
|
u64 dirty_bytes;
|
||||||
bool track_uptodate;
|
bool track_uptodate;
|
||||||
|
|
||||||
|
/* Who owns this io tree, should be one of IO_TREE_* */
|
||||||
|
u8 owner;
|
||||||
|
|
||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
const struct extent_io_ops *ops;
|
const struct extent_io_ops *ops;
|
||||||
};
|
};
|
||||||
|
@ -241,7 +256,8 @@ typedef struct extent_map *(get_extent_t)(struct btrfs_inode *inode,
|
||||||
int create);
|
int create);
|
||||||
|
|
||||||
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, void *private_data);
|
struct extent_io_tree *tree, unsigned int owner,
|
||||||
|
void *private_data);
|
||||||
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,
|
||||||
|
|
|
@ -9182,8 +9182,9 @@ struct inode *btrfs_alloc_inode(struct super_block *sb)
|
||||||
|
|
||||||
inode = &ei->vfs_inode;
|
inode = &ei->vfs_inode;
|
||||||
extent_map_tree_init(&ei->extent_tree);
|
extent_map_tree_init(&ei->extent_tree);
|
||||||
extent_io_tree_init(fs_info, &ei->io_tree, inode);
|
extent_io_tree_init(fs_info, &ei->io_tree, IO_TREE_INODE_IO, inode);
|
||||||
extent_io_tree_init(fs_info, &ei->io_failure_tree, inode);
|
extent_io_tree_init(fs_info, &ei->io_failure_tree,
|
||||||
|
IO_TREE_INODE_IO_FAILURE, inode);
|
||||||
ei->io_tree.track_uptodate = true;
|
ei->io_tree.track_uptodate = true;
|
||||||
ei->io_failure_tree.track_uptodate = true;
|
ei->io_failure_tree.track_uptodate = true;
|
||||||
atomic_set(&ei->sync_writers, 0);
|
atomic_set(&ei->sync_writers, 0);
|
||||||
|
|
|
@ -4234,7 +4234,8 @@ static struct reloc_control *alloc_reloc_control(struct btrfs_fs_info *fs_info)
|
||||||
INIT_LIST_HEAD(&rc->dirty_subvol_roots);
|
INIT_LIST_HEAD(&rc->dirty_subvol_roots);
|
||||||
backref_cache_init(&rc->backref_cache);
|
backref_cache_init(&rc->backref_cache);
|
||||||
mapping_tree_init(&rc->reloc_root_tree);
|
mapping_tree_init(&rc->reloc_root_tree);
|
||||||
extent_io_tree_init(fs_info, &rc->processed_blocks, NULL);
|
extent_io_tree_init(fs_info, &rc->processed_blocks,
|
||||||
|
IO_TREE_RELOC_BLOCKS, NULL);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -115,8 +115,10 @@ struct btrfs_fs_info *btrfs_alloc_dummy_fs_info(u32 nodesize, u32 sectorsize)
|
||||||
INIT_LIST_HEAD(&fs_info->tree_mod_seq_list);
|
INIT_LIST_HEAD(&fs_info->tree_mod_seq_list);
|
||||||
INIT_RADIX_TREE(&fs_info->buffer_radix, GFP_ATOMIC);
|
INIT_RADIX_TREE(&fs_info->buffer_radix, GFP_ATOMIC);
|
||||||
INIT_RADIX_TREE(&fs_info->fs_roots_radix, GFP_ATOMIC);
|
INIT_RADIX_TREE(&fs_info->fs_roots_radix, GFP_ATOMIC);
|
||||||
extent_io_tree_init(fs_info, &fs_info->freed_extents[0], NULL);
|
extent_io_tree_init(fs_info, &fs_info->freed_extents[0],
|
||||||
extent_io_tree_init(fs_info, &fs_info->freed_extents[1], NULL);
|
IO_TREE_FS_INFO_FREED_EXTENTS0, NULL);
|
||||||
|
extent_io_tree_init(fs_info, &fs_info->freed_extents[1],
|
||||||
|
IO_TREE_FS_INFO_FREED_EXTENTS1, NULL);
|
||||||
fs_info->pinned_extents = &fs_info->freed_extents[0];
|
fs_info->pinned_extents = &fs_info->freed_extents[0];
|
||||||
set_bit(BTRFS_FS_STATE_DUMMY_FS_INFO, &fs_info->fs_state);
|
set_bit(BTRFS_FS_STATE_DUMMY_FS_INFO, &fs_info->fs_state);
|
||||||
|
|
||||||
|
|
|
@ -77,7 +77,11 @@ static int test_find_delalloc(u32 sectorsize)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
extent_io_tree_init(NULL, &tmp, NULL);
|
/*
|
||||||
|
* Passing NULL as we don't have fs_info but tracepoints are not used
|
||||||
|
* at this point
|
||||||
|
*/
|
||||||
|
extent_io_tree_init(NULL, &tmp, IO_TREE_SELFTEST, NULL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First go through and create and mark all of our pages dirty, we pin
|
* First go through and create and mark all of our pages dirty, we pin
|
||||||
|
|
|
@ -275,7 +275,7 @@ loop:
|
||||||
spin_lock_init(&cur_trans->dropped_roots_lock);
|
spin_lock_init(&cur_trans->dropped_roots_lock);
|
||||||
list_add_tail(&cur_trans->list, &fs_info->trans_list);
|
list_add_tail(&cur_trans->list, &fs_info->trans_list);
|
||||||
extent_io_tree_init(fs_info, &cur_trans->dirty_pages,
|
extent_io_tree_init(fs_info, &cur_trans->dirty_pages,
|
||||||
fs_info->btree_inode);
|
IO_TREE_TRANS_DIRTY_PAGES, fs_info->btree_inode);
|
||||||
fs_info->generation++;
|
fs_info->generation++;
|
||||||
cur_trans->transid = fs_info->generation;
|
cur_trans->transid = fs_info->generation;
|
||||||
fs_info->running_transaction = cur_trans;
|
fs_info->running_transaction = cur_trans;
|
||||||
|
|
Loading…
Reference in New Issue