Skip to content

Commit 39771ce

Browse files
vishnuittapawanpraka1
authored andcommitted
fixes(istgt): leaving recvlowat as 1 to read data at earliest (#231)
- log for op_text response - reading immediate flag from correct bit - commented out unused code - Not closing the connection on logout request which will be closed only when client triggers it Signed-off-by: Vitta <[email protected]>
1 parent 202e135 commit 39771ce

File tree

1 file changed

+31
-32
lines changed

1 file changed

+31
-32
lines changed

src/istgt_iscsi.c

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -279,11 +279,12 @@ istgt_iscsi_read_pdu(CONN_Ptr conn, ISCSI_PDU_Ptr pdu)
279279
iovec[0].iov_len = 4 * pdu->total_ahs_len;
280280

281281
/* Header Digest */
282-
iovec[1].iov_base = pdu->header_digest;
283282
if (conn->header_digest) {
283+
iovec[1].iov_base = pdu->header_digest;
284284
iovec[1].iov_len = ISCSI_DIGEST_LEN;
285285
total += ISCSI_DIGEST_LEN;
286286
} else {
287+
iovec[1].iov_base = NULL;
287288
iovec[1].iov_len = 0;
288289
}
289290

@@ -313,11 +314,12 @@ istgt_iscsi_read_pdu(CONN_Ptr conn, ISCSI_PDU_Ptr pdu)
313314
iovec[2].iov_len = ISCSI_ALIGN(pdu->data_segment_len);
314315

315316
/* Data Digest */
316-
iovec[3].iov_base = pdu->data_digest;
317317
if (conn->data_digest && data_len != 0) {
318+
iovec[3].iov_base = pdu->data_digest;
318319
iovec[3].iov_len = ISCSI_DIGEST_LEN;
319320
total += ISCSI_DIGEST_LEN;
320321
} else {
322+
iovec[3].iov_base = NULL;
321323
iovec[3].iov_len = 0;
322324
}
323325

@@ -349,7 +351,7 @@ istgt_iscsi_read_pdu(CONN_Ptr conn, ISCSI_PDU_Ptr pdu)
349351
for (i = 0; i < 4; i++) {
350352
if (iovec[i].iov_len != 0 && iovec[i].iov_len > (size_t)rc) {
351353
iovec[i].iov_base
352-
= (void *) (((uintptr_t)iovec[i].iov_base) + rc);
354+
= (void *) (((char *)iovec[i].iov_base) + rc);
353355
iovec[i].iov_len -= rc;
354356
break;
355357
} else {
@@ -680,8 +682,8 @@ istgt_iscsi_write_pdu_internal(CONN_Ptr conn, ISCSI_PDU_Ptr pdu, ISTGT_LU_CMD_Pt
680682
rc = writev(conn->sock, &iovec[0], 5);
681683
if (rc < 0) {
682684
now = time(NULL);
683-
ISTGT_ERRLOG("writev() failed (errno=%d,%s,time=%f) for opcode:0x%2.2x CSN:0x%x\n",
684-
errno, conn->initiator_name, difftime(now, start), lu_cmd->cdb0, lu_cmd->CmdSN);
685+
ISTGT_ERRLOG("writev() failed (errno=%d,%s,time=%f) for opcode:%d cdb:0x%2.2x CSN:0x%x\n",
686+
errno, conn->initiator_name, difftime(now, start), opcode, lu_cmd->cdb0, lu_cmd->CmdSN);
685687
return (-1);
686688
}
687689
nbytes -= rc;
@@ -2508,6 +2510,8 @@ istgt_iscsi_op_text(CONN_Ptr conn, ISCSI_PDU_Ptr pdu)
25082510
uint32_t sMaxCmdSN = 0;
25092511
uint32_t cStatSN = 0;
25102512
int step = 0;
2513+
int8_t sendtargets_discovery = 0;
2514+
25112515
if (!conn->full_feature) {
25122516
ISTGT_ERRLOG("before Full Feature\n");
25132517
return (-1);
@@ -2519,7 +2523,7 @@ istgt_iscsi_op_text(CONN_Ptr conn, ISCSI_PDU_Ptr pdu)
25192523
memset(data, 0, alloc_len);
25202524

25212525
cp = (uint8_t *) &pdu->bhs;
2522-
I_bit = BGET8(&cp[0], 7);
2526+
I_bit = BGET8(&cp[0], 6);
25232527
F_bit = BGET8(&cp[1], 7);
25242528
C_bit = BGET8(&cp[1], 6);
25252529

@@ -2623,6 +2627,7 @@ istgt_iscsi_op_text(CONN_Ptr conn, ISCSI_PDU_Ptr pdu)
26232627
conn->initiator_name,
26242628
conn->initiator_addr,
26252629
val, data, alloc_len, data_len);
2630+
sendtargets_discovery = 1;
26262631
SESS_MTX_LOCK(conn);
26272632
} else {
26282633
if (strcasecmp(val, "ALL") == 0) {
@@ -2635,6 +2640,7 @@ istgt_iscsi_op_text(CONN_Ptr conn, ISCSI_PDU_Ptr pdu)
26352640
conn->initiator_name,
26362641
conn->initiator_addr,
26372642
val, data, alloc_len, data_len);
2643+
sendtargets_discovery = 2;
26382644
SESS_MTX_LOCK(conn);
26392645
}
26402646
}
@@ -2689,6 +2695,8 @@ istgt_iscsi_op_text(CONN_Ptr conn, ISCSI_PDU_Ptr pdu)
26892695
return (-1);
26902696
}
26912697

2698+
ISTGT_NOTICELOG("queued op_text response: %s", (sendtargets_discovery == 1) ? "sendtargets_discovery" :
2699+
((sendtargets_discovery == 2) ? "sendtargets_nondiscovery" : ""));
26922700
/* update internal variables */
26932701
istgt_iscsi_copy_param2var(conn);
26942702
/* check value */
@@ -5343,7 +5351,7 @@ wait_all_task(CONN_Ptr conn)
53435351
conn->id, conn->running_tasks);
53445352
}
53455353

