diff options
-rw-r--r-- | fs/bcachefs/btree_types.h | 2 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_leaf.c | 67 | ||||
-rw-r--r-- | fs/bcachefs/io.c | 8 | ||||
-rw-r--r-- | fs/bcachefs/io.h | 3 | ||||
-rw-r--r-- | fs/bcachefs/migrate.c | 5 | ||||
-rw-r--r-- | fs/bcachefs/move.c | 8 |
6 files changed, 41 insertions, 52 deletions
diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h index 44349159dfbe..a7eda1141108 100644 --- a/fs/bcachefs/btree_types.h +++ b/fs/bcachefs/btree_types.h @@ -439,11 +439,11 @@ enum btree_insert_ret { BTREE_INSERT_OK, /* extent spanned multiple leaf nodes: have to traverse to next node: */ BTREE_INSERT_NEED_TRAVERSE, - /* write lock held for too long */ /* leaf node needs to be split */ BTREE_INSERT_BTREE_NODE_FULL, BTREE_INSERT_ENOSPC, BTREE_INSERT_NEED_GC_LOCK, + BTREE_INSERT_NEED_MARK_REPLICAS, }; enum btree_gc_coalesce_fail_reason { diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c index eab685a4db31..913d74fb900b 100644 --- a/fs/bcachefs/btree_update_leaf.c +++ b/fs/bcachefs/btree_update_leaf.c @@ -11,6 +11,7 @@ #include "journal.h" #include "journal_reclaim.h" #include "keylist.h" +#include "replicas.h" #include <linux/sort.h> #include <trace/events/bcachefs.h> @@ -300,8 +301,8 @@ static inline int btree_trans_cmp(struct btree_insert_entry l, static enum btree_insert_ret btree_key_can_insert(struct btree_insert *trans, - struct btree_insert_entry *insert, - unsigned *u64s) + struct btree_insert_entry *insert, + unsigned *u64s) { struct bch_fs *c = trans->c; struct btree *b = insert->iter->l[0].b; @@ -310,6 +311,11 @@ btree_key_can_insert(struct btree_insert *trans, if (unlikely(btree_node_fake(b))) return BTREE_INSERT_BTREE_NODE_FULL; + if (!bch2_bkey_replicas_marked(c, + insert->iter->btree_id, + bkey_i_to_s_c(insert->k))) + return BTREE_INSERT_NEED_MARK_REPLICAS; + ret = !btree_node_is_extents(b) ? BTREE_INSERT_OK : bch2_extent_can_insert(trans, insert, u64s); @@ -326,8 +332,7 @@ btree_key_can_insert(struct btree_insert *trans, * Get journal reservation, take write locks, and attempt to do btree update(s): */ static inline int do_btree_insert_at(struct btree_insert *trans, - struct btree_iter **split, - bool *cycle_gc_lock) + struct btree_insert_entry **stopped_at) { struct bch_fs *c = trans->c; struct btree_insert_entry *i; @@ -371,22 +376,10 @@ static inline int do_btree_insert_at(struct btree_insert *trans, u64s = 0; u64s += i->k->k.u64s; - switch (btree_key_can_insert(trans, i, &u64s)) { - case BTREE_INSERT_OK: - break; - case BTREE_INSERT_BTREE_NODE_FULL: - ret = -EINTR; - *split = i->iter; - goto out; - case BTREE_INSERT_ENOSPC: - ret = -ENOSPC; + ret = btree_key_can_insert(trans, i, &u64s); + if (ret) { + *stopped_at = i; goto out; - case BTREE_INSERT_NEED_GC_LOCK: - ret = -EINTR; - *cycle_gc_lock = true; - goto out; - default: - BUG(); } } @@ -444,8 +437,7 @@ int __bch2_btree_insert_at(struct btree_insert *trans) { struct bch_fs *c = trans->c; struct btree_insert_entry *i; - struct btree_iter *linked, *split = NULL; - bool cycle_gc_lock = false; + struct btree_iter *linked; unsigned flags; int ret; @@ -465,9 +457,6 @@ int __bch2_btree_insert_at(struct btree_insert *trans) if (unlikely(!percpu_ref_tryget(&c->writes))) return -EROFS; retry: - split = NULL; - cycle_gc_lock = false; - trans_for_each_entry(trans, i) { unsigned old_locks_want = i->iter->locks_want; unsigned old_uptodate = i->iter->uptodate; @@ -485,7 +474,7 @@ retry: } } - ret = do_btree_insert_at(trans, &split, &cycle_gc_lock); + ret = do_btree_insert_at(trans, &i); if (unlikely(ret)) goto err; @@ -520,8 +509,9 @@ err: if (!trans->did_work) flags &= ~BTREE_INSERT_NOUNLOCK; - if (split) { - ret = bch2_btree_split_leaf(c, split, flags); + switch (ret) { + case BTREE_INSERT_BTREE_NODE_FULL: + ret = bch2_btree_split_leaf(c, i->iter, flags); /* * if the split succeeded without dropping locks the insert will @@ -546,9 +536,10 @@ err: trans_restart(" (split)"); ret = -EINTR; } - } + break; + case BTREE_INSERT_NEED_GC_LOCK: + ret = -EINTR; - if (cycle_gc_lock) { if (!down_read_trylock(&c->gc_lock)) { if (flags & BTREE_INSERT_NOUNLOCK) goto out; @@ -557,6 +548,24 @@ err: down_read(&c->gc_lock); } up_read(&c->gc_lock); + break; + case BTREE_INSERT_ENOSPC: + ret = -ENOSPC; + break; + case BTREE_INSERT_NEED_MARK_REPLICAS: + if (flags & BTREE_INSERT_NOUNLOCK) { + ret = -EINTR; + goto out; + } + + bch2_btree_iter_unlock(trans->entries[0].iter); + ret = bch2_mark_bkey_replicas(c, i->iter->btree_id, + bkey_i_to_s_c(i->k)) + ?: -EINTR; + break; + default: + BUG_ON(ret >= 0); + break; } if (ret == -EINTR) { diff --git a/fs/bcachefs/io.c b/fs/bcachefs/io.c index eceb48656e60..34cab253c86d 100644 --- a/fs/bcachefs/io.c +++ b/fs/bcachefs/io.c @@ -22,7 +22,6 @@ #include "keylist.h" #include "move.h" #include "rebalance.h" -#include "replicas.h" #include "super.h" #include "super-io.h" @@ -319,13 +318,6 @@ static void __bch2_write_index(struct bch_write_op *op) goto err; } - if (!(op->flags & BCH_WRITE_NOMARK_REPLICAS)) { - ret = bch2_mark_bkey_replicas(c, BKEY_TYPE_EXTENTS, - e.s_c); - if (ret) - goto err; - } - dst = bkey_next(dst); } diff --git a/fs/bcachefs/io.h b/fs/bcachefs/io.h index 5bd5f846122e..3ca779745422 100644 --- a/fs/bcachefs/io.h +++ b/fs/bcachefs/io.h @@ -30,10 +30,9 @@ enum bch_write_flags { BCH_WRITE_PAGES_OWNED = (1 << 5), BCH_WRITE_ONLY_SPECIFIED_DEVS = (1 << 6), BCH_WRITE_NOPUT_RESERVATION = (1 << 7), - BCH_WRITE_NOMARK_REPLICAS = (1 << 8), /* Internal: */ - BCH_WRITE_JOURNAL_SEQ_PTR = (1 << 9), + BCH_WRITE_JOURNAL_SEQ_PTR = (1 << 8), }; static inline u64 *op_journal_seq(struct bch_write_op *op) diff --git a/fs/bcachefs/migrate.c b/fs/bcachefs/migrate.c index c0dfe1c641e2..df4fbae2408a 100644 --- a/fs/bcachefs/migrate.c +++ b/fs/bcachefs/migrate.c @@ -71,11 +71,6 @@ static int bch2_dev_usrdata_drop(struct bch_fs *c, unsigned dev_idx, int flags) */ bch2_extent_normalize(c, e.s); - ret = bch2_mark_bkey_replicas(c, BKEY_TYPE_EXTENTS, - bkey_i_to_s_c(&tmp.key)); - if (ret) - break; - iter.pos = bkey_start_pos(&tmp.key.k); ret = bch2_btree_insert_at(c, NULL, NULL, diff --git a/fs/bcachefs/move.c b/fs/bcachefs/move.c index e93725bf9b39..885792bd4ee3 100644 --- a/fs/bcachefs/move.c +++ b/fs/bcachefs/move.c @@ -150,11 +150,6 @@ static int bch2_migrate_index_update(struct bch_write_op *op) goto next; } - ret = bch2_mark_bkey_replicas(c, BKEY_TYPE_EXTENTS, - extent_i_to_s_c(insert).s_c); - if (ret) - break; - ret = bch2_btree_insert_at(c, &op->res, op_journal_seq(op), BTREE_INSERT_ATOMIC| @@ -239,8 +234,7 @@ int bch2_migrate_write_init(struct bch_fs *c, struct migrate_write *m, m->op.flags |= BCH_WRITE_ONLY_SPECIFIED_DEVS| BCH_WRITE_PAGES_STABLE| BCH_WRITE_PAGES_OWNED| - BCH_WRITE_DATA_ENCODED| - BCH_WRITE_NOMARK_REPLICAS; + BCH_WRITE_DATA_ENCODED; m->op.nr_replicas = 1; m->op.nr_replicas_required = 1; |