summaryrefslogtreecommitdiff
path: root/fs/bcachefs/recovery.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-12-23 21:35:28 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:09:19 -0400
commite75b2d4c1c829142f8e3e64a9b3cf7faedcfb640 (patch)
tree75f6894c21e6efb33e63fa06fcb5e2185f93842f /fs/bcachefs/recovery.c
parent4b674b09a950fb20aa30e902331e4eba12059b80 (diff)
downloadlwn-e75b2d4c1c829142f8e3e64a9b3cf7faedcfb640.tar.gz
lwn-e75b2d4c1c829142f8e3e64a9b3cf7faedcfb640.zip
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.c35
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