Commit 38c23fb8 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: BTREE_TRIGGER_ATOMIC



Add a new flag to be explicit about when we're running atomic triggers.

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 9d5dba2b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -821,7 +821,7 @@ int bch2_trigger_alloc(struct btree_trans *trans,
		}
	}

	if (!(flags & BTREE_TRIGGER_TRANSACTIONAL) && (flags & BTREE_TRIGGER_INSERT)) {
	if ((flags & BTREE_TRIGGER_ATOMIC) && (flags & BTREE_TRIGGER_INSERT)) {
		struct bch_alloc_v4 *new_a = bkey_s_to_alloc_v4(new).v;
		u64 journal_seq = trans->journal_res.seq;
		u64 bucket_journal_seq = new_a->journal_seq;
+6 −4
Original line number Diff line number Diff line
@@ -83,9 +83,10 @@ enum btree_update_flags {

	__BTREE_TRIGGER_NORUN,
	__BTREE_TRIGGER_TRANSACTIONAL,
	__BTREE_TRIGGER_ATOMIC,
	__BTREE_TRIGGER_GC,
	__BTREE_TRIGGER_INSERT,
	__BTREE_TRIGGER_OVERWRITE,
	__BTREE_TRIGGER_GC,
	__BTREE_TRIGGER_BUCKET_INVALIDATE,
};

@@ -107,6 +108,10 @@ enum btree_update_flags {
 * causing us to go emergency read-only)
 */
#define BTREE_TRIGGER_TRANSACTIONAL	(1U << __BTREE_TRIGGER_TRANSACTIONAL)
#define BTREE_TRIGGER_ATOMIC		(1U << __BTREE_TRIGGER_ATOMIC)

/* We're in gc/fsck: running triggers to recalculate e.g. disk usage */
#define BTREE_TRIGGER_GC		(1U << __BTREE_TRIGGER_GC)

/* @new is entering the btree */
#define BTREE_TRIGGER_INSERT		(1U << __BTREE_TRIGGER_INSERT)
@@ -114,9 +119,6 @@ enum btree_update_flags {
/* @old is leaving the btree */
#define BTREE_TRIGGER_OVERWRITE		(1U << __BTREE_TRIGGER_OVERWRITE)

/* We're in gc/fsck: running triggers to recalculate e.g. disk usage */
#define BTREE_TRIGGER_GC		(1U << __BTREE_TRIGGER_GC)

/* signal from bucket invalidate path to alloc trigger */
#define BTREE_TRIGGER_BUCKET_INVALIDATE	(1U << __BTREE_TRIGGER_BUCKET_INVALIDATE)

+7 −12
Original line number Diff line number Diff line
@@ -448,9 +448,6 @@ static int run_one_mem_trigger(struct btree_trans *trans,
	if (unlikely(flags & BTREE_TRIGGER_NORUN))
		return 0;

	if (!btree_node_type_needs_gc(__btree_node_type(i->level, i->btree_id)))
		return 0;

	if (old_ops->trigger == new_ops->trigger) {
		ret   = bch2_key_trigger(trans, i->btree_id, i->level,
				old, bkey_i_to_s(new),
@@ -586,9 +583,6 @@ static int bch2_trans_commit_run_triggers(struct btree_trans *trans)

static noinline int bch2_trans_commit_run_gc_triggers(struct btree_trans *trans)
{
	struct bch_fs *c = trans->c;
	int ret = 0;

	trans_for_each_update(trans, i) {
		/*
		 * XXX: synchronization of cached update triggers with gc
@@ -596,14 +590,15 @@ static noinline int bch2_trans_commit_run_gc_triggers(struct btree_trans *trans)
		 */
		BUG_ON(i->cached || i->level);

		if (gc_visited(c, gc_pos_btree_node(insert_l(trans, i)->b))) {
			ret = run_one_mem_trigger(trans, i, i->flags|BTREE_TRIGGER_GC);
		if (btree_node_type_needs_gc(__btree_node_type(i->level, i->btree_id)) &&
		    gc_visited(trans->c, gc_pos_btree_node(insert_l(trans, i)->b))) {
			int ret = run_one_mem_trigger(trans, i, i->flags|BTREE_TRIGGER_GC);
			if (ret)
				break;
				return ret;
		}
	}

	return ret;
	return 0;
}

static inline int
@@ -689,8 +684,8 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags,
	}

	trans_for_each_update(trans, i)
		if (BTREE_NODE_TYPE_HAS_MEM_TRIGGERS & (1U << i->bkey_type)) {
			ret = run_one_mem_trigger(trans, i, i->flags);
		if (BTREE_NODE_TYPE_HAS_ATOMIC_TRIGGERS & (1U << i->bkey_type)) {
			ret = run_one_mem_trigger(trans, i, BTREE_TRIGGER_ATOMIC|i->flags);
			if (ret)
				goto fatal_err;
		}
+2 −2
Original line number Diff line number Diff line
@@ -653,7 +653,7 @@ const char *bch2_btree_node_type_str(enum btree_node_type);
	 BIT_ULL(BKEY_TYPE_reflink)|			\
	 BIT_ULL(BKEY_TYPE_btree))

#define BTREE_NODE_TYPE_HAS_MEM_TRIGGERS		\
#define BTREE_NODE_TYPE_HAS_ATOMIC_TRIGGERS		\
	(BIT_ULL(BKEY_TYPE_alloc)|			\
	 BIT_ULL(BKEY_TYPE_inodes)|			\
	 BIT_ULL(BKEY_TYPE_stripes)|			\
@@ -661,7 +661,7 @@ const char *bch2_btree_node_type_str(enum btree_node_type);

#define BTREE_NODE_TYPE_HAS_TRIGGERS			\
	(BTREE_NODE_TYPE_HAS_TRANS_TRIGGERS|		\
	 BTREE_NODE_TYPE_HAS_MEM_TRIGGERS)
	 BTREE_NODE_TYPE_HAS_ATOMIC_TRIGGERS)

static inline bool btree_node_type_needs_gc(enum btree_node_type type)
{
+1 −1
Original line number Diff line number Diff line
@@ -367,7 +367,7 @@ int bch2_trigger_stripe(struct btree_trans *trans,
		}
	}

	if (!(flags & (BTREE_TRIGGER_TRANSACTIONAL|BTREE_TRIGGER_GC))) {
	if (flags & BTREE_TRIGGER_ATOMIC) {
		struct stripe *m = genradix_ptr(&c->stripes, idx);

		if (!m) {
Loading