summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2024-08-23 21:07:45 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2025-04-29 13:44:31 -0400
commitffaada324dfa916767b021eba9da6fabdca37f89 (patch)
treef63467f60c85de47642e1980e3f288107d7c18b4
parente2bb7d2012b794b70b4aec9e8f0feaaa124594ee (diff)
fsck_trigger_fn
-rw-r--r--fs/bcachefs/bcachefs.h8
-rw-r--r--fs/bcachefs/btree_trans_commit.c22
-rw-r--r--fs/bcachefs/fsck.c5
3 files changed, 34 insertions, 1 deletions
diff --git a/fs/bcachefs/bcachefs.h b/fs/bcachefs/bcachefs.h
index e7c005901716..182233a5c560 100644
--- a/fs/bcachefs/bcachefs.h
+++ b/fs/bcachefs/bcachefs.h
@@ -478,6 +478,7 @@ enum bch_time_stats {
#include "alloc_types.h"
#include "async_objs_types.h"
+#include "bkey.h"
#include "btree_gc_types.h"
#include "btree_types.h"
#include "btree_node_scan_types.h"
@@ -763,6 +764,9 @@ enum bch_write_ref {
#define BCH_FS_DEFAULT_UTF8_ENCODING UNICODE_AGE(12, 1, 0)
+typedef void (*fsck_trigger_fn)(struct bch_fs *, enum btree_id,
+ struct bkey_s_c, struct bkey_s_c);
+
struct bch_fs {
struct closure cl;
@@ -1016,9 +1020,11 @@ struct bch_fs {
*/
seqcount_t gc_pos_lock;
struct gc_pos gc_pos;
- struct percpu_rw_semaphore
check_allocations_done_lock;
+ fsck_trigger_fn fsck_trigger;
+ void *fsck_trigger_priv;
+
struct mutex gc_gens_lock;
/* IO PATH */
diff --git a/fs/bcachefs/btree_trans_commit.c b/fs/bcachefs/btree_trans_commit.c
index e385aadbc379..a2579d637197 100644
--- a/fs/bcachefs/btree_trans_commit.c
+++ b/fs/bcachefs/btree_trans_commit.c
@@ -583,6 +583,25 @@ static noinline int bch2_trans_commit_run_gc_triggers(struct btree_trans *trans)
return 0;
}
+static noinline void bch2_trans_commit_run_fsck_triggers(struct btree_trans *trans)
+{
+ struct bch_fs *c = trans->c;
+ fsck_trigger_fn fsck_trigger = READ_ONCE(c->fsck_trigger);
+
+ if (!fsck_trigger)
+ return;
+
+ trans_for_each_update(trans, i) {
+ if (i->level)
+ continue;
+
+ struct bkey_s_c old = { &i->old_k, i->old_v };
+ struct bkey_s_c new = bkey_i_to_s_c(i->k);
+
+ fsck_trigger(c, i->btree_id, old, new);
+ }
+}
+
static noinline void __trace_transaction_commit(struct btree_trans *trans, unsigned long ip)
{
struct printbuf buf = PRINTBUF;
@@ -672,6 +691,9 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags,
h = h->next;
}
+ if (unlikely(c->fsck_trigger))
+ bch2_trans_commit_run_fsck_triggers(trans);
+
struct jset_entry *entry = trans->journal_entries;
percpu_down_read(&c->mark_lock);
diff --git a/fs/bcachefs/fsck.c b/fs/bcachefs/fsck.c
index a6c0cf4d6b98..9efbb026c411 100644
--- a/fs/bcachefs/fsck.c
+++ b/fs/bcachefs/fsck.c
@@ -2339,6 +2339,11 @@ int bch2_check_dirents(struct bch_fs *c)
return ret;
}
+static void fsck_trigger(struct bch_fs *c, enum btree_id btree,
+ struct bkey_s_c old, struct bkey_s_c new)
+{
+}
+
static int check_xattr(struct btree_trans *trans, struct btree_iter *iter,
struct bkey_s_c k,
struct bch_hash_info *hash_info,