]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Kill bkey_buf usage in data_update_index_update()
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 22 May 2025 16:34:40 +0000 (12:34 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 22 May 2025 19:13:17 +0000 (15:13 -0400)
Reduce stack usage - bkey_buf has a 96 byte buffer on the stack, but the
btree_trans bump allocator works just fine here.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/data_update.c

index de096ca65b4babf7749c8bbe1436bd7c533f9e0e..ef648a6d9c52ed730908d0b6ec829f64af3a5f3c 100644 (file)
@@ -187,14 +187,9 @@ static int __bch2_data_update_index_update(struct btree_trans *trans,
        struct data_update *m =
                container_of(op, struct data_update, op);
        struct keylist *keys = &op->insert_keys;
-       struct bkey_buf _new, _insert;
        struct printbuf journal_msg = PRINTBUF;
        int ret = 0;
 
-       bch2_bkey_buf_init(&_new);
-       bch2_bkey_buf_init(&_insert);
-       bch2_bkey_buf_realloc(&_insert, c, U8_MAX);
-
        bch2_trans_iter_init(trans, &iter, m->btree_id,
                             bkey_start_pos(&bch2_keylist_front(keys)->k),
                             BTREE_ITER_slots|BTREE_ITER_intent);
@@ -229,11 +224,22 @@ static int __bch2_data_update_index_update(struct btree_trans *trans,
                        goto nowork;
                }
 
-               bkey_reassemble(_insert.k, k);
-               insert = _insert.k;
+               insert = bch2_trans_kmalloc(trans,
+                                           bkey_bytes(k.k) +
+                                           bkey_val_bytes(&new->k) +
+                                           sizeof(struct bch_extent_rebalance));
+               ret = PTR_ERR_OR_ZERO(insert);
+               if (ret)
+                       goto err;
+
+               bkey_reassemble(insert, k);
+
+               new = bch2_trans_kmalloc(trans, bkey_bytes(&new->k));
+               ret = PTR_ERR_OR_ZERO(new);
+               if (ret)
+                       goto err;
 
-               bch2_bkey_buf_copy(&_new, c, bch2_keylist_front(keys));
-               new = bkey_i_to_extent(_new.k);
+               bkey_copy(&new->k_i, bch2_keylist_front(keys));
                bch2_cut_front(iter.pos, &new->k_i);
 
                bch2_cut_front(iter.pos,        insert);
@@ -457,8 +463,6 @@ nowork:
 out:
        printbuf_exit(&journal_msg);
        bch2_trans_iter_exit(trans, &iter);
-       bch2_bkey_buf_exit(&_insert, c);
-       bch2_bkey_buf_exit(&_new, c);
        BUG_ON(bch2_err_matches(ret, BCH_ERR_transaction_restart));
        return ret;
 }