]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/btree_update_leaf.c
Update bcachefs sources to fbb669e9de bcachefs: Kill btree_node_iter_large
[bcachefs-tools-debian] / libbcachefs / btree_update_leaf.c
index 54893b7b151e24ba0fb86546f2654ec8e40d5efb..46c0a1e7fa2029e65f31ce1adc2827dbbab1dee1 100644 (file)
@@ -104,38 +104,43 @@ bool bch2_btree_bset_insert_key(struct btree_iter *iter,
                        return true;
                }
 
-               insert->k.needs_whiteout = k->needs_whiteout;
-
                btree_account_key_drop(b, k);
 
-               if (k >= btree_bset_last(b)->start) {
-                       clobber_u64s = k->u64s;
+               if (bkey_whiteout(&insert->k)) {
+                       unsigned clobber_u64s = k->u64s, new_u64s = k->u64s;
+
+                       k->type = KEY_TYPE_deleted;
 
-                       /*
-                        * If we're deleting, and the key we're deleting doesn't
-                        * need a whiteout (it wasn't overwriting a key that had
-                        * been written to disk) - just delete it:
-                        */
-                       if (bkey_whiteout(&insert->k) && !k->needs_whiteout) {
+                       if (k->needs_whiteout) {
+                               push_whiteout(iter->trans->c, b, k);
+                               k->needs_whiteout = false;
+                       }
+
+                       if (k >= btree_bset_last(b)->start) {
                                bch2_bset_delete(b, k, clobber_u64s);
-                               bch2_btree_node_iter_fix(iter, b, node_iter,
-                                                        k, clobber_u64s, 0);
-                               return true;
+                               new_u64s = 0;
                        }
 
+                       bch2_btree_node_iter_fix(iter, b, node_iter, k,
+                                                clobber_u64s, new_u64s);
+                       return true;
+
+               }
+
+               if (k >= btree_bset_last(b)->start) {
+                       clobber_u64s = k->u64s;
                        goto overwrite;
                }
 
+               insert->k.needs_whiteout = k->needs_whiteout;
+               k->needs_whiteout = false;
                k->type = KEY_TYPE_deleted;
+               /*
+                * XXX: we should be able to do this without two calls to
+                * bch2_btree_node_iter_fix:
+                */
                bch2_btree_node_iter_fix(iter, b, node_iter, k,
                                         k->u64s, k->u64s);
-
-               if (bkey_whiteout(&insert->k)) {
-                       reserve_whiteout(b, k);
-                       return true;
-               } else {
-                       k->needs_whiteout = false;
-               }
        } else {
                /*
                 * Deleting, but the key to delete wasn't found - nothing to do:
@@ -863,9 +868,6 @@ retry:
               bkey_cmp(iter->pos, end) < 0) {
                struct bkey_i delete;
 
-               bch2_trans_unlink_iters(trans);
-               trans->iters_touched &= trans->iters_live;
-
                bkey_init(&delete.k);
 
                /*