I believe vfs_set_writeable_dirty is safe without an object lock at all. I originally had it required to keep the type stable but it does not matter if we race with dead and that would be a reference bug.
Mark tells me that I can now vm_page_replace() while a page is in queue. This allows me to optimize fault in two ways. Firstly, we allocate and free a page in first_object every time we discover a busy backing object page. We only need to do this once and leave it invalid but in a paging queue. the cow optimization replace runs into this. Secondly, this allows me to skip requiring the first_object write lock in cases where we want to free the page.
Lastly, vm_object_busy() is a standin for xbusy. Allow wired refs while the object is busy.