]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bcachefs: Optimize bch2_trans_start_alloc_update()
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 16 May 2025 21:29:53 +0000 (17:29 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 22 May 2025 00:15:02 +0000 (20:15 -0400)
Avoid doing more updates if we already have one.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/alloc_background.c

index 5934104af7e6b73a745c1521f1cf257e21e0e0a1..f8d21c12c3d1fc56d8f6a5f4a68061167c95443e 100644 (file)
@@ -479,11 +479,26 @@ struct bkey_i_alloc_v4 *bch2_trans_start_alloc_update(struct btree_trans *trans,
                                                      enum btree_iter_update_trigger_flags flags)
 {
        struct btree_iter iter;
-       struct bkey_i_alloc_v4 *a = bch2_trans_start_alloc_update_noupdate(trans, &iter, pos);
-       int ret = PTR_ERR_OR_ZERO(a);
-       if (ret)
+       struct bkey_s_c k = bch2_bkey_get_iter(trans, &iter, BTREE_ID_alloc, pos,
+                                              BTREE_ITER_with_updates|
+                                              BTREE_ITER_cached|
+                                              BTREE_ITER_intent);
+       int ret = bkey_err(k);
+       if (unlikely(ret))
                return ERR_PTR(ret);
 
+       if ((void *) k.v >= trans->mem &&
+           (void *) k.v <  trans->mem + trans->mem_top) {
+               bch2_trans_iter_exit(trans, &iter);
+               return container_of(bkey_s_c_to_alloc_v4(k).v, struct bkey_i_alloc_v4, v);
+       }
+
+       struct bkey_i_alloc_v4 *a = bch2_alloc_to_v4_mut_inlined(trans, k);
+       if (IS_ERR(a)) {
+               bch2_trans_iter_exit(trans, &iter);
+               return a;
+       }
+
        ret = bch2_trans_update_ip(trans, &iter, &a->k_i, flags, _RET_IP_);
        bch2_trans_iter_exit(trans, &iter);
        return unlikely(ret) ? ERR_PTR(ret) : a;