diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-07-09 15:16:50 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-07-09 15:25:40 -0400 |
commit | 5d507f795b0b679a67e972a48cbd0854c4ad0f02 (patch) | |
tree | bf30f9dd1badd504025e836d696d4d2d939108c3 /libbcachefs/reflink.c | |
parent | c99a444c5cc242a89845be83236aacd7db628ef5 (diff) |
Update bcachefs sources to da7d42a9a2 bcachefs: Add new assertions for shutdown path
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'libbcachefs/reflink.c')
-rw-r--r-- | libbcachefs/reflink.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/libbcachefs/reflink.c b/libbcachefs/reflink.c index 08a05cc1..39f711d5 100644 --- a/libbcachefs/reflink.c +++ b/libbcachefs/reflink.c @@ -97,22 +97,21 @@ bool bch2_reflink_v_merge(struct bch_fs *c, struct bkey_s _l, struct bkey_s_c _r return l.v->refcount == r.v->refcount && bch2_extent_merge(c, _l, _r); } -static inline void check_indirect_extent_deleting(struct bkey_i *new, unsigned *flags) -{ - if ((*flags & BTREE_TRIGGER_INSERT) && !*bkey_refcount(new)) { - new->k.type = KEY_TYPE_deleted; - new->k.size = 0; - set_bkey_val_u64s(&new->k, 0);; - *flags &= ~BTREE_TRIGGER_INSERT; - } -} - int bch2_trans_mark_reflink_v(struct btree_trans *trans, enum btree_id btree_id, unsigned level, struct bkey_s_c old, struct bkey_i *new, unsigned flags) { - check_indirect_extent_deleting(new, &flags); + if (!(flags & BTREE_TRIGGER_OVERWRITE)) { + struct bkey_i_reflink_v *r = bkey_i_to_reflink_v(new); + + if (!r->v.refcount) { + r->k.type = KEY_TYPE_deleted; + r->k.size = 0; + set_bkey_val_u64s(&r->k, 0); + return 0; + } + } return bch2_trans_mark_extent(trans, btree_id, level, old, new, flags); } @@ -127,7 +126,7 @@ int bch2_indirect_inline_data_invalid(const struct bch_fs *c, struct bkey_s_c k, } void bch2_indirect_inline_data_to_text(struct printbuf *out, - struct bch_fs *c, struct bkey_s_c k) + struct bch_fs *c, struct bkey_s_c k) { struct bkey_s_c_indirect_inline_data d = bkey_s_c_to_indirect_inline_data(k); unsigned datalen = bkey_inline_data_bytes(k.k); @@ -142,7 +141,16 @@ int bch2_trans_mark_indirect_inline_data(struct btree_trans *trans, struct bkey_s_c old, struct bkey_i *new, unsigned flags) { - check_indirect_extent_deleting(new, &flags); + if (!(flags & BTREE_TRIGGER_OVERWRITE)) { + struct bkey_i_indirect_inline_data *r = + bkey_i_to_indirect_inline_data(new); + + if (!r->v.refcount) { + r->k.type = KEY_TYPE_deleted; + r->k.size = 0; + set_bkey_val_u64s(&r->k, 0); + } + } return 0; } |