summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2016-10-23 02:40:04 -0800
committerKent Overstreet <kent.overstreet@gmail.com>2017-01-18 21:40:44 -0900
commit5353f305878259894f51a11994b44e451b0775f9 (patch)
treed67cbd85dd3c6c55cd1c8c8a215dc9f26a00165e
parent64228c5d12a76e8a0d254a900c2edaa918addecc (diff)
bcache: don't touch journal flags in fast paths
-rw-r--r--drivers/md/bcache/btree_update.c7
-rw-r--r--drivers/md/bcache/btree_update.h14
-rw-r--r--drivers/md/bcache/buckets.c12
-rw-r--r--drivers/md/bcache/extents.c6
-rw-r--r--drivers/md/bcache/journal.c2
5 files changed, 21 insertions, 20 deletions
diff --git a/drivers/md/bcache/btree_update.c b/drivers/md/bcache/btree_update.c
index a6d595df7f04..5163733c80cf 100644
--- a/drivers/md/bcache/btree_update.c
+++ b/drivers/md/bcache/btree_update.c
@@ -723,12 +723,12 @@ void bch_btree_journal_key(struct btree_iter *iter,
struct btree_write *w = btree_current_write(b);
EBUG_ON(iter->level || b->level);
- BUG_ON(!res->ref && test_bit(JOURNAL_REPLAY_DONE, &j->flags));
+ EBUG_ON(!res->ref && test_bit(JOURNAL_REPLAY_DONE, &j->flags));
if (!journal_pin_active(&w->journal))
bch_journal_pin_add(j, &w->journal, btree_node_flush);
- if (test_bit(JOURNAL_REPLAY_DONE, &j->flags)) {
+ if (res->ref) {
bch_journal_add_keys(j, res, b->btree_id, insert);
btree_bset_last(b)->journal_seq =
cpu_to_le64(bch_journal_res_seq(j, res));
@@ -1414,7 +1414,6 @@ static void btree_split(struct btree *b, struct btree_iter *iter,
* @insert_keys: list of keys to insert
* @hook: insert callback
* @persistent: if not null, @persistent will wait on journal write
- * @flags: BTREE_INSERT_NO_MARK_KEY
*
* Inserts as many keys as it can into a given btree node, splitting it if full.
* If a split occurred, this function will return early. This can only happen
@@ -1616,7 +1615,7 @@ retry:
if (!i->done)
u64s += jset_u64s(i->k->k.u64s);
- ret = test_bit(JOURNAL_REPLAY_DONE, &c->journal.flags)
+ ret = !(trans->flags & BTREE_INSERT_JOURNAL_REPLAY)
? bch_journal_res_get(&c->journal, &res, u64s, u64s)
: 0;
if (ret)
diff --git a/drivers/md/bcache/btree_update.h b/drivers/md/bcache/btree_update.h
index 97725296a2e8..5f74662a845a 100644
--- a/drivers/md/bcache/btree_update.h
+++ b/drivers/md/bcache/btree_update.h
@@ -274,10 +274,10 @@ int __bch_btree_insert_at(struct btree_insert *, u64 *);
#define BTREE_INSERT_NOFAIL (1 << 1)
/*
- * Don't account key being insert (bch_mark_key) - only for journal replay,
- * where we've already marked the new keys:
+ * Insert is for journal replay: don't get journal reservations, or mark extents
+ * (bch_mark_key)
*/
-#define BTREE_INSERT_NO_MARK_KEY (1 << 2)
+#define BTREE_INSERT_JOURNAL_REPLAY (1 << 2)
int bch_btree_insert_list_at(struct btree_iter *, struct keylist *,
struct disk_reservation *,
@@ -287,12 +287,14 @@ static inline bool journal_res_insert_fits(struct btree_insert *trans,
struct btree_insert_entry *insert,
struct journal_res *res)
{
- struct cache_set *c = insert->iter->c;
unsigned u64s = 0;
struct btree_insert_entry *i;
- /* If we're in journal replay we're not getting journal reservations: */
- if (!test_bit(JOURNAL_REPLAY_DONE, &c->journal.flags))
+ /*
+ * If we didn't get a journal reservation, we're in journal replay and
+ * we're not journalling updates:
+ */
+ if (!res->ref)
return true;
for (i = insert; i < trans->entries + trans->nr; i++)
diff --git a/drivers/md/bcache/buckets.c b/drivers/md/bcache/buckets.c
index 8e62ce236851..18ce58934f9e 100644
--- a/drivers/md/bcache/buckets.c
+++ b/drivers/md/bcache/buckets.c
@@ -437,8 +437,8 @@ static void bch_mark_pointer(struct cache_set *c,
* checked the gen
*/
if (ptr_stale(ca, ptr)) {
- BUG_ON(type != S_CACHED &&
- test_bit(JOURNAL_REPLAY_DONE, &c->journal.flags));
+ EBUG_ON(type != S_CACHED &&
+ test_bit(JOURNAL_REPLAY_DONE, &c->journal.flags));
return;
}
@@ -450,10 +450,10 @@ static void bch_mark_pointer(struct cache_set *c,
if (!is_gc && gc_will_visit(c, gc_pos))
goto out;
- BUG_ON(type != S_CACHED &&
- !may_make_unavailable &&
- is_available_bucket(old) &&
- test_bit(JOURNAL_REPLAY_DONE, &c->journal.flags));
+ EBUG_ON(type != S_CACHED &&
+ !may_make_unavailable &&
+ is_available_bucket(old) &&
+ test_bit(JOURNAL_REPLAY_DONE, &c->journal.flags));
BUG_ON((old.dirty_sectors ||
old.cached_sectors) &&
diff --git a/drivers/md/bcache/extents.c b/drivers/md/bcache/extents.c
index b06e5a4fe957..02cb01a795c9 100644
--- a/drivers/md/bcache/extents.c
+++ b/drivers/md/bcache/extents.c
@@ -1129,7 +1129,7 @@ static void extent_insert_committed(struct btree_insert *trans,
bkey_copy(&split.k, insert->k);
- if (!(trans->flags & BTREE_INSERT_NO_MARK_KEY) &&
+ if (!(trans->flags & BTREE_INSERT_JOURNAL_REPLAY) &&
bkey_cmp(committed_pos, insert->k->k.p) &&
bkey_extent_is_compressed(trans->c,
bkey_i_to_s_c(insert->k))) {
@@ -1317,7 +1317,7 @@ bch_insert_fixup_extent(struct btree_insert *trans,
*/
EBUG_ON(bkey_cmp(iter->pos, bkey_start_pos(&insert->k->k)));
- if (!(trans->flags & BTREE_INSERT_NO_MARK_KEY))
+ if (!(trans->flags & BTREE_INSERT_JOURNAL_REPLAY))
bch_add_sectors(iter, bkey_i_to_s_c(insert->k),
bkey_start_offset(&insert->k->k),
insert->k->k.size, &stats);
@@ -1493,7 +1493,7 @@ stop:
* and didn't fully insert @insert:
*/
if (insert->k->k.size &&
- !(trans->flags & BTREE_INSERT_NO_MARK_KEY))
+ !(trans->flags & BTREE_INSERT_JOURNAL_REPLAY))
bch_subtract_sectors(iter, bkey_i_to_s_c(insert->k),
bkey_start_offset(&insert->k->k),
insert->k->k.size, &stats);
diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c
index 0d9104e7f19e..35f55cfa6ef2 100644
--- a/drivers/md/bcache/journal.c
+++ b/drivers/md/bcache/journal.c
@@ -1360,7 +1360,7 @@ int bch_journal_replay(struct cache_set *c, struct list_head *list)
ret = bch_btree_insert(c, entry->btree_id, k,
&disk_res, NULL, NULL,
BTREE_INSERT_NOFAIL|
- BTREE_INSERT_NO_MARK_KEY);
+ BTREE_INSERT_JOURNAL_REPLAY);
bch_disk_reservation_put(c, &disk_res);
if (ret)