diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-08-16 09:58:07 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:08:25 -0400 |
commit | 3c7f3b7aeb73f2155aec9d00567b70ef55ede465 (patch) | |
tree | b15d0dd40a4213018b9d6c3f9c4fb38fd5f5ff97 /fs/bcachefs/io.c | |
parent | 63069bb6bf03ac7a55c53886a1380899df3a176d (diff) | |
download | lwn-3c7f3b7aeb73f2155aec9d00567b70ef55ede465.tar.gz lwn-3c7f3b7aeb73f2155aec9d00567b70ef55ede465.zip |
bcachefs: Refactor bch2_extent_trim_atomic() for reflink
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/io.c')
-rw-r--r-- | fs/bcachefs/io.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/fs/bcachefs/io.c b/fs/bcachefs/io.c index fd1aceea3553..ed84572a9e67 100644 --- a/fs/bcachefs/io.c +++ b/fs/bcachefs/io.c @@ -274,6 +274,8 @@ int bch2_write_index_default(struct bch_write_op *op) bch2_verify_keylist_sorted(keys); bch2_trans_init(&trans, c, BTREE_ITER_MAX, 256); +retry: + bch2_trans_begin(&trans); iter = bch2_trans_get_iter(&trans, BTREE_ID_EXTENTS, bkey_start_pos(&bch2_keylist_front(keys)->k), @@ -284,7 +286,9 @@ int bch2_write_index_default(struct bch_write_op *op) bkey_copy(&split.k, bch2_keylist_front(keys)); - bch2_extent_trim_atomic(&split.k, iter); + ret = bch2_extent_trim_atomic(&split.k, iter); + if (ret) + break; bch2_trans_update(&trans, BTREE_INSERT_ENTRY(iter, &split.k)); @@ -301,6 +305,11 @@ int bch2_write_index_default(struct bch_write_op *op) bch2_keylist_pop_front(keys); } while (!bch2_keylist_empty(keys)); + if (ret == -EINTR) { + ret = 0; + goto retry; + } + bch2_trans_exit(&trans); return ret; |