[PATCH 0/8][v3] relocation error handling fixes

Josef Bacik
2020-03-13T15:45:52Z

v2->v3:
- Updated the free reloc control to use the rbtree postorder thing.
- Updated the changelog for patch 6.
- Fixed the error goto in patch 5.
- Added the reviewed-bys.

v1->v2:
- Incorporated the various feedback, tweaked some things, adjusted commit
messages, added some more comments. Hopefully I got everything.
- Added "btrfs: do not init a reloc root if we aren't relocating", this is to
oddress the weird handling of DEAD_ROOT and the use-after-free that Qu had
originally attempted to fix.
- Reworked "btrfs: splice rc->reloc_roots onto reloc roots in recover" to simply
handle cleaning up any remaining bigs on the reloc_control, since errors can
mean we'll have some things left pending on the reloc_control.

------------------------------ Original email ---------------------------------
My root ref patches have uncovered weird failures in some of our xfstests,
particularly those that do balance while having errors.

I ran relocation through my eio-stress bpf script and loads of things fell out,
these are the fixes required to make the stress test run to completion.

Dave this is just based on my master, I assume it'll apply cleanly to what you
have, but if not let me know which branch you want me to rebase onto to get it
to work right.

Most of these are straightforward, the only tricky/subtle one is 7/7, and I've
added a lot of explanation there around my reasoning. 6/7 is also a little bit
more complicated as it changes the rules slightly for reference holding for
roots. Before we just sort of hoped and prayed we go the right reference
dropped when we dropped root->reloc_root. Now we hold one ref for the list of
reloc roots and one ref for root->reloc_root, so it's more clear when we need to
be dropping references. Everything else is relatively straightforward. Thanks,

Josef