diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2021-12-23 21:35:28 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2022-05-30 18:16:56 -0400 |
commit | 8cf1cca8e07cd3024864061bd025666e0d039fc6 (patch) | |
tree | c8ae42c45e6591e8d981e3a7380a9468961b4b1b /fs/bcachefs/recovery.c | |
parent | ddf928ad1a0f44c80055cecc87340d913d3caa3a (diff) |
bcachefs: bch2_journal_key_insert() no longer transfers ownership
bch2_journal_key_insert() used to assume that the key passed to it was
allocated with kmalloc(), and on success took ownership. This patch
deletes that behaviour, making it more similar to
bch2_trans_update()/bch2_trans_commit().
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs/bcachefs/recovery.c')
-rw-r--r-- | fs/bcachefs/recovery.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/fs/bcachefs/recovery.c b/fs/bcachefs/recovery.c index d0ceac0f2b39..118d536b4376 100644 --- a/fs/bcachefs/recovery.c +++ b/fs/bcachefs/recovery.c @@ -109,8 +109,8 @@ static void journal_iter_fix(struct bch_fs *c, struct journal_iter *iter, unsign iter->idx++; } -int bch2_journal_key_insert(struct bch_fs *c, enum btree_id id, - unsigned level, struct bkey_i *k) +int bch2_journal_key_insert_take(struct bch_fs *c, enum btree_id id, + unsigned level, struct bkey_i *k) { struct journal_key n = { .btree_id = id, @@ -157,27 +157,34 @@ int bch2_journal_key_insert(struct bch_fs *c, enum btree_id id, return 0; } -int bch2_journal_key_delete(struct bch_fs *c, enum btree_id id, - unsigned level, struct bpos pos) +int bch2_journal_key_insert(struct bch_fs *c, enum btree_id id, + unsigned level, struct bkey_i *k) { - struct bkey_i *whiteout = - kmalloc(sizeof(struct bkey), GFP_KERNEL); + struct bkey_i *n; int ret; - if (!whiteout) { - bch_err(c, "%s: error allocating new key", __func__); + n = kmalloc(bkey_bytes(&k->k), GFP_KERNEL); + if (!n) return -ENOMEM; - } - - bkey_init(&whiteout->k); - whiteout->k.p = pos; - ret = bch2_journal_key_insert(c, id, level, whiteout); + bkey_copy(n, k); + ret = bch2_journal_key_insert_take(c, id, level, n); if (ret) - kfree(whiteout); + kfree(n); return ret; } +int bch2_journal_key_delete(struct bch_fs *c, enum btree_id id, + unsigned level, struct bpos pos) +{ + struct bkey_i whiteout; + + bkey_init(&whiteout.k); + whiteout.k.p = pos; + + return bch2_journal_key_insert(c, id, level, &whiteout); +} + static struct bkey_i *bch2_journal_iter_peek(struct journal_iter *iter) { struct journal_key *k = iter->idx - iter->keys->nr |