Signed-off-by: Daniel Hill <[email protected]>
---
 fs/bcachefs/data_update.c | 70 +++++++++++++++++++++++++++++++--------
 fs/bcachefs/move.c        | 23 +++++++++++--
 fs/bcachefs/trace.h       | 11 ++++--
 3 files changed, 86 insertions(+), 18 deletions(-)

diff --git a/fs/bcachefs/data_update.c b/fs/bcachefs/data_update.c
index 4150feca42a2..b14bd845f34a 100644
--- a/fs/bcachefs/data_update.c
+++ b/fs/bcachefs/data_update.c
@@ -88,6 +88,15 @@ static void trace_move_extent_fail2(struct data_update *m,
        printbuf_exit(&buf);
 }
 
+static void trace_move_extent_fail3(struct bch_fs *c, const char *msg, int ret)
+{
+       struct printbuf buf = PRINTBUF;
+
+       prt_printf(&buf, "error %s %i", msg, ret);
+       trace_move_extent_fail(c, buf.buf);
+       printbuf_exit(&buf);
+}
+
 static int __bch2_data_update_index_update(struct btree_trans *trans,
                                           struct bch_write_op *op)
 {
@@ -121,13 +130,16 @@ static int __bch2_data_update_index_update(struct 
btree_trans *trans,
                bool should_check_enospc;
                s64 i_sectors_delta = 0, disk_sectors_delta = 0;
                unsigned rewrites_found = 0, durability, i;
+               const char *msg = "no err";
 
                bch2_trans_begin(trans);
 
                k = bch2_btree_iter_peek_slot(&iter);
                ret = bkey_err(k);
-               if (ret)
+               if (ret) {
+                       msg = "peek_slot";
                        goto err;
+               }
 
                new = bkey_i_to_extent(bch2_keylist_front(keys));
 
@@ -171,7 +183,8 @@ static int __bch2_data_update_index_update(struct 
btree_trans *trans,
                if (m->data_opts.rewrite_ptrs &&
                    !rewrites_found &&
                    bch2_bkey_durability(c, k) >= m->op.opts.data_replicas) {
-                       trace_move_extent_fail2(m, k, bkey_i_to_s_c(&new->k_i), 
insert, "no rewrites found:");
+                       trace_move_extent_fail2(m, k, bkey_i_to_s_c(&new->k_i),
+                                               insert, "no rewrites found:");
                        goto nowork;
                }
 
@@ -188,7 +201,8 @@ static int __bch2_data_update_index_update(struct 
btree_trans *trans,
                        }
 
                if (!bkey_val_u64s(&new->k)) {
-                       trace_move_extent_fail2(m, k, bkey_i_to_s_c(&new->k_i), 
insert, "new replicas conflicted:");
+                       trace_move_extent_fail2(m, k, bkey_i_to_s_c(&new->k_i), 
insert,
+                                               "new replicas conflicted:");
                        goto nowork;
                }
 
@@ -225,16 +239,21 @@ static int __bch2_data_update_index_update(struct 
btree_trans *trans,
                                                 &should_check_enospc,
                                                 &i_sectors_delta,
                                                 &disk_sectors_delta);
-               if (ret)
+               if (ret) {
+                       msg = "sum_sectors";
                        goto err;
+               }
+
 
                if (disk_sectors_delta > (s64) op->res.sectors) {
                        ret = bch2_disk_reservation_add(c, &op->res,
                                                disk_sectors_delta - 
op->res.sectors,
                                                !should_check_enospc
                                                ? BCH_DISK_RESERVATION_NOFAIL : 
0);
-                       if (ret)
+                       if (ret) {
+                               trace_move_extent_fail3(c, 
"disk_reservation_add", ret);
                                goto out;
+                       }
                }
 
                next_pos = insert->k.p;
@@ -299,11 +318,15 @@ static int __bch2_data_update_index_update(struct 
btree_trans *trans,
                        
this_cpu_add(c->counters[BCH_COUNTER_move_extent_finish], new->k.size);
                        trace_move_extent_finish2(c, bkey_i_to_s_c(&new->k_i));
                }
+
 err:
                if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
                        ret = 0;
-               if (ret)
+
+               if (ret) {
+                       trace_move_extent_fail3(c, msg, ret);
                        break;
+               }
 next:
                while (bkey_ge(iter.pos, bch2_keylist_front(keys)->k.p)) {
                        bch2_keylist_pop_front(keys);
@@ -367,7 +390,7 @@ void bch2_data_update_exit(struct data_update *update)
        bch2_bio_free_pages_pool(c, &update->op.wbio.bio);
 }
 
-static void bch2_update_unwritten_extent(struct btree_trans *trans,
+static int bch2_update_unwritten_extent(struct btree_trans *trans,
                                  struct data_update *update)
 {
        struct bch_fs *c = update->op.c;
@@ -377,7 +400,8 @@ static void bch2_update_unwritten_extent(struct btree_trans 
*trans,
        struct closure cl;
        struct btree_iter iter;
        struct bkey_s_c k;
-       int ret;
+       int ret = 0;
+       const char *msg = "";
 
        closure_init_stack(&cl);
        bch2_keylist_init(&update->op.insert_keys, update->op.inline_keys);
@@ -393,8 +417,12 @@ static void bch2_update_unwritten_extent(struct 
btree_trans *trans,
                }));
                bch2_trans_iter_exit(trans, &iter);
 
-               if (ret || !bch2_extents_match(k, bkey_i_to_s_c(update->k.k)))
+               if (ret)
                        break;
+               if (!bch2_extents_match(k, bkey_i_to_s_c(update->k.k))) {
+                       msg = "extent doesn't match ";
+                       goto err;
+               }
 
                e = bkey_extent_init(update->op.insert_keys.top);
                e->k.p = update->op.pos;
@@ -416,8 +444,15 @@ static void bch2_update_unwritten_extent(struct 
btree_trans *trans,
 
                bch_err_fn_ratelimited(c, ret);
 
-               if (ret)
-                       return;
+               if (ret) {
+                       const char *estr = bch2_err_str(ret);
+                       struct printbuf buf = PRINTBUF;
+
+                       prt_printf(&buf, "alloc_sectors_start err %s", estr);
+                       trace_update_unwritten_extent(c, buf.buf);
+                       printbuf_exit(&buf);
+                       return ret;
+               }
 
                sectors = min(sectors, wp->sectors_free);
 
@@ -441,11 +476,20 @@ static void bch2_update_unwritten_extent(struct 
btree_trans *trans,
                if (ret)
                        break;
        }
-
+err:
        if (closure_nr_remaining(&cl) != 1) {
                bch2_trans_unlock(trans);
                closure_sync(&cl);
        }
+
+       const char *estr = bch2_err_str(ret);
+       struct printbuf buf = PRINTBUF;
+
+       prt_printf(&buf, "%serr: %s", msg, estr);
+       trace_update_unwritten_extent(c, buf.buf);
+       printbuf_exit(&buf);
+
+       return ret;
 }
 
 int bch2_extent_drop_ptrs(struct btree_trans *trans,
@@ -624,7 +668,7 @@ int bch2_data_update_init(struct btree_trans *trans,
        }
 
        if (bkey_extent_is_unwritten(k)) {
-               bch2_update_unwritten_extent(trans, m);
+               ret = bch2_update_unwritten_extent(trans, m);
                goto done;
        }
 
diff --git a/fs/bcachefs/move.c b/fs/bcachefs/move.c
index bf68ea49447b..40a8305b3860 100644
--- a/fs/bcachefs/move.c
+++ b/fs/bcachefs/move.c
@@ -295,6 +295,12 @@ int bch2_move_extent(struct moving_context *ctxt,
 
        if (!data_opts.rewrite_ptrs &&
            !data_opts.extra_replicas) {
+               struct printbuf buf = PRINTBUF;
+
+               prt_printf(&buf, "drop ptrs or ret 0");
+               trace_move_extent_finish(c, buf.buf);
+
+               printbuf_exit(&buf);
                if (data_opts.kill_ptrs)
                        return bch2_extent_drop_ptrs(trans, iter, k, data_opts);
                return 0;
@@ -388,12 +394,23 @@ int bch2_move_extent(struct moving_context *ctxt,
 err_free:
        kfree(io);
 err:
-       if (ret == -BCH_ERR_data_update_done)
+       if (ret == -BCH_ERR_data_update_done) {
+               struct printbuf buf = PRINTBUF;
+
+               bch2_bkey_val_to_text(&buf, c, k);
+               prt_str(&buf, ": ");
+               prt_str(&buf, bch2_err_str(ret));
+               trace_move_extent_finish(c, buf.buf);
+               printbuf_exit(&buf);
                return 0;
+       }
 
-       if (bch2_err_matches(ret, EROFS) ||
-           bch2_err_matches(ret, BCH_ERR_transaction_restart))
+       if (bch2_err_matches(ret, EROFS))
+               return ret;
+       if (bch2_err_matches(ret, BCH_ERR_transaction_restart)) {
+               trace_move_extent_finish(c, "BCH_ERR_transanction_restart");
                return ret;
+       }
 
        count_event(c, move_extent_start_fail);
 
diff --git a/fs/bcachefs/trace.h b/fs/bcachefs/trace.h
index 293b90d704fb..f48c727d89aa 100644
--- a/fs/bcachefs/trace.h
+++ b/fs/bcachefs/trace.h
@@ -837,6 +837,11 @@ DEFINE_EVENT(fs_str, move_extent_fail,
        TP_ARGS(c, str)
 );
 
+DEFINE_EVENT(fs_str, update_unwritten_extent,
+            TP_PROTO(struct bch_fs *c, const char *k),
+            TP_ARGS(c, k)
+);
+
 DEFINE_EVENT(fs_str, move_extent_start_fail,
        TP_PROTO(struct bch_fs *c, const char *str),
        TP_ARGS(c, str)
@@ -875,16 +880,18 @@ TRACE_EVENT(move_data,
                  __entry->sectors_raced)
 );
 
-TRACE_EVENT(evacuate_bucket,
+TRACE_EVENT(evacuate_bucket_finish,
        TP_PROTO(struct bch_fs *c, struct bpos *bucket,
+                u8 gen,
                 unsigned sectors, unsigned bucket_size,
                 u64 fragmentation, int ret),
-       TP_ARGS(c, bucket, sectors, bucket_size, fragmentation, ret),
+       TP_ARGS(c, bucket, gen, sectors, bucket_size, fragmentation, ret),
 
        TP_STRUCT__entry(
                __field(dev_t,          dev             )
                __field(u64,            member          )
                __field(u64,            bucket          )
+               __field(u8,             gen             )
                __field(u32,            sectors         )
                __field(u32,            bucket_size     )
                __field(u64,            fragmentation   )
-- 
2.43.0


Reply via email to