Commit c259bd95 authored by Kent Overstreet's avatar Kent Overstreet

bcachefs: No need to allocate keys for write buffer

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 3c471b65
...@@ -136,15 +136,30 @@ static noinline int backpointer_mod_err(struct btree_trans *trans, ...@@ -136,15 +136,30 @@ static noinline int backpointer_mod_err(struct btree_trans *trans,
} }
int bch2_bucket_backpointer_mod_nowritebuffer(struct btree_trans *trans, int bch2_bucket_backpointer_mod_nowritebuffer(struct btree_trans *trans,
struct bkey_i_backpointer *bp_k, struct bpos bucket,
struct bch_backpointer bp, struct bch_backpointer bp,
struct bkey_s_c orig_k, struct bkey_s_c orig_k,
bool insert) bool insert)
{ {
struct btree_iter bp_iter; struct btree_iter bp_iter;
struct bkey_s_c k; struct bkey_s_c k;
struct bkey_i_backpointer *bp_k;
int ret; int ret;
bp_k = bch2_trans_kmalloc_nomemzero(trans, sizeof(struct bkey_i_backpointer));
ret = PTR_ERR_OR_ZERO(bp_k);
if (ret)
return ret;
bkey_backpointer_init(&bp_k->k_i);
bp_k->k.p = bucket_pos_to_bp(trans->c, bucket, bp.bucket_offset);
bp_k->v = bp;
if (!insert) {
bp_k->k.type = KEY_TYPE_deleted;
set_bkey_val_u64s(&bp_k->k, 0);
}
k = bch2_bkey_get_iter(trans, &bp_iter, BTREE_ID_backpointers, k = bch2_bkey_get_iter(trans, &bp_iter, BTREE_ID_backpointers,
bp_k->k.p, bp_k->k.p,
BTREE_ITER_INTENT| BTREE_ITER_INTENT|
......
...@@ -63,7 +63,7 @@ static inline struct bpos bucket_pos_to_bp(const struct bch_fs *c, ...@@ -63,7 +63,7 @@ static inline struct bpos bucket_pos_to_bp(const struct bch_fs *c,
return ret; return ret;
} }
int bch2_bucket_backpointer_mod_nowritebuffer(struct btree_trans *, struct bkey_i_backpointer *, int bch2_bucket_backpointer_mod_nowritebuffer(struct btree_trans *, struct bpos bucket,
struct bch_backpointer, struct bkey_s_c, bool); struct bch_backpointer, struct bkey_s_c, bool);
static inline int bch2_bucket_backpointer_mod(struct btree_trans *trans, static inline int bch2_bucket_backpointer_mod(struct btree_trans *trans,
...@@ -72,28 +72,21 @@ static inline int bch2_bucket_backpointer_mod(struct btree_trans *trans, ...@@ -72,28 +72,21 @@ static inline int bch2_bucket_backpointer_mod(struct btree_trans *trans,
struct bkey_s_c orig_k, struct bkey_s_c orig_k,
bool insert) bool insert)
{ {
struct bch_fs *c = trans->c; if (unlikely(bch2_backpointers_no_use_write_buffer))
struct bkey_i_backpointer *bp_k; return bch2_bucket_backpointer_mod_nowritebuffer(trans, bucket, bp, orig_k, insert);
int ret;
bp_k = bch2_trans_kmalloc_nomemzero(trans, sizeof(struct bkey_i_backpointer)); struct bkey_i_backpointer bp_k;
ret = PTR_ERR_OR_ZERO(bp_k);
if (ret)
return ret;
bkey_backpointer_init(&bp_k->k_i); bkey_backpointer_init(&bp_k.k_i);
bp_k->k.p = bucket_pos_to_bp(c, bucket, bp.bucket_offset); bp_k.k.p = bucket_pos_to_bp(trans->c, bucket, bp.bucket_offset);
bp_k->v = bp; bp_k.v = bp;
if (!insert) { if (!insert) {
bp_k->k.type = KEY_TYPE_deleted; bp_k.k.type = KEY_TYPE_deleted;
set_bkey_val_u64s(&bp_k->k, 0); set_bkey_val_u64s(&bp_k.k, 0);
} }
if (unlikely(bch2_backpointers_no_use_write_buffer)) return bch2_trans_update_buffered(trans, BTREE_ID_backpointers, &bp_k.k_i);
return bch2_bucket_backpointer_mod_nowritebuffer(trans, bp_k, bp, orig_k, insert);
return bch2_trans_update_buffered(trans, BTREE_ID_backpointers, &bp_k->k_i);
} }
static inline enum bch_data_type bkey_ptr_data_type(enum btree_id btree_id, unsigned level, static inline enum bch_data_type bkey_ptr_data_type(enum btree_id btree_id, unsigned level,
......
...@@ -710,20 +710,6 @@ int bch2_btree_delete_at(struct btree_trans *trans, ...@@ -710,20 +710,6 @@ int bch2_btree_delete_at(struct btree_trans *trans,
return bch2_btree_delete_extent_at(trans, iter, 0, update_flags); return bch2_btree_delete_extent_at(trans, iter, 0, update_flags);
} }
int bch2_btree_delete_at_buffered(struct btree_trans *trans,
enum btree_id btree, struct bpos pos)
{
struct bkey_i *k;
k = bch2_trans_kmalloc(trans, sizeof(*k));
if (IS_ERR(k))
return PTR_ERR(k);
bkey_init(&k->k);
k->k.p = pos;
return bch2_trans_update_buffered(trans, btree, k);
}
int bch2_btree_delete(struct btree_trans *trans, int bch2_btree_delete(struct btree_trans *trans,
enum btree_id btree, struct bpos pos, enum btree_id btree, struct bpos pos,
unsigned update_flags) unsigned update_flags)
...@@ -828,19 +814,13 @@ int bch2_btree_delete_range(struct bch_fs *c, enum btree_id id, ...@@ -828,19 +814,13 @@ int bch2_btree_delete_range(struct bch_fs *c, enum btree_id id,
int bch2_btree_bit_mod(struct btree_trans *trans, enum btree_id btree, int bch2_btree_bit_mod(struct btree_trans *trans, enum btree_id btree,
struct bpos pos, bool set) struct bpos pos, bool set)
{ {
struct bkey_i *k; struct bkey_i k;
int ret = 0;
k = bch2_trans_kmalloc_nomemzero(trans, sizeof(*k)); bkey_init(&k.k);
ret = PTR_ERR_OR_ZERO(k); k.k.type = set ? KEY_TYPE_set : KEY_TYPE_deleted;
if (unlikely(ret)) k.k.p = pos;
return ret;
bkey_init(&k->k);
k->k.type = set ? KEY_TYPE_set : KEY_TYPE_deleted;
k->k.p = pos;
return bch2_trans_update_buffered(trans, btree, k); return bch2_trans_update_buffered(trans, btree, &k);
} }
__printf(2, 0) __printf(2, 0)
......
...@@ -47,7 +47,6 @@ enum bch_trans_commit_flags { ...@@ -47,7 +47,6 @@ enum bch_trans_commit_flags {
int bch2_btree_delete_extent_at(struct btree_trans *, struct btree_iter *, int bch2_btree_delete_extent_at(struct btree_trans *, struct btree_iter *,
unsigned, unsigned); unsigned, unsigned);
int bch2_btree_delete_at(struct btree_trans *, struct btree_iter *, unsigned); int bch2_btree_delete_at(struct btree_trans *, struct btree_iter *, unsigned);
int bch2_btree_delete_at_buffered(struct btree_trans *, enum btree_id, struct bpos);
int bch2_btree_delete(struct btree_trans *, enum btree_id, struct bpos, unsigned); int bch2_btree_delete(struct btree_trans *, enum btree_id, struct bpos, unsigned);
int bch2_btree_insert_nonextent(struct btree_trans *, enum btree_id, int bch2_btree_insert_nonextent(struct btree_trans *, enum btree_id,
...@@ -65,6 +64,12 @@ int bch2_btree_delete_range(struct bch_fs *, enum btree_id, ...@@ -65,6 +64,12 @@ int bch2_btree_delete_range(struct bch_fs *, enum btree_id,
int bch2_btree_bit_mod(struct btree_trans *, enum btree_id, struct bpos, bool); int bch2_btree_bit_mod(struct btree_trans *, enum btree_id, struct bpos, bool);
static inline int bch2_btree_delete_at_buffered(struct btree_trans *trans,
enum btree_id btree, struct bpos pos)
{
return bch2_btree_bit_mod(trans, btree, pos, false);
}
int __bch2_insert_snapshot_whiteouts(struct btree_trans *, enum btree_id, int __bch2_insert_snapshot_whiteouts(struct btree_trans *, enum btree_id,
struct bpos, struct bpos); struct bpos, struct bpos);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment