diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-07-15 19:51:30 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2025-04-29 13:44:32 -0400 |
commit | b6442d1e8d0ea8c69880c3d44b036e39a264d1e3 (patch) | |
tree | 913a81eb960c6e78d78ba038b9a271c8d56fd12e | |
parent | c88daf6ddb5e2cb709e1274fac2999f254583199 (diff) |
bcachefs: overlapping extent checks no longer uses key_visible_in_snapshot XXX
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r-- | fs/bcachefs/fsck.c | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/fs/bcachefs/fsck.c b/fs/bcachefs/fsck.c index 771321cb3155..eaa1f007021b 100644 --- a/fs/bcachefs/fsck.c +++ b/fs/bcachefs/fsck.c @@ -1565,8 +1565,9 @@ static int check_i_sectors(struct btree_trans *trans, struct inode_walker *w) } struct extent_end { - u32 snapshot; u64 offset; + u32 snapshot; + bool seen_this_pos; struct snapshots_seen seen; }; @@ -1750,22 +1751,39 @@ static int check_overlapping_extents(struct btree_trans *trans, bool *fixed) { struct bch_fs *c = trans->c; + u32 i_equiv; int ret = 0; /* transaction restart, running again */ if (bpos_eq(extent_ends->last_pos, k.k->p)) return 0; - if (extent_ends->last_pos.inode != k.k->p.inode) + if (extent_ends->last_pos.inode != k.k->p.inode) { extent_ends_reset(extent_ends); + } else if (!bkey_eq(extent_ends->last_pos, k.k->p)) { + darray_for_each(extent_ends->e, i) + i->seen_this_pos = false; + } darray_for_each(extent_ends->e, i) { + bool visible; + if (i->offset <= bkey_start_offset(k.k)) continue; - if (!ref_visible2(c, - k.k->p.snapshot, seen, - i->snapshot, &i->seen)) + i_equiv = bch2_snapshot_equiv(c, i->snapshot); + + if (i->snapshot <= k.k->p.snapshot) { + visible = !i->seen_this_pos && bch2_snapshot_is_ancestor(c, i_equiv, equiv); + } else { + visible = key_visible_in_snapshot(c, &i->seen, equiv, i_equiv); + } + + BUG_ON(ref_visible2(c, + k.k->p.snapshot, seen, + i->snapshot, &i->seen) != visible); + + if (!visible) continue; ret = overlapping_extents_found(trans, iter->btree_id, @@ -1776,6 +1794,14 @@ static int check_overlapping_extents(struct btree_trans *trans, *k.k, fixed, i); if (ret) goto err; + + /* + * XXX: + * When we had repair work to do, and then a later transaction + * restart, this will cause us to fail to find and repair this + * entry: + */ + i->seen_this_pos = true; } extent_ends->last_pos = k.k->p; |