diff options
author | Jack Meng <Jack.Meng@Sun.COM> | 2009-03-12 18:01:17 +0800 |
---|---|---|
committer | Jack Meng <Jack.Meng@Sun.COM> | 2009-03-12 18:01:17 +0800 |
commit | 912e288b51cca49c24bd9f8b0a5ba07e7210204a (patch) | |
tree | 986556c63f483298462b71e93317714bd590c5c2 /usr/src | |
parent | ff5ca3bd17dee7e2bf2e4f2e3a2b354e0ecbd00d (diff) | |
download | illumos-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.c | 10 | ||||
-rw-r--r-- | usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_net.c | 2 |
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); } |