mirror of https://github.com/torvalds/linux.git
btrfs: use rb_find_add() in btrfs_insert_inode_defrag()
Use the rb-tree helper so we don't open code the search and insert code. Signed-off-by: Yangtao Li <frank.li@vivo.com> Signed-off-by: Pan Chuang <panchuang@vivo.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
06c3437f74
commit
7a91e01875
|
|
@ -60,6 +60,14 @@ static int compare_inode_defrag(const struct inode_defrag *defrag1,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int inode_defrag_cmp(struct rb_node *new, const struct rb_node *existing)
|
||||||
|
{
|
||||||
|
const struct inode_defrag *new_defrag = rb_entry(new, struct inode_defrag, rb_node);
|
||||||
|
const struct inode_defrag *existing_defrag = rb_entry(existing, struct inode_defrag, rb_node);
|
||||||
|
|
||||||
|
return compare_inode_defrag(new_defrag, existing_defrag);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Insert a record for an inode into the defrag tree. The lock must be held
|
* Insert a record for an inode into the defrag tree. The lock must be held
|
||||||
* already.
|
* already.
|
||||||
|
|
@ -71,37 +79,23 @@ static int btrfs_insert_inode_defrag(struct btrfs_inode *inode,
|
||||||
struct inode_defrag *defrag)
|
struct inode_defrag *defrag)
|
||||||
{
|
{
|
||||||
struct btrfs_fs_info *fs_info = inode->root->fs_info;
|
struct btrfs_fs_info *fs_info = inode->root->fs_info;
|
||||||
struct inode_defrag *entry;
|
struct rb_node *node;
|
||||||
struct rb_node **p;
|
|
||||||
struct rb_node *parent = NULL;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
p = &fs_info->defrag_inodes.rb_node;
|
node = rb_find_add(&defrag->rb_node, &fs_info->defrag_inodes, inode_defrag_cmp);
|
||||||
while (*p) {
|
if (node) {
|
||||||
parent = *p;
|
struct inode_defrag *entry;
|
||||||
entry = rb_entry(parent, struct inode_defrag, rb_node);
|
|
||||||
|
|
||||||
ret = compare_inode_defrag(defrag, entry);
|
entry = rb_entry(node, struct inode_defrag, rb_node);
|
||||||
if (ret < 0)
|
/*
|
||||||
p = &parent->rb_left;
|
* If we're reinserting an entry for an old defrag run, make
|
||||||
else if (ret > 0)
|
* sure to lower the transid of our existing record.
|
||||||
p = &parent->rb_right;
|
*/
|
||||||
else {
|
if (defrag->transid < entry->transid)
|
||||||
/*
|
entry->transid = defrag->transid;
|
||||||
* If we're reinserting an entry for an old defrag run,
|
entry->extent_thresh = min(defrag->extent_thresh, entry->extent_thresh);
|
||||||
* make sure to lower the transid of our existing
|
return -EEXIST;
|
||||||
* record.
|
|
||||||
*/
|
|
||||||
if (defrag->transid < entry->transid)
|
|
||||||
entry->transid = defrag->transid;
|
|
||||||
entry->extent_thresh = min(defrag->extent_thresh,
|
|
||||||
entry->extent_thresh);
|
|
||||||
return -EEXIST;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
set_bit(BTRFS_INODE_IN_DEFRAG, &inode->runtime_flags);
|
set_bit(BTRFS_INODE_IN_DEFRAG, &inode->runtime_flags);
|
||||||
rb_link_node(&defrag->rb_node, parent, p);
|
|
||||||
rb_insert_color(&defrag->rb_node, &fs_info->defrag_inodes);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue