Skip to content

Commit 4fd509c

Browse files
author
Kent Overstreet
committed
bcachefs: Fix bch2_indirect_extent_missing_error()
We had some error handling confusion here; -BCH_ERR_missing_indirect_extent is thrown by trans_trigger_reflink_p_segment(); at this point we haven't decide whether we're generating an error. Signed-off-by: Kent Overstreet <[email protected]>
1 parent b9ddb3e commit 4fd509c

File tree

1 file changed

+8
-10
lines changed

1 file changed

+8
-10
lines changed

fs/bcachefs/reflink.c

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ static int bch2_indirect_extent_missing_error(struct btree_trans *trans,
172172
bool should_commit)
173173
{
174174
if (REFLINK_P_ERROR(p.v))
175-
return -BCH_ERR_missing_indirect_extent;
175+
return 0;
176176

177177
struct bch_fs *c = trans->c;
178178
u64 live_start = REFLINK_P_IDX(p.v);
@@ -259,23 +259,23 @@ struct bkey_s_c bch2_lookup_indirect_extent(struct btree_trans *trans,
259259
return k;
260260

261261
if (unlikely(!bkey_extent_is_reflink_data(k.k))) {
262-
bch2_trans_iter_exit(trans, iter);
263-
264262
unsigned size = min((u64) k.k->size,
265263
REFLINK_P_IDX(p.v) + p.k->size + le32_to_cpu(p.v->back_pad) -
266264
reflink_offset);
267265
bch2_key_resize(&iter->k, size);
268266

269267
int ret = bch2_indirect_extent_missing_error(trans, p, reflink_offset,
270268
k.k->p.offset, should_commit);
271-
if (ret)
269+
if (ret) {
270+
bch2_trans_iter_exit(trans, iter);
272271
return bkey_s_c_err(ret);
272+
}
273273
} else if (unlikely(REFLINK_P_ERROR(p.v))) {
274-
bch2_trans_iter_exit(trans, iter);
275-
276274
int ret = bch2_indirect_extent_not_missing(trans, p, should_commit);
277-
if (ret)
275+
if (ret) {
276+
bch2_trans_iter_exit(trans, iter);
278277
return bkey_s_c_err(ret);
278+
}
279279
}
280280

281281
*offset_into_extent = reflink_offset - bkey_start_offset(k.k);
@@ -300,7 +300,7 @@ static int trans_trigger_reflink_p_segment(struct btree_trans *trans,
300300
if (ret)
301301
return ret;
302302

303-
if (bkey_deleted(k.k)) {
303+
if (!bkey_refcount_c(k)) {
304304
if (!(flags & BTREE_TRIGGER_overwrite))
305305
ret = -BCH_ERR_missing_indirect_extent;
306306
goto next;
@@ -381,8 +381,6 @@ static s64 gc_trigger_reflink_p_segment(struct btree_trans *trans,
381381
not_found:
382382
if (flags & BTREE_TRIGGER_check_repair) {
383383
ret = bch2_indirect_extent_missing_error(trans, p, *idx, next_idx, false);
384-
if (ret == -BCH_ERR_missing_indirect_extent)
385-
ret = 0;
386384
if (ret)
387385
goto err;
388386
}

0 commit comments

Comments
 (0)