bcachefs: Copy ptr->cached when migrating data
authorKent Overstreet <kent.overstreet@gmail.com>
Fri, 10 Jul 2020 23:49:34 +0000 (19:49 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:44 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/move.c

index b5970f09609a06d510da19bc1d5f5b8355e72ab4..9967dd422e4d9096e1c2dcaa885fcc3f767ed6df 100644 (file)
@@ -94,10 +94,6 @@ static int bch2_migrate_index_update(struct bch_write_op *op)
                    !bch2_bkey_matches_ptr(c, k, m->ptr, m->offset))
                        goto nomatch;
 
-               if (m->data_cmd == DATA_REWRITE &&
-                   !bch2_bkey_has_device(k, m->data_opts.rewrite_dev))
-                       goto nomatch;
-
                bkey_reassemble(&_insert.k, k);
                insert = &_insert.k;
 
@@ -109,9 +105,19 @@ static int bch2_migrate_index_update(struct bch_write_op *op)
                bch2_cut_back(new->k.p,         insert);
                bch2_cut_back(insert->k.p,      &new->k_i);
 
-               if (m->data_cmd == DATA_REWRITE)
-                       bch2_bkey_drop_device(bkey_i_to_s(insert),
-                                             m->data_opts.rewrite_dev);
+               if (m->data_cmd == DATA_REWRITE) {
+                       struct bch_extent_ptr *new_ptr, *old_ptr = (void *)
+                               bch2_bkey_has_device(bkey_i_to_s_c(insert),
+                                                    m->data_opts.rewrite_dev);
+                       if (!old_ptr)
+                               goto nomatch;
+
+                       if (old_ptr->cached)
+                               extent_for_each_ptr(extent_i_to_s(new), new_ptr)
+                                       new_ptr->cached = true;
+
+                       bch2_bkey_drop_ptr(bkey_i_to_s(insert), old_ptr);
+               }
 
                extent_for_each_ptr_decode(extent_i_to_s(new), p, entry) {
                        if (bch2_bkey_has_device(bkey_i_to_s_c(insert), p.ptr.dev)) {