@@ -694,48 +694,25 @@ void bch2_trans_fs_usage_revert(struct btree_trans *trans,
694
694
percpu_up_read (& c -> mark_lock );
695
695
}
696
696
697
- int bch2_trans_fs_usage_apply (struct btree_trans * trans ,
698
- struct replicas_delta_list * deltas )
697
+ void bch2_trans_account_disk_usage_change (struct btree_trans * trans )
699
698
{
700
699
struct bch_fs * c = trans -> c ;
700
+ u64 disk_res_sectors = trans -> disk_res ? trans -> disk_res -> sectors : 0 ;
701
701
static int warned_disk_usage = 0 ;
702
702
bool warn = false;
703
- u64 disk_res_sectors = trans -> disk_res ? trans -> disk_res -> sectors : 0 ;
704
- struct replicas_delta * d , * d2 ;
705
- struct replicas_delta * top = (void * ) deltas -> d + deltas -> used ;
706
- struct bch_fs_usage * dst ;
707
- s64 added = 0 , should_not_have_added ;
708
- unsigned i ;
709
703
710
704
percpu_down_read (& c -> mark_lock );
711
705
preempt_disable ();
712
- dst = fs_usage_ptr (c , trans -> journal_res .seq , false);
713
-
714
- for (d = deltas -> d ; d != top ; d = replicas_delta_next (d )) {
715
- switch (d -> r .data_type ) {
716
- case BCH_DATA_btree :
717
- case BCH_DATA_user :
718
- case BCH_DATA_parity :
719
- added += d -> delta ;
720
- }
721
-
722
- if (__update_replicas (c , dst , & d -> r , d -> delta ))
723
- goto need_mark ;
724
- }
706
+ struct bch_fs_usage_base * dst = & fs_usage_ptr (c , trans -> journal_res .seq , false)-> b ;
707
+ struct bch_fs_usage_base * src = & trans -> fs_usage_delta ;
725
708
726
- dst -> b .nr_inodes += deltas -> nr_inodes ;
727
-
728
- for (i = 0 ; i < BCH_REPLICAS_MAX ; i ++ ) {
729
- added += deltas -> persistent_reserved [i ];
730
- dst -> b .reserved += deltas -> persistent_reserved [i ];
731
- dst -> persistent_reserved [i ] += deltas -> persistent_reserved [i ];
732
- }
709
+ s64 added = src -> btree + src -> data + src -> reserved ;
733
710
734
711
/*
735
712
* Not allowed to reduce sectors_available except by getting a
736
713
* reservation:
737
714
*/
738
- should_not_have_added = added - (s64 ) disk_res_sectors ;
715
+ s64 should_not_have_added = added - (s64 ) disk_res_sectors ;
739
716
if (unlikely (should_not_have_added > 0 )) {
740
717
u64 old , new , v = atomic64_read (& c -> sectors_available );
741
718
@@ -754,13 +731,48 @@ int bch2_trans_fs_usage_apply(struct btree_trans *trans,
754
731
this_cpu_sub (* c -> online_reserved , added );
755
732
}
756
733
734
+ dst -> hidden += src -> hidden ;
735
+ dst -> btree += src -> btree ;
736
+ dst -> data += src -> data ;
737
+ dst -> cached += src -> cached ;
738
+ dst -> reserved += src -> reserved ;
739
+ dst -> nr_inodes += src -> nr_inodes ;
740
+
757
741
preempt_enable ();
758
742
percpu_up_read (& c -> mark_lock );
759
743
760
744
if (unlikely (warn ) && !xchg (& warned_disk_usage , 1 ))
761
745
bch2_trans_inconsistent (trans ,
762
746
"disk usage increased %lli more than %llu sectors reserved)" ,
763
747
should_not_have_added , disk_res_sectors );
748
+ }
749
+
750
+ int bch2_trans_fs_usage_apply (struct btree_trans * trans ,
751
+ struct replicas_delta_list * deltas )
752
+ {
753
+ struct bch_fs * c = trans -> c ;
754
+ struct replicas_delta * d , * d2 ;
755
+ struct replicas_delta * top = (void * ) deltas -> d + deltas -> used ;
756
+ struct bch_fs_usage * dst ;
757
+ unsigned i ;
758
+
759
+ percpu_down_read (& c -> mark_lock );
760
+ preempt_disable ();
761
+ dst = fs_usage_ptr (c , trans -> journal_res .seq , false);
762
+
763
+ for (d = deltas -> d ; d != top ; d = replicas_delta_next (d ))
764
+ if (__update_replicas (c , dst , & d -> r , d -> delta ))
765
+ goto need_mark ;
766
+
767
+ dst -> b .nr_inodes += deltas -> nr_inodes ;
768
+
769
+ for (i = 0 ; i < BCH_REPLICAS_MAX ; i ++ ) {
770
+ dst -> b .reserved += deltas -> persistent_reserved [i ];
771
+ dst -> persistent_reserved [i ] += deltas -> persistent_reserved [i ];
772
+ }
773
+
774
+ preempt_enable ();
775
+ percpu_up_read (& c -> mark_lock );
764
776
return 0 ;
765
777
need_mark :
766
778
/* revert changes: */
0 commit comments