summaryrefslogtreecommitdiffstats
path: root/sys/dev/iscsi
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2014-10-20 07:35:46 +0000
committermav <mav@FreeBSD.org>2014-10-20 07:35:46 +0000
commit5889805f1c8d073e48e28ed50a629090c354309f (patch)
tree5edef3f84b3f25e6f67bac50c236cd528644cf13 /sys/dev/iscsi
parentcc6cca3f1e5c3cec97d68e6b2d95d678f1bc0eb2 (diff)
downloadFreeBSD-src-5889805f1c8d073e48e28ed50a629090c354309f.zip
FreeBSD-src-5889805f1c8d073e48e28ed50a629090c354309f.tar.gz
MFC r272812: Make iSCSI connection close somewhat less aggressive.
It allows to push out some final data from the send queue to the socket before its close. In particular, it increases chances for logout response to be delivered to the initiator.
Diffstat (limited to 'sys/dev/iscsi')
-rw-r--r--sys/dev/iscsi/icl.c27
-rw-r--r--sys/dev/iscsi/icl.h1
-rw-r--r--sys/dev/iscsi/iscsi.c1
3 files changed, 5 insertions, 24 deletions
diff --git a/sys/dev/iscsi/icl.c b/sys/dev/iscsi/icl.c
index ede3938..476f5dc 100644
--- a/sys/dev/iscsi/icl.c
+++ b/sys/dev/iscsi/icl.c
@@ -877,8 +877,6 @@ icl_conn_send_pdus(struct icl_conn *ic, struct icl_pdu_stailq *queue)
SOCKBUF_UNLOCK(&so->so_snd);
while (!STAILQ_EMPTY(queue)) {
- if (ic->ic_disconnecting)
- return;
request = STAILQ_FIRST(queue);
size = icl_pdu_size(request);
if (available < size) {
@@ -975,11 +973,6 @@ icl_send_thread(void *arg)
ic->ic_send_running = true;
for (;;) {
- if (ic->ic_disconnecting) {
- //ICL_DEBUG("terminating");
- break;
- }
-
for (;;) {
/*
* If the local queue is empty, populate it from
@@ -1018,6 +1011,11 @@ icl_send_thread(void *arg)
break;
}
+ if (ic->ic_disconnecting) {
+ //ICL_DEBUG("terminating");
+ break;
+ }
+
cv_wait(&ic->ic_send_cv, ic->ic_lock);
}
@@ -1301,21 +1299,6 @@ icl_conn_handoff(struct icl_conn *ic, int fd)
}
void
-icl_conn_shutdown(struct icl_conn *ic)
-{
- ICL_CONN_LOCK_ASSERT_NOT(ic);
-
- ICL_CONN_LOCK(ic);
- if (ic->ic_socket == NULL) {
- ICL_CONN_UNLOCK(ic);
- return;
- }
- ICL_CONN_UNLOCK(ic);
-
- soshutdown(ic->ic_socket, SHUT_RDWR);
-}
-
-void
icl_conn_close(struct icl_conn *ic)
{
struct icl_pdu *pdu;
diff --git a/sys/dev/iscsi/icl.h b/sys/dev/iscsi/icl.h
index 5f03434..ca5ee8f 100644
--- a/sys/dev/iscsi/icl.h
+++ b/sys/dev/iscsi/icl.h
@@ -107,7 +107,6 @@ struct icl_conn {
struct icl_conn *icl_conn_new(const char *name, struct mtx *lock);
void icl_conn_free(struct icl_conn *ic);
int icl_conn_handoff(struct icl_conn *ic, int fd);
-void icl_conn_shutdown(struct icl_conn *ic);
void icl_conn_close(struct icl_conn *ic);
bool icl_conn_connected(struct icl_conn *ic);
diff --git a/sys/dev/iscsi/iscsi.c b/sys/dev/iscsi/iscsi.c
index 659d74e..0ba68e8 100644
--- a/sys/dev/iscsi/iscsi.c
+++ b/sys/dev/iscsi/iscsi.c
@@ -372,7 +372,6 @@ static void
iscsi_maintenance_thread_reconnect(struct iscsi_session *is)
{
- icl_conn_shutdown(is->is_conn);
icl_conn_close(is->is_conn);
ISCSI_SESSION_LOCK(is);
OpenPOWER on IntegriCloud