diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-12-21 00:57:00 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-12-23 23:40:46 -0500 |
commit | b71ae58d2b93d0e4f6a365ec9f771d3870510fd1 (patch) | |
tree | 96a10b1153a299478fa7b97338ce87102325d6f0 | |
parent | 332961acf73265b2318d7729b2d4ba3a18e1c5c4 (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.c | 28 | ||||
-rw-r--r-- | fs/bcachefs/btree_io.h | 1 | ||||
-rw-r--r-- | fs/bcachefs/btree_types.h | 3 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_interior.c | 29 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_interior.h | 1 |
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]; |