diff options
Diffstat (limited to 'fs/bcachefs/backpointers.c')
-rw-r--r-- | fs/bcachefs/backpointers.c | 107 |
1 files changed, 16 insertions, 91 deletions
diff --git a/fs/bcachefs/backpointers.c b/fs/bcachefs/backpointers.c index 7d4367f93b5c..8b83992f3963 100644 --- a/fs/bcachefs/backpointers.c +++ b/fs/bcachefs/backpointers.c @@ -208,8 +208,7 @@ int bch2_bucket_backpointer_del(struct btree_trans *trans, struct bch_fs *c = trans->c; struct bch_backpointer *bps = alloc_v4_backpointers(&a->v); unsigned i, nr = BCH_ALLOC_V4_NR_BACKPOINTERS(&a->v); - struct btree_iter bp_iter; - struct bkey_s_c k; + struct bkey_i *delete; int ret; for (i = 0; i < nr; i++) { @@ -228,52 +227,15 @@ found: set_alloc_v4_u64s(a); return 0; btree: - bch2_trans_iter_init(trans, &bp_iter, BTREE_ID_backpointers, - bucket_pos_to_bp(c, a->k.p, bp.bucket_offset), - BTREE_ITER_INTENT| - BTREE_ITER_SLOTS| - BTREE_ITER_WITH_UPDATES); - k = bch2_btree_iter_peek_slot(&bp_iter); - ret = bkey_err(k); + delete = bch2_trans_kmalloc_nomemzero(trans, sizeof(*delete)); + ret = PTR_ERR_OR_ZERO(delete); if (ret) - goto err; - - if (k.k->type != KEY_TYPE_backpointer || - memcmp(bkey_s_c_to_backpointer(k).v, &bp, sizeof(bp))) { - struct printbuf buf = PRINTBUF; - - prt_printf(&buf, "backpointer not found when deleting"); - prt_newline(&buf); - printbuf_indent_add(&buf, 2); - - prt_printf(&buf, "searching for "); - bch2_backpointer_to_text(&buf, &bp); - prt_newline(&buf); - - prt_printf(&buf, "got "); - bch2_bkey_val_to_text(&buf, c, k); - prt_newline(&buf); - - prt_str(&buf, "alloc "); - bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(&a->k_i)); - prt_newline(&buf); + return ret; - prt_printf(&buf, "for "); - bch2_bkey_val_to_text(&buf, c, orig_k); + bkey_init(&delete->k); + delete->k.p = bucket_pos_to_bp(c, a->k.p, bp.bucket_offset); - bch_err(c, "%s", buf.buf); - if (test_bit(BCH_FS_CHECK_BACKPOINTERS_DONE, &c->flags)) { - bch2_inconsistent_error(c); - ret = -EIO; - } - printbuf_exit(&buf); - goto err; - } - - ret = bch2_btree_delete_at(trans, &bp_iter, 0); -err: - bch2_trans_iter_exit(trans, &bp_iter); - return ret; + return bch2_trans_update_buffered(trans, BTREE_ID_backpointers, delete); } int bch2_bucket_backpointer_add(struct btree_trans *trans, @@ -282,13 +244,11 @@ int bch2_bucket_backpointer_add(struct btree_trans *trans, struct bkey_s_c orig_k) { struct bch_fs *c = trans->c; - struct bch_backpointer *bps = alloc_v4_backpointers(&a->v); - unsigned i, nr = BCH_ALLOC_V4_NR_BACKPOINTERS(&a->v); struct bkey_i_backpointer *bp_k; - struct btree_iter bp_iter; - struct bkey_s_c k; int ret; - +#if 0 + struct bch_backpointer *bps = alloc_v4_backpointers(&a->v); + unsigned i, nr = BCH_ALLOC_V4_NR_BACKPOINTERS(&a->v); /* Check for duplicates: */ for (i = 0; i < nr; i++) { int cmp = backpointer_cmp(bps[i], bp); @@ -331,52 +291,17 @@ int bch2_bucket_backpointer_add(struct btree_trans *trans, } /* Overflow: use backpointer btree */ - - bch2_trans_iter_init(trans, &bp_iter, BTREE_ID_backpointers, - bucket_pos_to_bp(c, a->k.p, bp.bucket_offset), - BTREE_ITER_INTENT| - BTREE_ITER_SLOTS| - BTREE_ITER_WITH_UPDATES); - k = bch2_btree_iter_peek_slot(&bp_iter); - ret = bkey_err(k); - if (ret) - goto err; - - if (k.k->type) { - struct printbuf buf = PRINTBUF; - - prt_printf(&buf, "existing btree backpointer key found when inserting "); - bch2_backpointer_to_text(&buf, &bp); - prt_newline(&buf); - printbuf_indent_add(&buf, 2); - - prt_printf(&buf, "found "); - bch2_bkey_val_to_text(&buf, c, k); - prt_newline(&buf); - - prt_printf(&buf, "for "); - bch2_bkey_val_to_text(&buf, c, orig_k); - - bch_err(c, "%s", buf.buf); - printbuf_exit(&buf); - if (test_bit(BCH_FS_CHECK_BACKPOINTERS_DONE, &c->flags)) { - bch2_inconsistent_error(c); - ret = -EIO; - goto err; - } - } - - bp_k = bch2_bkey_alloc(trans, &bp_iter, backpointer); +#endif + bp_k = bch2_trans_kmalloc_nomemzero(trans, sizeof(struct bkey_i_backpointer)); ret = PTR_ERR_OR_ZERO(bp_k); if (ret) - goto err; + return ret; + bkey_backpointer_init(&bp_k->k_i); + bp_k->k.p = bucket_pos_to_bp(c, a->k.p, bp.bucket_offset); bp_k->v = bp; - ret = bch2_trans_update(trans, &bp_iter, &bp_k->k_i, 0); -err: - bch2_trans_iter_exit(trans, &bp_iter); - return ret; + return bch2_trans_update_buffered(trans, BTREE_ID_backpointers, &bp_k->k_i); } /* |