bcachefs: Don't run indirect extent trigger unless inserting/deleting
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 3 Dec 2023 18:05:21 +0000 (13:05 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Mon, 4 Dec 2023 21:04:55 +0000 (16:04 -0500)
commitf88d811a238b12a261a04f125db952cf05c06d0b
tree37a34fd2425e53c6192bdde9278272e29fbea11b
parentadcf4ee64291b701d083bacf653eb10a4c46acd7
bcachefs: Don't run indirect extent trigger unless inserting/deleting

This fixes a transaction path overflow reported in the snapshot deletion
path, when moving extents to the correct snapshot.

The root of the issue is that creating/deleting a reflink pointer can
generate an unbounded number of updates, if it is allowed to reference
an unbounded number of indirect extents; to prevent this, merging of
reflink pointers has been disabled.

But there's a hole, which is that copygc/rebalance may fragment existing
extents in the course of moving them around, and if an indirect extent
becomes too fragmented we'll then become unable to delete the reflink
pointer.

The eventual solution is going to be to tweak trigger handling so that
we can process large reflink pointers incrementally when necessary, and
notice that trigger updates don't need to be run for the part of the
reflink pointer not changing. That is going to be a bigger project
though, for another patch.

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