summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-08-19 00:00:12 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:09:39 +0300
commit12043cf1511420ecf38f4925a0089c1ae1aa058b (patch)
treef8efa70e183e56251b51ba71aa78595f2ee34fb8
parent42590b53fef427f96fc50da4974923564e9033cd (diff)
downloadlinux-12043cf1511420ecf38f4925a0089c1ae1aa058b.tar.xz
bcachefs: fsck: Another transaction restart handling fix
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/data_update.c2
-rw-r--r--fs/bcachefs/fsck.c12
-rw-r--r--fs/bcachefs/trace.h11
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),