Btrfs: more efficient inode tree replace operation
Instead of removing the current inode from the red black tree and then add the new one, just use the red black tree replace operation, which is more efficient. Signed-off-by: Filipe David Borba Manana <fdmanana@gmail.com> Reviewed-by: Zach Brown <zab@redhat.com> Signed-off-by: Josef Bacik <jbacik@fusionio.com> Signed-off-by: Chris Mason <chris.mason@fusionio.com>
This commit is contained in:
Родитель
55e50e458e
Коммит
cef2193729
|
@ -4688,11 +4688,11 @@ static void inode_tree_add(struct inode *inode)
|
|||
struct btrfs_inode *entry;
|
||||
struct rb_node **p;
|
||||
struct rb_node *parent;
|
||||
struct rb_node *new = &BTRFS_I(inode)->rb_node;
|
||||
u64 ino = btrfs_ino(inode);
|
||||
|
||||
if (inode_unhashed(inode))
|
||||
return;
|
||||
again:
|
||||
parent = NULL;
|
||||
spin_lock(&root->inode_lock);
|
||||
p = &root->inode_tree.rb_node;
|
||||
|
@ -4707,14 +4707,14 @@ again:
|
|||
else {
|
||||
WARN_ON(!(entry->vfs_inode.i_state &
|
||||
(I_WILL_FREE | I_FREEING)));
|
||||
rb_erase(parent, &root->inode_tree);
|
||||
rb_replace_node(parent, new, &root->inode_tree);
|
||||
RB_CLEAR_NODE(parent);
|
||||
spin_unlock(&root->inode_lock);
|
||||
goto again;
|
||||
return;
|
||||
}
|
||||
}
|
||||
rb_link_node(&BTRFS_I(inode)->rb_node, parent, p);
|
||||
rb_insert_color(&BTRFS_I(inode)->rb_node, &root->inode_tree);
|
||||
rb_link_node(new, parent, p);
|
||||
rb_insert_color(new, &root->inode_tree);
|
||||
spin_unlock(&root->inode_lock);
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче