@@ -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
53475355static void
53485356snd_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
54325441const 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