summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/md/bcache/btree_update.c7
-rw-r--r--drivers/md/bcache/journal.h7
2 files changed, 11 insertions, 3 deletions
diff --git a/drivers/md/bcache/btree_update.c b/drivers/md/bcache/btree_update.c
index 5797023f104c..3290849370bb 100644
--- a/drivers/md/bcache/btree_update.c
+++ b/drivers/md/bcache/btree_update.c
@@ -730,7 +730,8 @@ void bch_btree_journal_key(struct btree_iter *iter,
if (test_bit(JOURNAL_REPLAY_DONE, &j->flags)) {
bch_journal_add_keys(j, res, b->btree_id, insert);
- btree_bset_last(b)->journal_seq = cpu_to_le64(j->seq);
+ btree_bset_last(b)->journal_seq =
+ cpu_to_le64(bch_journal_res_seq(j, res));
}
if (!btree_node_dirty(b)) {
@@ -994,8 +995,6 @@ void bch_btree_interior_update_will_free_node(struct cache_set *c,
struct pending_btree_node_free *d;
struct bset_tree *t;
- mutex_lock(&c->btree_interior_update_lock);
-
/*
* Does this node have data that hasn't been written in the journal?
*
@@ -1022,6 +1021,8 @@ void bch_btree_interior_update_will_free_node(struct cache_set *c,
&b->writes[1].journal,
&as->journal, NULL);
+ mutex_lock(&c->btree_interior_update_lock);
+
/*
* Does this node have any btree_interior_update operations preventing
* it from being written?
diff --git a/drivers/md/bcache/journal.h b/drivers/md/bcache/journal.h
index 6a37de1b0ff3..2dfb1a7ebba4 100644
--- a/drivers/md/bcache/journal.h
+++ b/drivers/md/bcache/journal.h
@@ -152,6 +152,13 @@ u64 bch_inode_journal_seq(struct journal *, u64);
void bch_journal_add_keys(struct journal *, struct journal_res *,
enum btree_id, const struct bkey_i *);
+static inline u64 bch_journal_res_seq(struct journal *j,
+ struct journal_res *res)
+{
+ struct journal_buf *buf = &j->buf[res->idx];
+
+ return le64_to_cpu(buf->data->seq);
+}
void bch_journal_res_put(struct journal *, struct journal_res *, u64 *);
int bch_journal_res_get(struct journal *, struct journal_res *,