diff options
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); } |