aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs/bcachefs/btree_update_leaf.c6
-rw-r--r--fs/bcachefs/buckets.c18
-rw-r--r--fs/bcachefs/buckets_types.h6
3 files changed, 20 insertions, 10 deletions
diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c
index fd50f51943c3..139e8e8711f0 100644
--- a/fs/bcachefs/btree_update_leaf.c
+++ b/fs/bcachefs/btree_update_leaf.c
@@ -587,9 +587,11 @@ out:
bch2_journal_res_put(&c->journal, &trans->journal_res);
out_clear_replicas:
if (trans->fs_usage_deltas) {
- memset(&trans->fs_usage_deltas->fs_usage, 0,
- sizeof(trans->fs_usage_deltas->fs_usage));
trans->fs_usage_deltas->used = 0;
+ memset((void *) trans->fs_usage_deltas +
+ offsetof(struct replicas_delta_list, memset_start), 0,
+ (void *) &trans->fs_usage_deltas->memset_end -
+ (void *) &trans->fs_usage_deltas->memset_start);
}
return ret;
diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c
index d4d66d78d2a3..34d3b117085b 100644
--- a/fs/bcachefs/buckets.c
+++ b/fs/bcachefs/buckets.c
@@ -585,9 +585,14 @@ void bch2_replicas_delta_list_apply(struct bch_fs *c,
{
struct replicas_delta *d = r->d;
struct replicas_delta *top = (void *) r->d + r->used;
+ unsigned i;
+
+ fs_usage->nr_inodes += r->nr_inodes;
- acc_u64s((u64 *) fs_usage,
- (u64 *) &r->fs_usage, sizeof(*fs_usage) / sizeof(u64));
+ for (i = 0; i < BCH_REPLICAS_MAX; i++) {
+ fs_usage->reserved += r->persistent_reserved[i];
+ fs_usage->persistent_reserved[i] += r->persistent_reserved[i];
+ }
while (d != top) {
BUG_ON((void *) d > (void *) top);
@@ -1739,9 +1744,9 @@ int bch2_trans_mark_key(struct btree_trans *trans, struct bkey_s_c k,
d = replicas_deltas_realloc(trans, 0);
if (!(flags & BCH_BUCKET_MARK_OVERWRITE))
- d->fs_usage.nr_inodes++;
+ d->nr_inodes++;
else
- d->fs_usage.nr_inodes--;
+ d->nr_inodes--;
return 0;
case KEY_TYPE_reservation: {
unsigned replicas = bkey_s_c_to_reservation(k).v->nr_replicas;
@@ -1750,10 +1755,9 @@ int bch2_trans_mark_key(struct btree_trans *trans, struct bkey_s_c k,
sectors *= replicas;
replicas = clamp_t(unsigned, replicas, 1,
- ARRAY_SIZE(d->fs_usage.persistent_reserved));
+ ARRAY_SIZE(d->persistent_reserved));
- d->fs_usage.reserved += sectors;
- d->fs_usage.persistent_reserved[replicas - 1] += sectors;
+ d->persistent_reserved[replicas - 1] += sectors;
return 0;
}
case KEY_TYPE_reflink_p:
diff --git a/fs/bcachefs/buckets_types.h b/fs/bcachefs/buckets_types.h
index 7ab9aa641c95..070e10dfa7bb 100644
--- a/fs/bcachefs/buckets_types.h
+++ b/fs/bcachefs/buckets_types.h
@@ -100,7 +100,11 @@ struct replicas_delta {
struct replicas_delta_list {
unsigned size;
unsigned used;
- struct bch_fs_usage fs_usage;
+
+ struct {} memset_start;
+ u64 nr_inodes;
+ u64 persistent_reserved[BCH_REPLICAS_MAX];
+ struct {} memset_end;
struct replicas_delta d[0];
};