Commit 3763cb95 authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: Don't use in-memory bucket array for alloc updates

More prep work for getting rid of the in-memory bucket array: now that
we have BTREE_ITER_WITH_JOURNAL, the allocator code can do ntree lookups
before journal replay is finished, and there's no longer any need for it
to get allocation information from the in-memory bucket array.
Signed-off-by: default avatarKent Overstreet <kent.overstreet@gmail.com>
parent 1f5f52bd
...@@ -464,19 +464,20 @@ int bch2_bucket_io_time_reset(struct btree_trans *trans, unsigned dev, ...@@ -464,19 +464,20 @@ int bch2_bucket_io_time_reset(struct btree_trans *trans, unsigned dev,
{ {
struct bch_fs *c = trans->c; struct bch_fs *c = trans->c;
struct btree_iter iter; struct btree_iter iter;
struct bkey_s_c k;
struct bkey_alloc_unpacked u; struct bkey_alloc_unpacked u;
u64 *time, now; u64 *time, now;
int ret = 0; int ret = 0;
bch2_trans_iter_init(trans, &iter, BTREE_ID_alloc, POS(dev, bucket_nr), bch2_trans_iter_init(trans, &iter, BTREE_ID_alloc, POS(dev, bucket_nr),
BTREE_ITER_CACHED| BTREE_ITER_CACHED|
BTREE_ITER_CACHED_NOFILL|
BTREE_ITER_INTENT); BTREE_ITER_INTENT);
ret = bch2_btree_iter_traverse(&iter); k = bch2_btree_iter_peek_slot(&iter);
ret = bkey_err(k);
if (ret) if (ret)
goto out; goto out;
u = alloc_mem_to_key(c, &iter); u = bch2_alloc_unpack(k);
time = rw == READ ? &u.read_time : &u.write_time; time = rw == READ ? &u.read_time : &u.write_time;
now = atomic64_read(&c->io_clock[rw].now); now = atomic64_read(&c->io_clock[rw].now);
...@@ -673,20 +674,20 @@ static int bucket_invalidate_btree(struct btree_trans *trans, ...@@ -673,20 +674,20 @@ static int bucket_invalidate_btree(struct btree_trans *trans,
{ {
struct bch_fs *c = trans->c; struct bch_fs *c = trans->c;
struct btree_iter iter; struct btree_iter iter;
struct bkey_s_c k;
int ret; int ret;
bch2_trans_iter_init(trans, &iter, BTREE_ID_alloc, bch2_trans_iter_init(trans, &iter, BTREE_ID_alloc,
POS(ca->dev_idx, b), POS(ca->dev_idx, b),
BTREE_ITER_CACHED| BTREE_ITER_CACHED|
BTREE_ITER_CACHED_NOFILL|
BTREE_ITER_INTENT); BTREE_ITER_INTENT);
ret = bch2_btree_iter_traverse(&iter); k = bch2_btree_iter_peek_slot(&iter);
ret = bkey_err(k);
if (ret) if (ret)
goto err; goto err;
*u = alloc_mem_to_key(c, &iter); *u = bch2_alloc_unpack(k);
u->gen++; u->gen++;
u->data_type = 0; u->data_type = 0;
u->dirty_sectors = 0; u->dirty_sectors = 0;
......
...@@ -2183,6 +2183,7 @@ inline bool bch2_btree_iter_rewind(struct btree_iter *iter) ...@@ -2183,6 +2183,7 @@ inline bool bch2_btree_iter_rewind(struct btree_iter *iter)
return ret; return ret;
} }
static noinline
struct bkey_i *__bch2_btree_trans_peek_updates(struct btree_iter *iter) struct bkey_i *__bch2_btree_trans_peek_updates(struct btree_iter *iter)
{ {
struct btree_insert_entry *i; struct btree_insert_entry *i;
...@@ -2202,6 +2203,13 @@ struct bkey_i *__bch2_btree_trans_peek_updates(struct btree_iter *iter) ...@@ -2202,6 +2203,13 @@ struct bkey_i *__bch2_btree_trans_peek_updates(struct btree_iter *iter)
return ret; return ret;
} }
static inline struct bkey_i *btree_trans_peek_updates(struct btree_iter *iter)
{
return iter->flags & BTREE_ITER_WITH_UPDATES
? __bch2_btree_trans_peek_updates(iter)
: NULL;
}
static struct bkey_i *__btree_trans_peek_journal(struct btree_trans *trans, static struct bkey_i *__btree_trans_peek_journal(struct btree_trans *trans,
struct btree_path *path) struct btree_path *path)
{ {
......
...@@ -141,13 +141,4 @@ static inline int bch2_trans_commit(struct btree_trans *trans, ...@@ -141,13 +141,4 @@ static inline int bch2_trans_commit(struct btree_trans *trans,
(_i) < (_trans)->updates + (_trans)->nr_updates; \ (_i) < (_trans)->updates + (_trans)->nr_updates; \
(_i)++) (_i)++)
struct bkey_i *__bch2_btree_trans_peek_updates(struct btree_iter *);
static inline struct bkey_i *btree_trans_peek_updates(struct btree_iter *iter)
{
return iter->flags & BTREE_ITER_WITH_UPDATES
? __bch2_btree_trans_peek_updates(iter)
: NULL;
}
#endif /* _BCACHEFS_BTREE_UPDATE_H */ #endif /* _BCACHEFS_BTREE_UPDATE_H */
...@@ -1429,25 +1429,22 @@ static int bch2_trans_start_alloc_update(struct btree_trans *trans, struct btree ...@@ -1429,25 +1429,22 @@ static int bch2_trans_start_alloc_update(struct btree_trans *trans, struct btree
{ {
struct bch_fs *c = trans->c; struct bch_fs *c = trans->c;
struct bch_dev *ca = bch_dev_bkey_exists(c, ptr->dev); struct bch_dev *ca = bch_dev_bkey_exists(c, ptr->dev);
struct bpos pos = POS(ptr->dev, PTR_BUCKET_NR(ca, ptr)); struct bkey_s_c k;
struct bkey_i *update;
int ret; int ret;
bch2_trans_iter_init(trans, iter, BTREE_ID_alloc, pos, bch2_trans_iter_init(trans, iter, BTREE_ID_alloc,
POS(ptr->dev, PTR_BUCKET_NR(ca, ptr)),
BTREE_ITER_WITH_UPDATES|
BTREE_ITER_CACHED| BTREE_ITER_CACHED|
BTREE_ITER_CACHED_NOFILL|
BTREE_ITER_INTENT); BTREE_ITER_INTENT);
ret = bch2_btree_iter_traverse(iter); k = bch2_btree_iter_peek_slot(iter);
ret = bkey_err(k);
if (ret) { if (ret) {
bch2_trans_iter_exit(trans, iter); bch2_trans_iter_exit(trans, iter);
return ret; return ret;
} }
update = __bch2_btree_trans_peek_updates(iter); *u = bch2_alloc_unpack(k);
*u = update && !bpos_cmp(update->k.p, pos)
? bch2_alloc_unpack(bkey_i_to_s_c(update))
: alloc_mem_to_key(c, iter);
return 0; return 0;
} }
......
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