231 lines
7.5 KiB
Diff
231 lines
7.5 KiB
Diff
From 7fda5f15087a016cc2ef2d449bcba4e4b9b795ce Mon Sep 17 00:00:00 2001
|
|
From: Kent Overstreet <kent.overstreet@linux.dev>
|
|
Date: Sat, 26 Oct 2024 23:35:03 -0400
|
|
Subject: [PATCH 077/233] bcachefs: bch2_btree_bit_mod_iter()
|
|
Content-Type: text/plain; charset="utf-8"
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
factor out a new helper, make it handle extents bitset btrees
|
|
(freespace).
|
|
|
|
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
|
|
Signed-off-by: Alexander Miroshnichenko <alex@millerson.name>
|
|
---
|
|
fs/bcachefs/alloc_background.c | 57 ++++++----------------------------
|
|
fs/bcachefs/btree_update.c | 37 +++++++++++-----------
|
|
fs/bcachefs/btree_update.h | 3 +-
|
|
3 files changed, 29 insertions(+), 68 deletions(-)
|
|
|
|
diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c
|
|
index af791f4dab99..a1bd75a44d79 100644
|
|
--- a/fs/bcachefs/alloc_background.c
|
|
+++ b/fs/bcachefs/alloc_background.c
|
|
@@ -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 @@ static noinline_for_stack int bch2_check_discard_freespace_key(struct btree_tran
|
|
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;
|
|
diff --git a/fs/bcachefs/btree_update.c b/fs/bcachefs/btree_update.c
|
|
index f3d7ca3d92b9..06fd5aa62296 100644
|
|
--- a/fs/bcachefs/btree_update.c
|
|
+++ b/fs/bcachefs/btree_update.c
|
|
@@ -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;
|
|
}
|
|
diff --git a/fs/bcachefs/btree_update.h b/fs/bcachefs/btree_update.h
|
|
index 3bc57d43aa83..58df20194306 100644
|
|
--- a/fs/bcachefs/btree_update.h
|
|
+++ b/fs/bcachefs/btree_update.h
|
|
@@ -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);
|
|
|
|
--
|
|
2.45.2
|
|
|