}
 
 __flatten
-bool bch2_btree_path_relock_norestart(struct btree_trans *trans,
-                       struct btree_path *path, unsigned long trace_ip)
+bool bch2_btree_path_relock_norestart(struct btree_trans *trans, struct btree_path *path)
 {
        struct get_locks_fail f;
 
 int __bch2_btree_path_relock(struct btree_trans *trans,
                        struct btree_path *path, unsigned long trace_ip)
 {
-       if (!bch2_btree_path_relock_norestart(trans, path, trace_ip)) {
+       if (!bch2_btree_path_relock_norestart(trans, path)) {
                trace_and_count(trans->c, trans_restart_relock_path, trans, trace_ip, path);
                return btree_trans_restart(trans, BCH_ERR_transaction_restart_relock_path);
        }
        if (unlikely(trans->restarted))
                return -((int) trans->restarted);
 
-       trans_for_each_path(trans, path, i)
+       trans_for_each_path(trans, path, i) {
+               struct get_locks_fail f;
+
                if (path->should_be_locked &&
-                   !bch2_btree_path_relock_norestart(trans, path, _RET_IP_)) {
-                       trace_and_count(trans->c, trans_restart_relock, trans, _RET_IP_, path);
+                   !btree_path_get_locks(trans, path, false, &f)) {
+                       if (trace_trans_restart_relock_enabled()) {
+                               struct printbuf buf = PRINTBUF;
+
+                               bch2_bpos_to_text(&buf, path->pos);
+                               prt_printf(&buf, " l=%u seq=%u node seq=",
+                                          f.l, path->l[f.l].lock_seq);
+                               if (IS_ERR_OR_NULL(f.b)) {
+                                       prt_str(&buf, bch2_err_str(PTR_ERR(f.b)));
+                               } else {
+                                       prt_printf(&buf, "%u", f.b->c.lock.seq);
+
+                                       struct six_lock_count c =
+                                               bch2_btree_node_lock_counts(trans, NULL, &f.b->c, f.l);
+                                       prt_printf(&buf, " self locked %u.%u.%u", c.n[0], c.n[1], c.n[2]);
+
+                                       c = six_lock_counts(&f.b->c.lock);
+                                       prt_printf(&buf, " total locked %u.%u.%u", c.n[0], c.n[1], c.n[2]);
+                               }
+
+                               trace_trans_restart_relock(trans, _RET_IP_, buf.buf);
+                               printbuf_exit(&buf);
+                       }
+
+                       count_event(trans->c, trans_restart_relock);
                        return btree_trans_restart(trans, BCH_ERR_transaction_restart_relock);
                }
+       }
+
        return 0;
 }
 
 
        trans_for_each_path(trans, path, i)
                if (path->should_be_locked &&
-                   !bch2_btree_path_relock_norestart(trans, path, _RET_IP_)) {
+                   !bch2_btree_path_relock_norestart(trans, path)) {
                        return btree_trans_restart(trans, BCH_ERR_transaction_restart_relock);
                }
        return 0;
 
                __entry->level                  = path->level;
                TRACE_BPOS_assign(pos, path->pos);
 
-               c = bch2_btree_node_lock_counts(trans, NULL, &path->l[level].b->c, level),
+               c = bch2_btree_node_lock_counts(trans, NULL, &path->l[level].b->c, level);
                __entry->self_read_count        = c.n[SIX_LOCK_read];
                __entry->self_intent_count      = c.n[SIX_LOCK_intent];
 
        TP_ARGS(trans, caller_ip, path)
 );
 
-struct get_locks_fail;
-
 TRACE_EVENT(trans_restart_upgrade,
        TP_PROTO(struct btree_trans *trans,
                 unsigned long caller_ip,
                  __entry->node_seq)
 );
 
-DEFINE_EVENT(transaction_restart_iter, trans_restart_relock,
-       TP_PROTO(struct btree_trans *trans,
-                unsigned long caller_ip,
-                struct btree_path *path),
-       TP_ARGS(trans, caller_ip, path)
+DEFINE_EVENT(trans_str,        trans_restart_relock,
+       TP_PROTO(struct btree_trans *trans, unsigned long caller_ip, const char *str),
+       TP_ARGS(trans, caller_ip, str)
 );
 
 DEFINE_EVENT(transaction_restart_iter, trans_restart_relock_next_node,