bcachefs: Handle transaction restarts in __bch2_move_data()
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 10 Jan 2022 01:52:10 +0000 (20:52 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:22 +0000 (17:09 -0400)
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>
fs/bcachefs/move.c

index 8756df0414a8d0f9efadae7b241fd73f15c1d2ee..f428e2ff99f64817b0cf5122f1024402ae1a4a41 100644 (file)
@@ -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 */