bcachefs: Make replicas_delta_list smaller
authorKent Overstreet <kent.overstreet@gmail.com>
Sun, 20 Oct 2019 02:22:29 +0000 (22:22 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:30 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_update_leaf.c
fs/bcachefs/buckets.c
fs/bcachefs/buckets_types.h

index fd50f51943c3a595535920ef04ea748c0b7906e0..139e8e8711f01a0617788bc1729b5def6cbe09f1 100644 (file)
@@ -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;
index d4d66d78d2a313bd5ab1ff7469fbacaafc45ad31..34d3b117085ba3a83e26a94c007d119711b2e433 100644 (file)
@@ -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:
index 7ab9aa641c95c688cd2aac7b20db918c2f7966eb..070e10dfa7bbf6ebb257ccfc7d6c90bc51a3b7fa 100644 (file)
@@ -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];
 };