summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs/bcachefs/btree_iter.c4
-rw-r--r--fs/bcachefs/btree_locking.c2
-rw-r--r--fs/bcachefs/btree_types.h1
-rw-r--r--fs/bcachefs/io.c6
4 files changed, 11 insertions, 2 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index 7bb7b5ffe001..21f12e522360 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -2854,8 +2854,10 @@ u32 bch2_trans_begin(struct btree_trans *trans)
bch2_trans_reset_srcu_lock(trans);
trans->last_restarted_ip = _RET_IP_;
- if (trans->restarted)
+ if (trans->restarted) {
bch2_btree_path_traverse_all(trans);
+ trans->notrace_relock_fail = false;
+ }
trans->last_begin_time = local_clock();
return trans->restart_count;
diff --git a/fs/bcachefs/btree_locking.c b/fs/bcachefs/btree_locking.c
index 56489e7b0ac2..cf138cd9d431 100644
--- a/fs/bcachefs/btree_locking.c
+++ b/fs/bcachefs/btree_locking.c
@@ -473,7 +473,7 @@ bool __bch2_btree_node_relock(struct btree_trans *trans,
return true;
}
fail:
- if (trace)
+ if (trace && !trans->notrace_relock_fail)
trace_and_count(trans->c, btree_path_relock_fail, trans, _RET_IP_, path, level);
return false;
}
diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h
index 5660d076c678..a815cd5a072e 100644
--- a/fs/bcachefs/btree_types.h
+++ b/fs/bcachefs/btree_types.h
@@ -425,6 +425,7 @@ struct btree_trans {
bool memory_allocation_failure:1;
bool journal_transaction_names:1;
bool journal_replay_not_finished:1;
+ bool notrace_relock_fail:1;
enum bch_errcode restarted:16;
u32 restart_count;
unsigned long last_restarted_ip;
diff --git a/fs/bcachefs/io.c b/fs/bcachefs/io.c
index bd55c4b41d7c..b57187ce1f65 100644
--- a/fs/bcachefs/io.c
+++ b/fs/bcachefs/io.c
@@ -2375,6 +2375,12 @@ get_bio:
else
submit_bio_wait(&rbio->bio);
}
+
+ /*
+ * We just submitted IO which may block, we expect relock fail
+ * events and shouldn't count them:
+ */
+ trans->notrace_relock_fail = true;
} else {
/* Attempting reconstruct read: */
if (bch2_ec_read_extent(c, rbio)) {