summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLee Duncan <lduncan@suse.com>2021-02-04 13:09:48 -0800
committerGitHub <noreply@github.com>2021-02-04 13:09:48 -0800
commit0068fd9bea9939866735038bf8dac0c878ede867 (patch)
treeca08e6f91289d9f04401ee33c508c75b3f2116be
parentf7231ca0e2336d3e26655d49adee1464cb592d01 (diff)
parent19f1ae0b7bbcc3376153cf9f18b33d5db9d6e176 (diff)
downloadopen-iscsi-0068fd9bea9939866735038bf8dac0c878ede867.tar.gz
Merge pull request #248 from gonzoleeman/iscsistart-timeout-fix
Fix iscsistart login issue when target is delayed.
-rw-r--r--usr/iscsistart.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/usr/iscsistart.c b/usr/iscsistart.c
index 73991b3..755489f 100644
--- a/usr/iscsistart.c
+++ b/usr/iscsistart.c
@@ -241,12 +241,25 @@ static int login_session(struct node_rec *rec)
/*
* Need to handle race where iscsid proc is starting up while we are
* trying to connect. Retry with exponential backoff, start from 50 ms.
+ *
+ * NOTE: another race condition can occur if the system is just coming
+ * up, where our login request will be sent, but the login response
+ * takes a while. In such a case, if we timeout and give up, the
+ * login response may still show up once we give up, in which case
+ * it seems to get iscsistart into a state where it cannot try to
+ * login again because it thinks there's already a session. So make
+ * sure our timeout is long enough, on each try, to give the response
+ * a chance to show up. The old value of 1 second was not enough,
+ * so we multiply that by 10, which seems reasonable for initial
+ * login.
*/
for (msec = 50; msec <= 15000; msec <<= 1) {
- rc = iscsid_exec_req(&req, &rsp, 0, ISCSID_REQ_TIMEOUT);
+ int tmo = ISCSID_REQ_TIMEOUT * 10;
+
+ rc = iscsid_exec_req(&req, &rsp, 0, tmo);
if (rc == 0) {
return rc;
- } else if (rc == ISCSI_ERR_ISCSID_NOTCONN) {
+ } else if (rc == ISCSI_ERR_SESSION_NOT_CONNECTED) {
ts.tv_sec = msec / 1000;
ts.tv_nsec = (msec % 1000) * 1000000L;