diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2022-08-18 13:03:43 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2022-08-18 13:03:43 -0400 |
commit | c4ddc63aecf1e4c820532b8e6ab47e98f74d3d7d (patch) | |
tree | 0c239d2b2c8689fe7497a0f1546b651c644f5cb6 /libbcachefs/btree_update_leaf.c | |
parent | dded444b20dd3f47393937315b8217535ff3c51d (diff) |
Update bcachefs sources to 3421116a6c bcachefs: bch2_btree_delete_range_trans() now returns -BCH_ERR_transaction_restart_nested
Diffstat (limited to 'libbcachefs/btree_update_leaf.c')
-rw-r--r-- | libbcachefs/btree_update_leaf.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/libbcachefs/btree_update_leaf.c b/libbcachefs/btree_update_leaf.c index dd832f12..ca988392 100644 --- a/libbcachefs/btree_update_leaf.c +++ b/libbcachefs/btree_update_leaf.c @@ -1693,15 +1693,16 @@ int bch2_btree_delete_range_trans(struct btree_trans *trans, enum btree_id id, unsigned update_flags, u64 *journal_seq) { + u32 restart_count = trans->restart_count; struct btree_iter iter; struct bkey_s_c k; int ret = 0; bch2_trans_iter_init(trans, &iter, id, start, BTREE_ITER_INTENT); retry: - while ((bch2_trans_begin(trans), - (k = bch2_btree_iter_peek(&iter)).k) && - !(ret = bkey_err(k)) && + while ((k = bch2_btree_iter_peek(&iter)).k && + !(ret = bkey_err(k) ?: + btree_trans_too_many_iters(trans)) && bkey_cmp(iter.pos, end) < 0) { struct disk_reservation disk_res = bch2_disk_reservation_init(trans->c, 0); @@ -1747,11 +1748,15 @@ retry: } if (bch2_err_matches(ret, BCH_ERR_transaction_restart)) { + bch2_trans_begin(trans); ret = 0; goto retry; } bch2_trans_iter_exit(trans, &iter); + + if (!ret && trans_was_restarted(trans, restart_count)) + ret = -BCH_ERR_transaction_restart_nested; return ret; } @@ -1765,8 +1770,12 @@ int bch2_btree_delete_range(struct bch_fs *c, enum btree_id id, unsigned update_flags, u64 *journal_seq) { - return bch2_trans_run(c, - bch2_btree_delete_range_trans(&trans, id, start, end, update_flags, journal_seq)); + int ret = bch2_trans_run(c, + bch2_btree_delete_range_trans(&trans, id, start, end, + update_flags, journal_seq)); + if (ret == -BCH_ERR_transaction_restart_nested) + ret = 0; + return ret; } int bch2_trans_log_msg(struct btree_trans *trans, const char *msg) |