matthew@ noted a possible misuse of the rwlock used to protect vscsi from being opened by multiple processes at the same time. then he pointed out that pool_get can sleep in the middle of scsi_cmd, during which time the process processing the vscsi requests can go away.
matthew@ noted a possible misuse of the rwlock used to protect vscsi
from being opened by multiple processes at the same time. then he
pointed out that pool_get can sleep in the middle of scsi_cmd,
during which time the process processing the vscsi requests can go
away.

this uses a state variable to protect vscsi from multiple opens
which is checked by all the process and scsi midlayer entrypoints.
it avoids a potential sleep in the middle of the scsi_cmd handler
by moving to iopools.

lots of tweaks and feedback by matthew@

orumin/openbsd-efivars,orumin/openbsd-efivars,orumin/openbsd-efivars,orumin/openbsd-efivars