#include "buckets.h"
#include "dirent.h"
#include "ec.h"
+#include "errcode.h"
#include "error.h"
#include "fs-common.h"
#include "fsck.h"
return keys->d + idx_to_pos(keys, idx);
}
-static size_t bch2_journal_key_search(struct journal_keys *keys,
- enum btree_id id, unsigned level,
- struct bpos pos)
+static size_t __bch2_journal_key_search(struct journal_keys *keys,
+ enum btree_id id, unsigned level,
+ struct bpos pos)
{
size_t l = 0, r = keys->nr, m;
BUG_ON(l &&
__journal_key_cmp(id, level, pos, idx_to_key(keys, l - 1)) <= 0);
- return idx_to_pos(keys, l);
+ return l;
+}
+
+static size_t bch2_journal_key_search(struct journal_keys *keys,
+ enum btree_id id, unsigned level,
+ struct bpos pos)
+{
+ return idx_to_pos(keys, __bch2_journal_key_search(keys, id, level, pos));
}
struct bkey_i *bch2_journal_keys_peek_upto(struct bch_fs *c, enum btree_id btree_id,
{
struct journal_keys *keys = &c->journal_keys;
unsigned iters = 0;
+ struct journal_key *k;
search:
if (!*idx)
- *idx = bch2_journal_key_search(keys, btree_id, level, pos);
+ *idx = __bch2_journal_key_search(keys, btree_id, level, pos);
- while (*idx < keys->size &&
- keys->d[*idx].btree_id == btree_id &&
- keys->d[*idx].level == level &&
- bpos_cmp(keys->d[*idx].k->k.p, end_pos) <= 0) {
- if (bpos_cmp(keys->d[*idx].k->k.p, pos) >= 0 &&
- !keys->d[*idx].overwritten)
- return keys->d[*idx].k;
+ while (*idx < keys->nr &&
+ (k = idx_to_key(keys, *idx),
+ k->btree_id == btree_id &&
+ k->level == level &&
+ bpos_cmp(k->k->k.p, end_pos) <= 0)) {
+ if (bpos_cmp(k->k->k.p, pos) >= 0 &&
+ !k->overwritten)
+ return k->k;
(*idx)++;
- if (*idx == keys->gap)
- *idx += keys->size - keys->nr;
-
iters++;
if (iters == 10) {
*idx = 0;
use_clean:
if (!clean) {
bch_err(c, "no superblock clean section found");
- ret = BCH_FSCK_REPAIR_IMPOSSIBLE;
+ ret = -BCH_ERR_fsck_repair_impossible;
goto err;
}
}
if (ret)
- bch_err(c, "Error in recovery: %s (%i)", err, ret);
+ bch_err(c, "Error in recovery: %s (%s)", err, bch2_err_str(ret));
else
- bch_verbose(c, "ret %i", ret);
+ bch_verbose(c, "ret %s", bch2_err_str(ret));
return ret;
err:
fsck_err: