]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: check_bp_exists() check for backpointers for stale pointers
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 11 Feb 2025 18:33:08 +0000 (13:33 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 15 Mar 2025 01:02:10 +0000 (21:02 -0400)
Early version of 'bcachefs_metadata_version_cached_backpointers' was
creating backpointers for stale cached pointers - whoops. Now we have to
repair those.

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

index ebeb6a5ff9d262647d81c997824be0952f5b4501..1d30066e63dc3f90ce82d71694a44a4f612e4c25 100644 (file)
@@ -514,6 +514,22 @@ check_existing_bp:
        if (!other_extent.k)
                goto missing;
 
+       rcu_read_lock();
+       struct bch_dev *ca = bch2_dev_rcu_noerror(c, bp->k.p.inode);
+       if (ca) {
+               struct bkey_ptrs_c other_extent_ptrs = bch2_bkey_ptrs_c(other_extent);
+               bkey_for_each_ptr(other_extent_ptrs, ptr)
+                       if (ptr->dev == bp->k.p.inode &&
+                           dev_ptr_stale_rcu(ca, ptr)) {
+                               ret = drop_dev_and_update(trans, other_bp.v->btree_id,
+                                                         other_extent, bp->k.p.inode);
+                               if (ret)
+                                       goto err;
+                               goto out;
+                       }
+       }
+       rcu_read_unlock();
+
        if (bch2_extents_match(orig_k, other_extent)) {
                printbuf_reset(&buf);
                prt_printf(&buf, "duplicate versions of same extent, deleting smaller\n  ");