bcachefs: fsck: Another transaction restart handling fix
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 18 Aug 2022 21:00:12 +0000 (17:00 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:39 +0000 (17:09 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/data_update.c
fs/bcachefs/fsck.c
fs/bcachefs/trace.h

index c0d6a48..f9eb147 100644 (file)
@@ -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);
index ff10f09..9f768d7 100644 (file)
@@ -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,
index 931da79..9353191 100644 (file)
@@ -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),