@@ -699,7 +699,8 @@ static int bch2_trigger_stripe_ptr(struct btree_trans *trans,
699
699
static int __trigger_extent (struct btree_trans * trans ,
700
700
enum btree_id btree_id , unsigned level ,
701
701
struct bkey_s_c k ,
702
- enum btree_iter_update_trigger_flags flags )
702
+ enum btree_iter_update_trigger_flags flags ,
703
+ s64 * replicas_sectors )
703
704
{
704
705
bool gc = flags & BTREE_TRIGGER_gc ;
705
706
struct bkey_ptrs_c ptrs = bch2_bkey_ptrs_c (k );
@@ -708,7 +709,6 @@ static int __trigger_extent(struct btree_trans *trans,
708
709
enum bch_data_type data_type = bkey_is_btree_ptr (k .k )
709
710
? BCH_DATA_btree
710
711
: BCH_DATA_user ;
711
- s64 replicas_sectors = 0 ;
712
712
int ret = 0 ;
713
713
714
714
struct disk_accounting_pos acc_replicas_key = {
@@ -739,7 +739,7 @@ static int __trigger_extent(struct btree_trans *trans,
739
739
if (ret )
740
740
return ret ;
741
741
} else if (!p .has_ec ) {
742
- replicas_sectors += disk_sectors ;
742
+ * replicas_sectors += disk_sectors ;
743
743
acc_replicas_key .replicas .devs [acc_replicas_key .replicas .nr_devs ++ ] = p .ptr .dev ;
744
744
} else {
745
745
ret = bch2_trigger_stripe_ptr (trans , k , p , data_type , disk_sectors , flags );
@@ -777,7 +777,7 @@ static int __trigger_extent(struct btree_trans *trans,
777
777
}
778
778
779
779
if (acc_replicas_key .replicas .nr_devs ) {
780
- ret = bch2_disk_accounting_mod (trans , & acc_replicas_key , & replicas_sectors , 1 , gc );
780
+ ret = bch2_disk_accounting_mod (trans , & acc_replicas_key , replicas_sectors , 1 , gc );
781
781
if (ret )
782
782
return ret ;
783
783
}
@@ -787,7 +787,7 @@ static int __trigger_extent(struct btree_trans *trans,
787
787
.type = BCH_DISK_ACCOUNTING_snapshot ,
788
788
.snapshot .id = k .k -> p .snapshot ,
789
789
};
790
- ret = bch2_disk_accounting_mod (trans , & acc_snapshot_key , & replicas_sectors , 1 , gc );
790
+ ret = bch2_disk_accounting_mod (trans , & acc_snapshot_key , replicas_sectors , 1 , gc );
791
791
if (ret )
792
792
return ret ;
793
793
}
@@ -807,7 +807,7 @@ static int __trigger_extent(struct btree_trans *trans,
807
807
.type = BCH_DISK_ACCOUNTING_btree ,
808
808
.btree .id = btree_id ,
809
809
};
810
- ret = bch2_disk_accounting_mod (trans , & acc_btree_key , & replicas_sectors , 1 , gc );
810
+ ret = bch2_disk_accounting_mod (trans , & acc_btree_key , replicas_sectors , 1 , gc );
811
811
if (ret )
812
812
return ret ;
813
813
} else {
@@ -819,22 +819,13 @@ static int __trigger_extent(struct btree_trans *trans,
819
819
s64 v [3 ] = {
820
820
insert ? 1 : -1 ,
821
821
insert ? k .k -> size : - ((s64 ) k .k -> size ),
822
- replicas_sectors ,
822
+ * replicas_sectors ,
823
823
};
824
824
ret = bch2_disk_accounting_mod (trans , & acc_inum_key , v , ARRAY_SIZE (v ), gc );
825
825
if (ret )
826
826
return ret ;
827
827
}
828
828
829
- if (bch2_bkey_rebalance_opts (k )) {
830
- struct disk_accounting_pos acc = {
831
- .type = BCH_DISK_ACCOUNTING_rebalance_work ,
832
- };
833
- ret = bch2_disk_accounting_mod (trans , & acc , & replicas_sectors , 1 , gc );
834
- if (ret )
835
- return ret ;
836
- }
837
-
838
829
return 0 ;
839
830
}
840
831
@@ -843,6 +834,7 @@ int bch2_trigger_extent(struct btree_trans *trans,
843
834
struct bkey_s_c old , struct bkey_s new ,
844
835
enum btree_iter_update_trigger_flags flags )
845
836
{
837
+ struct bch_fs * c = trans -> c ;
846
838
struct bkey_ptrs_c new_ptrs = bch2_bkey_ptrs_c (new .s_c );
847
839
struct bkey_ptrs_c old_ptrs = bch2_bkey_ptrs_c (old );
848
840
unsigned new_ptrs_bytes = (void * ) new_ptrs .end - (void * ) new_ptrs .start ;
@@ -858,21 +850,53 @@ int bch2_trigger_extent(struct btree_trans *trans,
858
850
new_ptrs_bytes ))
859
851
return 0 ;
860
852
861
- if (flags & BTREE_TRIGGER_transactional ) {
862
- struct bch_fs * c = trans -> c ;
863
- int mod = (int ) bch2_bkey_needs_rebalance (c , new .s_c ) -
864
- (int ) bch2_bkey_needs_rebalance (c , old );
853
+ if (flags & (BTREE_TRIGGER_transactional |BTREE_TRIGGER_gc )) {
854
+ s64 old_replicas_sectors = 0 , new_replicas_sectors = 0 ;
855
+
856
+ if (old .k -> type ) {
857
+ int ret = __trigger_extent (trans , btree , level , old ,
858
+ flags & ~BTREE_TRIGGER_insert ,
859
+ & old_replicas_sectors );
860
+ if (ret )
861
+ return ret ;
862
+ }
863
+
864
+ if (new .k -> type ) {
865
+ int ret = __trigger_extent (trans , btree , level , new .s_c ,
866
+ flags & ~BTREE_TRIGGER_overwrite ,
867
+ & new_replicas_sectors );
868
+ if (ret )
869
+ return ret ;
870
+ }
871
+
872
+ int need_rebalance_delta = 0 ;
873
+ s64 need_rebalance_sectors_delta = 0 ;
874
+
875
+ s64 s = bch2_bkey_sectors_need_rebalance (c , old );
876
+ need_rebalance_delta -= s != 0 ;
877
+ need_rebalance_sectors_delta -= s ;
865
878
866
- if (mod ) {
879
+ s = bch2_bkey_sectors_need_rebalance (c , old );
880
+ need_rebalance_delta += s != 0 ;
881
+ need_rebalance_sectors_delta += s ;
882
+
883
+ if ((flags & BTREE_TRIGGER_transactional ) && need_rebalance_delta ) {
867
884
int ret = bch2_btree_bit_mod_buffered (trans , BTREE_ID_rebalance_work ,
868
- new .k -> p , mod > 0 );
885
+ new .k -> p , need_rebalance_delta > 0 );
869
886
if (ret )
870
887
return ret ;
871
888
}
872
- }
873
889
874
- if (flags & (BTREE_TRIGGER_transactional |BTREE_TRIGGER_gc ))
875
- return trigger_run_overwrite_then_insert (__trigger_extent , trans , btree , level , old , new , flags );
890
+ if (need_rebalance_sectors_delta ) {
891
+ struct disk_accounting_pos acc = {
892
+ .type = BCH_DISK_ACCOUNTING_rebalance_work ,
893
+ };
894
+ int ret = bch2_disk_accounting_mod (trans , & acc , & need_rebalance_sectors_delta , 1 ,
895
+ flags & BTREE_TRIGGER_gc );
896
+ if (ret )
897
+ return ret ;
898
+ }
899
+ }
876
900
877
901
return 0 ;
878
902
}
0 commit comments