diff options
author | Kent Overstreet <kmo@daterainc.com> | 2014-03-13 20:44:21 (GMT) |
---|---|---|
committer | Kent Overstreet <kmo@daterainc.com> | 2014-03-18 19:21:48 (GMT) |
commit | 27201cfdaa2aeb571191494c1bae6863ffb04108 (patch) | |
tree | d5a3bb26a54b5b1e26e8e87c756022ceb2a91c9f | |
parent | 65ddf45a3102916fb622c71f7af158b19d49dc7f (diff) | |
download | linux-27201cfdaa2aeb571191494c1bae6863ffb04108.tar.xz |
bcache: Fix a journalling reclaim after recovery bug
On recovery we weren't correctly keeping track of what journal buckets had open
journal entries, thus it was possible for them to be overwritten until we'd
written all new journal entries.
Signed-off-by: Kent Overstreet <kmo@daterainc.com>
-rw-r--r-- | drivers/md/bcache/journal.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index 97e6a92..4152a91 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c @@ -237,8 +237,14 @@ bsearch: for (i = 0; i < ca->sb.njournal_buckets; i++) if (ja->seq[i] > seq) { seq = ja->seq[i]; - ja->cur_idx = ja->discard_idx = - ja->last_idx = i; + /* + * When journal_reclaim() goes to allocate for + * the first time, it'll use the bucket after + * ja->cur_idx + */ + ja->cur_idx = i; + ja->last_idx = ja->discard_idx = (i + 1) % + ca->sb.njournal_buckets; } } |