summaryrefslogtreecommitdiff
path: root/libbcachefs/btree_update_leaf.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2020-01-21 17:24:32 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2020-01-21 17:24:32 -0500
commite0eb64c84601b2bbae055df809dd21f95f85c034 (patch)
tree85ac2fd5b2092ab96646cf05c00ce10d22f27088 /libbcachefs/btree_update_leaf.c
parent4d697aa315701e238e93e77947ac7ee61f10c578 (diff)
Update bcachefs sources to 3cd63315a6 bcachefs: Track incompressible data
Diffstat (limited to 'libbcachefs/btree_update_leaf.c')
-rw-r--r--libbcachefs/btree_update_leaf.c95
1 files changed, 51 insertions, 44 deletions
diff --git a/libbcachefs/btree_update_leaf.c b/libbcachefs/btree_update_leaf.c
index dfbe5dcd..afd2086e 100644
--- a/libbcachefs/btree_update_leaf.c
+++ b/libbcachefs/btree_update_leaf.c
@@ -64,64 +64,63 @@ bool bch2_btree_bset_insert_key(struct btree_iter *iter,
bkey_cmp(insert->k.p, b->data->max_key) > 0);
k = bch2_btree_node_iter_peek_all(node_iter, b);
- if (k && !bkey_cmp_packed(b, k, &insert->k)) {
- BUG_ON(bkey_whiteout(k));
+ if (k && bkey_cmp_packed(b, k, &insert->k))
+ k = NULL;
- if (!bkey_written(b, k) &&
- bkey_val_u64s(&insert->k) == bkeyp_val_u64s(f, k) &&
- !bkey_whiteout(&insert->k)) {
- k->type = insert->k.type;
- memcpy_u64s(bkeyp_val(f, k), &insert->v,
- bkey_val_u64s(&insert->k));
- return true;
- }
+ /* @k is the key being overwritten/deleted, if any: */
- btree_account_key_drop(b, k);
+ EBUG_ON(k && bkey_whiteout(k));
- if (bkey_whiteout(&insert->k)) {
- unsigned clobber_u64s = k->u64s, new_u64s = k->u64s;
+ if (bkey_whiteout(&insert->k)) {
+ /* Deleting: */
- k->type = KEY_TYPE_deleted;
+ /* Not found? Nothing to do: */
+ if (!k)
+ return false;
- if (k->needs_whiteout) {
- push_whiteout(iter->trans->c, b, k);
- k->needs_whiteout = false;
- }
+ btree_account_key_drop(b, k);
+ k->type = KEY_TYPE_deleted;
- if (k >= btree_bset_last(b)->start) {
- bch2_bset_delete(b, k, clobber_u64s);
- new_u64s = 0;
- }
+ if (k->needs_whiteout) {
+ push_whiteout(iter->trans->c, b, k);
+ k->needs_whiteout = false;
+ }
+
+ if (k >= btree_bset_last(b)->start) {
+ clobber_u64s = k->u64s;
+ bch2_bset_delete(b, k, clobber_u64s);
bch2_btree_node_iter_fix(iter, b, node_iter, k,
- clobber_u64s, new_u64s);
- return true;
+ clobber_u64s, 0);
+ } else {
+ bch2_btree_iter_fix_key_modified(iter, b, k);
+ }
+
+ return true;
+ }
+ if (k) {
+ /* Overwriting: */
+ if (!bkey_written(b, k) &&
+ bkey_val_u64s(&insert->k) == bkeyp_val_u64s(f, k)) {
+ k->type = insert->k.type;
+ memcpy_u64s(bkeyp_val(f, k), &insert->v,
+ bkey_val_u64s(&insert->k));
+ return true;
}
+ btree_account_key_drop(b, k);
+ k->type = KEY_TYPE_deleted;
+
insert->k.needs_whiteout = k->needs_whiteout;
k->needs_whiteout = false;
if (k >= btree_bset_last(b)->start) {
clobber_u64s = k->u64s;
goto overwrite;
+ } else {
+ bch2_btree_iter_fix_key_modified(iter, b, k);
}
-
- 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);
- } else {
- /*
- * Deleting, but the key to delete wasn't found - nothing to do:
- */
- if (bkey_whiteout(&insert->k))
- return false;
-
- insert->k.needs_whiteout = false;
}
k = bch2_btree_node_iter_bset_pos(node_iter, b, bset_tree_last(b));
@@ -707,10 +706,18 @@ int __bch2_trans_commit(struct btree_trans *trans)
trans_trigger_run = false;
trans_for_each_update(trans, i) {
- /* we know trans->nounlock won't be set here: */
- if (unlikely(!(i->iter->locks_want < 1
- ? __bch2_btree_iter_upgrade(i->iter, 1)
- : i->iter->uptodate <= BTREE_ITER_NEED_PEEK))) {
+ if (unlikely(i->iter->uptodate > BTREE_ITER_NEED_PEEK)) {
+ trace_trans_restart_traverse(trans->ip);
+ ret = -EINTR;
+ goto out;
+ }
+
+ /*
+ * We're not using bch2_btree_iter_upgrade here because
+ * we know trans->nounlock can't be set:
+ */
+ if (unlikely(i->iter->locks_want < 1 &&
+ !__bch2_btree_iter_upgrade(i->iter, 1))) {
trace_trans_restart_upgrade(trans->ip);
ret = -EINTR;
goto out;