aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/bcache/journal.c
diff options
context:
space:
mode:
authorKent Overstreet <kmo@daterainc.com>2014-06-02 15:39:44 -0700
committerKent Overstreet <kmo@daterainc.com>2014-08-04 15:23:03 -0700
commit6b708de64adb6dc8319e7aeac922b46904fbeeec (patch)
tree84aaf50c2b5b46e669315caf2fd32f143145f2f5 /drivers/md/bcache/journal.c
parentbcache: fix crash in bcache_btree_node_alloc_fail tracepoint (diff)
downloadlinux-dev-6b708de64adb6dc8319e7aeac922b46904fbeeec.tar.xz
linux-dev-6b708de64adb6dc8319e7aeac922b46904fbeeec.zip
bcache: Fix an infinite loop in journal replay
When running with multiple cache devices, if one of the devices has a completely empty journal but we'd already found some journal entries on a previosu device we'd go into an infinite loop. Change-Id: I1dcdc0d738192746de28f40e8b08825b0dea5e2b Signed-off-by: Kent Overstreet <kmo@daterainc.com>
Diffstat (limited to 'drivers/md/bcache/journal.c')
-rw-r--r--drivers/md/bcache/journal.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c
index ead001c9bed8..fe080ad0e558 100644
--- a/drivers/md/bcache/journal.c
+++ b/drivers/md/bcache/journal.c
@@ -190,9 +190,12 @@ int bch_journal_read(struct cache_set *c, struct list_head *list)
if (read_bucket(l))
goto bsearch;
- if (list_empty(list))
+ /* no journal entries on this device? */
+ if (l == ca->sb.njournal_buckets)
continue;
bsearch:
+ BUG_ON(list_empty(list));
+
/* Binary search */
m = l;
r = find_next_bit(bitmap, ca->sb.njournal_buckets, l + 1);