From: Kent Overstreet Date: Sat, 17 May 2025 03:12:09 +0000 (-0400) Subject: bcachefs: kill copy in bch2_disk_accounting_mod() X-Git-Tag: v6.16-rc1~211^2~49 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=878713b5f56aa4b3dce5bdb7f34952a10183b106;p=thirdparty%2Fkernel%2Flinux.git bcachefs: kill copy in bch2_disk_accounting_mod() Signed-off-by: Kent Overstreet --- diff --git a/fs/bcachefs/disk_accounting.c b/fs/bcachefs/disk_accounting.c index 195dc3fcec1d8..2786a684b0c8d 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); } }