Current implementation of vnode_create_vobject()/vnode_destroy_vobject() is written so that it allows object destruction for live vnode. Practically, no filesystems use this, except for some remnants present in UFS. One of the consequences of that model is that each filesystem must call vnode_destroy_vobject() in VOP_RECLAIM() or earlier, as result all of them get rid of the v_object in reclaim.
Move the call to vnode_destroy_vobject() to vgonel() before VOP_RECLAIM(). This makes v_object stable: either the object is NULL, or it is valid vm object till the vnode reclamation. Remove code from vnode_create_vobject() to handle races with the parallel destruction.
For UFS, in ffs_valloc(), force reclaim existing vnode on inode reuse, instead of trying to re-initialize the same vnode for new purposes.
[UFS change is really a blocker and must be handled before the rest, I am posting this for discussion and testing]