summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorts143224 <none@none>2008-06-06 08:17:07 -0700
committerts143224 <none@none>2008-06-06 08:17:07 -0700
commitd4ecbd70159d89a5bdbae105fe63f6d59b06b0f6 (patch)
tree080f89f7c02ac193ffc61ea1a5a7702a8b3c498a /usr/src
parent75569c1406d28e015f0c66ad03b5369377ca8e0a (diff)
downloadillumos-gate-d4ecbd70159d89a5bdbae105fe63f6d59b06b0f6.tar.gz
6571905 iscsi target does not correctly keep track of maxcmdsn
6669625 iscsitgtd core dumps: Reserve followed by logout 6693639 Assertion failed: 0, file ../t10_sam.c, line 640
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/iscsi/iscsitgtd/iscsi_cmd.c3
-rw-r--r--usr/src/cmd/iscsi/iscsitgtd/iscsi_login.c5
-rw-r--r--usr/src/cmd/iscsi/iscsitgtd/t10_sam.c18
3 files changed, 14 insertions, 12 deletions
diff --git a/usr/src/cmd/iscsi/iscsitgtd/iscsi_cmd.c b/usr/src/cmd/iscsi/iscsitgtd/iscsi_cmd.c
index 7c82f3c0ef..2683e1f9ef 100644
--- a/usr/src/cmd/iscsi/iscsitgtd/iscsi_cmd.c
+++ b/usr/src/cmd/iscsi/iscsitgtd/iscsi_cmd.c
@@ -143,6 +143,8 @@ iscsi_cmd_free(iscsi_conn_t *c, iscsi_cmd_t *cmd)
cmd->c_t_completion = h - cmd->c_t_start;
c->c_cmds_avg_sum += cmd->c_t_completion;
c->c_cmds_avg_cnt++;
+ /* decrement active count here */
+ c->c_cmds_active--;
}
/*
@@ -226,7 +228,6 @@ iscsi_cmd_remove(iscsi_conn_t *c, uint32_t statsn)
cmd->c_next = cmd_free;
cmd_free = cmd;
cmd = n;
- c->c_cmds_active--;
} else {
cmd = cmd->c_next;
}
diff --git a/usr/src/cmd/iscsi/iscsitgtd/iscsi_login.c b/usr/src/cmd/iscsi/iscsitgtd/iscsi_login.c
index 6146d62318..ddff81453c 100644
--- a/usr/src/cmd/iscsi/iscsitgtd/iscsi_login.c
+++ b/usr/src/cmd/iscsi/iscsitgtd/iscsi_login.c
@@ -740,8 +740,9 @@ make_login_response(iscsi_conn_t *c, iscsi_login_hdr_t *lhp)
if (c->c_sess != NULL) {
(void) pthread_mutex_lock(&c->c_sess->s_mutex);
/* ---- cmdsn is not advanced during login ---- */
- r->expcmdsn = htonl(c->c_sess->s_seencmdsn);
- r->maxcmdsn = htonl(c->c_sess->s_seencmdsn + 1);
+ r->expcmdsn = htonl(c->c_sess->s_seencmdsn);
+ r->maxcmdsn = htonl(CMD_MAXOUTSTANDING +
+ c->c_sess->s_seencmdsn);
(void) pthread_mutex_unlock(&c->c_sess->s_mutex);
}
diff --git a/usr/src/cmd/iscsi/iscsitgtd/t10_sam.c b/usr/src/cmd/iscsi/iscsitgtd/t10_sam.c
index 1f510b2091..7ca21411de 100644
--- a/usr/src/cmd/iscsi/iscsitgtd/t10_sam.c
+++ b/usr/src/cmd/iscsi/iscsitgtd/t10_sam.c
@@ -485,11 +485,11 @@ t10_cmd_done(t10_cmd_t *cmd)
* ---+---------+---+---+---+---+-------+
* S2|T5 | - |T2 |T3 |T7 |T6 | - |
* ---+---------+---+---+---+---+-------+
- * S3|T5/6 |T4 | - | - |T7 | - | - |
+ * S3|T5 |T4 | - | - |T7 |T6 | - |
* ---+---------+---+---+---+---+-------+
* S4|T5 |T4 | - | - | - | - |T6 |
* ---+---------+---+---+---+---+-------+
- * S5|T6 | - |T4 | - | - | - | - |
+ * S5| | - |T4 | - | - |T6 | - |
* ---+---------+---+---+---+---+-------+
* S6|T2/4/5/6 | - | - | - | - | - |T3 |
* ---+---------+---+---+---+---+-------+
@@ -585,12 +585,14 @@ t10_cmd_state_machine(t10_cmd_t *c, t10_cmd_event_t e)
break;
case T10_Cmd_T5:
- /*FALLTHRU*/
- case T10_Cmd_T6:
c->c_state = T10_Cmd_S1_Free;
cmd_common_free(c);
return (T10_Cmd_S1_Free);
+ case T10_Cmd_T6:
+ c->c_state = T10_Cmd_S6_Freeing_In;
+ break;
+
case T10_Cmd_T7:
c->c_state = T10_Cmd_S5_Wait;
break;
@@ -633,9 +635,8 @@ t10_cmd_state_machine(t10_cmd_t *c, t10_cmd_event_t e)
break;
case T10_Cmd_T6:
- c->c_state = T10_Cmd_S1_Free;
- cmd_common_free(c);
- return (T10_Cmd_S1_Free);
+ c->c_state = T10_Cmd_S6_Freeing_In;
+ break;
default:
queue_prt(mgmtq, Q_STE_ERRS,
@@ -1832,11 +1833,10 @@ lu_runner(void *v)
(void) pthread_mutex_lock(&lu->l_common_mutex);
assert(avl_find(&lu->l_all_open, (void *)itl, NULL) !=
NULL);
- avl_remove(&lu->l_all_open, (void *)itl);
-
queue_walker_free(lu->l_from_transports,
lu_remove_cmds, (void *)itl);
(*sam_emul_table[lu->l_dtype].t_per_fini)(itl);
+ avl_remove(&lu->l_all_open, (void *)itl);
/*
* Don't remove reference to l_common area until after