summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2025-05-17 06:12:09 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2025-05-22 03:15:02 +0300
commit878713b5f56aa4b3dce5bdb7f34952a10183b106 (patch)
treec6ba6f1af2e70cdc942b650f7afc58122d3ed9cb
parent295dbf50e5f60cbc41416aff1feadd876d17e492 (diff)
downloadlinux-878713b5f56aa4b3dce5bdb7f34952a10183b106.tar.xz
bcachefs: kill copy in bch2_disk_accounting_mod()
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/disk_accounting.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/fs/bcachefs/disk_accounting.c b/fs/bcachefs/disk_accounting.c
index 195dc3fcec1d..2786a684b0c8 100644
--- a/fs/bcachefs/disk_accounting.c
+++ b/fs/bcachefs/disk_accounting.c
@@ -94,19 +94,27 @@ int bch2_disk_accounting_mod(struct btree_trans *trans,
BUG_ON(nr > BCH_ACCOUNTING_MAX_COUNTERS);
- struct { __BKEY_PADDED(k, BCH_ACCOUNTING_MAX_COUNTERS); } k_i;
+ if (likely(!gc)) {
+ unsigned u64s = sizeof(struct bkey_i_accounting) / sizeof(u64) + nr;
+ struct jset_entry *e = bch2_trans_jset_entry_alloc(trans, jset_u64s(u64s));
+ int ret = PTR_ERR_OR_ZERO(e);
+ if (ret)
+ return ret;
- accounting_key_init(&k_i.k, k, d, nr);
+ journal_entry_init(e, BCH_JSET_ENTRY_write_buffer_keys, BTREE_ID_accounting, 0, u64s);
+ accounting_key_init(e->start, k, d, nr);
+ return 0;
+ } else {
+ struct { __BKEY_PADDED(k, BCH_ACCOUNTING_MAX_COUNTERS); } k_i;
+
+ accounting_key_init(&k_i.k, k, d, nr);
- if (unlikely(gc)) {
int ret = bch2_accounting_mem_add(trans, bkey_i_to_s_c_accounting(&k_i.k), true);
if (ret == -BCH_ERR_btree_insert_need_mark_replicas)
ret = drop_locks_do(trans,
bch2_accounting_update_sb_one(trans->c, disk_accounting_pos_to_bpos(k))) ?:
bch2_accounting_mem_add(trans, bkey_i_to_s_c_accounting(&k_i.k), true);
return ret;
- } else {
- return bch2_trans_update_buffered(trans, BTREE_ID_accounting, &k_i.k);
}
}