bcachefs: unify inode trigger
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 28 Dec 2023 05:05:54 +0000 (00:05 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 6 Jan 2024 04:24:19 +0000 (23:24 -0500)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/inode.c
fs/bcachefs/inode.h

index e6978005bafd29029017ef048a4cc24aa8a0f2fb..37dce96f48ac42d28b98d99e75a77b049e04de8f 100644 (file)
@@ -561,61 +561,46 @@ static inline bool bkey_is_deleted_inode(struct bkey_s_c k)
        return bkey_inode_flags(k) & BCH_INODE_unlinked;
 }
 
-int bch2_trans_mark_inode(struct btree_trans *trans,
-                         enum btree_id btree_id, unsigned level,
-                         struct bkey_s_c old,
-                         struct bkey_s new,
-                         unsigned flags)
+int bch2_trigger_inode(struct btree_trans *trans,
+                      enum btree_id btree_id, unsigned level,
+                      struct bkey_s_c old,
+                      struct bkey_s new,
+                      unsigned flags)
 {
        s64 nr = bkey_is_inode(new.k) - bkey_is_inode(old.k);
-       bool old_deleted = bkey_is_deleted_inode(old);
-       bool new_deleted = bkey_is_deleted_inode(new.s_c);
 
-       if (nr) {
-               int ret = bch2_replicas_deltas_realloc(trans, 0);
-               struct replicas_delta_list *d = trans->fs_usage_deltas;
+       if (flags & BTREE_TRIGGER_TRANSACTIONAL) {
+               if (nr) {
+                       int ret = bch2_replicas_deltas_realloc(trans, 0);
+                       if (ret)
+                               return ret;
 
-               if (ret)
-                       return ret;
-
-               d->nr_inodes += nr;
-       }
+                       trans->fs_usage_deltas->nr_inodes += nr;
+               }
 
-       if (old_deleted != new_deleted) {
-               int ret = bch2_btree_bit_mod(trans, BTREE_ID_deleted_inodes, new.k->p, new_deleted);
-               if (ret)
-                       return ret;
+               bool old_deleted = bkey_is_deleted_inode(old);
+               bool new_deleted = bkey_is_deleted_inode(new.s_c);
+               if (old_deleted != new_deleted) {
+                       int ret = bch2_btree_bit_mod(trans, BTREE_ID_deleted_inodes, new.k->p, new_deleted);
+                       if (ret)
+                               return ret;
+               }
        }
 
-       return 0;
-}
-
-int bch2_mark_inode(struct btree_trans *trans,
-                   enum btree_id btree_id, unsigned level,
-                   struct bkey_s_c old, struct bkey_s new,
-                   unsigned flags)
-{
-       struct bch_fs *c = trans->c;
-       struct bch_fs_usage *fs_usage;
-       u64 journal_seq = trans->journal_res.seq;
-
-       if (flags & BTREE_TRIGGER_INSERT) {
-               BUG_ON(!journal_seq);
+       if (!(flags & BTREE_TRIGGER_TRANSACTIONAL) && (flags & BTREE_TRIGGER_INSERT)) {
+               BUG_ON(!trans->journal_res.seq);
 
-               bkey_s_to_inode_v3(new).v->bi_journal_seq = cpu_to_le64(journal_seq);
+               bkey_s_to_inode_v3(new).v->bi_journal_seq = cpu_to_le64(trans->journal_res.seq);
        }
 
        if (flags & BTREE_TRIGGER_GC) {
-               percpu_down_read(&c->mark_lock);
-               preempt_disable();
-
-               fs_usage = fs_usage_ptr(c, journal_seq, flags & BTREE_TRIGGER_GC);
-               fs_usage->nr_inodes += bkey_is_inode(new.k);
-               fs_usage->nr_inodes -= bkey_is_inode(old.k);
+               struct bch_fs *c = trans->c;
 
-               preempt_enable();
+               percpu_down_read(&c->mark_lock);
+               this_cpu_add(c->usage_gc->nr_inodes, nr);
                percpu_up_read(&c->mark_lock);
        }
+
        return 0;
 }
 
index f1838dccfb3c0dd3a3d90bb2142b5985a3680b90..fed552e0140ad934cbca463920c757368b4b2cd2 100644 (file)
@@ -17,32 +17,30 @@ int bch2_inode_v3_invalid(struct bch_fs *, struct bkey_s_c,
                          enum bkey_invalid_flags, struct printbuf *);
 void bch2_inode_to_text(struct printbuf *, struct bch_fs *, struct bkey_s_c);
 
-int bch2_trans_mark_inode(struct btree_trans *, enum btree_id, unsigned,
+int bch2_trigger_inode(struct btree_trans *, enum btree_id, unsigned,
                          struct bkey_s_c, struct bkey_s, unsigned);
-int bch2_mark_inode(struct btree_trans *, enum btree_id, unsigned,
-                   struct bkey_s_c, struct bkey_s, unsigned);
 
 #define bch2_bkey_ops_inode ((struct bkey_ops) {       \
        .key_invalid    = bch2_inode_invalid,           \
        .val_to_text    = bch2_inode_to_text,           \
-       .trans_trigger  = bch2_trans_mark_inode,        \
-       .atomic_trigger = bch2_mark_inode,              \
+       .trans_trigger  = bch2_trigger_inode,           \
+       .atomic_trigger = bch2_trigger_inode,           \
        .min_val_size   = 16,                           \
 })
 
 #define bch2_bkey_ops_inode_v2 ((struct bkey_ops) {    \
        .key_invalid    = bch2_inode_v2_invalid,        \
        .val_to_text    = bch2_inode_to_text,           \
-       .trans_trigger  = bch2_trans_mark_inode,        \
-       .atomic_trigger = bch2_mark_inode,              \
+       .trans_trigger  = bch2_trigger_inode,           \
+       .atomic_trigger = bch2_trigger_inode,           \
        .min_val_size   = 32,                           \
 })
 
 #define bch2_bkey_ops_inode_v3 ((struct bkey_ops) {    \
        .key_invalid    = bch2_inode_v3_invalid,        \
        .val_to_text    = bch2_inode_to_text,           \
-       .trans_trigger  = bch2_trans_mark_inode,        \
-       .atomic_trigger = bch2_mark_inode,              \
+       .trans_trigger  = bch2_trigger_inode,           \
+       .atomic_trigger = bch2_trigger_inode,           \
        .min_val_size   = 48,                           \
 })