These new functions are helpers to cross mount points covering a given vnode.
They make sure that there is no lock-like ordering between obtaining a busy
reference on the mount point and the original vnode lock.
Doing so solves two problems at once. The first is a possible deadlock with
stacked filesystems (nullfs, unionfs) for which locking the covered vnode is
equivalent to locking the mounted filesystem's root vnode, which was previously
solved via VV_CROSSLOCK. If the covered vnode is still locked while calling
vfs_busy(), the "(covered) vnode lock" -> "mount point reference" lock-order is
established, while finishing crossing the mount point establishes the reverse
"mount point reference" -> "(root) vnode lock" since the covered vnode lock was
released in-between (VV_CROSSLOCK's solution was to refrain from releasing the
latter until the end of the whole process, at the price of complexity in both
the generic and stacked filesystems code, since some locks would be acquired
in advance and recursively).
The second is a possible deadlock at unmount (with or without stacked
filesystems), where dounmount() establishes the order "mount point reference" ->
"covered vnode lock", which is incompatible with the first one on lookup
described in the previous paragraph.
This commit is part of a series whose goal is to remove the VV_CROSSLOCK vnode
flag and logic and fix a timing-dependent deadlock between lookup and unmount.
No functional change.