btrfs: stripe_alloc: never let relocation wait on the whole-stripe gate
The data admission gate refuses reservations that would not fit in the
whole-stripe supply, and a refused reservation waits as a flush ticket
for space to appear. Relocation reserves its prealloc clusters through
the same path, so at the fill edge the reclaim worker sat for half an
hour in
holding the exclusive operation and the group it was emptying, while the
gate waited for exactly the stripes that relocation was supposed to
free. User writers queued behind that head ticket and unmount hung on
their writeback.
Exempting relocation from the gate altogether is wrong too: it then
takes whole stripes that admitted writers were promised, and their
writebacks are dropped at the edge. Give relocation its own flush type,
BTRFS_RESERVE_FLUSH_DATA_RELOC, that is subject to the same bound but
never waits: if the reservation does not fit beyond the bytes already
promised it fails at once, the relocation is abandoned cleanly and is
retried when the trigger next finds room. Zoned relocation already
has a flush type of its own for the same reason.