bcachefs: bch2_bkey_alloc() now calls bch2_trans_update()
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 30 Apr 2023 22:59:28 +0000 (18:59 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:10:01 +0000 (17:10 -0400)
It's safe to call bch2_trans_update with a k/v pair where the value
hasn't been filled out, as long as the key part has been and the value
is filled out by transaction commit time.

This patch folds the bch2_trans_update() call into bch2_bkey_alloc(),
eliminating a bit of boilerplate.

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

index 5e2aa21caf55d02999a3cea117bd09afae6faf9c..5743a6e0f4744bbef8ac4f50cc7a3e75a27db12d 100644 (file)
@@ -251,22 +251,27 @@ static inline struct bkey_i *bch2_bkey_get_mut(struct btree_trans *trans,
                        KEY_TYPE_##_type, sizeof(struct bkey_i_##_type)))
 
 static inline struct bkey_i *__bch2_bkey_alloc(struct btree_trans *trans, struct btree_iter *iter,
-                                              unsigned type, unsigned val_size)
+                                              unsigned flags, unsigned type, unsigned val_size)
 {
        struct bkey_i *k = bch2_trans_kmalloc(trans, sizeof(*k) + val_size);
+       int ret;
 
-       if (!IS_ERR(k)) {
-               bkey_init(&k->k);
-               k->k.p = iter->pos;
-               k->k.type = type;
-               set_bkey_val_bytes(&k->k, val_size);
-       }
+       if (IS_ERR(k))
+               return k;
+
+       bkey_init(&k->k);
+       k->k.p = iter->pos;
+       k->k.type = type;
+       set_bkey_val_bytes(&k->k, val_size);
 
+       ret = bch2_trans_update(trans, iter, k, flags);
+       if (unlikely(ret))
+               return ERR_PTR(ret);
        return k;
 }
 
-#define bch2_bkey_alloc(_trans, _iter, _type)                          \
-       bkey_i_to_##_type(__bch2_bkey_alloc(_trans, _iter,              \
+#define bch2_bkey_alloc(_trans, _iter, _flags, _type)                  \
+       bkey_i_to_##_type(__bch2_bkey_alloc(_trans, _iter, _flags,      \
                                KEY_TYPE_##_type, sizeof(struct bch_##_type)))
 
 #endif /* _BCACHEFS_BTREE_UPDATE_H */
index eea4c255899879c9de29f502e0007416b3b2134e..48956453340d37cf9301841febcb60ccb7c09e04 100644 (file)
@@ -476,7 +476,7 @@ int bch2_snapshot_node_create(struct btree_trans *trans, u32 parent,
                        goto err;
                }
 
-               n = bch2_bkey_alloc(trans, &iter, snapshot);
+               n = bch2_bkey_alloc(trans, &iter, 0, snapshot);
                ret = PTR_ERR_OR_ZERO(n);
                if (ret)
                        goto err;
@@ -487,9 +487,8 @@ int bch2_snapshot_node_create(struct btree_trans *trans, u32 parent,
                n->v.pad        = 0;
                SET_BCH_SNAPSHOT_SUBVOL(&n->v, true);
 
-               ret   = bch2_trans_update(trans, &iter, &n->k_i, 0) ?:
-                       bch2_mark_snapshot(trans, BTREE_ID_snapshots, 0,
-                                          bkey_s_c_null, bkey_i_to_s_c(&n->k_i), 0);
+               ret = bch2_mark_snapshot(trans, BTREE_ID_snapshots, 0,
+                                        bkey_s_c_null, bkey_i_to_s_c(&n->k_i), 0);
                if (ret)
                        goto err;
 
@@ -981,7 +980,7 @@ found_slot:
                        goto err;
        }
 
-       new_subvol = bch2_bkey_alloc(trans, &dst_iter, subvolume);
+       new_subvol = bch2_bkey_alloc(trans, &dst_iter, 0, subvolume);
        ret = PTR_ERR_OR_ZERO(new_subvol);
        if (ret)
                goto err;
@@ -991,9 +990,6 @@ found_slot:
        new_subvol->v.inode     = cpu_to_le64(inode);
        SET_BCH_SUBVOLUME_RO(&new_subvol->v, ro);
        SET_BCH_SUBVOLUME_SNAP(&new_subvol->v, src_subvolid != 0);
-       ret = bch2_trans_update(trans, &dst_iter, &new_subvol->k_i, 0);
-       if (ret)
-               goto err;
 
        *new_subvolid   = new_subvol->k.p.offset;
        *new_snapshotid = new_nodes[0];