mirror of
https://github.com/koverstreet/bcachefs-tools.git
synced 2025-02-23 00:00:02 +03:00
Update bcachefs sources to 969fbff4ef bcachefs: Print message on btree node read retry success
This commit is contained in:
parent
e142c4ca01
commit
03ed64edc8
@ -1 +1 @@
|
|||||||
40eaef7e8049b75ff7e5da42227295c754d9c906
|
969fbff4ef3a75ae25ef7cca17dd4e028443bfc2
|
||||||
|
@ -1553,6 +1553,7 @@ LE64_BITMASK(BCH_SB_INODES_USE_KEY_CACHE,struct bch_sb, flags[3], 29, 30);
|
|||||||
LE64_BITMASK(BCH_SB_JOURNAL_FLUSH_DELAY,struct bch_sb, flags[3], 30, 62);
|
LE64_BITMASK(BCH_SB_JOURNAL_FLUSH_DELAY,struct bch_sb, flags[3], 30, 62);
|
||||||
LE64_BITMASK(BCH_SB_JOURNAL_FLUSH_DISABLED,struct bch_sb, flags[3], 62, 63);
|
LE64_BITMASK(BCH_SB_JOURNAL_FLUSH_DISABLED,struct bch_sb, flags[3], 62, 63);
|
||||||
LE64_BITMASK(BCH_SB_JOURNAL_RECLAIM_DELAY,struct bch_sb, flags[4], 0, 32);
|
LE64_BITMASK(BCH_SB_JOURNAL_RECLAIM_DELAY,struct bch_sb, flags[4], 0, 32);
|
||||||
|
/* Obsolete, always enabled: */
|
||||||
LE64_BITMASK(BCH_SB_JOURNAL_TRANSACTION_NAMES,struct bch_sb, flags[4], 32, 33);
|
LE64_BITMASK(BCH_SB_JOURNAL_TRANSACTION_NAMES,struct bch_sb, flags[4], 32, 33);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1146,10 +1146,12 @@ static void btree_node_read_work(struct work_struct *work)
|
|||||||
struct bch_io_failures failed = { .nr = 0 };
|
struct bch_io_failures failed = { .nr = 0 };
|
||||||
struct printbuf buf = PRINTBUF;
|
struct printbuf buf = PRINTBUF;
|
||||||
bool saw_error = false;
|
bool saw_error = false;
|
||||||
|
bool retry = false;
|
||||||
bool can_retry;
|
bool can_retry;
|
||||||
|
|
||||||
goto start;
|
goto start;
|
||||||
while (1) {
|
while (1) {
|
||||||
|
retry = true;
|
||||||
bch_info(c, "retrying read");
|
bch_info(c, "retrying read");
|
||||||
ca = bch_dev_bkey_exists(c, rb->pick.ptr.dev);
|
ca = bch_dev_bkey_exists(c, rb->pick.ptr.dev);
|
||||||
rb->have_ioref = bch2_dev_get_ioref(ca, READ);
|
rb->have_ioref = bch2_dev_get_ioref(ca, READ);
|
||||||
@ -1180,8 +1182,11 @@ start:
|
|||||||
&failed, &rb->pick) > 0;
|
&failed, &rb->pick) > 0;
|
||||||
|
|
||||||
if (!bio->bi_status &&
|
if (!bio->bi_status &&
|
||||||
!bch2_btree_node_read_done(c, ca, b, can_retry))
|
!bch2_btree_node_read_done(c, ca, b, can_retry)) {
|
||||||
|
if (retry)
|
||||||
|
bch_info(c, "retry success");
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
saw_error = true;
|
saw_error = true;
|
||||||
|
|
||||||
|
@ -2248,14 +2248,38 @@ static inline struct bkey_i *btree_trans_peek_updates(struct btree_trans *trans,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct bkey_i *bch2_btree_journal_peek(struct btree_trans *trans,
|
||||||
|
struct btree_iter *iter,
|
||||||
|
struct bpos start_pos,
|
||||||
|
struct bpos end_pos)
|
||||||
|
{
|
||||||
|
struct bkey_i *k;
|
||||||
|
|
||||||
|
if (bpos_cmp(start_pos, iter->journal_pos) < 0)
|
||||||
|
iter->journal_idx = 0;
|
||||||
|
|
||||||
|
k = bch2_journal_keys_peek_upto(trans->c, iter->btree_id, 0,
|
||||||
|
start_pos, end_pos,
|
||||||
|
&iter->journal_idx);
|
||||||
|
|
||||||
|
iter->journal_pos = k ? k->k.p : end_pos;
|
||||||
|
return k;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct bkey_i *bch2_btree_journal_peek_slot(struct btree_trans *trans,
|
||||||
|
struct btree_iter *iter,
|
||||||
|
struct bpos pos)
|
||||||
|
{
|
||||||
|
return bch2_btree_journal_peek(trans, iter, pos, pos);
|
||||||
|
}
|
||||||
|
|
||||||
static noinline
|
static noinline
|
||||||
struct bkey_s_c btree_trans_peek_journal(struct btree_trans *trans,
|
struct bkey_s_c btree_trans_peek_journal(struct btree_trans *trans,
|
||||||
struct btree_iter *iter,
|
struct btree_iter *iter,
|
||||||
struct bkey_s_c k)
|
struct bkey_s_c k)
|
||||||
{
|
{
|
||||||
struct bkey_i *next_journal =
|
struct bkey_i *next_journal =
|
||||||
bch2_journal_keys_peek_upto(trans->c, iter->btree_id, 0,
|
bch2_btree_journal_peek(trans, iter, iter->path->pos,
|
||||||
iter->path->pos,
|
|
||||||
k.k ? k.k->p : iter->path->l[0].b->key.k.p);
|
k.k ? k.k->p : iter->path->l[0].b->key.k.p);
|
||||||
|
|
||||||
if (next_journal) {
|
if (next_journal) {
|
||||||
@ -2804,10 +2828,8 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(iter->flags & BTREE_ITER_WITH_JOURNAL) &&
|
if (unlikely(iter->flags & BTREE_ITER_WITH_JOURNAL) &&
|
||||||
(next_update = bch2_journal_keys_peek_slot(trans->c,
|
(next_update = bch2_btree_journal_peek_slot(trans,
|
||||||
iter->btree_id,
|
iter, iter->pos))) {
|
||||||
iter->path->level,
|
|
||||||
iter->pos))) {
|
|
||||||
iter->k = next_update->k;
|
iter->k = next_update->k;
|
||||||
k = bkey_i_to_s_c(next_update);
|
k = bkey_i_to_s_c(next_update);
|
||||||
goto out;
|
goto out;
|
||||||
@ -3074,6 +3096,8 @@ static void __bch2_trans_iter_init(struct btree_trans *trans,
|
|||||||
iter->k.type = KEY_TYPE_deleted;
|
iter->k.type = KEY_TYPE_deleted;
|
||||||
iter->k.p = pos;
|
iter->k.p = pos;
|
||||||
iter->k.size = 0;
|
iter->k.size = 0;
|
||||||
|
iter->journal_idx = 0;
|
||||||
|
iter->journal_pos = POS_MIN;
|
||||||
#ifdef CONFIG_BCACHEFS_DEBUG
|
#ifdef CONFIG_BCACHEFS_DEBUG
|
||||||
iter->ip_allocated = ip;
|
iter->ip_allocated = ip;
|
||||||
#endif
|
#endif
|
||||||
|
@ -138,6 +138,9 @@ struct btree_path *bch2_path_get(struct btree_trans *, enum btree_id, struct bpo
|
|||||||
unsigned, unsigned, unsigned, unsigned long);
|
unsigned, unsigned, unsigned, unsigned long);
|
||||||
inline struct bkey_s_c bch2_btree_path_peek_slot(struct btree_path *, struct bkey *);
|
inline struct bkey_s_c bch2_btree_path_peek_slot(struct btree_path *, struct bkey *);
|
||||||
|
|
||||||
|
struct bkey_i *bch2_btree_journal_peek_slot(struct btree_trans *,
|
||||||
|
struct btree_iter *, struct bpos);
|
||||||
|
|
||||||
#ifdef CONFIG_BCACHEFS_DEBUG
|
#ifdef CONFIG_BCACHEFS_DEBUG
|
||||||
void bch2_trans_verify_paths(struct btree_trans *);
|
void bch2_trans_verify_paths(struct btree_trans *);
|
||||||
void bch2_trans_verify_locks(struct btree_trans *);
|
void bch2_trans_verify_locks(struct btree_trans *);
|
||||||
|
@ -292,6 +292,10 @@ struct btree_iter {
|
|||||||
* bch2_btree_iter_next_slot() can correctly advance pos.
|
* bch2_btree_iter_next_slot() can correctly advance pos.
|
||||||
*/
|
*/
|
||||||
struct bkey k;
|
struct bkey k;
|
||||||
|
|
||||||
|
/* BTREE_ITER_WITH_JOURNAL: */
|
||||||
|
size_t journal_idx;
|
||||||
|
struct bpos journal_pos;
|
||||||
#ifdef CONFIG_BCACHEFS_DEBUG
|
#ifdef CONFIG_BCACHEFS_DEBUG
|
||||||
unsigned long ip_allocated;
|
unsigned long ip_allocated;
|
||||||
#endif
|
#endif
|
||||||
@ -393,7 +397,6 @@ struct btree_trans {
|
|||||||
bool in_traverse_all:1;
|
bool in_traverse_all:1;
|
||||||
bool restarted:1;
|
bool restarted:1;
|
||||||
bool memory_allocation_failure:1;
|
bool memory_allocation_failure:1;
|
||||||
bool journal_transaction_names:1;
|
|
||||||
bool is_initial_gc:1;
|
bool is_initial_gc:1;
|
||||||
/*
|
/*
|
||||||
* For when bch2_trans_update notices we'll be splitting a compressed
|
* For when bch2_trans_update notices we'll be splitting a compressed
|
||||||
|
@ -305,7 +305,7 @@ static inline int bch2_trans_journal_res_get(struct btree_trans *trans,
|
|||||||
|
|
||||||
#define JSET_ENTRY_LOG_U64s 4
|
#define JSET_ENTRY_LOG_U64s 4
|
||||||
|
|
||||||
static noinline void journal_transaction_name(struct btree_trans *trans)
|
static void journal_transaction_name(struct btree_trans *trans)
|
||||||
{
|
{
|
||||||
struct bch_fs *c = trans->c;
|
struct bch_fs *c = trans->c;
|
||||||
struct jset_entry *entry = journal_res_entry(&c->journal, &trans->journal_res);
|
struct jset_entry *entry = journal_res_entry(&c->journal, &trans->journal_res);
|
||||||
@ -684,8 +684,7 @@ bch2_trans_commit_write_locked(struct btree_trans *trans,
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (unlikely(trans->journal_transaction_names))
|
journal_transaction_name(trans);
|
||||||
journal_transaction_name(trans);
|
|
||||||
} else {
|
} else {
|
||||||
trans->journal_res.seq = c->journal.replay_journal_seq;
|
trans->journal_res.seq = c->journal.replay_journal_seq;
|
||||||
}
|
}
|
||||||
@ -1118,10 +1117,8 @@ int __bch2_trans_commit(struct btree_trans *trans)
|
|||||||
trans->journal_u64s = trans->extra_journal_entries.nr;
|
trans->journal_u64s = trans->extra_journal_entries.nr;
|
||||||
trans->journal_preres_u64s = 0;
|
trans->journal_preres_u64s = 0;
|
||||||
|
|
||||||
trans->journal_transaction_names = READ_ONCE(c->opts.journal_transaction_names);
|
/* For journalling transaction name: */
|
||||||
|
trans->journal_u64s += JSET_ENTRY_LOG_U64s;
|
||||||
if (trans->journal_transaction_names)
|
|
||||||
trans->journal_u64s += JSET_ENTRY_LOG_U64s;
|
|
||||||
|
|
||||||
trans_for_each_update(trans, i) {
|
trans_for_each_update(trans, i) {
|
||||||
BUG_ON(!i->path->should_be_locked);
|
BUG_ON(!i->path->should_be_locked);
|
||||||
|
@ -116,7 +116,12 @@ static inline int do_encrypt(struct crypto_sync_skcipher *tfm,
|
|||||||
{
|
{
|
||||||
struct scatterlist sg;
|
struct scatterlist sg;
|
||||||
|
|
||||||
sg_init_one(&sg, buf, len);
|
sg_init_table(&sg, 1);
|
||||||
|
sg_set_page(&sg,
|
||||||
|
is_vmalloc_addr(buf)
|
||||||
|
? vmalloc_to_page(buf)
|
||||||
|
: virt_to_page(buf),
|
||||||
|
len, offset_in_page(buf));
|
||||||
return do_encrypt_sg(tfm, nonce, &sg, len);
|
return do_encrypt_sg(tfm, nonce, &sg, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,22 +165,22 @@ enum opt_type {
|
|||||||
OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME, \
|
OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME, \
|
||||||
OPT_FN(bch2_opt_target), \
|
OPT_FN(bch2_opt_target), \
|
||||||
BCH_SB_METADATA_TARGET, 0, \
|
BCH_SB_METADATA_TARGET, 0, \
|
||||||
"(target)", "Device or disk group for metadata writes") \
|
"(target)", "Device or label for metadata writes") \
|
||||||
x(foreground_target, u16, \
|
x(foreground_target, u16, \
|
||||||
OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME, \
|
OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME, \
|
||||||
OPT_FN(bch2_opt_target), \
|
OPT_FN(bch2_opt_target), \
|
||||||
BCH_SB_FOREGROUND_TARGET, 0, \
|
BCH_SB_FOREGROUND_TARGET, 0, \
|
||||||
"(target)", "Device or disk group for foreground writes") \
|
"(target)", "Device or label for foreground writes") \
|
||||||
x(background_target, u16, \
|
x(background_target, u16, \
|
||||||
OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME, \
|
OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME, \
|
||||||
OPT_FN(bch2_opt_target), \
|
OPT_FN(bch2_opt_target), \
|
||||||
BCH_SB_BACKGROUND_TARGET, 0, \
|
BCH_SB_BACKGROUND_TARGET, 0, \
|
||||||
"(target)", "Device or disk group to move data to in the background")\
|
"(target)", "Device or label to move data to in the background")\
|
||||||
x(promote_target, u16, \
|
x(promote_target, u16, \
|
||||||
OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME, \
|
OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME, \
|
||||||
OPT_FN(bch2_opt_target), \
|
OPT_FN(bch2_opt_target), \
|
||||||
BCH_SB_PROMOTE_TARGET, 0, \
|
BCH_SB_PROMOTE_TARGET, 0, \
|
||||||
"(target)", "Device or disk group to promote data to on read")\
|
"(target)", "Device or label to promote data to on read") \
|
||||||
x(erasure_code, u16, \
|
x(erasure_code, u16, \
|
||||||
OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME, \
|
OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME, \
|
||||||
OPT_BOOL(), \
|
OPT_BOOL(), \
|
||||||
@ -331,11 +331,6 @@ enum opt_type {
|
|||||||
OPT_BOOL(), \
|
OPT_BOOL(), \
|
||||||
BCH2_NO_SB_OPT, false, \
|
BCH2_NO_SB_OPT, false, \
|
||||||
NULL, "Only read the journal, skip the rest of recovery")\
|
NULL, "Only read the journal, skip the rest of recovery")\
|
||||||
x(journal_transaction_names, u8, \
|
|
||||||
OPT_FS|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME, \
|
|
||||||
OPT_BOOL(), \
|
|
||||||
BCH_SB_JOURNAL_TRANSACTION_NAMES, true, \
|
|
||||||
NULL, "Log transaction function names in journal") \
|
|
||||||
x(noexcl, u8, \
|
x(noexcl, u8, \
|
||||||
OPT_FS|OPT_MOUNT, \
|
OPT_FS|OPT_MOUNT, \
|
||||||
OPT_BOOL(), \
|
OPT_BOOL(), \
|
||||||
|
@ -86,9 +86,9 @@ static inline struct journal_key *idx_to_key(struct journal_keys *keys, size_t i
|
|||||||
return keys->d + idx_to_pos(keys, idx);
|
return keys->d + idx_to_pos(keys, idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t bch2_journal_key_search(struct journal_keys *keys,
|
static size_t bch2_journal_key_search(struct journal_keys *keys,
|
||||||
enum btree_id id, unsigned level,
|
enum btree_id id, unsigned level,
|
||||||
struct bpos pos)
|
struct bpos pos)
|
||||||
{
|
{
|
||||||
size_t l = 0, r = keys->nr, m;
|
size_t l = 0, r = keys->nr, m;
|
||||||
|
|
||||||
@ -111,21 +111,31 @@ size_t bch2_journal_key_search(struct journal_keys *keys,
|
|||||||
|
|
||||||
struct bkey_i *bch2_journal_keys_peek_upto(struct bch_fs *c, enum btree_id btree_id,
|
struct bkey_i *bch2_journal_keys_peek_upto(struct bch_fs *c, enum btree_id btree_id,
|
||||||
unsigned level, struct bpos pos,
|
unsigned level, struct bpos pos,
|
||||||
struct bpos end_pos)
|
struct bpos end_pos, size_t *idx)
|
||||||
{
|
{
|
||||||
struct journal_keys *keys = &c->journal_keys;
|
struct journal_keys *keys = &c->journal_keys;
|
||||||
size_t idx = bch2_journal_key_search(keys, btree_id, level, pos);
|
unsigned iters = 0;
|
||||||
|
search:
|
||||||
|
if (!*idx)
|
||||||
|
*idx = bch2_journal_key_search(keys, btree_id, level, pos);
|
||||||
|
|
||||||
while (idx < keys->size &&
|
while (*idx < keys->size &&
|
||||||
keys->d[idx].btree_id == btree_id &&
|
keys->d[*idx].btree_id == btree_id &&
|
||||||
keys->d[idx].level == level &&
|
keys->d[*idx].level == level &&
|
||||||
bpos_cmp(keys->d[idx].k->k.p, end_pos) <= 0) {
|
bpos_cmp(keys->d[*idx].k->k.p, end_pos) <= 0) {
|
||||||
if (!keys->d[idx].overwritten)
|
if (bpos_cmp(keys->d[*idx].k->k.p, pos) >= 0 &&
|
||||||
return keys->d[idx].k;
|
!keys->d[*idx].overwritten)
|
||||||
|
return keys->d[*idx].k;
|
||||||
|
|
||||||
idx++;
|
(*idx)++;
|
||||||
if (idx == keys->gap)
|
if (*idx == keys->gap)
|
||||||
idx += keys->size - keys->nr;
|
*idx += keys->size - keys->nr;
|
||||||
|
|
||||||
|
iters++;
|
||||||
|
if (iters == 10) {
|
||||||
|
*idx = 0;
|
||||||
|
goto search;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -134,7 +144,9 @@ struct bkey_i *bch2_journal_keys_peek_upto(struct bch_fs *c, enum btree_id btree
|
|||||||
struct bkey_i *bch2_journal_keys_peek_slot(struct bch_fs *c, enum btree_id btree_id,
|
struct bkey_i *bch2_journal_keys_peek_slot(struct bch_fs *c, enum btree_id btree_id,
|
||||||
unsigned level, struct bpos pos)
|
unsigned level, struct bpos pos)
|
||||||
{
|
{
|
||||||
return bch2_journal_keys_peek_upto(c, btree_id, level, pos, pos);
|
size_t idx = 0;
|
||||||
|
|
||||||
|
return bch2_journal_keys_peek_upto(c, btree_id, level, pos, pos, &idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void journal_iters_fix(struct bch_fs *c)
|
static void journal_iters_fix(struct bch_fs *c)
|
||||||
@ -1246,7 +1258,7 @@ use_clean:
|
|||||||
|
|
||||||
set_bit(BCH_FS_MAY_GO_RW, &c->flags);
|
set_bit(BCH_FS_MAY_GO_RW, &c->flags);
|
||||||
|
|
||||||
bch_verbose(c, "starting journal replay, %zu keys", c->journal_keys.nr);
|
bch_info(c, "starting journal replay, %zu keys", c->journal_keys.nr);
|
||||||
err = "journal replay failed";
|
err = "journal replay failed";
|
||||||
ret = bch2_journal_replay(c);
|
ret = bch2_journal_replay(c);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -28,10 +28,8 @@ struct btree_and_journal_iter {
|
|||||||
} last;
|
} last;
|
||||||
};
|
};
|
||||||
|
|
||||||
size_t bch2_journal_key_search(struct journal_keys *, enum btree_id,
|
|
||||||
unsigned, struct bpos);
|
|
||||||
struct bkey_i *bch2_journal_keys_peek_upto(struct bch_fs *, enum btree_id,
|
struct bkey_i *bch2_journal_keys_peek_upto(struct bch_fs *, enum btree_id,
|
||||||
unsigned, struct bpos, struct bpos);
|
unsigned, struct bpos, struct bpos, size_t *);
|
||||||
struct bkey_i *bch2_journal_keys_peek_slot(struct bch_fs *, enum btree_id,
|
struct bkey_i *bch2_journal_keys_peek_slot(struct bch_fs *, enum btree_id,
|
||||||
unsigned, struct bpos);
|
unsigned, struct bpos);
|
||||||
|
|
||||||
|
@ -1058,7 +1058,7 @@ static void bch2_sb_members_to_text(struct printbuf *out, struct bch_sb *sb,
|
|||||||
: "unknown");
|
: "unknown");
|
||||||
pr_newline(out);
|
pr_newline(out);
|
||||||
|
|
||||||
pr_buf(out, "Group:");
|
pr_buf(out, "Label:");
|
||||||
pr_tab(out);
|
pr_tab(out);
|
||||||
if (BCH_MEMBER_GROUP(m)) {
|
if (BCH_MEMBER_GROUP(m)) {
|
||||||
unsigned idx = BCH_MEMBER_GROUP(m) - 1;
|
unsigned idx = BCH_MEMBER_GROUP(m) - 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user