summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-06-24 17:58:40 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2019-06-27 22:22:08 -0400
commit1f431b384d032f0bb7d3b4241ba485dd416babdf (patch)
treec729bd3195979c82d631c275d1447943da9c8c09
parentfeefa0f36c61b30843d0aea7b2740b9c76ff3406 (diff)
bcachefs: Refactor trans_(get|update)_key
these are still pretty ugly... Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--fs/bcachefs/bcachefs_format.h2
-rw-r--r--fs/bcachefs/buckets.c65
2 files changed, 35 insertions, 32 deletions
diff --git a/fs/bcachefs/bcachefs_format.h b/fs/bcachefs/bcachefs_format.h
index 05b92ee7fd96..362f9bc9b82c 100644
--- a/fs/bcachefs/bcachefs_format.h
+++ b/fs/bcachefs/bcachefs_format.h
@@ -848,6 +848,8 @@ static const unsigned BKEY_ALLOC_VAL_U64s_MAX =
BCH_ALLOC_FIELDS(), sizeof(u64));
#undef x
+static const unsigned BKEY_ALLOC_U64s_MAX = BKEY_U64s + BKEY_ALLOC_VAL_U64s_MAX;
+
/* Quotas: */
enum quota_types {
diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c
index 9516a59c3ada..b6b3ac5111ca 100644
--- a/fs/bcachefs/buckets.c
+++ b/fs/bcachefs/buckets.c
@@ -1318,22 +1318,18 @@ void bch2_trans_fs_usage_apply(struct btree_trans *trans,
static int trans_get_key(struct btree_trans *trans,
enum btree_id btree_id, struct bpos pos,
- struct btree_insert_entry **insert,
struct btree_iter **iter,
struct bkey_s_c *k)
{
unsigned i;
int ret;
- *insert = NULL;
-
for (i = 0; i < trans->nr_updates; i++)
if (!trans->updates[i].deferred &&
trans->updates[i].iter->btree_id == btree_id &&
!bkey_cmp(pos, trans->updates[i].iter->pos)) {
- *insert = &trans->updates[i];
- *iter = (*insert)->iter;
- *k = bkey_i_to_s_c((*insert)->k);
+ *iter = trans->updates[i].iter;
+ *k = bkey_i_to_s_c(trans->updates[i].k);
return 0;
}
@@ -1349,30 +1345,34 @@ static int trans_get_key(struct btree_trans *trans,
return ret;
}
-static int trans_update_key(struct btree_trans *trans,
- struct btree_insert_entry **insert,
- struct btree_iter *iter,
- struct bkey_s_c k,
- unsigned extra_u64s)
+static void *trans_update_key(struct btree_trans *trans,
+ struct btree_iter *iter,
+ unsigned u64s)
{
struct bkey_i *new_k;
+ unsigned i;
- if (*insert)
- return 0;
-
- new_k = bch2_trans_kmalloc(trans, bkey_bytes(k.k) +
- extra_u64s * sizeof(u64));
+ new_k = bch2_trans_kmalloc(trans, u64s * sizeof(u64));
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) {
- .iter = iter,
- .k = new_k,
- .triggered = true,
+ 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,
+ .k = new_k,
+ .triggered = true,
}));
- bkey_reassemble((*insert)->k, k);
- return 0;
+ return new_k;
}
static int bch2_trans_mark_pointer(struct btree_trans *trans,
@@ -1381,7 +1381,6 @@ static int bch2_trans_mark_pointer(struct btree_trans *trans,
{
struct bch_fs *c = trans->c;
struct bch_dev *ca = bch_dev_bkey_exists(c, p.ptr.dev);
- struct btree_insert_entry *insert;
struct btree_iter *iter;
struct bkey_s_c k;
struct bkey_alloc_unpacked u;
@@ -1391,7 +1390,7 @@ static int bch2_trans_mark_pointer(struct btree_trans *trans,
ret = trans_get_key(trans, BTREE_ID_ALLOC,
POS(p.ptr.dev, PTR_BUCKET_NR(ca, &p.ptr)),
- &insert, &iter, &k);
+ &iter, &k);
if (ret)
return ret;
@@ -1424,11 +1423,12 @@ static int bch2_trans_mark_pointer(struct btree_trans *trans,
? u.dirty_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)
goto out;
- a = bkey_alloc_init(insert->k);
+ bkey_alloc_init(&a->k_i);
a->k.p = iter->pos;
bch2_alloc_pack(a, u);
out:
@@ -1441,8 +1441,8 @@ static int bch2_trans_mark_stripe_ptr(struct btree_trans *trans,
s64 sectors, enum bch_data_type data_type)
{
struct bch_replicas_padded r;
- struct btree_insert_entry *insert;
struct btree_iter *iter;
+ struct bkey_i *new_k;
struct bkey_s_c k;
struct bkey_s_stripe s;
unsigned nr_data;
@@ -1451,8 +1451,7 @@ static int bch2_trans_mark_stripe_ptr(struct btree_trans *trans,
BUG_ON(!sectors);
- ret = trans_get_key(trans, BTREE_ID_EC, POS(0, p.idx),
- &insert, &iter, &k);
+ ret = trans_get_key(trans, BTREE_ID_EC, POS(0, p.idx), &iter, &k);
if (ret)
return ret;
@@ -1464,11 +1463,13 @@ static int bch2_trans_mark_stripe_ptr(struct btree_trans *trans,
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)
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;