diff options
Diffstat (limited to 'drivers/md/bcache/journal.c')
-rw-r--r-- | drivers/md/bcache/journal.c | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index ba95ab84b2be..8435f81e5d85 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c | |||
@@ -153,7 +153,8 @@ int bch_journal_read(struct cache_set *c, struct list_head *list, | |||
153 | bitmap_zero(bitmap, SB_JOURNAL_BUCKETS); | 153 | bitmap_zero(bitmap, SB_JOURNAL_BUCKETS); |
154 | pr_debug("%u journal buckets", ca->sb.njournal_buckets); | 154 | pr_debug("%u journal buckets", ca->sb.njournal_buckets); |
155 | 155 | ||
156 | /* Read journal buckets ordered by golden ratio hash to quickly | 156 | /* |
157 | * Read journal buckets ordered by golden ratio hash to quickly | ||
157 | * find a sequence of buckets with valid journal entries | 158 | * find a sequence of buckets with valid journal entries |
158 | */ | 159 | */ |
159 | for (i = 0; i < ca->sb.njournal_buckets; i++) { | 160 | for (i = 0; i < ca->sb.njournal_buckets; i++) { |
@@ -166,18 +167,20 @@ int bch_journal_read(struct cache_set *c, struct list_head *list, | |||
166 | goto bsearch; | 167 | goto bsearch; |
167 | } | 168 | } |
168 | 169 | ||
169 | /* If that fails, check all the buckets we haven't checked | 170 | /* |
171 | * If that fails, check all the buckets we haven't checked | ||
170 | * already | 172 | * already |
171 | */ | 173 | */ |
172 | pr_debug("falling back to linear search"); | 174 | pr_debug("falling back to linear search"); |
173 | 175 | ||
174 | for (l = 0; l < ca->sb.njournal_buckets; l++) { | 176 | for (l = find_first_zero_bit(bitmap, ca->sb.njournal_buckets); |
175 | if (test_bit(l, bitmap)) | 177 | l < ca->sb.njournal_buckets; |
176 | continue; | 178 | l = find_next_zero_bit(bitmap, ca->sb.njournal_buckets, l + 1)) |
177 | |||
178 | if (read_bucket(l)) | 179 | if (read_bucket(l)) |
179 | goto bsearch; | 180 | goto bsearch; |
180 | } | 181 | |
182 | if (list_empty(list)) | ||
183 | continue; | ||
181 | bsearch: | 184 | bsearch: |
182 | /* Binary search */ | 185 | /* Binary search */ |
183 | m = r = find_next_bit(bitmap, ca->sb.njournal_buckets, l + 1); | 186 | m = r = find_next_bit(bitmap, ca->sb.njournal_buckets, l + 1); |
@@ -197,10 +200,12 @@ bsearch: | |||
197 | r = m; | 200 | r = m; |
198 | } | 201 | } |
199 | 202 | ||
200 | /* Read buckets in reverse order until we stop finding more | 203 | /* |
204 | * Read buckets in reverse order until we stop finding more | ||
201 | * journal entries | 205 | * journal entries |
202 | */ | 206 | */ |
203 | pr_debug("finishing up"); | 207 | pr_debug("finishing up: m %u njournal_buckets %u", |
208 | m, ca->sb.njournal_buckets); | ||
204 | l = m; | 209 | l = m; |
205 | 210 | ||
206 | while (1) { | 211 | while (1) { |
@@ -228,9 +233,10 @@ bsearch: | |||
228 | } | 233 | } |
229 | } | 234 | } |
230 | 235 | ||
231 | c->journal.seq = list_entry(list->prev, | 236 | if (!list_empty(list)) |
232 | struct journal_replay, | 237 | c->journal.seq = list_entry(list->prev, |
233 | list)->j.seq; | 238 | struct journal_replay, |
239 | list)->j.seq; | ||
234 | 240 | ||
235 | return 0; | 241 | return 0; |
236 | #undef read_bucket | 242 | #undef read_bucket |
@@ -428,7 +434,7 @@ static void do_journal_discard(struct cache *ca) | |||
428 | return; | 434 | return; |
429 | } | 435 | } |
430 | 436 | ||
431 | switch (atomic_read(&ja->discard_in_flight) == DISCARD_IN_FLIGHT) { | 437 | switch (atomic_read(&ja->discard_in_flight)) { |
432 | case DISCARD_IN_FLIGHT: | 438 | case DISCARD_IN_FLIGHT: |
433 | return; | 439 | return; |
434 | 440 | ||
@@ -689,6 +695,7 @@ void bch_journal_meta(struct cache_set *c, struct closure *cl) | |||
689 | if (cl) | 695 | if (cl) |
690 | BUG_ON(!closure_wait(&w->wait, cl)); | 696 | BUG_ON(!closure_wait(&w->wait, cl)); |
691 | 697 | ||
698 | closure_flush(&c->journal.io); | ||
692 | __journal_try_write(c, true); | 699 | __journal_try_write(c, true); |
693 | } | 700 | } |
694 | } | 701 | } |