Hyrum, I #if'd out the child/parent section at the end of parse_local_abspath that we talked about on IRC, and confirmed the test failures that you saw. Digging in, it turns out that we end up calling "owns lock" with two different wcroot_t structures. IOW, the wcroot that opened/owns the lock is attached to one directory, but another directory ends up with its own wcroot_t which has no "owned" locks associated with it, so things blow up because the code believes some other process is working on that other directory.
With the old PDH code in there, we get the wcroot inserted into PDH structures all the way up to the root. Any lookup thereafter will share the same wcroot_t structure. As we discussed on IRC, if a move is made to a more pure lookup of wcroot_t ancestors, then it could solve this particular problem. Your conversion of dir_data to wcroot pointers may run into a similar problem. I don't know enough about your change to truly know, but be aware of the problem. An SVN_DBG in create_wcroot could provide a lot of information (generally, it should only ever be called once per process). I'm putting this on hold now because I don't want to interfere with your work. A suggested fix would be to switch wcroot_parse to a new algorithm that cleans out the PDH concept and more directly identifies (and reuses!) a parent wcroot. I'd be happy to coordinate that rewrite with/for you. Cheers, -g