In general, it should be sufficient to hold the lock just for removing
the session from the ssesion list. For everything else the session specific
lock should sufficient.
On top of that, at present we can get a deadlock caused by waiting on
the CAM SIM reference count while holding the global lock.
A specific scenario involving ZFS is this:
- session S1 completed all I/Os and sleeps in CAM waiting for device close by ZFS;
- session S2 is also dead now, but can not forcefully complete outstanding requests by calling iscsi_session_cleanup() from iscsi_maintenance_thread_terminate(), since it can't get the same global sc_lock;
- as soon as there are unfinished requests, ZFS can not do spa_config_enter() as writer, and so can not close the device for session S1
- deadlock.