bcachefs: Don't use in-memory bucket array for alloc updates
authorKent Overstreet <kent.overstreet@gmail.com>
Sun, 26 Dec 2021 01:36:47 +0000 (20:36 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:22 +0000 (17:09 -0400)
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: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/alloc_background.c
fs/bcachefs/btree_iter.c
fs/bcachefs/btree_update.h
fs/bcachefs/buckets.c

index 48f4db591c06b762ed5358dbe36d7145f575f193..0cf71125c55f00dcad6808bc99350f6d44f219d1 100644 (file)
@@ -464,19 +464,20 @@ int bch2_bucket_io_time_reset(struct btree_trans *trans, unsigned dev,
 {
        struct bch_fs *c = trans->c;
        struct btree_iter iter;
+       struct bkey_s_c k;
        struct bkey_alloc_unpacked u;
        u64 *time, now;
        int ret = 0;
 
        bch2_trans_iter_init(trans, &iter, BTREE_ID_alloc, POS(dev, bucket_nr),
                             BTREE_ITER_CACHED|
-                            BTREE_ITER_CACHED_NOFILL|
                             BTREE_ITER_INTENT);
-       ret = bch2_btree_iter_traverse(&iter);
+       k = bch2_btree_iter_peek_slot(&iter);
+       ret = bkey_err(k);
        if (ret)
                goto out;
 
-       u = alloc_mem_to_key(c, &iter);
+       u = bch2_alloc_unpack(k);
 
        time = rw == READ ? &u.read_time : &u.write_time;
        now = atomic64_read(&c->io_clock[rw].now);
@@ -673,20 +674,20 @@ static int bucket_invalidate_btree(struct btree_trans *trans,
 {
        struct bch_fs *c = trans->c;
        struct btree_iter iter;
+       struct bkey_s_c k;
        int ret;
 
        bch2_trans_iter_init(trans, &iter, BTREE_ID_alloc,
                             POS(ca->dev_idx, b),
                             BTREE_ITER_CACHED|
-                            BTREE_ITER_CACHED_NOFILL|
                             BTREE_ITER_INTENT);
 
-       ret = bch2_btree_iter_traverse(&iter);
+       k = bch2_btree_iter_peek_slot(&iter);
+       ret = bkey_err(k);
        if (ret)
                goto err;
 
-       *u = alloc_mem_to_key(c, &iter);
-
+       *u = bch2_alloc_unpack(k);
        u->gen++;
        u->data_type            = 0;
        u->dirty_sectors        = 0;
index ae1628918c5759dded589b2976a8666ca52c1a34..100305cf93bf81cd6f963055de7f4eab5916f7e9 100644 (file)
@@ -2183,6 +2183,7 @@ inline bool bch2_btree_iter_rewind(struct btree_iter *iter)
        return ret;
 }
 
+static noinline
 struct bkey_i *__bch2_btree_trans_peek_updates(struct btree_iter *iter)
 {
        struct btree_insert_entry *i;
@@ -2202,6 +2203,13 @@ struct bkey_i *__bch2_btree_trans_peek_updates(struct btree_iter *iter)
        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,
                                                 struct btree_path *path)
 {
index c8e1f43f71e3f36aeebb327fc01b8828ef7db53b..5e5a1b5e750eb1d75552c27c31743a5326072896 100644 (file)
@@ -141,13 +141,4 @@ static inline int bch2_trans_commit(struct btree_trans *trans,
             (_i) < (_trans)->updates + (_trans)->nr_updates;           \
             (_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 */
index f7a750aff03fdd18e02f16e37ff17baa5b5fb9ec..fb833d82222bac8ba5404ff6b1265be362953d0f 100644 (file)
@@ -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_dev *ca = bch_dev_bkey_exists(c, ptr->dev);
-       struct bpos pos = POS(ptr->dev, PTR_BUCKET_NR(ca, ptr));
-       struct bkey_i *update;
+       struct bkey_s_c k;
        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_NOFILL|
                             BTREE_ITER_INTENT);
-       ret = bch2_btree_iter_traverse(iter);
+       k = bch2_btree_iter_peek_slot(iter);
+       ret = bkey_err(k);
        if (ret) {
                bch2_trans_iter_exit(trans, iter);
                return ret;
        }
 
-       update = __bch2_btree_trans_peek_updates(iter);
-       *u = update && !bpos_cmp(update->k.p, pos)
-               ? bch2_alloc_unpack(bkey_i_to_s_c(update))
-               : alloc_mem_to_key(c, iter);
-
+       *u = bch2_alloc_unpack(k);
        return 0;
 }