5346-
5354+
#if 0
53475355
static void
53485356
snd_cleanup(void *arg)
53495357
{
@@ -5428,6 +5436,7 @@ worker_cleanup(void *arg)
54285436
MTX_UNLOCK(&g_conns_mutex);
54295437
ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "cancel cleanup UNLOCK\n");
54305438
}
5439+
#endif
54315440

54325441
const char lu_task_typ[4][12] = {
54335442
"RESPONSE",
@@ -5724,7 +5733,7 @@ sender(void *arg)
57245733
pthread_set_name_np(slf, tinfo);
57255734
#endif
57265735

5727-
pthread_cleanup_push(snd_cleanup, (void *)conn);
5736+
// pthread_cleanup_push(snd_cleanup, (void *)conn);
57285737
memset(&abstime, 0, sizeof (abstime));
57295738
/* handle DATA-IN/SCSI status */
57305739
ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "sender loop start (%d)\n", conn->id);
@@ -5882,7 +5891,7 @@ sender(void *arg)
58825891
// MTX_UNLOCK(&conn->wpdu_mutex);
58835892
}
58845893
// MTX_UNLOCK(&conn->sender_mutex);
5885-
pthread_cleanup_pop(0);
5894+
// pthread_cleanup_pop(0);
58865895
ISTGT_NOTICELOG("sender loop ended (%d:%d:%d)\n", conn->id, conn->epfd, ntohs(conn->iport));
58875896
return (NULL);
58885897
}
@@ -5929,22 +5938,21 @@ worker(void *arg)
59295938
// #endif
59305939

