From 0a3e15784450994b5da462695884f881fcb2ef9e Mon Sep 17 00:00:00 2001 From: Peter Lieven Date: Tue, 16 Jun 2015 11:32:50 +0200 Subject: [PATCH 1/4] reconnect: copy scsi_timeout on reconnect Signed-off-by: Peter Lieven --- lib/connect.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/connect.c b/lib/connect.c index 8afe77b..c108d3d 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -412,6 +412,7 @@ int iscsi_reconnect(struct iscsi_context *old_iscsi) iscsi->tcp_keepintvl = old_iscsi->tcp_keepintvl; iscsi->tcp_syncnt = old_iscsi->tcp_syncnt; iscsi->cache_allocations = old_iscsi->cache_allocations; + iscsi->scsi_timeout = old_iscsi->scsi_timeout; iscsi->reconnect_max_retries = old_iscsi->reconnect_max_retries; From 7dd62aca6180d05af139d5e098cfce81f6ae4ae8 Mon Sep 17 00:00:00 2001 From: Peter Lieven Date: Tue, 16 Jun 2015 12:06:59 +0200 Subject: [PATCH 2/4] pdu: add more debugging info for timed out commands Signed-off-by: Peter Lieven --- lib/pdu.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/pdu.c b/lib/pdu.c index 8e48004..591992b 100644 --- a/lib/pdu.c +++ b/lib/pdu.c @@ -75,7 +75,7 @@ void iscsi_dump_pdu_header(struct iscsi_context *iscsi, unsigned char *data) { for (i=0;ipending_reconnect = 1; } - int iscsi_process_reject(struct iscsi_context *iscsi, struct iscsi_in_pdu *in) { @@ -348,9 +347,7 @@ int iscsi_process_reject(struct iscsi_context *iscsi, itt = scsi_get_uint32(&in->data[16]); - if (iscsi->log_level > 1) { - iscsi_dump_pdu_header(iscsi, in->data); - } + iscsi_dump_pdu_header(iscsi, in->data); for (pdu = iscsi->waitpdu; pdu; pdu = pdu->next) { if (pdu->itt == itt) { @@ -706,6 +703,8 @@ iscsi_timeout_scan(struct iscsi_context *iscsi) continue; } ISCSI_LIST_REMOVE(&iscsi->outqueue, pdu); + iscsi_set_error(iscsi, "command timed out"); + iscsi_dump_pdu_header(iscsi, pdu->outdata.data); pdu->callback(iscsi, SCSI_STATUS_TIMEOUT, NULL, pdu->private_data); } @@ -721,6 +720,8 @@ iscsi_timeout_scan(struct iscsi_context *iscsi) continue; } ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); + iscsi_set_error(iscsi, "command timed out"); + iscsi_dump_pdu_header(iscsi, pdu->outdata.data); pdu->callback(iscsi, SCSI_STATUS_TIMEOUT, NULL, pdu->private_data); } From 85fc823f592da66bf1f1d21d399398e30e0a8c52 Mon Sep 17 00:00:00 2001 From: Peter Lieven Date: Tue, 16 Jun 2015 12:08:13 +0200 Subject: [PATCH 3/4] pdu: do not leak timed out pdus Signed-off-by: Peter Lieven --- lib/pdu.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/pdu.c b/lib/pdu.c index 591992b..0b63682 100644 --- a/lib/pdu.c +++ b/lib/pdu.c @@ -707,6 +707,7 @@ iscsi_timeout_scan(struct iscsi_context *iscsi) iscsi_dump_pdu_header(iscsi, pdu->outdata.data); pdu->callback(iscsi, SCSI_STATUS_TIMEOUT, NULL, pdu->private_data); + iscsi_free_pdu(iscsi, pdu); } for (pdu = iscsi->waitpdu; pdu; pdu = next_pdu) { next_pdu = pdu->next; @@ -724,5 +725,6 @@ iscsi_timeout_scan(struct iscsi_context *iscsi) iscsi_dump_pdu_header(iscsi, pdu->outdata.data); pdu->callback(iscsi, SCSI_STATUS_TIMEOUT, NULL, pdu->private_data); + iscsi_free_pdu(iscsi, pdu); } } From 1ceb2163940e85beb648ea333974555da5242d65 Mon Sep 17 00:00:00 2001 From: Peter Lieven Date: Tue, 16 Jun 2015 12:14:11 +0200 Subject: [PATCH 4/4] pdu: timed out pdus might have no callback Signed-off-by: Peter Lieven --- lib/pdu.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/pdu.c b/lib/pdu.c index 0b63682..09ee141 100644 --- a/lib/pdu.c +++ b/lib/pdu.c @@ -705,8 +705,10 @@ iscsi_timeout_scan(struct iscsi_context *iscsi) ISCSI_LIST_REMOVE(&iscsi->outqueue, pdu); iscsi_set_error(iscsi, "command timed out"); iscsi_dump_pdu_header(iscsi, pdu->outdata.data); - pdu->callback(iscsi, SCSI_STATUS_TIMEOUT, - NULL, pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_TIMEOUT, + NULL, pdu->private_data); + } iscsi_free_pdu(iscsi, pdu); } for (pdu = iscsi->waitpdu; pdu; pdu = next_pdu) { @@ -723,8 +725,10 @@ iscsi_timeout_scan(struct iscsi_context *iscsi) ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); iscsi_set_error(iscsi, "command timed out"); iscsi_dump_pdu_header(iscsi, pdu->outdata.data); - pdu->callback(iscsi, SCSI_STATUS_TIMEOUT, - NULL, pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_TIMEOUT, + NULL, pdu->private_data); + } iscsi_free_pdu(iscsi, pdu); } }