From 12043cf1511420ecf38f4925a0089c1ae1aa058b Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Thu, 18 Aug 2022 17:00:12 -0400 Subject: [PATCH] bcachefs: fsck: Another transaction restart handling fix Signed-off-by: Kent Overstreet Signed-off-by: Kent Overstreet --- fs/bcachefs/data_update.c | 2 ++ fs/bcachefs/fsck.c | 12 +++++------- fs/bcachefs/trace.h | 11 +++++++++-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/fs/bcachefs/data_update.c b/fs/bcachefs/data_update.c index c0d6a48d3c72..f9eb147fe229 100644 --- a/fs/bcachefs/data_update.c +++ b/fs/bcachefs/data_update.c @@ -248,6 +248,8 @@ next: } continue; nomatch: + trace_data_update_fail(&old.k->p); + if (m->ctxt) { BUG_ON(k.k->p.offset <= iter.pos.offset); atomic64_inc(&m->ctxt->stats->keys_raced); diff --git a/fs/bcachefs/fsck.c b/fs/bcachefs/fsck.c index ff10f09eee56..9f768d774ba6 100644 --- a/fs/bcachefs/fsck.c +++ b/fs/bcachefs/fsck.c @@ -728,7 +728,7 @@ static int __get_visible_inodes(struct btree_trans *trans, w->inodes.nr = 0; - for_each_btree_key(trans, iter, BTREE_ID_inodes, POS(0, inum), + for_each_btree_key_norestart(trans, iter, BTREE_ID_inodes, POS(0, inum), BTREE_ITER_ALL_SNAPSHOTS, k, ret) { u32 equiv = bch2_snapshot_equiv(c, k.k->p.snapshot); @@ -1372,13 +1372,11 @@ static int check_subdir_count(struct btree_trans *trans, struct inode_walker *w) } } fsck_err: - if (ret) { + if (ret) bch_err(c, "error from check_subdir_count(): %s", bch2_err_str(ret)); - return ret; - } - if (trans_was_restarted(trans, restart_count)) - return -BCH_ERR_transaction_restart_nested; - return 0; + if (!ret && trans_was_restarted(trans, restart_count)) + ret = -BCH_ERR_transaction_restart_nested; + return ret; } static int check_dirent_target(struct btree_trans *trans, diff --git a/fs/bcachefs/trace.h b/fs/bcachefs/trace.h index 931da79e027f..9353191c4fc8 100644 --- a/fs/bcachefs/trace.h +++ b/fs/bcachefs/trace.h @@ -18,7 +18,7 @@ __entry->dst##_snapshot = (src).snapshot DECLARE_EVENT_CLASS(bpos, - TP_PROTO(struct bpos *p), + TP_PROTO(const struct bpos *p), TP_ARGS(p), TP_STRUCT__entry( @@ -225,7 +225,7 @@ TRACE_EVENT(journal_reclaim_finish, /* bset.c: */ DEFINE_EVENT(bpos, bkey_pack_pos_fail, - TP_PROTO(struct bpos *p), + TP_PROTO(const struct bpos *p), TP_ARGS(p) ); @@ -727,6 +727,13 @@ TRACE_EVENT(copygc_wait, __entry->wait_amount, __entry->until) ); +DEFINE_EVENT(bpos, data_update_fail, + TP_PROTO(const struct bpos *p), + TP_ARGS(p) +); + +/* btree transactions: */ + DECLARE_EVENT_CLASS(transaction_event, TP_PROTO(struct btree_trans *trans, unsigned long caller_ip),