Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6054c6d4 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcache: Don't use op->insert_collision



When we convert bch_btree_insert() to bch_btree_map_leaf_nodes(), we
won't be passing struct btree_op to bch_btree_insert() anymore - so we
need a different way of returning whether there was a collision (really,
a replace collision).

Signed-off-by: default avatarKent Overstreet <kmo@daterainc.com>
parent 1b207d80
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -2227,6 +2227,9 @@ int bch_btree_insert(struct btree_op *op, struct cache_set *c,
		}
	}

	if (op->insert_collision)
		return -ESRCH;

	return ret;
}

+1 −1
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@ static void write_moving_finish(struct closure *cl)
	bio_for_each_segment_all(bv, bio, i)
		__free_page(bv->bv_page);

	if (io->s.op.insert_collision)
	if (io->s.insert_collision)
		trace_bcache_gc_copy_collision(&io->w->key);

	bch_keybuf_del(&io->s.c->moving_gc_keys, io->w);
+7 −3
Original line number Diff line number Diff line
@@ -218,6 +218,7 @@ static void bch_data_insert_keys(struct closure *cl)
	struct search *s = container_of(cl, struct search, btree);
	atomic_t *journal_ref = NULL;
	struct bkey *replace_key = s->replace ? &s->replace_key : NULL;
	int ret;

	/*
	 * If we're looping, might already be waiting on
@@ -236,8 +237,11 @@ static void bch_data_insert_keys(struct closure *cl)
					  s->flush_journal
					  ? &s->cl : NULL);

	if (bch_btree_insert(&s->op, s->c, &s->insert_keys,
			     journal_ref, replace_key)) {
	ret = bch_btree_insert(&s->op, s->c, &s->insert_keys,
			       journal_ref, replace_key);
	if (ret == -ESRCH) {
		s->insert_collision = true;
	} else if (ret) {
		s->error		= -ENOMEM;
		s->insert_data_done	= true;
	}
@@ -977,7 +981,7 @@ static void cached_dev_cache_miss_done(struct closure *cl)
{
	struct search *s = container_of(cl, struct search, cl);

	if (s->op.insert_collision)
	if (s->insert_collision)
		bch_mark_cache_miss_collision(s);

	if (s->cache_bio) {
+1 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ struct search {

	unsigned		insert_data_done:1;
	unsigned		replace:1;
	unsigned		insert_collision:1;

	uint16_t		write_prio;

+4 −3
Original line number Diff line number Diff line
@@ -142,6 +142,7 @@ static void write_dirty_finish(struct closure *cl)
		unsigned i;
		struct btree_op op;
		struct keylist keys;
		int ret;

		bch_btree_op_init(&op, -1);
		bch_keylist_init(&keys);
@@ -153,12 +154,12 @@ static void write_dirty_finish(struct closure *cl)
		for (i = 0; i < KEY_PTRS(&w->key); i++)
			atomic_inc(&PTR_BUCKET(dc->disk.c, &w->key, i)->pin);

		bch_btree_insert(&op, dc->disk.c, &keys, NULL, &w->key);
		ret = bch_btree_insert(&op, dc->disk.c, &keys, NULL, &w->key);

		if (op.insert_collision)
		if (ret)
			trace_bcache_writeback_collision(&w->key);

		atomic_long_inc(op.insert_collision
		atomic_long_inc(ret
				? &dc->disk.c->writeback_keys_failed
				: &dc->disk.c->writeback_keys_done);
	}