]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bcachefs: unify reservation trigger
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 28 Dec 2023 05:50:21 +0000 (00:50 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 6 Jan 2024 04:24:20 +0000 (23:24 -0500)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/buckets.c
fs/bcachefs/buckets.h
fs/bcachefs/extents.h

index 233590cff14e736616ece56f7510023515c937af..ee28eacb5a210e38873b5496bdc7963d9337123b 100644 (file)
@@ -1121,45 +1121,6 @@ int bch2_mark_stripe(struct btree_trans *trans,
        return 0;
 }
 
-static int __mark_reservation(struct btree_trans *trans,
-                             enum btree_id btree_id, unsigned level,
-                             struct bkey_s_c k, unsigned flags)
-{
-       struct bch_fs *c = trans->c;
-       struct bch_fs_usage *fs_usage;
-       unsigned replicas = bkey_s_c_to_reservation(k).v->nr_replicas;
-       s64 sectors = (s64) k.k->size;
-
-       BUG_ON(!(flags & BTREE_TRIGGER_GC));
-
-       if (flags & BTREE_TRIGGER_OVERWRITE)
-               sectors = -sectors;
-       sectors *= replicas;
-
-       percpu_down_read(&c->mark_lock);
-       preempt_disable();
-
-       fs_usage = fs_usage_ptr(c, trans->journal_res.seq, flags & BTREE_TRIGGER_GC);
-       replicas = clamp_t(unsigned, replicas, 1,
-                          ARRAY_SIZE(fs_usage->persistent_reserved));
-
-       fs_usage->reserved                              += sectors;
-       fs_usage->persistent_reserved[replicas - 1]     += sectors;
-
-       preempt_enable();
-       percpu_up_read(&c->mark_lock);
-
-       return 0;
-}
-
-int bch2_mark_reservation(struct btree_trans *trans,
-                         enum btree_id btree_id, unsigned level,
-                         struct bkey_s_c old, struct bkey_s new,
-                         unsigned flags)
-{
-       return trigger_run_overwrite_then_insert(__mark_reservation, trans, btree_id, level, old, new, flags);
-}
-
 void bch2_trans_fs_usage_revert(struct btree_trans *trans,
                                struct replicas_delta_list *deltas)
 {
@@ -1593,40 +1554,57 @@ int bch2_trans_mark_stripe(struct btree_trans *trans,
        return ret;
 }
 
-static int __trans_mark_reservation(struct btree_trans *trans,
-                                   enum btree_id btree_id, unsigned level,
-                                   struct bkey_s_c k, unsigned flags)
+/* KEY_TYPE_reservation */
+
+static int __trigger_reservation(struct btree_trans *trans,
+                                enum btree_id btree_id, unsigned level,
+                                struct bkey_s_c k, unsigned flags)
 {
+       struct bch_fs *c = trans->c;
        unsigned replicas = bkey_s_c_to_reservation(k).v->nr_replicas;
-       s64 sectors = (s64) k.k->size;
-       struct replicas_delta_list *d;
-       int ret;
+       s64 sectors = (s64) k.k->size * replicas;
 
        if (flags & BTREE_TRIGGER_OVERWRITE)
                sectors = -sectors;
-       sectors *= replicas;
 
-       ret = bch2_replicas_deltas_realloc(trans, 0);
-       if (ret)
-               return ret;
+       if (flags & BTREE_TRIGGER_TRANSACTIONAL) {
+               int ret = bch2_replicas_deltas_realloc(trans, 0);
+               if (ret)
+                       return ret;
 
-       d = trans->fs_usage_deltas;
-       replicas = clamp_t(unsigned, replicas, 1,
-                          ARRAY_SIZE(d->persistent_reserved));
+               struct replicas_delta_list *d = trans->fs_usage_deltas;
+               replicas = min(replicas, ARRAY_SIZE(d->persistent_reserved));
+
+               d->persistent_reserved[replicas - 1] += sectors;
+       }
+
+       if (flags & BTREE_TRIGGER_GC) {
+               percpu_down_read(&c->mark_lock);
+               preempt_disable();
+
+               struct bch_fs_usage *fs_usage = this_cpu_ptr(c->usage_gc);
+
+               replicas = min(replicas, ARRAY_SIZE(fs_usage->persistent_reserved));
+               fs_usage->reserved                              += sectors;
+               fs_usage->persistent_reserved[replicas - 1]     += sectors;
+
+               preempt_enable();
+               percpu_up_read(&c->mark_lock);
+       }
 
-       d->persistent_reserved[replicas - 1] += sectors;
        return 0;
 }
 
-int bch2_trans_mark_reservation(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_reservation(struct btree_trans *trans,
+                         enum btree_id btree_id, unsigned level,
+                         struct bkey_s_c old, struct bkey_s new,
+                         unsigned flags)
 {
-       return trigger_run_overwrite_then_insert(__trans_mark_reservation, trans, btree_id, level, old, new, flags);
+       return trigger_run_overwrite_then_insert(__trigger_reservation, trans, btree_id, level, old, new, flags);
 }
 
+/* Mark superblocks: */
+
 static int __bch2_trans_mark_metadata_bucket(struct btree_trans *trans,
                                    struct bch_dev *ca, size_t b,
                                    enum bch_data_type type,
index c2ffa1bd57b606e4fea065a57f64ce54fbba2d75..8cf8d32b0eb3fc7381c0cf2fe38981c77e0a40fa 100644 (file)
@@ -333,12 +333,11 @@ int bch2_mark_extent(struct btree_trans *, enum btree_id, unsigned,
                     struct bkey_s_c, struct bkey_s, unsigned);
 int bch2_mark_stripe(struct btree_trans *, enum btree_id, unsigned,
                     struct bkey_s_c, struct bkey_s, unsigned);
-int bch2_mark_reservation(struct btree_trans *, enum btree_id, unsigned,
+int bch2_trigger_reservation(struct btree_trans *, enum btree_id, unsigned,
                          struct bkey_s_c, struct bkey_s, unsigned);
 
 int bch2_trans_mark_extent(struct btree_trans *, enum btree_id, unsigned, struct bkey_s_c, struct bkey_s, unsigned);
 int bch2_trans_mark_stripe(struct btree_trans *, enum btree_id, unsigned, struct bkey_s_c, struct bkey_s, unsigned);
-int bch2_trans_mark_reservation(struct btree_trans *, enum btree_id, unsigned, struct bkey_s_c, struct bkey_s, unsigned);
 #define trigger_run_overwrite_then_insert(_fn, _trans, _btree_id, _level, _old, _new, _flags)\
 ({                                                                                             \
        int ret = 0;                                                                            \
index 77ae4476578b1a7721cceee22be4ded1b1db90a1..374ce357e8bb5a4ed0bc9ef3aba12d6f983f852e 100644 (file)
@@ -454,8 +454,8 @@ bool bch2_reservation_merge(struct bch_fs *, struct bkey_s, struct bkey_s_c);
        .key_invalid    = bch2_reservation_invalid,             \
        .val_to_text    = bch2_reservation_to_text,             \
        .key_merge      = bch2_reservation_merge,               \
-       .trans_trigger  = bch2_trans_mark_reservation,          \
-       .atomic_trigger = bch2_mark_reservation,                \
+       .trans_trigger  = bch2_trigger_reservation,             \
+       .atomic_trigger = bch2_trigger_reservation,             \
        .min_val_size   = 8,                                    \
 })