summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorJack Meng <Jack.Meng@Sun.COM>2009-03-12 18:01:17 +0800
committerJack Meng <Jack.Meng@Sun.COM>2009-03-12 18:01:17 +0800
commit912e288b51cca49c24bd9f8b0a5ba07e7210204a (patch)
tree986556c63f483298462b71e93317714bd590c5c2 /usr/src
parentff5ca3bd17dee7e2bf2e4f2e3a2b354e0ecbd00d (diff)
downloadillumos-gate-912e288b51cca49c24bd9f8b0a5ba07e7210204a.tar.gz
6813447 iscsi needs to use ksocket_hold() and ksocket_rele() to prevent hanging
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_io.c10
-rw-r--r--usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_net.c2
2 files changed, 10 insertions, 2 deletions
diff --git a/usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_io.c b/usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_io.c
index da4ccede4c..ca9e7e025a 100644
--- a/usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_io.c
+++ b/usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_io.c
@@ -309,8 +309,14 @@ iscsi_rx_thread(iscsi_thread_t *thread, void *arg)
case ISCSI_STATUS_TCP_RX_ERROR:
/* connection had an error */
mutex_enter(&icp->conn_state_mutex);
- (void) iscsi_conn_state_machine(icp,
- ISCSI_CONN_EVENT_T15);
+ /*
+ * recvmsg may return after the closing of socket
+ * with this error
+ */
+ if (ISCSI_CONN_STATE_FULL_FEATURE(icp->conn_state)) {
+ (void) iscsi_conn_state_machine(icp,
+ ISCSI_CONN_EVENT_T15);
+ }
mutex_exit(&icp->conn_state_mutex);
break;
case ISCSI_STATUS_HEADER_DIGEST_ERROR:
diff --git a/usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_net.c b/usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_net.c
index 77d0f54f57..aac3217f13 100644
--- a/usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_net.c
+++ b/usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_net.c
@@ -492,7 +492,9 @@ iscsi_net_recvmsg(void *socket, struct msghdr *msg, int timeout)
* Receive the requested data. Block until all
* data is received or timeout.
*/
+ ksocket_hold(ks);
ksocket_recvmsg(ks, msg, prflag, &recv, CRED());
+ ksocket_rele(ks);
DTRACE_PROBE1(ksocket_recvmsg, size_t, recv);
return (recv);
}