]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/alloc_background.c
Update bcachefs sources to 6a20aede29 bcachefs: Fix quotas + snapshots
[bcachefs-tools-debian] / libbcachefs / alloc_background.c
index 816208703f4742c1420d6ad2bdf1105cd959e5c5..dcdef3bcd4c49159fb1962601acb1e5bb9d495c4 100644 (file)
@@ -18,6 +18,7 @@
 #include "error.h"
 #include "lru.h"
 #include "recovery.h"
+#include "trace.h"
 #include "varint.h"
 
 #include <linux/kthread.h>
@@ -27,7 +28,6 @@
 #include <linux/rcupdate.h>
 #include <linux/sched/task.h>
 #include <linux/sort.h>
-#include <trace/events/bcachefs.h>
 
 /* Persistent alloc info: */
 
@@ -511,18 +511,8 @@ static inline struct bkey_i_alloc_v4 *bch2_alloc_to_v4_mut_inlined(struct btree_
 
        if (likely(k.k->type == KEY_TYPE_alloc_v4) &&
            ((a = bkey_s_c_to_alloc_v4(k), true) &&
-            BCH_ALLOC_V4_BACKPOINTERS_START(a.v) == BCH_ALLOC_V4_U64s &&
-            BCH_ALLOC_V4_NR_BACKPOINTERS(a.v) == 0)) {
-               /*
-                * Reserve space for one more backpointer here:
-                * Not sketchy at doing it this way, nope...
-                */
-               struct bkey_i_alloc_v4 *ret =
-                       bch2_trans_kmalloc_nomemzero(trans, bkey_bytes(k.k) + sizeof(struct bch_backpointer));
-               if (!IS_ERR(ret))
-                       bkey_reassemble(&ret->k_i, k);
-               return ret;
-       }
+            BCH_ALLOC_V4_NR_BACKPOINTERS(a.v) == 0))
+               return bch2_bkey_make_mut_noupdate_typed(trans, k, alloc_v4);
 
        return __bch2_alloc_to_v4_mut(trans, k);
 }
