@@ -4685,6 +4685,14 @@ static int btrfs_qgroup_swapped_block_key_cmp(const void *k, const struct rb_nod
4685
4685
return 0 ;
4686
4686
}
4687
4687
4688
+ static int btrfs_qgroup_swapped_block_cmp (struct rb_node * new , const struct rb_node * exist )
4689
+ {
4690
+ const struct btrfs_qgroup_swapped_block * new_block =
4691
+ rb_entry (new , struct btrfs_qgroup_swapped_block , node );
4692
+
4693
+ return btrfs_qgroup_swapped_block_key_cmp (& new_block -> subvol_bytenr , exist );
4694
+ }
4695
+
4688
4696
/*
4689
4697
* Add subtree roots record into @subvol_root.
4690
4698
*
@@ -4704,8 +4712,7 @@ int btrfs_qgroup_add_swapped_blocks(struct btrfs_root *subvol_root,
4704
4712
struct btrfs_fs_info * fs_info = subvol_root -> fs_info ;
4705
4713
struct btrfs_qgroup_swapped_blocks * blocks = & subvol_root -> swapped_blocks ;
4706
4714
struct btrfs_qgroup_swapped_block * block ;
4707
- struct rb_node * * cur ;
4708
- struct rb_node * parent = NULL ;
4715
+ struct rb_node * exist ;
4709
4716
int level = btrfs_header_level (subvol_parent ) - 1 ;
4710
4717
int ret = 0 ;
4711
4718
@@ -4754,40 +4761,31 @@ int btrfs_qgroup_add_swapped_blocks(struct btrfs_root *subvol_root,
4754
4761
4755
4762
/* Insert @block into @blocks */
4756
4763
spin_lock (& blocks -> lock );
4757
- cur = & blocks -> blocks [level ].rb_node ;
4758
- while (* cur ) {
4764
+ exist = rb_find_add (& block -> node , & blocks -> blocks [level ],
4765
+ btrfs_qgroup_swapped_block_cmp );
4766
+ if (exist ) {
4759
4767
struct btrfs_qgroup_swapped_block * entry ;
4760
4768
4761
- parent = * cur ;
4762
- entry = rb_entry (parent , struct btrfs_qgroup_swapped_block ,
4769
+ entry = rb_entry (exist , struct btrfs_qgroup_swapped_block ,
4763
4770
node );
4764
-
4765
- if (entry -> subvol_bytenr < block -> subvol_bytenr ) {
4766
- cur = & (* cur )-> rb_left ;
4767
- } else if (entry -> subvol_bytenr > block -> subvol_bytenr ) {
4768
- cur = & (* cur )-> rb_right ;
4769
- } else {
4770
- if (entry -> subvol_generation !=
4771
- block -> subvol_generation ||
4772
- entry -> reloc_bytenr != block -> reloc_bytenr ||
4773
- entry -> reloc_generation !=
4774
- block -> reloc_generation ) {
4775
- /*
4776
- * Duplicated but mismatch entry found.
4777
- * Shouldn't happen.
4778
- *
4779
- * Marking qgroup inconsistent should be enough
4780
- * for end users.
4781
- */
4782
- DEBUG_WARN ("duplicated but mismatched entry found" );
4783
- ret = - EEXIST ;
4784
- }
4785
- kfree (block );
4786
- goto out_unlock ;
4771
+ if (entry -> subvol_generation !=
4772
+ block -> subvol_generation ||
4773
+ entry -> reloc_bytenr != block -> reloc_bytenr ||
4774
+ entry -> reloc_generation !=
4775
+ block -> reloc_generation ) {
4776
+ /*
4777
+ * Duplicated but mismatch entry found.
4778
+ * Shouldn't happen.
4779
+ *
4780
+ * Marking qgroup inconsistent should be enough
4781
+ * for end users.
4782
+ */
4783
+ DEBUG_WARN ("duplicated but mismatched entry found" );
4784
+ ret = - EEXIST ;
4787
4785
}
4786
+ kfree (block );
4787
+ goto out_unlock ;
4788
4788
}
4789
- rb_link_node (& block -> node , parent , cur );
4790
- rb_insert_color (& block -> node , & blocks -> blocks [level ]);
4791
4789
blocks -> swapped = true;
4792
4790
out_unlock :
4793
4791
spin_unlock (& blocks -> lock );
0 commit comments