summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2023-12-21 00:57:00 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2023-12-23 23:40:46 -0500
commitb71ae58d2b93d0e4f6a365ec9f771d3870510fd1 (patch)
tree96a10b1153a299478fa7b97338ce87102325d6f0
parent332961acf73265b2318d7729b2d4ba3a18e1c5c4 (diff)
bcachefs: Record keys for new btree nodes from write path
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/btree_io.c28
-rw-r--r--fs/bcachefs/btree_io.h1
-rw-r--r--fs/bcachefs/btree_types.h3
-rw-r--r--fs/bcachefs/btree_update_interior.c29
-rw-r--r--fs/bcachefs/btree_update_interior.h1
5 files changed, 33 insertions, 29 deletions
diff --git a/fs/bcachefs/btree_io.c b/fs/bcachefs/btree_io.c
index 93a548cd393d..33115744d8f3 100644
--- a/fs/bcachefs/btree_io.c
+++ b/fs/bcachefs/btree_io.c
@@ -1785,7 +1785,7 @@ static void btree_node_write_work(struct work_struct *work)
struct btree_write_bio *wbio =
container_of(work, struct btree_write_bio, work);
struct bch_fs *c = wbio->wbio.c;
- struct btree *b = wbio->wbio.bio.bi_private;
+ struct btree *b = wbio->b;
struct bch_extent_ptr *ptr;
int ret = 0;
@@ -1833,7 +1833,7 @@ static void btree_node_write_endio(struct bio *bio)
struct bch_write_bio *orig = parent ?: wbio;
struct btree_write_bio *wb = container_of(orig, struct btree_write_bio, wbio);
struct bch_fs *c = wbio->c;
- struct btree *b = wbio->bio.bi_private;
+ struct btree *b = wb->b;
struct bch_dev *ca = bch_dev_bkey_exists(c, wbio->dev);
unsigned long flags;
@@ -1893,14 +1893,32 @@ static int validate_bset_for_write(struct bch_fs *c, struct btree *b,
static void btree_write_submit(struct work_struct *work)
{
struct btree_write_bio *wbio = container_of(work, struct btree_write_bio, work);
- BKEY_PADDED_ONSTACK(k, BKEY_BTREE_PTR_VAL_U64s_MAX) tmp;
+ struct bch_fs *c = wbio->wbio.c;
+ struct btree *b = wbio->b;
+
+ struct btree_update *as = (void *) (b->will_make_reachable & ~1UL);
+ if (as) {
+ spin_lock(&as->journal_entries_lock);
+ BUG_ON(as->journal_u64s + jset_u64s(wbio->key.k.u64s) >
+ ARRAY_SIZE(as->journal_entries));
+ as->journal_u64s +=
+ journal_entry_set((void *) &as->journal_entries[as->journal_u64s],
+ btree_node_is_root(b)
+ ? BCH_JSET_ENTRY_btree_root
+ : BCH_JSET_ENTRY_btree_keys,
+ b->c.btree_id,
+ b->c.level + !btree_node_is_root(b),
+ &wbio->key, wbio->key.k.u64s);
+ spin_unlock(&as->journal_entries_lock);
+ }
+ BKEY_PADDED_ONSTACK(k, BKEY_BTREE_PTR_VAL_U64s_MAX) tmp;
bkey_copy(&tmp.k, &wbio->key);
bkey_for_each_ptr(bch2_bkey_ptrs(bkey_i_to_s(&tmp.k)), ptr)
ptr->offset += wbio->sector_offset;
- bch2_submit_wbio_replicas(&wbio->wbio, wbio->wbio.c, BCH_DATA_btree,
+ bch2_submit_wbio_replicas(&wbio->wbio, c, BCH_DATA_btree,
&tmp.k, false);
}
@@ -2124,6 +2142,7 @@ do_write:
&c->btree_bio),
struct btree_write_bio, wbio.bio);
wbio_init(&wbio->wbio.bio);
+ wbio->b = b;
wbio->data = data;
wbio->data_bytes = bytes;
wbio->sector_offset = b->written;
@@ -2131,7 +2150,6 @@ do_write:
wbio->wbio.used_mempool = used_mempool;
wbio->wbio.first_btree_write = !b->written;
wbio->wbio.bio.bi_end_io = btree_node_write_endio;
- wbio->wbio.bio.bi_private = b;
bch2_bio_map(&wbio->wbio.bio, data, sectors_to_write << 9);
diff --git a/fs/bcachefs/btree_io.h b/fs/bcachefs/btree_io.h
index e251cb6b965f..2fd6926a71c7 100644
--- a/fs/bcachefs/btree_io.h
+++ b/fs/bcachefs/btree_io.h
@@ -48,6 +48,7 @@ struct btree_read_bio {
struct btree_write_bio {
struct work_struct work;
+ struct btree *b;
__BKEY_PADDED(key, BKEY_BTREE_PTR_VAL_U64s_MAX);
void *data;
unsigned data_bytes;
diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h
index d530307046f4..172a96161d9c 100644
--- a/fs/bcachefs/btree_types.h
+++ b/fs/bcachefs/btree_types.h
@@ -491,7 +491,8 @@ enum btree_write_type {
x(dying) \
x(fake) \
x(need_rewrite) \
- x(never_write)
+ x(never_write) \
+ x(is_root)
enum btree_flags {
/* First bits for btree node write type */
diff --git a/fs/bcachefs/btree_update_interior.c b/fs/bcachefs/btree_update_interior.c
index 2a93eb92d112..55a3a67359b2 100644
--- a/fs/bcachefs/btree_update_interior.c
+++ b/fs/bcachefs/btree_update_interior.c
@@ -830,20 +830,10 @@ static void btree_update_reparent(struct btree_update *as,
static void btree_update_updated_root(struct btree_update *as, struct btree *b)
{
- struct bkey_i *insert = &b->key;
struct bch_fs *c = as->c;
BUG_ON(as->mode != BTREE_INTERIOR_NO_UPDATE);
- BUG_ON(as->journal_u64s + jset_u64s(insert->k.u64s) >
- ARRAY_SIZE(as->journal_entries));
-
- as->journal_u64s +=
- journal_entry_set((void *) &as->journal_entries[as->journal_u64s],
- BCH_JSET_ENTRY_btree_root,
- b->c.btree_id, b->c.level,
- insert, insert->k.u64s);
-
mutex_lock(&c->btree_interior_update_lock);
list_add_tail(&as->unwritten_list, &c->btree_interior_updates_unwritten);
@@ -1125,6 +1115,7 @@ bch2_btree_update_start(struct btree_trans *trans, struct btree_path *path,
bch2_keylist_init(&as->old_keys, as->_old_keys);
bch2_keylist_init(&as->new_keys, as->_new_keys);
bch2_keylist_init(&as->parent_keys, as->inline_keys);
+ spin_lock_init(&as->journal_entries_lock);
mutex_lock(&c->btree_interior_update_lock);
list_add_tail(&as->list, &c->btree_interior_update_list);
@@ -1199,6 +1190,8 @@ err:
static void bch2_btree_set_root_inmem(struct bch_fs *c, struct btree *b)
{
+ set_btree_node_is_root(b);
+
/* Root nodes cannot be reaped */
mutex_lock(&c->btree_cache.lock);
list_del_init(&b->list);
@@ -1249,14 +1242,13 @@ static void bch2_btree_set_root(struct btree_update *as,
/* Interior node updates: */
-static void bch2_insert_fixup_btree_ptr(struct btree_update *as,
- struct btree_trans *trans,
+static void bch2_insert_fixup_btree_ptr(struct btree_trans *trans,
struct btree_path *path,
struct btree *b,
struct btree_node_iter *node_iter,
struct bkey_i *insert)
{
- struct bch_fs *c = as->c;
+ struct bch_fs *c = trans->c;
struct bkey_packed *k;
struct printbuf buf = PRINTBUF;
unsigned long old, new, v;
@@ -1282,15 +1274,6 @@ static void bch2_insert_fixup_btree_ptr(struct btree_update *as,
dump_stack();
}
- BUG_ON(as->journal_u64s + jset_u64s(insert->k.u64s) >
- ARRAY_SIZE(as->journal_entries));
-
- as->journal_u64s +=
- journal_entry_set((void *) &as->journal_entries[as->journal_u64s],
- BCH_JSET_ENTRY_btree_keys,
- b->c.btree_id, b->c.level,
- insert, insert->k.u64s);
-
while ((k = bch2_btree_node_iter_peek_all(node_iter, b)) &&
bkey_iter_pos_cmp(b, k, &insert->k.p) < 0)
bch2_btree_node_iter_advance(node_iter, b);
@@ -1333,7 +1316,7 @@ __bch2_btree_insert_keys_interior(struct btree_update *as,
if (bpos_gt(insert->k.p, b->key.k.p))
break;
- bch2_insert_fixup_btree_ptr(as, trans, path, b, &node_iter, insert);
+ bch2_insert_fixup_btree_ptr(trans, path, b, &node_iter, insert);
bch2_keylist_pop_front(keys);
}
}
diff --git a/fs/bcachefs/btree_update_interior.h b/fs/bcachefs/btree_update_interior.h
index adfc62083844..a7ccc4f52737 100644
--- a/fs/bcachefs/btree_update_interior.h
+++ b/fs/bcachefs/btree_update_interior.h
@@ -99,6 +99,7 @@ struct btree_update {
BCH_REPLICAS_MAX];
open_bucket_idx_t nr_open_buckets;
+ spinlock_t journal_entries_lock;
unsigned journal_u64s;
u64 journal_entries[BTREE_UPDATE_JOURNAL_RES];