59315940
events.data.fd = conn->sock;
5932-
events.events = EPOLLIN;
5933-
rc = epoll_ctl(epfd, EPOLL_CTL_ADD, conn->sock, &events);
5934-
if (rc == -1) {
5941+
events.events = EPOLLIN;
5942+
rc = epoll_ctl(epfd, EPOLL_CTL_ADD, conn->sock, &events);
5943+
if (rc == -1) {
59355944
ISTGT_ERRLOG("epoll_ctl() failed\n");
59365945
close(epfd);
59375946
return (NULL);
5938-
}
5947+
}
59395948
events.data.fd = conn->task_pipe[0];
5940-
events.events = EPOLLIN;
5941-
rc = epoll_ctl(epfd, EPOLL_CTL_ADD, conn->task_pipe[0], &events);
5942-
if (rc == -1) {
5949+
events.events = EPOLLIN;
5950+
rc = epoll_ctl(epfd, EPOLL_CTL_ADD, conn->task_pipe[0], &events);
5951+
if (rc == -1) {
59435952
ISTGT_ERRLOG("epoll_ctl() failed\n");
59445953
close(epfd);
59455954
return (NULL);
5946-
}
5947-
5955+
}
59485956

59495957
// TODO
59505958
// if (!conn->istgt->daemon) {
@@ -6019,7 +6027,7 @@ worker(void *arg)
60196027
conn->exec_lu_task = NULL;
60206028
lu_task = NULL;
60216029

6022-
pthread_cleanup_push(worker_cleanup, conn);
6030+
// pthread_cleanup_push(worker_cleanup, conn);
60236031
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
60246032

60256033
/* create sender thread */
@@ -6097,22 +6105,23 @@ worker(void *arg)
60976105
if ((events.events & EPOLLERR) ||
60986106
(events.events & EPOLLHUP) ||
60996107
(!(events.events & EPOLLIN))) {
6100-
ISTGT_ERRLOG("close conn %d\n", errno);
6108+
ISTGT_ERRLOG("close conn events %d\n", events.events);
61016109
break;
61026110
}
61036111

61046112
rc = istgt_iscsi_read_pdu(conn, &conn->pdu);
61056113
if (rc < 0) {
61066114
if (errno == EAGAIN) {
6115+
ISTGT_ERRLOG("close conn %d %d\n", errno, events.events);
61076116
break;
61086117
}
61096118
if (conn->state != CONN_STATE_EXITING) {
61106119
ISTGT_ERRLOG("conn->state = %d\n", conn->state);
61116120
}
61126121
if (conn->state != CONN_STATE_RUNNING) {
61136122
if (errno == EINPROGRESS) {
6114-
sleep(1);
6115-
continue;
6123+
ISTGT_ERRLOG("iscsi_read_pdu shouldn't get EINPROGRESS");
6124+
break;
61166125
}
61176126
if (errno == ECONNRESET
61186127
|| errno == ETIMEDOUT) {
@@ -6139,7 +6148,6 @@ worker(void *arg)
61396148
break;
61406149
} else if (rc == 1) { // means successful logout ISCSI_OP_LOGOUT
61416150
ISTGT_TRACELOG(ISTGT_TRACE_ISCSI, "logout received\n");
6142-
break;
61436151
}
61446152

61456153
if (conn->pdu.ahs != NULL) {
@@ -6273,7 +6281,6 @@ worker(void *arg)
62736281

62746282
cleanup_exit:
62756283
;
6276-
pthread_cleanup_pop(0);
62776284
conn->state = CONN_STATE_EXITING;
62786285
if (conn->sess != NULL) {
62796286
lu = conn->sess->lu;
@@ -6480,14 +6487,6 @@ istgt_create_conn(ISTGT_Ptr istgt, PORTAL_Ptr portal, int sock, struct sockaddr
64806487
ISTGT_ERRLOG("istgt_set_sendtimeo() failed\n");
64816488
goto error_return;
64826489
}
6483-
#if defined(ISTGT_USE_IOVEC)
6484-
/* set low water mark */
6485-
rc = istgt_set_recvlowat(conn->sock, ISCSI_BHS_LEN);
6486-
if (rc != 0) {
6487-
ISTGT_ERRLOG("istgt_set_recvlowat() failed\n");
6488-
goto error_return;
6489-
}
6490-
#endif
64916490

64926491
rc = pipe(conn->task_pipe);
64936492
if (rc != 0) {

0 commit comments

Comments
 (0)