@@ -540,14 +530,13 @@ bch2_trans_start_alloc_update(struct btree_trans *trans, struct btree_iter *iter
        struct bkey_i_alloc_v4 *a;
        int ret;
 
-       bch2_trans_iter_init(trans, iter, BTREE_ID_alloc, pos,
+       k = bch2_bkey_get_iter(trans, iter, BTREE_ID_alloc, pos,
                             BTREE_ITER_WITH_UPDATES|
                             BTREE_ITER_CACHED|
                             BTREE_ITER_INTENT);
-       k = bch2_btree_iter_peek_slot(iter);
        ret = bkey_err(k);
        if (unlikely(ret))
-               goto err;
+               return ERR_PTR(ret);
 
        a = bch2_alloc_to_v4_mut_inlined(trans, k);
        ret = PTR_ERR_OR_ZERO(a);
@@ -789,13 +778,12 @@ static int bch2_bucket_do_index(struct btree_trans *trans,
                return 0;
        }
 
-       bch2_trans_iter_init(trans, &iter, btree,
+       old = bch2_bkey_get_iter(trans, &iter, btree,
                             bkey_start_pos(&k->k),
                             BTREE_ITER_INTENT);
-       old = bch2_btree_iter_peek_slot(&iter);
        ret = bkey_err(old);
        if (ret)
-               goto err;
+               return ret;
 
        if (ca->mi.freespace_initialized &&
            test_bit(BCH_FS_CHECK_ALLOC_DONE, &c->flags) &&
@@ -833,13 +821,12 @@ static noinline int bch2_bucket_gen_update(struct btree_trans *trans,
        if (ret)
                return ret;
 
-       bch2_trans_iter_init(trans, &iter, BTREE_ID_bucket_gens, pos,
-                            BTREE_ITER_INTENT|
-                            BTREE_ITER_WITH_UPDATES);
-       k = bch2_btree_iter_peek_slot(&iter);
+       k = bch2_bkey_get_iter(trans, &iter, BTREE_ID_bucket_gens, pos,
+                              BTREE_ITER_INTENT|
+                              BTREE_ITER_WITH_UPDATES);
        ret = bkey_err(k);
        if (ret)
-               goto err;
+               return ret;
 
        if (k.k->type != KEY_TYPE_bucket_gens) {
                bkey_bucket_gens_init(&g->k_i);
@@ -851,7 +838,6 @@ static noinline int bch2_bucket_gen_update(struct btree_trans *trans,
        g->v.gens[offset] = gen;
 
        ret = bch2_trans_update(trans, &iter, &g->k_i, 0);
-err:
        bch2_trans_iter_exit(trans, &iter);
        return ret;
 }
@@ -1312,18 +1298,16 @@ static int bch2_check_discard_freespace_key(struct btree_trans *trans,
        pos.offset &= ~(~0ULL << 56);
        genbits = iter->pos.offset & (~0ULL << 56);
 
-       bch2_trans_iter_init(trans, &alloc_iter, BTREE_ID_alloc, pos, 0);
+       alloc_k = bch2_bkey_get_iter(trans, &alloc_iter, BTREE_ID_alloc, pos, 0);
+       ret = bkey_err(alloc_k);
+       if (ret)
+               return ret;
 
        if (fsck_err_on(!bch2_dev_bucket_exists(c, pos), c,
                        "entry in %s btree for nonexistant dev:bucket %llu:%llu",
                        bch2_btree_ids[iter->btree_id], pos.inode, pos.offset))
                goto delete;
 
-       alloc_k = bch2_btree_iter_peek_slot(&alloc_iter);
-       ret = bkey_err(alloc_k);
-       if (ret)
-               goto err;
-
        a = bch2_alloc_to_v4(alloc_k, &a_convert);
 
        if (fsck_err_on(a->data_type != state ||
@@ -1336,7 +1320,6 @@ static int bch2_check_discard_freespace_key(struct btree_trans *trans,
                        genbits >> 56, alloc_freespace_genbits(*a) >> 56))
                goto delete;
 out:
-err:
 fsck_err:
        bch2_trans_iter_exit(trans, &alloc_iter);
        printbuf_exit(&buf);
@@ -1525,7 +1508,7 @@ static int bch2_check_alloc_to_lru_ref(struct btree_trans *trans,
        struct btree_iter lru_iter;
        struct bch_alloc_v4 a_convert;
        const struct bch_alloc_v4 *a;
-       struct bkey_s_c alloc_k, k;
+       struct bkey_s_c alloc_k, lru_k;
        struct printbuf buf = PRINTBUF;
        int ret;
 
@@ -1542,21 +1525,20 @@ static int bch2_check_alloc_to_lru_ref(struct btree_trans *trans,
        if (a->data_type != BCH_DATA_cached)
                return 0;
 
-       bch2_trans_iter_init(trans, &lru_iter, BTREE_ID_lru,
+       lru_k = bch2_bkey_get_iter(trans, &lru_iter, BTREE_ID_lru,
                             lru_pos(alloc_k.k->p.inode,
                                     bucket_to_u64(alloc_k.k->p),
                                     a->io_time[READ]), 0);
-       k = bch2_btree_iter_peek_slot(&lru_iter);
-       ret = bkey_err(k);
+       ret = bkey_err(lru_k);
        if (ret)
-               goto err;
+               return ret;
 
        if (fsck_err_on(!a->io_time[READ], c,
                        "cached bucket with read_time 0\n"
                        "  %s",
                (printbuf_reset(&buf),
                 bch2_bkey_val_to_text(&buf, c, alloc_k), buf.buf)) ||
-           fsck_err_on(k.k->type != KEY_TYPE_set, c,
+           fsck_err_on(lru_k.k->type != KEY_TYPE_set, c,
                        "missing lru entry\n"
                        "  %s",
                        (printbuf_reset(&buf),
@@ -1645,10 +1627,9 @@ static int bch2_discard_one_bucket(struct btree_trans *trans,
                goto out;
        }
 
-       bch2_trans_iter_init(trans, &iter, BTREE_ID_alloc,
-                            need_discard_iter->pos,
-                            BTREE_ITER_CACHED);
-       k = bch2_btree_iter_peek_slot(&iter);
+       k = bch2_bkey_get_iter(trans, &iter, BTREE_ID_alloc,
+                              need_discard_iter->pos,
+                              BTREE_ITER_CACHED);
        ret = bkey_err(k);
        if (ret)
                goto out;