diff options
| -rw-r--r-- | drivers/md/bcache/journal.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index c0017ca32b76..f5203dfc4cfe 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 |
