static int comp_refs(struct btrfs_delayed_ref_node *ref1, struct btrfs_delayed_ref_node *ref2, bool check_seq) { int ret = 0; if (ref1->type < ref2->type) return -1; if (ref1->type > ref2->type) return 1; if (ref1->type == BTRFS_TREE_BLOCK_REF_KEY || ref1->type == BTRFS_SHARED_BLOCK_REF_KEY) ret = comp_tree_refs(btrfs_delayed_node_to_tree_ref(ref1), btrfs_delayed_node_to_tree_ref(ref2)); else ret = comp_data_refs(btrfs_delayed_node_to_data_ref(ref1), btrfs_delayed_node_to_data_ref(ref2)); if (ret) return ret; if (check_seq) { if (ref1->seq < ref2->seq) return -1; if (ref1->seq > ref2->seq) return 1; } return 0; }
/* * entries in the rb tree are ordered by the byte number of the extent, * type of the delayed backrefs and content of delayed backrefs. */ static int comp_entry(struct btrfs_delayed_ref_node *ref2, struct btrfs_delayed_ref_node *ref1) { if (ref1->bytenr < ref2->bytenr) return -1; if (ref1->bytenr > ref2->bytenr) return 1; if (ref1->is_head && ref2->is_head) return 0; if (ref2->is_head) return -1; if (ref1->is_head) return 1; if (ref1->type < ref2->type) return -1; if (ref1->type > ref2->type) return 1; if (ref1->type == BTRFS_TREE_BLOCK_REF_KEY || ref1->type == BTRFS_SHARED_BLOCK_REF_KEY) { return comp_tree_refs(btrfs_delayed_node_to_tree_ref(ref2), btrfs_delayed_node_to_tree_ref(ref1)); } else if (ref1->type == BTRFS_EXTENT_DATA_REF_KEY || ref1->type == BTRFS_SHARED_DATA_REF_KEY) { return comp_data_refs(btrfs_delayed_node_to_data_ref(ref2), btrfs_delayed_node_to_data_ref(ref1)); } BUG(); return 0; }
/* * entries in the rb tree are ordered by the byte number of the extent, * type of the delayed backrefs and content of delayed backrefs. */ static int comp_entry(struct btrfs_delayed_ref_node *ref2, struct btrfs_delayed_ref_node *ref1, bool compare_seq) { if (ref1->bytenr < ref2->bytenr) return -1; if (ref1->bytenr > ref2->bytenr) return 1; if (ref1->is_head && ref2->is_head) return 0; if (ref2->is_head) return -1; if (ref1->is_head) return 1; if (ref1->type < ref2->type) return -1; if (ref1->type > ref2->type) return 1; /* merging of sequenced refs is not allowed */ if (compare_seq) { if (ref1->seq < ref2->seq) return -1; if (ref1->seq > ref2->seq) return 1; } if (ref1->type == BTRFS_TREE_BLOCK_REF_KEY || ref1->type == BTRFS_SHARED_BLOCK_REF_KEY) { return comp_tree_refs(btrfs_delayed_node_to_tree_ref(ref2), btrfs_delayed_node_to_tree_ref(ref1), ref1->type); } else if (ref1->type == BTRFS_EXTENT_DATA_REF_KEY || ref1->type == BTRFS_SHARED_DATA_REF_KEY) { return comp_data_refs(btrfs_delayed_node_to_data_ref(ref2), btrfs_delayed_node_to_data_ref(ref1)); } BUG(); return 0; }