bcache: Journal replay fix
The journal replay code starts by finding something that looks like a valid journal entry, then it does a binary search over the unchecked region of the journal for the journal entries with the highest sequence numbers. Trouble is, the logic was wrong - journal_read_bucket() returns true if it found journal entries we need, but if the range of journal entries we're looking for loops around the end of the journal - in that case journal_read_bucket() could return true when it hadn't found the highest sequence number we'd seen yet, and in that case the binary search did the wrong thing. Whoops. Signed-off-by: Kent Overstreet <kmo@daterainc.com> Cc: linux-stable <stable@vger.kernel.org> # >= v3.10
This commit is contained in:
parent
5caa52afc5
commit
faa5673617
1 changed files with 7 additions and 2 deletions
|
@ -184,9 +184,14 @@ bsearch:
|
||||||
pr_debug("starting binary search, l %u r %u", l, r);
|
pr_debug("starting binary search, l %u r %u", l, r);
|
||||||
|
|
||||||
while (l + 1 < r) {
|
while (l + 1 < r) {
|
||||||
m = (l + r) >> 1;
|
seq = list_entry(list->prev, struct journal_replay,
|
||||||
|
list)->j.seq;
|
||||||
|
|
||||||
if (read_bucket(m))
|
m = (l + r) >> 1;
|
||||||
|
read_bucket(m);
|
||||||
|
|
||||||
|
if (seq != list_entry(list->prev, struct journal_replay,
|
||||||
|
list)->j.seq)
|
||||||
l = m;
|
l = m;
|
||||||
else
|
else
|
||||||
r = m;
|
r = m;
|
||||||
|
|
Loading…
Reference in a new issue