]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
bcachefs: Handle -EINTR bch2_migrate_index_update()
authorKent Overstreet <kent.overstreet@gmail.com>
Fri, 24 Apr 2020 18:08:56 +0000 (14:08 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:39 +0000 (17:08 -0400)
peek_slot() shouldn't return -EINTR when there's only a single live
iterator, but that's tricky to guarantee - we seem to be returning
-EINTR when we shouldn't, but it's easy enough to handle in the caller.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/move.c

index a9a72963e1b71ba9c31fd2789a508faf818298b6..882e86e70db7d4bd06c8678c60a4fc539af0f5c0 100644 (file)
@@ -69,19 +69,26 @@ static int bch2_migrate_index_update(struct bch_write_op *op)
                                   BTREE_ITER_SLOTS|BTREE_ITER_INTENT);
 
        while (1) {
-               struct bkey_s_c k = bch2_btree_iter_peek_slot(iter);
+               struct bkey_s_c k;
                struct bkey_i *insert;
-               struct bkey_i_extent *new =
-                       bkey_i_to_extent(bch2_keylist_front(keys));
+               struct bkey_i_extent *new;
                BKEY_PADDED(k) _new, _insert;
                const union bch_extent_entry *entry;
                struct extent_ptr_decoded p;
                bool did_work = false;
                int nr;
 
+               bch2_trans_reset(&trans, 0);
+
+               k = bch2_btree_iter_peek_slot(iter);
                ret = bkey_err(k);
-               if (ret)
+               if (ret) {
+                       if (ret == -EINTR)
+                               continue;
                        break;
+               }
+
+               new = bkey_i_to_extent(bch2_keylist_front(keys));
 
                if (bversion_cmp(k.k->version, new->k.version) ||
                    !bch2_bkey_matches_ptr(c, k, m->ptr, m->offset))