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_DISABLED,struct bch_sb, flags[3], 62, 63);
|
||||
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);
|
||||
|
||||
/*
|
||||
|
@ -1146,10 +1146,12 @@ static void btree_node_read_work(struct work_struct *work)
|
||||
struct bch_io_failures failed = { .nr = 0 };
|
||||
struct printbuf buf = PRINTBUF;
|
||||
bool saw_error = false;
|
||||
bool retry = false;
|
||||
bool can_retry;
|
||||
|
||||
goto start;
|
||||
while (1) {
|
||||
retry = true;
|
||||
bch_info(c, "retrying read");
|
||||
ca = bch_dev_bkey_exists(c, rb->pick.ptr.dev);
|
||||
rb->have_ioref = bch2_dev_get_ioref(ca, READ);
|
||||
@ -1180,8 +1182,11 @@ start:
|
||||
&failed, &rb->pick) > 0;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
saw_error = true;
|
||||
|
||||
|
@ -2248,14 +2248,38 @@ static inline struct bkey_i *btree_trans_peek_updates(struct btree_trans *trans,
|
||||
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
|
||||
struct bkey_s_c btree_trans_peek_journal(struct btree_trans *trans,
|
||||
struct btree_iter *iter,
|
||||
struct bkey_s_c k)
|
||||
{
|
||||
struct bkey_i *next_journal =
|
||||
bch2_journal_keys_peek_upto(trans->c, iter->btree_id, 0,
|
||||
iter->path->pos,
|
||||
bch2_btree_journal_peek(trans, iter, iter->path->pos,
|
||||
k.k ? k.k->p : iter->path->l[0].b->key.k.p);
|
||||
|
||||
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) &&
|
||||
(next_update = bch2_journal_keys_peek_slot(trans->c,
|
||||
iter->btree_id,
|
||||
iter->path->level,
|
||||
iter->pos))) {
|
||||
(next_update = bch2_btree_journal_peek_slot(trans,
|
||||
iter, iter->pos))) {
|
||||
iter->k = next_update->k;
|
||||
k = bkey_i_to_s_c(next_update);
|
||||
goto out;
|
||||
@ -3074,6 +3096,8 @@ static void __bch2_trans_iter_init(struct btree_trans *trans,
|
||||
iter->k.type = KEY_TYPE_deleted;
|
||||
iter->k.p = pos;
|
||||
iter->k.size = 0;
|
||||
iter->journal_idx = 0;
|
||||
iter->journal_pos = POS_MIN;
|
||||
#ifdef CONFIG_BCACHEFS_DEBUG
|
||||
iter->ip_allocated = ip;
|
||||
#endif
|
||||
|
@ -138,6 +138,9 @@ struct btree_path *bch2_path_get(struct btree_trans *, enum btree_id, struct bpo
|
||||
unsigned, unsigned, unsigned, unsigned long);
|
||||
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
|
||||
void bch2_trans_verify_paths(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.
|
||||
*/
|
||||
struct bkey k;
|
||||
|
||||
/* BTREE_ITER_WITH_JOURNAL: */
|
||||
size_t journal_idx;
|
||||
struct bpos journal_pos;
|
||||
#ifdef CONFIG_BCACHEFS_DEBUG
|
||||
unsigned long ip_allocated;
|
||||
#endif
|
||||
@ -393,7 +397,6 @@ struct btree_trans {
|
||||
bool in_traverse_all:1;
|
||||
bool restarted:1;
|
||||
bool memory_allocation_failure:1;
|
||||
bool journal_transaction_names:1;
|
||||
bool is_initial_gc:1;
|
||||
/*
|
||||
* 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
|
||||
|
||||
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 jset_entry *entry = journal_res_entry(&c->journal, &trans->journal_res);
|
||||
@ -684,7 +684,6 @@ bch2_trans_commit_write_locked(struct btree_trans *trans,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (unlikely(trans->journal_transaction_names))
|
||||
journal_transaction_name(trans);
|
||||
} else {
|
||||
trans->journal_res.seq = c->journal.replay_journal_seq;
|
||||
@ -1118,9 +1117,7 @@ int __bch2_trans_commit(struct btree_trans *trans)
|
||||
trans->journal_u64s = trans->extra_journal_entries.nr;
|
||||
trans->journal_preres_u64s = 0;
|
||||
|
||||
trans->journal_transaction_names = READ_ONCE(c->opts.journal_transaction_names);
|
||||
|
||||
if (trans->journal_transaction_names)
|
||||
/* For journalling transaction name: */
|
||||
trans->journal_u64s += JSET_ENTRY_LOG_U64s;
|
||||
|
||||
trans_for_each_update(trans, i) {
|
||||
|
@ -116,7 +116,12 @@ static inline int do_encrypt(struct crypto_sync_skcipher *tfm,
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -165,22 +165,22 @@ enum opt_type {
|
||||
OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME, \
|
||||
OPT_FN(bch2_opt_target), \
|
||||
BCH_SB_METADATA_TARGET, 0, \
|
||||
"(target)", "Device or disk group for metadata writes") \
|
||||
"(target)", "Device or label for metadata writes") \
|
||||
x(foreground_target, u16, \
|
||||
OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME, \
|
||||
OPT_FN(bch2_opt_target), \
|
||||
BCH_SB_FOREGROUND_TARGET, 0, \
|
||||
"(target)", "Device or disk group for foreground writes") \
|
||||
"(target)", "Device or label for foreground writes") \
|
||||
x(background_target, u16, \
|
||||
OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME, \
|
||||
OPT_FN(bch2_opt_target), \
|
||||
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, \
|
||||
OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME, \
|
||||
OPT_FN(bch2_opt_target), \
|
||||
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, \
|
||||
OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME, \
|
||||
OPT_BOOL(), \
|
||||
@ -331,11 +331,6 @@ enum opt_type {
|
||||
OPT_BOOL(), \
|
||||
BCH2_NO_SB_OPT, false, \
|
||||
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, \
|
||||
OPT_FS|OPT_MOUNT, \
|
||||
OPT_BOOL(), \
|
||||
|
@ -86,7 +86,7 @@ static inline struct journal_key *idx_to_key(struct journal_keys *keys, size_t i
|
||||
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,
|
||||
struct bpos pos)
|
||||
{
|
||||
@ -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,
|
||||
unsigned level, struct bpos pos,
|
||||
struct bpos end_pos)
|
||||
struct bpos end_pos, size_t *idx)
|
||||
{
|
||||
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 &&
|
||||
keys->d[idx].btree_id == btree_id &&
|
||||
keys->d[idx].level == level &&
|
||||
bpos_cmp(keys->d[idx].k->k.p, end_pos) <= 0) {
|
||||
if (!keys->d[idx].overwritten)
|
||||
return keys->d[idx].k;
|
||||
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;
|
||||
|
||||
idx++;
|
||||
if (idx == keys->gap)
|
||||
idx += keys->size - keys->nr;
|
||||
(*idx)++;
|
||||
if (*idx == keys->gap)
|
||||
*idx += keys->size - keys->nr;
|
||||
|
||||
iters++;
|
||||
if (iters == 10) {
|
||||
*idx = 0;
|
||||
goto search;
|
||||
}
|
||||
}
|
||||
|
||||
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,
|
||||
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)
|
||||
@ -1246,7 +1258,7 @@ use_clean:
|
||||
|
||||
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";
|
||||
ret = bch2_journal_replay(c);
|
||||
if (ret)
|
||||
|
@ -28,10 +28,8 @@ struct btree_and_journal_iter {
|
||||
} 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,
|
||||
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,
|
||||
unsigned, struct bpos);
|
||||
|
||||
|
@ -1058,7 +1058,7 @@ static void bch2_sb_members_to_text(struct printbuf *out, struct bch_sb *sb,
|
||||
: "unknown");
|
||||
pr_newline(out);
|
||||
|
||||
pr_buf(out, "Group:");
|
||||
pr_buf(out, "Label:");
|
||||
pr_tab(out);
|
||||
if (BCH_MEMBER_GROUP(m)) {
|
||||
unsigned idx = BCH_MEMBER_GROUP(m) - 1;
|
||||
|
Loading…
Reference in New Issue
Block a user