diff options
Diffstat (limited to 'libbcachefs/extents.c')
-rw-r--r-- | libbcachefs/extents.c | 34 |
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 */ |