Commit 91052b9d authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: Refactor trans_(get|update)_key

these are still pretty ugly...
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 88767d65
...@@ -852,6 +852,8 @@ static const unsigned BKEY_ALLOC_VAL_U64s_MAX = ...@@ -852,6 +852,8 @@ static const unsigned BKEY_ALLOC_VAL_U64s_MAX =
BCH_ALLOC_FIELDS(), sizeof(u64)); BCH_ALLOC_FIELDS(), sizeof(u64));
#undef x #undef x
static const unsigned BKEY_ALLOC_U64s_MAX = BKEY_U64s + BKEY_ALLOC_VAL_U64s_MAX;
/* Quotas: */ /* Quotas: */
enum quota_types { enum quota_types {
......
...@@ -1319,22 +1319,18 @@ void bch2_trans_fs_usage_apply(struct btree_trans *trans, ...@@ -1319,22 +1319,18 @@ void bch2_trans_fs_usage_apply(struct btree_trans *trans,
static int trans_get_key(struct btree_trans *trans, static int trans_get_key(struct btree_trans *trans,
enum btree_id btree_id, struct bpos pos, enum btree_id btree_id, struct bpos pos,
struct btree_insert_entry **insert,
struct btree_iter **iter, struct btree_iter **iter,
struct bkey_s_c *k) struct bkey_s_c *k)
{ {
unsigned i; unsigned i;
int ret; int ret;
*insert = NULL;
for (i = 0; i < trans->nr_updates; i++) for (i = 0; i < trans->nr_updates; i++)
if (!trans->updates[i].deferred && if (!trans->updates[i].deferred &&
trans->updates[i].iter->btree_id == btree_id && trans->updates[i].iter->btree_id == btree_id &&
!bkey_cmp(pos, trans->updates[i].iter->pos)) { !bkey_cmp(pos, trans->updates[i].iter->pos)) {
*insert = &trans->updates[i]; *iter = trans->updates[i].iter;
*iter = (*insert)->iter; *k = bkey_i_to_s_c(trans->updates[i].k);
*k = bkey_i_to_s_c((*insert)->k);
return 0; return 0;
} }
...@@ -1350,30 +1346,34 @@ static int trans_get_key(struct btree_trans *trans, ...@@ -1350,30 +1346,34 @@ static int trans_get_key(struct btree_trans *trans,
return ret; return ret;
} }
static int trans_update_key(struct btree_trans *trans, static void *trans_update_key(struct btree_trans *trans,
struct btree_insert_entry **insert,
struct btree_iter *iter, struct btree_iter *iter,
struct bkey_s_c k, unsigned u64s)
unsigned extra_u64s)
{ {
struct bkey_i *new_k; struct bkey_i *new_k;
unsigned i;
if (*insert) new_k = bch2_trans_kmalloc(trans, u64s * sizeof(u64));
return 0;
new_k = bch2_trans_kmalloc(trans, bkey_bytes(k.k) +
extra_u64s * sizeof(u64));
if (IS_ERR(new_k)) if (IS_ERR(new_k))
return PTR_ERR(new_k); return new_k;
bkey_init(&new_k->k);
new_k->k.p = iter->pos;
*insert = bch2_trans_update(trans, ((struct btree_insert_entry) { for (i = 0; i < trans->nr_updates; i++)
if (!trans->updates[i].deferred &&
trans->updates[i].iter == iter) {
trans->updates[i].k = new_k;
return new_k;
}
bch2_trans_update(trans, ((struct btree_insert_entry) {
.iter = iter, .iter = iter,
.k = new_k, .k = new_k,
.triggered = true, .triggered = true,
})); }));
bkey_reassemble((*insert)->k, k); return new_k;
return 0;
} }
static int bch2_trans_mark_pointer(struct btree_trans *trans, static int bch2_trans_mark_pointer(struct btree_trans *trans,
...@@ -1382,7 +1382,6 @@ static int bch2_trans_mark_pointer(struct btree_trans *trans, ...@@ -1382,7 +1382,6 @@ static int bch2_trans_mark_pointer(struct btree_trans *trans,
{ {
struct bch_fs *c = trans->c; struct bch_fs *c = trans->c;
struct bch_dev *ca = bch_dev_bkey_exists(c, p.ptr.dev); struct bch_dev *ca = bch_dev_bkey_exists(c, p.ptr.dev);
struct btree_insert_entry *insert;
struct btree_iter *iter; struct btree_iter *iter;
struct bkey_s_c k; struct bkey_s_c k;
struct bkey_alloc_unpacked u; struct bkey_alloc_unpacked u;
...@@ -1392,7 +1391,7 @@ static int bch2_trans_mark_pointer(struct btree_trans *trans, ...@@ -1392,7 +1391,7 @@ static int bch2_trans_mark_pointer(struct btree_trans *trans,
ret = trans_get_key(trans, BTREE_ID_ALLOC, ret = trans_get_key(trans, BTREE_ID_ALLOC,
POS(p.ptr.dev, PTR_BUCKET_NR(ca, &p.ptr)), POS(p.ptr.dev, PTR_BUCKET_NR(ca, &p.ptr)),
&insert, &iter, &k); &iter, &k);
if (ret) if (ret)
return ret; return ret;
...@@ -1425,11 +1424,12 @@ static int bch2_trans_mark_pointer(struct btree_trans *trans, ...@@ -1425,11 +1424,12 @@ static int bch2_trans_mark_pointer(struct btree_trans *trans,
? u.dirty_sectors ? u.dirty_sectors
: u.cached_sectors, sectors); : u.cached_sectors, sectors);
ret = trans_update_key(trans, &insert, iter, k, 1); a = trans_update_key(trans, iter, BKEY_ALLOC_U64s_MAX);
ret = PTR_ERR_OR_ZERO(a);
if (ret) if (ret)
goto out; goto out;
a = bkey_alloc_init(insert->k); bkey_alloc_init(&a->k_i);
a->k.p = iter->pos; a->k.p = iter->pos;
bch2_alloc_pack(a, u); bch2_alloc_pack(a, u);
out: out:
...@@ -1442,8 +1442,8 @@ static int bch2_trans_mark_stripe_ptr(struct btree_trans *trans, ...@@ -1442,8 +1442,8 @@ static int bch2_trans_mark_stripe_ptr(struct btree_trans *trans,
s64 sectors, enum bch_data_type data_type) s64 sectors, enum bch_data_type data_type)
{ {
struct bch_replicas_padded r; struct bch_replicas_padded r;
struct btree_insert_entry *insert;
struct btree_iter *iter; struct btree_iter *iter;
struct bkey_i *new_k;
struct bkey_s_c k; struct bkey_s_c k;
struct bkey_s_stripe s; struct bkey_s_stripe s;
unsigned nr_data; unsigned nr_data;
...@@ -1452,8 +1452,7 @@ static int bch2_trans_mark_stripe_ptr(struct btree_trans *trans, ...@@ -1452,8 +1452,7 @@ static int bch2_trans_mark_stripe_ptr(struct btree_trans *trans,
BUG_ON(!sectors); BUG_ON(!sectors);
ret = trans_get_key(trans, BTREE_ID_EC, POS(0, p.idx), ret = trans_get_key(trans, BTREE_ID_EC, POS(0, p.idx), &iter, &k);
&insert, &iter, &k);
if (ret) if (ret)
return ret; return ret;
...@@ -1465,11 +1464,13 @@ static int bch2_trans_mark_stripe_ptr(struct btree_trans *trans, ...@@ -1465,11 +1464,13 @@ static int bch2_trans_mark_stripe_ptr(struct btree_trans *trans,
goto out; goto out;
} }
ret = trans_update_key(trans, &insert, iter, k, 1); new_k = trans_update_key(trans, iter, k.k->u64s);
ret = PTR_ERR_OR_ZERO(new_k);
if (ret) if (ret)
goto out; goto out;
s = bkey_i_to_s_stripe(insert->k); bkey_reassemble(new_k, k);
s = bkey_i_to_s_stripe(new_k);
nr_data = s.v->nr_blocks - s.v->nr_redundant; nr_data = s.v->nr_blocks - s.v->nr_redundant;
......
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