]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
Update bcachefs sources to c3e4d892b77b mean and variance: Promote to lib/math
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 29 Nov 2023 22:00:30 +0000 (17:00 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 29 Nov 2023 22:00:30 +0000 (17:00 -0500)
29 files changed:
.bcachefs_revision
libbcachefs/alloc_background.c
libbcachefs/alloc_background.h
libbcachefs/alloc_foreground.c
libbcachefs/backpointers.c
libbcachefs/bcachefs.h
libbcachefs/bcachefs_ioctl.h
libbcachefs/btree_gc.c
libbcachefs/btree_iter.c
libbcachefs/btree_iter.h
libbcachefs/btree_key_cache.c
libbcachefs/btree_locking.c
libbcachefs/btree_update_interior.c
libbcachefs/btree_write_buffer.c
libbcachefs/compress.c
libbcachefs/data_update.c
libbcachefs/fsck.c
libbcachefs/io_read.c
libbcachefs/io_write.c
libbcachefs/journal.c
libbcachefs/journal.h
libbcachefs/journal_types.h
libbcachefs/move.c
libbcachefs/movinggc.c
libbcachefs/recovery.c
libbcachefs/replicas_types.h
libbcachefs/snapshot.c
libbcachefs/subvolume.c
libbcachefs/trace.h

index e41bb401696b0f4682485ea5a0ad417fdf71e88c..9399807435f22dbf943d6b0cf2b390eb4584f85c 100644 (file)
@@ -1 +1 @@
-feaca6edbd240bbd98d261097a97037c56a09eec
+c3e4d892b77b9361c88854b0192223f68947b6b0
index 56a18ace8cf32fe9abc034128fb4b6a0d3acffcd..01b29c850467e5cd008d62fa166d2e3fd236852f 100644 (file)
@@ -558,8 +558,7 @@ int bch2_bucket_gens_init(struct bch_fs *c)
 
                if (have_bucket_gens_key && bkey_cmp(iter.pos, pos)) {
                        ret = commit_do(trans, NULL, NULL,
-                                       BCH_TRANS_COMMIT_no_enospc|
-                                       BCH_TRANS_COMMIT_lazy_rw,
+                                       BCH_TRANS_COMMIT_no_enospc,
                                bch2_btree_insert_trans(trans, BTREE_ID_bucket_gens, &g.k_i, 0));
                        if (ret)
                                break;
@@ -578,8 +577,7 @@ int bch2_bucket_gens_init(struct bch_fs *c)
 
        if (have_bucket_gens_key && !ret)
                ret = commit_do(trans, NULL, NULL,
-                               BCH_TRANS_COMMIT_no_enospc|
-                               BCH_TRANS_COMMIT_lazy_rw,
+                               BCH_TRANS_COMMIT_no_enospc,
                        bch2_btree_insert_trans(trans, BTREE_ID_bucket_gens, &g.k_i, 0));
 
        bch2_trans_put(trans);
@@ -1276,7 +1274,7 @@ delete:
        ret =   bch2_btree_delete_extent_at(trans, iter,
                        iter->btree_id == BTREE_ID_freespace ? 1 : 0, 0) ?:
                bch2_trans_commit(trans, NULL, NULL,
-                       BCH_TRANS_COMMIT_no_enospc|BCH_TRANS_COMMIT_lazy_rw);
+                       BCH_TRANS_COMMIT_no_enospc);
        goto out;
 }
 
@@ -1413,8 +1411,7 @@ int bch2_check_alloc_info(struct bch_fs *c)
                }
 
                ret = bch2_trans_commit(trans, NULL, NULL,
-                                       BCH_TRANS_COMMIT_no_enospc|
-                                       BCH_TRANS_COMMIT_lazy_rw);
+                                       BCH_TRANS_COMMIT_no_enospc);
                if (ret)
                        goto bkey_err;
 
@@ -1472,7 +1469,7 @@ bkey_err:
        ret = for_each_btree_key_commit(trans, iter,
                        BTREE_ID_bucket_gens, POS_MIN,
                        BTREE_ITER_PREFETCH, k,
-                       NULL, NULL, BCH_TRANS_COMMIT_no_enospc|BCH_TRANS_COMMIT_lazy_rw,
+                       NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
                bch2_check_bucket_gens_key(trans, &iter, k));
 err:
        bch2_trans_put(trans);
@@ -1562,7 +1559,7 @@ int bch2_check_alloc_to_lru_refs(struct bch_fs *c)
        int ret = bch2_trans_run(c,
                for_each_btree_key_commit(trans, iter, BTREE_ID_alloc,
                                POS_MIN, BTREE_ITER_PREFETCH, k,
-                               NULL, NULL, BCH_TRANS_COMMIT_no_enospc|BCH_TRANS_COMMIT_lazy_rw,
+                               NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
                        bch2_check_alloc_to_lru_ref(trans, &iter)));
        bch_err_fn(c, ret);
        return ret;
@@ -1674,7 +1671,7 @@ write:
        if (ret)
                goto out;
 
-       this_cpu_inc(c->counters[BCH_COUNTER_bucket_discard]);
+       count_event(c, bucket_discard);
        (*discarded)++;
 out:
        (*seen)++;
