summaryrefslogtreecommitdiffstats
path: root/fs/bcachefs/move.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-01-09 20:52:10 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:09:22 -0400
commit8ede99101ec354053ac755419df9da5434a13733 (patch)
tree273dde110cbd6e3ec933e7b4ce2bb5f654905f06 /fs/bcachefs/move.c
parentd5030164ec53ab212f6acaff8938b352c654b67e (diff)
downloadlinux-stable-8ede99101ec354053ac755419df9da5434a13733.tar.gz
linux-stable-8ede99101ec354053ac755419df9da5434a13733.tar.bz2
linux-stable-8ede99101ec354053ac755419df9da5434a13733.zip
bcachefs: Handle transaction restarts in __bch2_move_data()
We weren't checking for -EINTR in the main loop in __bch2_move_data - this code predates modern transaction restarts. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs/bcachefs/move.c')
-rw-r--r--fs/bcachefs/move.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/fs/bcachefs/move.c b/fs/bcachefs/move.c
index 8756df0414a8..f428e2ff99f6 100644
--- a/fs/bcachefs/move.c
+++ b/fs/bcachefs/move.c
@@ -701,17 +701,20 @@ static int __bch2_move_data(struct bch_fs *c,
bch2_trans_begin(&trans);
k = bch2_btree_iter_peek(&iter);
-
- stats->pos = iter.pos;
-
if (!k.k)
break;
+
ret = bkey_err(k);
+ if (ret == -EINTR)
+ continue;
if (ret)
break;
+
if (bkey_cmp(bkey_start_pos(k.k), end) >= 0)
break;
+ stats->pos = iter.pos;
+
if (!bkey_extent_is_direct_data(k.k))
goto next_nondata;
@@ -754,10 +757,8 @@ static int __bch2_move_data(struct bch_fs *c,
ret2 = bch2_move_extent(&trans, ctxt, wp, io_opts, btree_id, k,
data_cmd, data_opts);
if (ret2) {
- if (ret2 == -EINTR) {
- bch2_trans_begin(&trans);
+ if (ret2 == -EINTR)
continue;
- }
if (ret2 == -ENOMEM) {
/* memory allocation failure, wait for some IO to finish */