Hoisting removal prior to dooming the vnode provides an invariant that listmtx delays vgone, meaning VN_IS_DOOMED checks can be eliminated for the common case. This also means filtering routines can safely access ->v_data and ->v_object.
In contrast to the retired active list, vnodes don't get requeued on the lazy list. Thus if relocking is needed, we only need to check if the vnode got doomed. Other than that it must not have moved as long as we have a hold. New routine - vdrop not last - is added to handle this case.