@@ -1877,7 +1874,6 @@ int bch2_dev_freespace_init(struct bch_fs *c, struct bch_dev *ca,
 
                        ret =   bch2_bucket_do_index(trans, k, a, true) ?:
                                bch2_trans_commit(trans, NULL, NULL,
-                                                 BCH_TRANS_COMMIT_lazy_rw|
                                                  BCH_TRANS_COMMIT_no_enospc);
                        if (ret)
                                goto bkey_err;
@@ -1898,7 +1894,6 @@ int bch2_dev_freespace_init(struct bch_fs *c, struct bch_dev *ca,
 
                        ret = bch2_btree_insert_trans(trans, BTREE_ID_freespace, freespace, 0) ?:
                                bch2_trans_commit(trans, NULL, NULL,
-                                                 BCH_TRANS_COMMIT_lazy_rw|
                                                  BCH_TRANS_COMMIT_no_enospc);
                        if (ret)
                                goto bkey_err;
index 72bb8491fe743042b81aed50d72afc4ee77f02c1..96671f166dd8053a7842fdda13e9afd14e62144b 100644 (file)
@@ -84,9 +84,9 @@ static inline unsigned bch2_bucket_sectors_dirty(struct bch_alloc_v4 a)
 static inline unsigned bch2_bucket_sectors_fragmented(struct bch_dev *ca,
                                                 struct bch_alloc_v4 a)
 {
-       unsigned d = bch2_bucket_sectors_dirty(a);
+       int d = bch2_bucket_sectors_dirty(a);
 
-       return d ? max(0U, ca->mi.bucket_size - d) : 0;
+       return d ? max(0, ca->mi.bucket_size - d) : 0;
 }
 
 static inline u64 alloc_lru_idx_read(struct bch_alloc_v4 a)
index 1ba0eeb7552a2795d033d2603cccce611c8f3381..a961df74d421707468ed0868932d25a59fc218fb 100644 (file)
@@ -697,11 +697,9 @@ static int add_new_bucket(struct bch_fs *c,
                bch_dev_bkey_exists(c, ob->dev)->mi.durability;
 
        BUG_ON(*nr_effective >= nr_replicas);
-       BUG_ON(flags & BCH_WRITE_ONLY_SPECIFIED_DEVS);
 
        __clear_bit(ob->dev, devs_may_alloc->d);
-       *nr_effective   += (flags & BCH_WRITE_ONLY_SPECIFIED_DEVS)
-               ? durability : 1;
+       *nr_effective   += durability;
        *have_cache     |= !durability;
 
        ob_push(c, ptrs, ob);
index 8c66333bcf272127400c4b7f8581c787b851d021..12820acbcd0902e59a7da0063828f94eac3bac8d 100644 (file)
@@ -397,7 +397,7 @@ int bch2_check_btree_backpointers(struct bch_fs *c)
        ret = bch2_trans_run(c,
                for_each_btree_key_commit(trans, iter,
                        BTREE_ID_backpointers, POS_MIN, 0, k,
-                       NULL, NULL, BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc,
+                       NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
                  bch2_check_btree_backpointer(trans, &iter, k)));
        if (ret)
                bch_err_fn(c, ret);
@@ -621,7 +621,6 @@ static int bch2_check_extents_to_backpointers_pass(struct btree_trans *trans,
                int level, depth = btree_type_has_ptrs(btree_id) ? 0 : 1;
 
                ret = commit_do(trans, NULL, NULL,
-                               BCH_TRANS_COMMIT_lazy_rw|
                                BCH_TRANS_COMMIT_no_enospc,
                                check_btree_root_to_backpointers(trans, btree_id,
                                                        bucket_start, bucket_end,
@@ -635,7 +634,6 @@ static int bch2_check_extents_to_backpointers_pass(struct btree_trans *trans,
                                                  BTREE_ITER_PREFETCH);
                        for_each_btree_key_continue(trans, iter, BTREE_ITER_PREFETCH, k, ret) {
                                ret = commit_do(trans, NULL, NULL,
-                                               BCH_TRANS_COMMIT_lazy_rw|
                                                BCH_TRANS_COMMIT_no_enospc,
                                        check_extent_to_backpointers(trans, btree_id, level,
                                                                     bucket_start, bucket_end,
@@ -810,7 +808,7 @@ static int bch2_check_backpointers_to_extents_pass(struct btree_trans *trans,
 
        return for_each_btree_key_commit(trans, iter, BTREE_ID_backpointers,
                                  POS_MIN, BTREE_ITER_PREFETCH, k,
-                                 NULL, NULL, BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc,
+                                 NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
                check_one_backpointer(trans, start, end,
                                      bkey_s_c_to_backpointer(k),
                                      &last_flushed_pos));
index 2e9f4af3ad58072a7e199462b2c7b3dbcfebea1f..bb2a0cc43f83d2a4c9ffb5d4d7819804104982bd 100644 (file)
 
 #define race_fault(...)                        dynamic_fault("bcachefs:race")
 
+#define count_event(_c, _name) this_cpu_inc((_c)->counters[BCH_COUNTER_##_name])
+
 #define trace_and_count(_c, _name, ...)                                        \
 do {                                                                   \
-       this_cpu_inc((_c)->counters[BCH_COUNTER_##_name]);              \
+       count_event(_c, _name);                                         \
        trace_##_name(__VA_ARGS__);                                     \
 } while (0)
 
index 44ba7a87aea726ee5626d6a86957eb37cd1c5c58..43822c17297c697c070717aa34458a88e830a676 100644 (file)
@@ -276,7 +276,7 @@ struct bch_ioctl_fs_usage {
        __u32                   replica_entries_bytes;
        __u32                   pad;
 
-       struct bch_replicas_usage replicas[0];
+       struct bch_replicas_usage replicas[];
 };
 
 /*
@@ -313,7 +313,7 @@ struct bch_ioctl_dev_usage_v2 {
        __u32                   bucket_size;
        __u64                   nr_buckets;
 
-       struct bch_ioctl_dev_usage_type  d[0];
+       struct bch_ioctl_dev_usage_type d[];
 };
 
 /*
index 70e4788074b9271fd0b5ba58066143527123143e..d1615607480d33d49ad74e46e126f74fe203119f 100644 (file)
@@ -1541,8 +1541,8 @@ static int bch2_gc_alloc_start(struct bch_fs *c, bool metadata_only)
                rcu_assign_pointer(ca->buckets_gc, buckets);
        }
 
-       for_each_btree_key(trans, iter, BTREE_ID_alloc, POS_MIN,
-                          BTREE_ITER_PREFETCH, k, ret) {
+       ret = for_each_btree_key2(trans, iter, BTREE_ID_alloc, POS_MIN,
+                                 BTREE_ITER_PREFETCH, k, ({
                ca = bch_dev_bkey_exists(c, k.k->p.inode);
                g = gc_bucket(ca, k.k->p.offset);
 
@@ -1561,8 +1561,9 @@ static int bch2_gc_alloc_start(struct bch_fs *c, bool metadata_only)
                        g->stripe               = a->stripe;
                        g->stripe_redundancy    = a->stripe_redundancy;
                }
-       }
-       bch2_trans_iter_exit(trans, &iter);
+
+               0;
+       }));
 err:
        bch2_trans_put(trans);
        if (ret)
index bdc80808715b0a7db5a1aff4b68eec21c8608b51..f430ca83720673043b135128aa75b272a73dfaff 100644 (file)
@@ -1492,6 +1492,22 @@ static void bch2_trans_update_max_paths(struct btree_trans *trans)
        trans->nr_max_paths = hweight64(trans->paths_allocated);
 }
 
+noinline __cold
+int __bch2_btree_trans_too_many_iters(struct btree_trans *trans)
+{
+       if (trace_trans_restart_too_many_iters_enabled()) {
+               struct printbuf buf = PRINTBUF;
+
+               bch2_trans_paths_to_text(&buf, trans);
+               trace_trans_restart_too_many_iters(trans, _THIS_IP_, buf.buf);
+               printbuf_exit(&buf);
+       }
+
+       count_event(trans->c, trans_restart_too_many_iters);
+
+       return btree_trans_restart(trans, BCH_ERR_transaction_restart_too_many_iters);
+}
+
 static noinline void btree_path_overflow(struct btree_trans *trans)
 {
        bch2_dump_trans_paths_updates(trans);
@@ -3027,6 +3043,7 @@ void bch2_btree_trans_to_text(struct printbuf *out, struct btree_trans *trans)
        struct btree_path *path;
        struct btree_bkey_cached_common *b;
        static char lock_types[] = { 'r', 'i', 'w' };
+       struct task_struct *task = READ_ONCE(trans->locking_wait.task);
        unsigned l, idx;
 
        if (!out->nr_tabstops) {
@@ -3034,7 +3051,7 @@ void bch2_btree_trans_to_text(struct printbuf *out, struct btree_trans *trans)
                printbuf_tabstop_push(out, 32);
        }
 
-       prt_printf(out, "%i %s\n", trans->locking_wait.task->pid, trans->fn);
+       prt_printf(out, "%i %s\n", task ? task->pid : 0, trans->fn);
 
        trans_for_each_path_safe(trans, path, idx) {
                if (!path->nodes_locked)
index a4fec7cce911cb2878ed6ee181a8162bb057c0b0..75beb183183d7e849b10b25c36d0dcd20d1c0112 100644 (file)
@@ -627,12 +627,12 @@ static inline struct bkey_s_c bch2_btree_iter_peek_upto_type(struct btree_iter *
        return bch2_btree_iter_peek_slot(iter);
 }
 
+int __bch2_btree_trans_too_many_iters(struct btree_trans *);
+
 static inline int btree_trans_too_many_iters(struct btree_trans *trans)
 {
-       if (hweight64(trans->paths_allocated) > BTREE_ITER_MAX - 8) {
-               trace_and_count(trans->c, trans_restart_too_many_iters, trans, _THIS_IP_);
-               return btree_trans_restart(trans, BCH_ERR_transaction_restart_too_many_iters);
-       }
+       if (hweight64(trans->paths_allocated) > BTREE_ITER_MAX - 8)
+               return __bch2_btree_trans_too_many_iters(trans);
 
        return 0;
 }
index c64f8db0673387fc2f456914a0789de907a1b54b..c5e8a46129c55dd1d1b82ba6b945c628c5f3c001 100644 (file)
@@ -737,7 +737,7 @@ int bch2_btree_key_cache_journal_flush(struct journal *j,
        }
        six_unlock_read(&ck->c.lock);
 
-       ret = commit_do(trans, NULL, NULL, 0,
+       ret = lockrestart_do(trans,
                btree_key_cache_flush_pos(trans, key, seq,
                                BCH_TRANS_COMMIT_journal_reclaim, false));
 unlock:
index 59c57c585a4c37716ecc50fbfdc0968eb62655d7..89f14b5a5eddaf6f47b1f7e08eb3860b96cff392 100644 (file)
@@ -141,10 +141,28 @@ static bool lock_graph_remove_non_waiters(struct lock_graph *g)
        return false;
 }
 
+static void trace_would_deadlock(struct lock_graph *g, struct btree_trans *trans,
+                                unsigned long ip)
+{
+       struct bch_fs *c = trans->c;
+
+       count_event(c, trans_restart_would_deadlock);
+
+       if (trace_trans_restart_would_deadlock_enabled()) {
+               struct printbuf buf = PRINTBUF;
+
+               buf.atomic++;
+               print_cycle(&buf, g);
+
+               trace_trans_restart_would_deadlock(trans, ip, buf.buf);
+               printbuf_exit(&buf);
+       }
+}
+
 static int abort_lock(struct lock_graph *g, struct trans_waiting_for_lock *i)
 {
        if (i == g->g) {
-               trace_and_count(i->trans->c, trans_restart_would_deadlock, i->trans, _RET_IP_);
+               trace_would_deadlock(g, i->trans, _RET_IP_);
                return btree_trans_restart(i->trans, BCH_ERR_transaction_restart_would_deadlock);
        } else {
                i->trans->lock_must_abort = true;
@@ -265,15 +283,16 @@ int bch2_check_for_deadlock(struct btree_trans *trans, struct printbuf *cycle)
        unsigned path_idx;
        int ret;
 
+       g.nr = 0;
+
        if (trans->lock_must_abort) {
                if (cycle)
                        return -1;
 
-               trace_and_count(trans->c, trans_restart_would_deadlock, trans, _RET_IP_);
+               trace_would_deadlock(&g, trans, _RET_IP_);
                return btree_trans_restart(trans, BCH_ERR_transaction_restart_would_deadlock);
        }
 
-       g.nr = 0;
        lock_graph_down(&g, trans);
 next:
        if (!g.nr)
index 68627061b787ac2fb440e6bfbd3a8caa70516857..c9f07ca49b9b0b23b56b0fd4a21921fea4e9e50d 100644 (file)
@@ -2279,6 +2279,10 @@ int bch2_btree_node_update_key_get_iter(struct btree_trans *trans,
 
        BUG_ON(!btree_node_hashed(b));
 
+       struct bch_extent_ptr *ptr;
+       bch2_bkey_drop_ptrs(bkey_i_to_s(new_key), ptr,
+                           !bch2_bkey_has_device(bkey_i_to_s(&b->key), ptr->dev));
+
        ret = bch2_btree_node_update_key(trans, &iter, b, new_key,
                                         commit_flags, skip_triggers);
 out:
index 6a19156804079d1a0538e2cba7e0f8a50ba0fdb8..6ab26576252c17edc603ad42438e7a9ebd9b4181 100644 (file)
@@ -33,17 +33,32 @@ static int btree_write_buffered_journal_cmp(const void *_l, const void *_r)
        return  cmp_int(l->journal_seq, r->journal_seq);
 }
 
-static int bch2_btree_write_buffer_flush_one(struct btree_trans *trans,
-                                            struct btree_iter *iter,
-                                            struct btree_write_buffered_key *wb,
-                                            unsigned commit_flags,
-                                            bool *write_locked,
-                                            size_t *fast)
+static noinline int wb_flush_one_slowpath(struct btree_trans *trans,
+                                         struct btree_iter *iter,
+                                         struct btree_write_buffered_key *wb)
+{
+       bch2_btree_node_unlock_write(trans, iter->path, iter->path->l[0].b);
+
+       trans->journal_res.seq = wb->journal_seq;
+
+       return bch2_trans_update(trans, iter, &wb->k,
+                                BTREE_UPDATE_INTERNAL_SNAPSHOT_NODE) ?:
+               bch2_trans_commit(trans, NULL, NULL,
+                                 BCH_TRANS_COMMIT_no_enospc|
+                                 BCH_TRANS_COMMIT_no_check_rw|
+                                 BCH_TRANS_COMMIT_no_journal_res|
+                                 BCH_TRANS_COMMIT_journal_reclaim);
+}
+
+static inline int wb_flush_one(struct btree_trans *trans, struct btree_iter *iter,
+                              struct btree_write_buffered_key *wb,
+                              bool *write_locked, size_t *fast)
 {
        struct bch_fs *c = trans->c;
        struct btree_path *path;
        int ret;
 
+       EBUG_ON(!wb->journal_seq);
        ret = bch2_btree_iter_traverse(iter);
        if (ret)
                return ret;
@@ -66,26 +81,14 @@ static int bch2_btree_write_buffer_flush_one(struct btree_trans *trans,
                *write_locked = true;
        }
 
-       if (!bch2_btree_node_insert_fits(c, path->l[0].b, wb->k.k.u64s)) {
-               bch2_btree_node_unlock_write(trans, path, path->l[0].b);
+       if (unlikely(!bch2_btree_node_insert_fits(c, path->l[0].b, wb->k.k.u64s))) {
                *write_locked = false;
-               goto trans_commit;
+               return wb_flush_one_slowpath(trans, iter, wb);
        }
 
        bch2_btree_insert_key_leaf(trans, path, &wb->k, wb->journal_seq);
        (*fast)++;
        return 0;
-trans_commit:
-       trans->journal_res.seq = wb->journal_seq;
-
-       return  bch2_trans_update(trans, iter, &wb->k,
-                                 BTREE_UPDATE_INTERNAL_SNAPSHOT_NODE) ?:
-               bch2_trans_commit(trans, NULL, NULL,
-                                 commit_flags|
-                                 BCH_TRANS_COMMIT_no_check_rw|
-                                 BCH_TRANS_COMMIT_no_enospc|
-                                 BCH_TRANS_COMMIT_no_journal_res|
-                                 BCH_TRANS_COMMIT_journal_reclaim);
 }
 
 static union btree_write_buffer_state btree_write_buffer_switch(struct btree_write_buffer *wb)
@@ -160,9 +163,6 @@ int bch2_btree_write_buffer_flush_locked(struct btree_trans *trans)
        keys = wb->keys[s.idx];
        nr = s.nr;
 
-       if (race_fault())
-               goto slowpath;
-
        /*
         * We first sort so that we can detect and skip redundant updates, and
         * then we attempt to flush in sorted btree order, as this is most
@@ -206,66 +206,68 @@ int bch2_btree_write_buffer_flush_locked(struct btree_trans *trans)
                iter.path->preserve = false;
 
                do {
-                       ret = bch2_btree_write_buffer_flush_one(trans, &iter, i, 0,
-                                                               &write_locked, &fast);
+                       if (race_fault()) {
+                               ret = -BCH_ERR_journal_reclaim_would_deadlock;
+                               break;
+                       }
+
+                       ret = wb_flush_one(trans, &iter, i, &write_locked, &fast);
                        if (!write_locked)
                                bch2_trans_begin(trans);
                } while (bch2_err_matches(ret, BCH_ERR_transaction_restart));
 
-               if (ret == -BCH_ERR_journal_reclaim_would_deadlock) {
+               if (!ret) {
+                       i->journal_seq = 0;
+               } else if (ret == -BCH_ERR_journal_reclaim_would_deadlock) {
                        slowpath++;
-                       continue;
-               }
-               if (ret)
+                       ret = 0;
+               } else
                        break;
-
-               i->journal_seq = 0;
        }
 
        if (write_locked)
                bch2_btree_node_unlock_write(trans, iter.path, iter.path->l[0].b);
        bch2_trans_iter_exit(trans, &iter);
 
-       trace_write_buffer_flush(trans, nr, skipped, fast, wb->size);
-
-       if (slowpath)
-               goto slowpath;
-
+       if (ret)
+               goto err;
+
+       if (slowpath) {
+               /*
+                * Flush in the order they were present in the journal, so that
+                * we can release journal pins:
+                * The fastpath zapped the seq of keys that were successfully flushed so
+                * we can skip those here.
+                */
+               trace_and_count(c, write_buffer_flush_slowpath, trans, slowpath, nr);
+
+               sort(keys, nr, sizeof(keys[0]),
+                    btree_write_buffered_journal_cmp,
+                    NULL);
+
+               for (i = keys; i < keys + nr; i++) {
+                       if (!i->journal_seq)
+                               continue;
+
+                       bch2_journal_pin_update(j, i->journal_seq, &pin,
+                                     bch2_btree_write_buffer_journal_flush);
+
+                       ret = commit_do(trans, NULL, NULL,
+                                       BCH_WATERMARK_reclaim|
+                                       BCH_TRANS_COMMIT_no_check_rw|
+                                       BCH_TRANS_COMMIT_no_enospc|
+                                       BCH_TRANS_COMMIT_no_journal_res|
+                                       BCH_TRANS_COMMIT_journal_reclaim,
+                                       btree_write_buffered_insert(trans, i));
+                       if (ret)
+                               goto err;
+               }
+       }
+err:
        bch2_fs_fatal_err_on(ret, c, "%s: insert error %s", __func__, bch2_err_str(ret));
-out:
+       trace_write_buffer_flush(trans, nr, skipped, fast, wb->size);
        bch2_journal_pin_drop(j, &pin);
        return ret;
-slowpath:
-       trace_and_count(c, write_buffer_flush_slowpath, trans, slowpath, nr);
-
-       /*
-        * Now sort the rest by journal seq and bump the journal pin as we go.
-        * The slowpath zapped the seq of keys that were successfully flushed so
-        * we can skip those here.
-        */
-       sort(keys, nr, sizeof(keys[0]),
-            btree_write_buffered_journal_cmp,
-            NULL);
-
-       for (i = keys; i < keys + nr; i++) {
-               if (!i->journal_seq)
-                       continue;
-
-               bch2_journal_pin_update(j, i->journal_seq, &pin,
-                             bch2_btree_write_buffer_journal_flush);
-
-               ret = commit_do(trans, NULL, NULL,
-                               BCH_WATERMARK_reclaim|
-                               BCH_TRANS_COMMIT_no_check_rw|
-                               BCH_TRANS_COMMIT_no_enospc|
-                               BCH_TRANS_COMMIT_no_journal_res|
-                               BCH_TRANS_COMMIT_journal_reclaim,
-                               btree_write_buffered_insert(trans, i));
-               if (bch2_fs_fatal_err_on(ret, c, "%s: insert error %s", __func__, bch2_err_str(ret)))
-                       break;
-       }
-
-       goto out;
 }
 
 int bch2_btree_write_buffer_flush_sync(struct btree_trans *trans)
index 64bdafe3190b8bd0be89ea5dd7d01447bddd040d..51af8ea230edbf997756e51ac37cfe3cfc158341 100644 (file)
@@ -576,7 +576,7 @@ static int __bch2_fs_compress_init(struct bch_fs *c, u64 features)
         * ZSTD is lying: if we allocate the size of the workspace it says it
         * requires, it returns memory allocation errors
         */
-       c->zstd_workspace_size = zstd_cctx_workspace_bound(&params.cParams) * 2;
+       c->zstd_workspace_size = zstd_cctx_workspace_bound(&params.cParams);
 
        struct {
                unsigned                        feature;
index 31090796cb6bc950e0ca202c2f38d419893c5354..08c664cabf094e423a44c455464797ffca830158 100644 (file)
@@ -321,7 +321,7 @@ nowork:
                                     &m->stats->sectors_raced);
                }
 
-               this_cpu_inc(c->counters[BCH_COUNTER_move_extent_fail]);
+               count_event(c, move_extent_fail);
 
                bch2_btree_iter_advance(&iter);
                goto next;
index 8cf4bcf9be897185a9cd89527362f9739772e9a5..bc6b56628fdfe58005a394b3ae25465a93cf033d 100644 (file)
@@ -207,10 +207,8 @@ static int fsck_write_inode(struct btree_trans *trans,
                            struct bch_inode_unpacked *inode,
                            u32 snapshot)
 {
-       int ret = commit_do(trans, NULL, NULL,
-                                 BCH_TRANS_COMMIT_no_enospc|
-                                 BCH_TRANS_COMMIT_lazy_rw,
-                                 __write_inode(trans, inode, snapshot));
+       int ret = commit_do(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
+                           __write_inode(trans, inode, snapshot));
        if (ret)
                bch_err_fn(trans->c, ret);
        return ret;
@@ -353,9 +351,7 @@ static int reattach_inode(struct btree_trans *trans,
                          struct bch_inode_unpacked *inode,
                          u32 inode_snapshot)
 {
-       int ret = commit_do(trans, NULL, NULL,
-                                 BCH_TRANS_COMMIT_lazy_rw|
-                                 BCH_TRANS_COMMIT_no_enospc,
+       int ret = commit_do(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
                        __reattach_inode(trans, inode, inode_snapshot));
        bch_err_msg(trans->c, ret, "reattaching inode %llu", inode->bi_inum);
        return ret;
@@ -756,9 +752,7 @@ static int hash_redo_key(struct btree_trans *trans,
                                       k.k->p.snapshot, tmp,
                                       BCH_HASH_SET_MUST_CREATE,
                                       BTREE_UPDATE_INTERNAL_SNAPSHOT_NODE) ?:
-               bch2_trans_commit(trans, NULL, NULL,
-                                 BCH_TRANS_COMMIT_no_enospc|
-                                 BCH_TRANS_COMMIT_lazy_rw);
+               bch2_trans_commit(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc);
 }
 
 static int hash_check_key(struct btree_trans *trans,
@@ -879,7 +873,7 @@ static int check_inode(struct btree_trans *trans,
                        c, inode_snapshot_mismatch,
                        "inodes in different snapshots don't match")) {
                bch_err(c, "repair not implemented yet");
-               return -EINVAL;
+               return -BCH_ERR_fsck_repair_unimplemented;
        }
 
        if ((u.bi_flags & (BCH_INODE_i_size_dirty|BCH_INODE_unlinked)) &&
@@ -905,12 +899,13 @@ static int check_inode(struct btree_trans *trans,
        if (u.bi_flags & BCH_INODE_unlinked &&
            c->sb.version >= bcachefs_metadata_version_deleted_inodes) {
                ret = check_inode_deleted_list(trans, k.k->p);
-               if (ret)
+               if (ret < 0)
                        return ret;
 
                fsck_err_on(ret, c, unlinked_inode_not_on_deleted_list,
                            "inode %llu:%u unlinked, but not on deleted list",
                            u.bi_inum, k.k->p.snapshot);
+               ret = 0;
        }
 
        if (u.bi_flags & BCH_INODE_unlinked &&
@@ -918,9 +913,6 @@ static int check_inode(struct btree_trans *trans,
             fsck_err(c, inode_unlinked_but_clean,
                      "filesystem marked clean, but inode %llu unlinked",
                      u.bi_inum))) {
-               bch2_trans_unlock(trans);
-               bch2_fs_lazy_rw(c);
-
                ret = bch2_inode_rm_snapshot(trans, u.bi_inum, iter->pos.snapshot);
                bch_err_msg(c, ret, "in fsck deleting inode");
                return ret;
@@ -933,9 +925,6 @@ static int check_inode(struct btree_trans *trans,
                      u.bi_inum))) {
                bch_verbose(c, "truncating inode %llu", u.bi_inum);
 
-               bch2_trans_unlock(trans);
-               bch2_fs_lazy_rw(c);
-
                /*
                 * XXX: need to truncate partial blocks too here - or ideally
                 * just switch units to bytes and that issue goes away
@@ -999,7 +988,6 @@ fsck_err:
        return ret;
 }
 
-noinline_for_stack
 int bch2_check_inodes(struct bch_fs *c)
 {
        bool full = c->opts.fsck;
@@ -1015,7 +1003,7 @@ int bch2_check_inodes(struct bch_fs *c)
        ret = for_each_btree_key_commit(trans, iter, BTREE_ID_inodes,
                        POS_MIN,
                        BTREE_ITER_PREFETCH|BTREE_ITER_ALL_SNAPSHOTS, k,
-                       NULL, NULL, BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc,
+                       NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
                check_inode(trans, &iter, k, &prev, &s, full));
 
        snapshots_seen_exit(&s);
@@ -1229,8 +1217,7 @@ static int overlapping_extents_found(struct btree_trans *trans,
                ret =   bch2_trans_update_extent_overwrite(trans, old_iter,
                                BTREE_UPDATE_INTERNAL_SNAPSHOT_NODE,
                                k1, k2) ?:
-                       bch2_trans_commit(trans, &res, NULL,
-                               BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc);
+                       bch2_trans_commit(trans, &res, NULL, BCH_TRANS_COMMIT_no_enospc);
                bch2_disk_reservation_put(c, &res);
 
                if (ret)
@@ -1469,7 +1456,7 @@ int bch2_check_extents(struct bch_fs *c)
                        POS(BCACHEFS_ROOT_INO, 0),
                        BTREE_ITER_PREFETCH|BTREE_ITER_ALL_SNAPSHOTS, k,
                        &res, NULL,
-                       BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc, ({
+                       BCH_TRANS_COMMIT_no_enospc, ({
                bch2_disk_reservation_put(c, &res);
                check_extent(trans, &iter, k, &w, &s, &extent_ends) ?:
                check_extent_overbig(trans, &iter, k);
@@ -1498,7 +1485,7 @@ int bch2_check_indirect_extents(struct bch_fs *c)
                        POS_MIN,
                        BTREE_ITER_PREFETCH, k,
                        &res, NULL,
-                       BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc, ({
+                       BCH_TRANS_COMMIT_no_enospc, ({
                bch2_disk_reservation_put(c, &res);
                check_extent_overbig(trans, &iter, k);
        }));
@@ -1871,7 +1858,7 @@ int bch2_check_dirents(struct bch_fs *c)
                        BTREE_ITER_PREFETCH|BTREE_ITER_ALL_SNAPSHOTS,
                        k,
                        NULL, NULL,
-                       BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc,
+                       BCH_TRANS_COMMIT_no_enospc,
                check_dirent(trans, &iter, k, &hash_info, &dir, &target, &s));
 
        bch2_trans_put(trans);
@@ -1935,7 +1922,7 @@ int bch2_check_xattrs(struct bch_fs *c)
                        BTREE_ITER_PREFETCH|BTREE_ITER_ALL_SNAPSHOTS,
                        k,
                        NULL, NULL,
-                       BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc,
+                       BCH_TRANS_COMMIT_no_enospc,
                check_xattr(trans, &iter, k, &hash_info, &inode)));
        bch_err_fn(c, ret);
        return ret;
@@ -1966,8 +1953,7 @@ static int check_root_trans(struct btree_trans *trans)
                root_subvol.v.snapshot  = cpu_to_le32(snapshot);
                root_subvol.v.inode     = cpu_to_le64(inum);
                ret = commit_do(trans, NULL, NULL,
-                                     BCH_TRANS_COMMIT_no_enospc|
-                                     BCH_TRANS_COMMIT_lazy_rw,
+                                     BCH_TRANS_COMMIT_no_enospc,
                        bch2_btree_insert_trans(trans, BTREE_ID_subvolumes,
                                            &root_subvol.k_i, 0));
                bch_err_msg(c, ret, "writing root subvol");
@@ -2002,9 +1988,7 @@ int bch2_check_root(struct bch_fs *c)
 {
        int ret;
 
-       ret = bch2_trans_do(c, NULL, NULL,
-                            BCH_TRANS_COMMIT_no_enospc|
-                            BCH_TRANS_COMMIT_lazy_rw,
+       ret = bch2_trans_do(c, NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
                check_root_trans(trans));
        bch_err_fn(c, ret);
        return ret;
@@ -2133,8 +2117,7 @@ static int check_path(struct btree_trans *trans,
                                return 0;
 
                        ret = commit_do(trans, NULL, NULL,
-                                             BCH_TRANS_COMMIT_no_enospc|
-                                             BCH_TRANS_COMMIT_lazy_rw,
+                                             BCH_TRANS_COMMIT_no_enospc,
                                        remove_backpointer(trans, inode));
                        if (ret) {
                                bch_err(c, "error removing dirent: %i", ret);
@@ -2415,7 +2398,7 @@ static int check_nlinks_update_hardlinks(struct bch_fs *c,
                for_each_btree_key_commit(trans, iter, BTREE_ID_inodes,
                                POS(0, range_start),
                                BTREE_ITER_INTENT|BTREE_ITER_PREFETCH|BTREE_ITER_ALL_SNAPSHOTS, k,
-                               NULL, NULL, BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc,
+                               NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
                        check_nlinks_update_inode(trans, &iter, k, links, &idx, range_end)));
        if (ret < 0) {
                bch_err(c, "error in fsck walking inodes: %s", bch2_err_str(ret));
@@ -2500,7 +2483,7 @@ int bch2_fix_reflink_p(struct bch_fs *c)
                                BTREE_ID_extents, POS_MIN,
                                BTREE_ITER_INTENT|BTREE_ITER_PREFETCH|
                                BTREE_ITER_ALL_SNAPSHOTS, k,
-                               NULL, NULL, BCH_TRANS_COMMIT_no_enospc|BCH_TRANS_COMMIT_lazy_rw,
+                               NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
                        fix_reflink_p_key(trans, &iter, k)));
        bch_err_fn(c, ret);
        return ret;
index 3281c4dd1d5252840fa0c13f1c7c4f720108ebdf..4c9eaf7cea8df07835e9b217dff097b73581fa60 100644 (file)
@@ -80,7 +80,7 @@ struct promote_op {
        struct bpos             pos;
 
        struct data_update      write;
-       struct bio_vec          bi_inline_vecs[0]; /* must be last */
+       struct bio_vec          bi_inline_vecs[]; /* must be last */
 };
 
 static const struct rhashtable_params bch_promote_params = {
index d6bd8f788d3a7e35113847a3ac02557ecbcc0770..7c904f7d53f975a346ece464506194f02efcff9e 100644 (file)
@@ -403,8 +403,7 @@ void bch2_submit_wbio_replicas(struct bch_write_bio *wbio, struct bch_fs *c,
        BUG_ON(c->opts.nochanges);
 
        bkey_for_each_ptr(ptrs, ptr) {
-               BUG_ON(ptr->dev >= BCH_SB_MEMBERS_MAX ||
-                      !c->devs[ptr->dev]);
+               BUG_ON(!bch2_dev_exists2(c, ptr->dev));
 
                ca = bch_dev_bkey_exists(c, ptr->dev);
 
index d5540c8568fffb7ee0af03cd6b514eabe979f119..acf9c358b82df7f576b4f071ba5e422febdbf260 100644 (file)
@@ -323,6 +323,8 @@ static int journal_entry_open(struct journal *j)
        atomic64_inc(&j->seq);
        journal_pin_list_init(fifo_push_ref(&j->pin), 1);
 
+       BUG_ON(j->pin.back - 1 != atomic64_read(&j->seq));
+
        BUG_ON(j->buf + (journal_cur_seq(j) & JOURNAL_BUF_MASK) != buf);
 
        bkey_extent_init(&buf->key);
index c85d01cf49484984d08d20a2159f84b2506f96a1..e1e9e60fa5360590aab042296dac685b607af90d 100644 (file)
@@ -119,7 +119,6 @@ static inline void journal_wake(struct journal *j)
 {
        wake_up(&j->wait);
        closure_wake_up(&j->async_wait);
-       closure_wake_up(&j->preres_wait);
 }
 
 static inline struct journal_buf *journal_cur_buf(struct journal *j)
@@ -136,9 +135,7 @@ static inline u64 journal_last_seq(struct journal *j)
 
 static inline u64 journal_cur_seq(struct journal *j)
 {
-       EBUG_ON(j->pin.back - 1 != atomic64_read(&j->seq));
-
-       return j->pin.back - 1;
+       return atomic64_read(&j->seq);
 }
 
 static inline u64 journal_last_unwritten_seq(struct journal *j)
index 2427cce64fed93388214c3de8b6446875eaf01b6..4ffae252e01ed6fd79e3e7a35692e35c66f961b1 100644 (file)
@@ -195,7 +195,6 @@ struct journal {
        /* Used when waiting because the journal was full */
        wait_queue_head_t       wait;
        struct closure_waitlist async_wait;
-       struct closure_waitlist preres_wait;
 
        struct closure          io;
        struct delayed_work     write_work;
index db14ec3769287763bce168b13fb80723003b6352..3efe6a6e1b555829393521d70655280b58cca157 100644 (file)
@@ -70,7 +70,7 @@ struct moving_io {
 
        struct data_update              write;
        /* Must be last since it is variable size */
-       struct bio_vec                  bi_inline_vecs[0];
+       struct bio_vec                  bi_inline_vecs[];
 };
 
 static void move_free(struct moving_io *io)
@@ -345,7 +345,12 @@ err:
        if (ret == -BCH_ERR_data_update_done)
                return 0;
 
-       this_cpu_inc(c->counters[BCH_COUNTER_move_extent_start_fail]);
+       if (bch2_err_matches(ret, EROFS) ||
+           bch2_err_matches(ret, BCH_ERR_transaction_restart))
+               return ret;
+
+       count_event(c, move_extent_start_fail);
+
        if (trace_move_extent_start_fail_enabled()) {
                struct printbuf buf = PRINTBUF;
 
@@ -461,7 +466,8 @@ int bch2_move_ratelimit(struct moving_context *ctxt)
 
                if (delay)
                        move_ctxt_wait_event_timeout(ctxt,
-                                       freezing(current) || kthread_should_stop(),
+                                       freezing(current) ||
+                                       kthread_should_stop(),
                                        delay);
 
                if (unlikely(freezing(current))) {
@@ -680,6 +686,9 @@ int __bch2_evacuate_bucket(struct moving_context *ctxt,
                goto err;
 
        while (!(ret = bch2_move_ratelimit(ctxt))) {
+               if (kthread_should_stop())
+                       break;
+
                bch2_trans_begin(trans);
 
                ret = bch2_get_next_backpointer(trans, bucket, gen,
index d079ba7aa65349bd8c6fbe73f65dee2872a249a0..794e4c56e5ea999f02cfa037bb6ac8f9f54a99e6 100644 (file)
@@ -217,7 +217,7 @@ static int bch2_copygc(struct moving_context *ctxt,
                goto err;
 
        darray_for_each(buckets, i) {
-               if (unlikely(freezing(current)))
+               if (kthread_should_stop() || freezing(current))
                        break;
 
                f = move_bucket_in_flight_add(buckets_in_flight, *i);
index 3f8c3ba105a28dc74c1011a9519312f8e9465f52..98f1454c23fb6c6307682082c27ecf072d392798 100644 (file)
@@ -531,7 +531,7 @@ static int bch2_set_may_go_rw(struct bch_fs *c)
        keys->gap = keys->nr;
 
        set_bit(BCH_FS_may_go_rw, &c->flags);
-       if (keys->nr)
+       if (keys->nr || c->opts.fsck)
                return bch2_fs_read_write_early(c);
        return 0;
 }
index 030324078bbab10eda32082a6443af297ea00871..ac90d142c4e87dde7d5df8753937e6ae0f0cb440 100644 (file)
@@ -21,7 +21,7 @@ struct replicas_delta_list {
        u64                     nr_inodes;
        u64                     persistent_reserved[BCH_REPLICAS_MAX];
        struct                  {} memset_end;
-       struct replicas_delta   d[0];
+       struct replicas_delta   d[];
 };
 
 #endif /* _BCACHEFS_REPLICAS_TYPES_H */
index e473c788fd64fa2b0d27e2d3273cbd0d3ed131a5..b2d216fa71824e8666dfac76226726251fe555bd 100644 (file)
@@ -590,7 +590,7 @@ int bch2_check_snapshot_trees(struct bch_fs *c)
                for_each_btree_key_commit(trans, iter,
                        BTREE_ID_snapshot_trees, POS_MIN,
                        BTREE_ITER_PREFETCH, k,
-                       NULL, NULL, BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc,
+                       NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
                check_snapshot_tree(trans, &iter, k)));
 
        if (ret)
@@ -868,7 +868,7 @@ int bch2_check_snapshots(struct bch_fs *c)
                for_each_btree_key_reverse_commit(trans, iter,
                        BTREE_ID_snapshots, POS_MAX,
                        BTREE_ITER_PREFETCH, k,
-                       NULL, NULL, BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc,
+                       NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
                check_snapshot(trans, &iter, k)));
        if (ret)
                bch_err_fn(c, ret);
index 1cbf9e3a09ecf67bbcc59951ce4df45e48f87c1c..4e258b7d18a41a2795623cd51ff5414c993a6289 100644 (file)
@@ -37,8 +37,6 @@ static int check_subvol(struct btree_trans *trans,
                return ret;
 
        if (BCH_SUBVOLUME_UNLINKED(subvol.v)) {
-               bch2_fs_lazy_rw(c);
-
                ret = bch2_subvolume_delete(trans, iter->pos.offset);
                if (ret)
                        bch_err_msg(c, ret, "deleting subvolume %llu", iter->pos.offset);
@@ -89,7 +87,7 @@ int bch2_check_subvols(struct bch_fs *c)
        ret = bch2_trans_run(c,
                for_each_btree_key_commit(trans, iter,
                        BTREE_ID_subvolumes, POS_MIN, BTREE_ITER_PREFETCH, k,
-                       NULL, NULL, BCH_TRANS_COMMIT_lazy_rw|BCH_TRANS_COMMIT_no_enospc,
+                       NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
                check_subvol(trans, &iter, k)));
        if (ret)
                bch_err_fn(c, ret);
index 6eced95ce3748676f3c399470d10bcfb61d633e1..6e2ad6f3db980d7d116c2800a2bdc37acc172e24 100644 (file)
@@ -32,7 +32,7 @@ DECLARE_EVENT_CLASS(bpos,
        TP_printk("%llu:%llu:%u", __entry->p_inode, __entry->p_offset, __entry->p_snapshot)
 );
 
-DECLARE_EVENT_CLASS(str,
+DECLARE_EVENT_CLASS(fs_str,
        TP_PROTO(struct bch_fs *c, const char *str),
        TP_ARGS(c, str),
 
@@ -49,6 +49,29 @@ DECLARE_EVENT_CLASS(str,
        TP_printk("%d,%d %s", MAJOR(__entry->dev), MINOR(__entry->dev), __get_str(str))
 );
 
+DECLARE_EVENT_CLASS(trans_str,
+       TP_PROTO(struct btree_trans *trans, unsigned long caller_ip, const char *str),
+       TP_ARGS(trans, caller_ip, str),
+
+       TP_STRUCT__entry(
+               __field(dev_t,          dev                     )
+               __array(char,           trans_fn, 32            )
+               __field(unsigned long,  caller_ip               )
+               __string(str,           str                     )
+       ),
+
+       TP_fast_assign(
+               __entry->dev            = trans->c->dev;
+               strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
+               __entry->caller_ip              = caller_ip;
+               __assign_str(str, str);
+       ),
+
+       TP_printk("%d,%d %s %pS %s",
+                 MAJOR(__entry->dev), MINOR(__entry->dev),
+                 __entry->trans_fn, (void *) __entry->caller_ip, __get_str(str))
+);
+
 DECLARE_EVENT_CLASS(btree_node,
        TP_PROTO(struct bch_fs *c, struct btree *b),
        TP_ARGS(c, b),
@@ -738,22 +761,22 @@ TRACE_EVENT(bucket_evacuate,
                  __entry->dev_idx, __entry->bucket)
 );
 
-DEFINE_EVENT(str, move_extent,
+DEFINE_EVENT(fs_str, move_extent,
        TP_PROTO(struct bch_fs *c, const char *k),
        TP_ARGS(c, k)
 );
 
-DEFINE_EVENT(str, move_extent_read,
+DEFINE_EVENT(fs_str, move_extent_read,
        TP_PROTO(struct bch_fs *c, const char *k),
        TP_ARGS(c, k)
 );
 
-DEFINE_EVENT(str, move_extent_write,
+DEFINE_EVENT(fs_str, move_extent_write,
        TP_PROTO(struct bch_fs *c, const char *k),
        TP_ARGS(c, k)
 );
 
-DEFINE_EVENT(str, move_extent_finish,
+DEFINE_EVENT(fs_str, move_extent_finish,
        TP_PROTO(struct bch_fs *c, const char *k),
        TP_ARGS(c, k)
 );
@@ -775,7 +798,7 @@ TRACE_EVENT(move_extent_fail,
        TP_printk("%d:%d %s", MAJOR(__entry->dev), MINOR(__entry->dev), __get_str(msg))
 );
 
-DEFINE_EVENT(str, move_extent_start_fail,
+DEFINE_EVENT(fs_str, move_extent_start_fail,
        TP_PROTO(struct bch_fs *c, const char *str),
        TP_ARGS(c, str)
 );
@@ -1008,10 +1031,11 @@ DEFINE_EVENT(transaction_event, trans_restart_key_cache_raced,
        TP_ARGS(trans, caller_ip)
 );
 
-DEFINE_EVENT(transaction_event,        trans_restart_too_many_iters,
+DEFINE_EVENT(trans_str, trans_restart_too_many_iters,
        TP_PROTO(struct btree_trans *trans,
-                unsigned long caller_ip),
-       TP_ARGS(trans, caller_ip)
+                unsigned long caller_ip,
+                const char *paths),
+       TP_ARGS(trans, caller_ip, paths)
 );
 
 DECLARE_EVENT_CLASS(transaction_restart_iter,
@@ -1181,10 +1205,11 @@ DEFINE_EVENT(transaction_restart_iter,  trans_restart_memory_allocation_failure,
        TP_ARGS(trans, caller_ip, path)
 );
 
-DEFINE_EVENT(transaction_event,        trans_restart_would_deadlock,
+DEFINE_EVENT(trans_str, trans_restart_would_deadlock,
        TP_PROTO(struct btree_trans *trans,
-                unsigned long caller_ip),
-       TP_ARGS(trans, caller_ip)
+                unsigned long caller_ip,
+                const char *cycle),
+       TP_ARGS(trans, caller_ip, cycle)
 );
 
 DEFINE_EVENT(transaction_event,        trans_restart_would_deadlock_recursion_limit,
@@ -1368,12 +1393,12 @@ TRACE_EVENT(write_buffer_flush_slowpath,
        TP_printk("%zu/%zu", __entry->slowpath, __entry->total)
 );
 
-DEFINE_EVENT(str, rebalance_extent,
+DEFINE_EVENT(fs_str, rebalance_extent,
        TP_PROTO(struct bch_fs *c, const char *str),
        TP_ARGS(c, str)
 );
 
-DEFINE_EVENT(str, data_update,
+DEFINE_EVENT(fs_str, data_update,
        TP_PROTO(struct bch_fs *c, const char *str),
        TP_ARGS(c, str)
 );