@@ -694,48 +694,25 @@ void bch2_trans_fs_usage_revert(struct btree_trans *trans,
694694 percpu_up_read (& c -> mark_lock );
695695}
696696
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 )
699698{
700699 struct bch_fs * c = trans -> c ;
700+ u64 disk_res_sectors = trans -> disk_res ? trans -> disk_res -> sectors : 0 ;
701701 static int warned_disk_usage = 0 ;
702702 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 ;
709703
710704 percpu_down_read (& c -> mark_lock );
711705 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 ;
725708
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 ;
733710
734711 /*
735712 * Not allowed to reduce sectors_available except by getting a
736713 * reservation:
737714 */
738- should_not_have_added = added - (s64 ) disk_res_sectors ;
715+ s64 should_not_have_added = added - (s64 ) disk_res_sectors ;
739716 if (unlikely (should_not_have_added > 0 )) {
740717 u64 old , new , v = atomic64_read (& c -> sectors_available );
741718
@@ -754,13 +731,48 @@ int bch2_trans_fs_usage_apply(struct btree_trans *trans,
754731 this_cpu_sub (* c -> online_reserved , added );
755732 }
756733
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+
757741 preempt_enable ();
758742 percpu_up_read (& c -> mark_lock );
759743
760744 if (unlikely (warn ) && !xchg (& warned_disk_usage , 1 ))
761745 bch2_trans_inconsistent (trans ,
762746 "disk usage increased %lli more than %llu sectors reserved)" ,
763747 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 );
764776 return 0 ;
765777need_mark :
766778 /* revert changes: */
0 commit comments