diff options
-rw-r--r-- | fs/bcachefs/btree_update_leaf.c | 6 | ||||
-rw-r--r-- | fs/bcachefs/buckets.c | 18 | ||||
-rw-r--r-- | fs/bcachefs/buckets_types.h | 6 |
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]; }; |