diff options
Diffstat (limited to 'fs/bcachefs/btree_update.c')
-rw-r--r-- | fs/bcachefs/btree_update.c | 45 |
1 files changed, 5 insertions, 40 deletions
diff --git a/fs/bcachefs/btree_update.c b/fs/bcachefs/btree_update.c index ff7b53c6b0fb..f514a8ad7a89 100644 --- a/fs/bcachefs/btree_update.c +++ b/fs/bcachefs/btree_update.c @@ -164,19 +164,6 @@ int __bch2_insert_snapshot_whiteouts(struct btree_trans *trans, return ret; } -static inline enum bch_bkey_type extent_whiteout_type(enum btree_id btree, const struct bkey *k) -{ - /* - * KEY_TYPE_extent_whiteout indicates that there isn't a real extent - * present at that position: key start positions inclusive of - * KEY_TYPE_extent_whiteout (but not KEY_TYPE_whiteout) are - * monotonically increasing - */ - return btree_id_is_extents_snapshots(btree) && bkey_deleted(k) - ? KEY_TYPE_extent_whiteout - : KEY_TYPE_whiteout; -} - int bch2_trans_update_extent_overwrite(struct btree_trans *trans, struct btree_iter *iter, enum btree_iter_update_trigger_flags flags, @@ -244,13 +231,13 @@ int bch2_trans_update_extent_overwrite(struct btree_trans *trans, update->k.p.snapshot = new.k->p.snapshot; if (new.k->p.snapshot != old.k->p.snapshot) { - update->k.type = extent_whiteout_type(iter->btree_id, new.k); + update->k.type = KEY_TYPE_whiteout; } else if (btree_type_has_snapshots(btree_id)) { ret = need_whiteout_for_snapshot(trans, btree_id, update->k.p); if (ret < 0) return ret; if (ret) - update->k.type = extent_whiteout_type(iter->btree_id, new.k); + update->k.type = KEY_TYPE_whiteout; } ret = bch2_btree_insert_nonextent(trans, btree_id, update, @@ -289,8 +276,7 @@ static int bch2_trans_update_extent(struct btree_trans *trans, bch2_trans_iter_init(trans, &iter, btree_id, bkey_start_pos(&insert->k), BTREE_ITER_intent| BTREE_ITER_with_updates| - BTREE_ITER_not_extents| - BTREE_ITER_nofilter_whiteouts); + BTREE_ITER_not_extents); k = bch2_btree_iter_peek_max(trans, &iter, POS(insert->k.p.inode, U64_MAX)); if ((ret = bkey_err(k))) goto err; @@ -307,28 +293,7 @@ static int bch2_trans_update_extent(struct btree_trans *trans, goto next; } - while (true) { - if (k.k->type == KEY_TYPE_whiteout && - bkey_lt(insert->k.p, k.k->p)) - continue; - - if (bkey_le(insert->k.p, bkey_start_pos(k.k))) - break; - - if (bkey_extent_whiteout(k.k)) { - enum bch_bkey_type whiteout_type = extent_whiteout_type(btree_id, &insert->k); - if (k.k->type != whiteout_type) { - struct bkey_i *update = bch2_bkey_make_mut(trans, &iter, &k, 0); - ret = PTR_ERR_OR_ZERO(update); - if (ret) - goto err; - - update->k.type = whiteout_type; - } - - goto next; - } - + while (bkey_gt(insert->k.p, bkey_start_pos(k.k))) { bool done = bkey_lt(insert->k.p, k.k->p); ret = bch2_trans_update_extent_overwrite(trans, &iter, flags, k, bkey_i_to_s_c(insert)); @@ -560,7 +525,7 @@ int __must_check bch2_trans_update_ip(struct btree_trans *trans, struct btree_it return ret; if (ret) - k->k.type = extent_whiteout_type(iter->btree_id, &k->k); + k->k.type = KEY_TYPE_whiteout; } /* |