]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: bch2_btree_bit_mod_iter()
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 27 Oct 2024 03:35:03 +0000 (23:35 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 21 Dec 2024 06:36:17 +0000 (01:36 -0500)
factor out a new helper, make it handle extents bitset btrees
(freespace).

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/alloc_background.c
fs/bcachefs/btree_update.c
fs/bcachefs/btree_update.h

index af791f4dab999c6d15e7fa151bc145fdf5dc30b4..a1bd75a44d7963866d2b219a992779388ba2fc69 100644 (file)
@@ -671,44 +671,31 @@ static int bch2_bucket_do_index(struct btree_trans *trans,
                                bool set)
 {
        struct bch_fs *c = trans->c;
-       struct btree_iter iter;
-       struct bkey_s_c old;
-       struct bkey_i *k;
        enum btree_id btree;
+       struct bpos pos;
        enum bch_bkey_type old_type = !set ? KEY_TYPE_set : KEY_TYPE_deleted;
-       enum bch_bkey_type new_type =  set ? KEY_TYPE_set : KEY_TYPE_deleted;
        struct printbuf buf = PRINTBUF;
-       int ret;
 
        if (a->data_type != BCH_DATA_free &&
            a->data_type != BCH_DATA_need_discard)
                return 0;
 
-       k = bch2_trans_kmalloc_nomemzero(trans, sizeof(*k));
-       if (IS_ERR(k))
-               return PTR_ERR(k);
-
-       bkey_init(&k->k);
-       k->k.type = new_type;
-
        switch (a->data_type) {
        case BCH_DATA_free:
                btree = BTREE_ID_freespace;
-               k->k.p = alloc_freespace_pos(alloc_k.k->p, *a);
-               bch2_key_resize(&k->k, 1);
+               pos = alloc_freespace_pos(alloc_k.k->p, *a);
                break;
        case BCH_DATA_need_discard:
                btree = BTREE_ID_need_discard;
-               k->k.p = alloc_k.k->p;
+               pos = alloc_k.k->p;
                break;
        default:
                return 0;
        }
 
-       old = bch2_bkey_get_iter(trans, &iter, btree,
-                            bkey_start_pos(&k->k),
-                            BTREE_ITER_intent);
-       ret = bkey_err(old);
+       struct btree_iter iter;
+       struct bkey_s_c old = bch2_bkey_get_iter(trans, &iter, btree, pos, BTREE_ITER_intent);
+       int ret = bkey_err(old);
        if (ret)
                return ret;
 
@@ -728,7 +715,7 @@ static int bch2_bucket_do_index(struct btree_trans *trans,
                goto err;
        }
 
-       ret = bch2_trans_update(trans, &iter, k, 0);
+       ret = bch2_btree_bit_mod_iter(trans, &iter, set);
 err:
        bch2_trans_iter_exit(trans, &iter);
        printbuf_exit(&buf);
@@ -1163,18 +1150,7 @@ int bch2_check_alloc_key(struct btree_trans *trans,
                        bch2_bkey_types[k.k->type],
                        bch2_bkey_types[discard_key_type],
                        (bch2_bkey_val_to_text(&buf, c, alloc_k), buf.buf))) {
-               struct bkey_i *update =
-                       bch2_trans_kmalloc(trans, sizeof(*update));
-
-               ret = PTR_ERR_OR_ZERO(update);
-               if (ret)
-                       goto err;
-
-               bkey_init(&update->k);
-               update->k.type  = discard_key_type;
-               update->k.p     = discard_iter->pos;
-
-               ret = bch2_trans_update(trans, discard_iter, update, 0);
+               ret = bch2_btree_bit_mod_iter(trans, discard_iter, !!discard_key_type);
                if (ret)
                        goto err;
        }
@@ -1194,19 +1170,7 @@ int bch2_check_alloc_key(struct btree_trans *trans,
                        bch2_bkey_types[freespace_key_type],
                        (printbuf_reset(&buf),
                         bch2_bkey_val_to_text(&buf, c, alloc_k), buf.buf))) {
-               struct bkey_i *update =
-                       bch2_trans_kmalloc(trans, sizeof(*update));
-
-               ret = PTR_ERR_OR_ZERO(update);
-               if (ret)
-                       goto err;
-
-               bkey_init(&update->k);
-               update->k.type  = freespace_key_type;
-               update->k.p     = freespace_iter->pos;
-               bch2_key_resize(&update->k, 1);
-
-               ret = bch2_trans_update(trans, freespace_iter, update, 0);
+               ret = bch2_btree_bit_mod_iter(trans, freespace_iter, !!freespace_key_type);
                if (ret)
                        goto err;
        }
@@ -1420,8 +1384,7 @@ fsck_err:
        printbuf_exit(&buf);
        return ret;
 delete:
