summaryrefslogtreecommitdiff
path: root/libbcachefs/extents.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/extents.c')
-rw-r--r--libbcachefs/extents.c34
1 files changed, 15 insertions, 19 deletions
diff --git a/libbcachefs/extents.c b/libbcachefs/extents.c
index b85af711..fe4bb527 100644
--- a/libbcachefs/extents.c
+++ b/libbcachefs/extents.c
@@ -778,7 +778,7 @@ static bool __bch2_cut_front(struct bpos where, struct bkey_s k)
* cause offset to point to the next bucket:
*/
if (!len)
- __set_bkey_deleted(k.k);
+ k.k->type = KEY_TYPE_DELETED;
else if (bkey_extent_is_data(k.k)) {
struct bkey_s_extent e = bkey_s_to_extent(k);
union bch_extent_entry *entry;
@@ -833,7 +833,7 @@ bool bch2_cut_back(struct bpos where, struct bkey *k)
k->size = len;
if (!len)
- __set_bkey_deleted(k);
+ k->type = KEY_TYPE_DELETED;
return true;
}
@@ -1103,7 +1103,7 @@ static void bch2_drop_subtract(struct extent_insert_state *s, struct bkey_s k)
bch2_subtract_sectors(s, k.s_c,
bkey_start_offset(k.k), k.k->size);
k.k->size = 0;
- __set_bkey_deleted(k.k);
+ k.k->type = KEY_TYPE_DELETED;
}
static bool bch2_extent_merge_inline(struct bch_fs *,
@@ -1143,10 +1143,13 @@ static void extent_bset_insert(struct bch_fs *c, struct btree_iter *iter,
struct bset_tree *t = bset_tree_last(l->b);
struct bkey_packed *where =
bch2_btree_node_iter_bset_pos(&l->iter, l->b, t);
- struct bkey_packed *prev = bch2_bkey_prev(l->b, t, where);
+ struct bkey_packed *prev = bch2_bkey_prev_filter(l->b, t, where,
+ KEY_TYPE_DISCARD);
struct bkey_packed *next_live_key = where;
unsigned clobber_u64s;
+ EBUG_ON(bkey_deleted(&insert->k) || !insert->k.size);
+
if (prev)
where = bkey_next(prev);
@@ -1188,6 +1191,7 @@ static void extent_insert_committed(struct extent_insert_state *s)
: &s->whiteout;
BKEY_PADDED(k) split;
+ EBUG_ON(bkey_deleted(&insert->k) || !insert->k.size);
EBUG_ON(bkey_cmp(insert->k.p, s->committed) < 0);
EBUG_ON(bkey_cmp(s->committed, bkey_start_pos(&insert->k)) < 0);
@@ -1246,8 +1250,6 @@ __extent_insert_advance_pos(struct extent_insert_state *s,
else
ret = BTREE_INSERT_OK;
- EBUG_ON(bkey_deleted(&s->insert->k->k) || !s->insert->k->k.size);
-
if (ret == BTREE_INSERT_OK)
s->committed = next_pos;
@@ -1446,6 +1448,7 @@ __bch2_delete_fixup_extent(struct extent_insert_state *s)
EBUG_ON(bkey_cmp(iter->pos, bkey_start_pos(&insert->k)));
s->whiteout = *insert;
+ s->whiteout.k.type = KEY_TYPE_DISCARD;
while (bkey_cmp(s->committed, insert->k.p) < 0 &&
(ret = extent_insert_should_stop(s)) == BTREE_INSERT_OK &&
@@ -1488,6 +1491,8 @@ __bch2_delete_fixup_extent(struct extent_insert_state *s)
bset_written(b, bset(b, t))) {
struct bkey_i discard = *insert;
+ discard.k.type = KEY_TYPE_DISCARD;
+
switch (overlap) {
case BCH_EXTENT_OVERLAP_FRONT:
bch2_cut_front(bkey_start_pos(k.k), &discard);
@@ -1634,7 +1639,7 @@ bch2_insert_fixup_extent(struct btree_insert *trans,
};
EBUG_ON(iter->level);
- EBUG_ON(bkey_deleted(&insert->k->k) || !insert->k->k.size);
+ EBUG_ON(!insert->k->k.size);
/*
* As we process overlapping extents, we advance @iter->pos both to
@@ -1979,11 +1984,11 @@ bool bch2_extent_normalize(struct bch_fs *c, struct bkey_s k)
return false;
case KEY_TYPE_DELETED:
- case KEY_TYPE_COOKIE:
return true;
-
case KEY_TYPE_DISCARD:
return bversion_zero(k.k->version);
+ case KEY_TYPE_COOKIE:
+ return false;
case BCH_EXTENT:
case BCH_EXTENT_CACHED:
@@ -2051,11 +2056,6 @@ int bch2_extent_pick_ptr(struct bch_fs *c, struct bkey_s_c k,
int ret;
switch (k.k->type) {
- case KEY_TYPE_DELETED:
- case KEY_TYPE_DISCARD:
- case KEY_TYPE_COOKIE:
- return 0;
-
case KEY_TYPE_ERROR:
return -EIO;
@@ -2069,11 +2069,8 @@ int bch2_extent_pick_ptr(struct bch_fs *c, struct bkey_s_c k,
return ret;
- case BCH_RESERVATION:
- return 0;
-
default:
- BUG();
+ return 0;
}
}
@@ -2099,7 +2096,6 @@ enum merge_result bch2_extent_merge(struct bch_fs *c, struct btree *b,
return BCH_MERGE_NOMERGE;
switch (l->k.type) {
- case KEY_TYPE_DELETED:
case KEY_TYPE_DISCARD:
case KEY_TYPE_ERROR:
/* These types are mergeable, and no val to check */