diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2024-08-23 21:07:45 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2025-04-29 13:44:31 -0400 |
commit | ffaada324dfa916767b021eba9da6fabdca37f89 (patch) | |
tree | f63467f60c85de47642e1980e3f288107d7c18b4 | |
parent | e2bb7d2012b794b70b4aec9e8f0feaaa124594ee (diff) |
fsck_trigger_fn
-rw-r--r-- | fs/bcachefs/bcachefs.h | 8 | ||||
-rw-r--r-- | fs/bcachefs/btree_trans_commit.c | 22 | ||||
-rw-r--r-- | fs/bcachefs/fsck.c | 5 |
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, |