Skip to content

Commit 5b14ce3

Browse files
author
Kent Overstreet
committed
bcachefs: bch2_trans_account_disk_usage_change()
The disk space accounting rewrite is splitting out accounting for each replicas set - those are moving to btree keys, instead of percpu counters. This breaks bch2_trans_fs_usage_apply() up, splitting out the part we will still need. Signed-off-by: Kent Overstreet <[email protected]>
1 parent 8e7834a commit 5b14ce3

File tree

3 files changed

+48
-29
lines changed

3 files changed

+48
-29
lines changed

fs/bcachefs/btree_trans_commit.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,9 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags,
675675
bch2_trans_fs_usage_apply(trans, trans->fs_usage_deltas))
676676
return -BCH_ERR_btree_insert_need_mark_replicas;
677677

678+
/* XXX: we only want to run this if deltas are nonzero */
679+
bch2_trans_account_disk_usage_change(trans);
680+
678681
h = trans->hooks;
679682
while (h) {
680683
ret = h->fn(trans, h);
@@ -989,6 +992,8 @@ int __bch2_trans_commit(struct btree_trans *trans, unsigned flags)
989992
!trans->journal_entries_u64s)
990993
goto out_reset;
991994

995+
memset(&trans->fs_usage_delta, 0, sizeof(trans->fs_usage_delta));
996+
992997
ret = bch2_trans_commit_run_triggers(trans);
993998
if (ret)
994999
goto out_reset;

fs/bcachefs/buckets.c

Lines changed: 41 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
765777
need_mark:
766778
/* revert changes: */

fs/bcachefs/buckets.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,8 @@ int bch2_trigger_reservation(struct btree_trans *, enum btree_id, unsigned,
356356
ret; \
357357
})
358358

359+
void bch2_trans_account_disk_usage_change(struct btree_trans *);
360+
359361
void bch2_trans_fs_usage_revert(struct btree_trans *, struct replicas_delta_list *);
360362
int bch2_trans_fs_usage_apply(struct btree_trans *, struct replicas_delta_list *);
361363

0 commit comments

Comments
 (0)