-       ret =   bch2_btree_delete_extent_at(trans, iter,
-                       iter->btree_id == BTREE_ID_freespace ? 1 : 0, 0) ?:
+       ret =   bch2_btree_bit_mod_iter(trans, iter, false) ?:
                bch2_trans_commit(trans, NULL, NULL,
                        BCH_TRANS_COMMIT_no_enospc);
        goto out;
index f3d7ca3d92b9c78f614604b34ab4cc39f2647e5b..06fd5aa62296a3a7759f528f560a51799751593d 100644 (file)
@@ -669,27 +669,19 @@ int bch2_btree_insert(struct bch_fs *c, enum btree_id id, struct bkey_i *k,
                             bch2_btree_insert_trans(trans, id, k, iter_flags));
 }
 
-int bch2_btree_delete_extent_at(struct btree_trans *trans, struct btree_iter *iter,
-                               unsigned len, unsigned update_flags)
+int bch2_btree_delete_at(struct btree_trans *trans,
+                        struct btree_iter *iter, unsigned update_flags)
 {
-       struct bkey_i *k;
-
-       k = bch2_trans_kmalloc(trans, sizeof(*k));
-       if (IS_ERR(k))
-               return PTR_ERR(k);
+       struct bkey_i *k = bch2_trans_kmalloc(trans, sizeof(*k));
+       int ret = PTR_ERR_OR_ZERO(k);
+       if (ret)
+               return ret;
 
        bkey_init(&k->k);
        k->k.p = iter->pos;
-       bch2_key_resize(&k->k, len);
        return bch2_trans_update(trans, iter, k, update_flags);
 }
 
-int bch2_btree_delete_at(struct btree_trans *trans,
-                        struct btree_iter *iter, unsigned update_flags)
-{
-       return bch2_btree_delete_extent_at(trans, iter, 0, update_flags);
-}
-
 int bch2_btree_delete(struct btree_trans *trans,
                      enum btree_id btree, struct bpos pos,
                      unsigned update_flags)
@@ -791,8 +783,7 @@ int bch2_btree_delete_range(struct bch_fs *c, enum btree_id id,
        return ret;
 }
 
-int bch2_btree_bit_mod(struct btree_trans *trans, enum btree_id btree,
-                      struct bpos pos, bool set)
+int bch2_btree_bit_mod_iter(struct btree_trans *trans, struct btree_iter *iter, bool set)
 {
        struct bkey_i *k = bch2_trans_kmalloc(trans, sizeof(*k));
        int ret = PTR_ERR_OR_ZERO(k);
@@ -801,13 +792,21 @@ int bch2_btree_bit_mod(struct btree_trans *trans, enum btree_id btree,
 
        bkey_init(&k->k);
        k->k.type = set ? KEY_TYPE_set : KEY_TYPE_deleted;
-       k->k.p = pos;
+       k->k.p = iter->pos;
+       if (iter->flags & BTREE_ITER_is_extents)
+               bch2_key_resize(&k->k, 1);
+
+       return bch2_trans_update(trans, iter, k, 0);
+}
 
+int bch2_btree_bit_mod(struct btree_trans *trans, enum btree_id btree,
+                      struct bpos pos, bool set)
+{
        struct btree_iter iter;
        bch2_trans_iter_init(trans, &iter, btree, pos, BTREE_ITER_intent);
 
-       ret   = bch2_btree_iter_traverse(&iter) ?:
-               bch2_trans_update(trans, &iter, k, 0);
+       int ret = bch2_btree_iter_traverse(&iter) ?:
+                 bch2_btree_bit_mod_iter(trans, &iter, set);
        bch2_trans_iter_exit(trans, &iter);
        return ret;
 }
index 3bc57d43aa8310cce0c63df8998b3b08d8723a0a..58df20194306de4ca491ca1f043bd3ad0b329abc 100644 (file)
@@ -46,8 +46,6 @@ enum bch_trans_commit_flags {
 
 void bch2_trans_commit_flags_to_text(struct printbuf *, enum bch_trans_commit_flags);
 
-int bch2_btree_delete_extent_at(struct btree_trans *, struct btree_iter *,
-                               unsigned, unsigned);
 int bch2_btree_delete_at(struct btree_trans *, struct btree_iter *, unsigned);
 int bch2_btree_delete(struct btree_trans *, enum btree_id, struct bpos, unsigned);
 
@@ -65,6 +63,7 @@ int bch2_btree_delete_range_trans(struct btree_trans *, enum btree_id,
 int bch2_btree_delete_range(struct bch_fs *, enum btree_id,
                            struct bpos, struct bpos, unsigned, u64 *);
 
+int bch2_btree_bit_mod_iter(struct btree_trans *, struct btree_iter *, bool);
 int bch2_btree_bit_mod(struct btree_trans *, enum btree_id, struct bpos, bool);
 int bch2_btree_bit_mod_buffered(struct btree_trans *, enum btree_id, struct bpos, bool);