bcachefs: Fix fallocate FL_INSERT_RANGE
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 1 Apr 2020 20:07:57 +0000 (16:07 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:38 +0000 (17:08 -0400)
This was another bug because of bch2_btree_iter_set_pos() invalidating
iterators.

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

index 726c55072b7bbb7c39618ffc6745b18c524c3682..e713c83530ccc3dbb431ebd1e975172d442a8d88 100644 (file)
@@ -2484,10 +2484,8 @@ reassemble:
                bkey_on_stack_reassemble(&copy, c, k);
 
                if (insert &&
-                   bkey_cmp(bkey_start_pos(k.k), move_pos) < 0) {
+                   bkey_cmp(bkey_start_pos(k.k), move_pos) < 0)
                        bch2_cut_front(move_pos, copy.k);
-                       bch2_btree_iter_set_pos(src, bkey_start_pos(&copy.k->k));
-               }
 
                copy.k->k.p.offset += shift >> 9;
                bch2_btree_iter_set_pos(dst, bkey_start_pos(&copy.k->k));
@@ -2507,8 +2505,9 @@ reassemble:
                }
 
                bkey_init(&delete.k);
-               delete.k.p = src->pos;
-               bch2_key_resize(&delete.k, copy.k->k.size);
+               delete.k.p = copy.k->k.p;
+               delete.k.size = copy.k->k.size;
+               delete.k.p.offset -= shift >> 9;
 
                next_pos = insert ? bkey_start_pos(&delete.k) : delete.k.p;
 
@@ -2529,6 +2528,8 @@ reassemble:
                        BUG_ON(ret);
                }
 
+               bch2_btree_iter_set_pos(src, bkey_start_pos(&delete.k));
+
                ret =   bch2_trans_update(&trans, src, &delete, trigger_flags) ?:
                        bch2_trans_update(&trans, dst, copy.k, trigger_flags) ?:
                        bch2_trans_commit(&trans, &disk_res,