kernel - Change lockmgr LK_SHARED behavior to fix improper recursion return
* When obtaining a LK_SHARED lock in a situation where you already own the
lock LK_EXCLUSIVE, lockmgr would downgrade the lock to shared.
This creates a very serious problem when large procedural recursions get
a lock that is already being held exclusively but request a shared lock.
When these recursions return the original top level will find its lock is
no longer exclusive.
* This problem occured with vnode locks when a VOP_WRITE operation on a mmap'd
space causes a VM fault which then turns around and issues a read().
When the fault returns the vnode wound up locked shared instead of
exclusive.
* Fix the problem by NOT downgrading an exclusive lock to shared when
recursing on LK_SHARED. Simply add another count to the exclusive
lock.