Hello community,

here is the log from the commit of package istgt for openSUSE:Factory checked 
in at 2012-11-08 08:04:59
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/istgt (Old)
 and      /work/SRC/openSUSE:Factory/.istgt.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "istgt", Maintainer is ""

Changes:
--------
--- /work/SRC/openSUSE:Factory/istgt/istgt.changes      2012-09-11 
09:08:14.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.istgt.new/istgt.changes 2012-11-08 
08:05:18.000000000 +0100
@@ -1,0 +2,15 @@
+Tue Nov  6 13:07:35 UTC 2012 - [email protected]
+
+- Update to upstream istgt-20121028.tar.gz release.
+
+- Japanese -> English ChangeLog.jp via Google Translate:
+  + Modified to return the (Changeable values) PC = 01b in MODE_SENSE
+    and modified to use NOTE_LOWAT SO_RCVLOWAT
+  + Fixed issue an error if you specify no authentication: istgtcontrol
+  + modified to abort initialization error: istgtcontrol
+  + Socket system displays an error
+  + Iqn Show at the PDU error
+  + Add a time-out error log
+  + Add the batch code using readv / writev
+
+-------------------------------------------------------------------

Old:
----
  istgt-20120901.tar.gz

New:
----
  istgt-20121028.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ istgt.spec ++++++
--- /var/tmp/diff_new_pack.TKU2hb/_old  2012-11-08 08:05:19.000000000 +0100
+++ /var/tmp/diff_new_pack.TKU2hb/_new  2012-11-08 08:05:19.000000000 +0100
@@ -17,9 +17,9 @@
 
 
 Name:           istgt
-Version:        0.8
-Release:        20120901
-%define upstreamrel 20120901
+Version:        0.10
+Release:        20121028
+%define upstreamrel 20121028
 Summary:        Userspace iSCSI Target
 License:        BSD-2-Clause
 Group:          Productivity/Networking/Other

++++++ istgt-20120901.tar.gz -> istgt-20121028.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istgt-20120901/ChangeLog.jp 
new/istgt-20121028/ChangeLog.jp
--- old/istgt-20120901/ChangeLog.jp     2012-09-01 04:19:35.000000000 +0200
+++ new/istgt-20121028/ChangeLog.jp     2012-10-28 00:26:36.000000000 +0200
@@ -1,3 +1,21 @@
+2012/10/28
+       2012/10/28版
+       MODE_SENSEでPC=01b(Changeable values)を返すように修正
+       SO_RCVLOWATとNOTE_LOWATを使うように修正
+
+2012/10/16
+       2012/10/16版
+       istgtcontrol:認証なしを指定するとエラーを出すのを修正
+       istgtcontrol:初期化エラーで中断するように変更
+
+2012/10/06
+       ソケット系エラーを表示
+       PDUエラー時にiqnを表示
+       タイムアウトエラーログに時間を追加
+
+2012/10/04
+       readv/writevを使った一括処理コードを追加
+
 2012/09/01
        2012/09/01版
        サポート外のMODE_SENSEにINVALID FIELD IN CDBを返すように変更
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istgt-20120901/README new/istgt-20121028/README
--- old/istgt-20120901/README   2012-08-09 00:48:09.000000000 +0200
+++ new/istgt-20121028/README   2012-10-15 23:40:18.000000000 +0200
@@ -84,18 +84,22 @@
  o VMware ESXi 4.0 (builtin)
  o VMware ESXi 4.1 Update 1 (builtin)
  o VMware ESXi 5.0 (builtin)
+ o VMware ESXi 5.1 (builtin)
  o Xen Server 5.0 Update 3 (builtin)
  o Xen Server 5.5 (builtin)
  o FreeBSD 7.1 + iscsi 2.1.3
  o FreeBSD 7.2 + iscsi 2.2.3
  o FreeBSD 7.3 + iscsi 2.2.4
  o FreeBSD 8.2 + isboot 0.2.3
+ o FreeBSD 9.1 + isboot 0.2.6
  o CentOS 5.2 + Open-iSCSI (package)
  o Ubuntu 9.10 + Open-iSCSI (package)
  o gPXE 1.0.0 + VirtualBox 3.1.2 on FreeNAS 0.7.1
+ o iPXE 1.0.0 + isboot 0.2.5 + FreeBSD 9.1
  o FreeNAS 0.7.1 (FreeBSD 7.2/7.3 + iscsi 2.2.4)
  o FreeNAS 0.7.2 (FreeBSD 7.3 + iscsi 2.2.4)
  o FreeNAS 0.7.5 (FreeBSD 9.0 + iscsi 2.3.1.0)
+ o NAS4Free 9.1.0.1 (FreeBSD 9.1 + iscsi 2.3.1.0)
 
 Features:
  o MCS/MPIO for failover (up to 255 concurrent sessions)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istgt-20120901/etc/istgt.conf.in 
new/istgt-20121028/etc/istgt.conf.in
--- old/istgt-20120901/etc/istgt.conf.in        2012-07-25 18:47:13.000000000 
+0200
+++ new/istgt-20121028/etc/istgt.conf.in        2012-10-28 00:26:36.000000000 
+0200
@@ -163,6 +163,8 @@
 
   # for future use (enabled by default)
   #LUN0 Option ReadCache Disable
+
+  # control WCE(mode page 8) and O_FSYNC/O_SYNC on the backing store (enabled 
by default)
   #LUN0 Option WriteCache Disable
 
 #[LogicalUnit2]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istgt-20120901/src/Makefile.in 
new/istgt-20121028/src/Makefile.in
--- old/istgt-20120901/src/Makefile.in  2012-08-09 00:48:09.000000000 +0200
+++ new/istgt-20121028/src/Makefile.in  2012-10-15 23:40:18.000000000 +0200
@@ -46,9 +46,9 @@
 document = 
 sample   = 
 
-ctl_source = istgtcontrol.c istgt_conf.c istgt_sock.c istgt_misc.c \
+ctl_source = istgtcontrol.c istgt_conf.c istgt_log.c istgt_sock.c istgt_misc.c 
\
        istgt_md5.c
-ctl_header = istgt_ver.h istgt_conf.h istgt_sock.h istgt_misc.h \
+ctl_header = istgt_ver.h istgt_conf.h istgt_log.h istgt_sock.h istgt_misc.h \
        istgt_md5.h
 
 ISTGT    = $(source:.c=.o)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istgt-20120901/src/istgt_iscsi.c 
new/istgt-20121028/src/istgt_iscsi.c
--- old/istgt-20120901/src/istgt_iscsi.c        2012-08-18 23:04:12.000000000 
+0200
+++ new/istgt-20121028/src/istgt_iscsi.c        2012-10-28 00:26:36.000000000 
+0200
@@ -117,6 +117,14 @@
 static int istgt_iscsi_drop_all_conns(CONN_Ptr conn);
 static int istgt_iscsi_drop_old_conns(CONN_Ptr conn);
 
+/* Switch to use readv/writev (assume blocking) */
+#define ISTGT_USE_IOVEC
+
+#if defined (ISTGT_USE_IOVEC)
+#include <sys/uio.h>
+#endif
+
+#if !defined (ISTGT_USE_IOVEC)
 #if 0
 #define ISTGT_USE_RECVBLOCK
 #define ISTGT_USE_SENDBLOCK
@@ -376,6 +384,7 @@
 #endif /* ISTGT_USE_SENDBLOCK */
        return nbytes;
 }
+#endif /* !defined (ISTGT_USE_IOVEC) */
 
 #define MATCH_DIGEST_WORD(BUF, CRC32C) \
        (    ((((uint32_t) *((uint8_t *)(BUF)+0)) << 0)         \
@@ -417,6 +426,7 @@
 }
 #endif
 
+#if !defined (ISTGT_USE_IOVEC)
 static int
 istgt_iscsi_read_pdu(CONN_Ptr conn, ISCSI_PDU_Ptr pdu)
 {
@@ -447,13 +457,14 @@
                            conn->initiator_name);
                        conn->state = CONN_STATE_EXITING;
                } else {
-                       ISTGT_ERRLOG("iscsi_read() failed (errno=%d)\n",
-                           errno);
+                       ISTGT_ERRLOG("iscsi_read() failed (errno=%d,%s)\n",
+                           errno, conn->initiator_name);
                }
                return -1;
        }
        if (rc == 0) {
-               ISTGT_TRACELOG(ISTGT_TRACE_NET, "iscsi_read() EOF\n");
+               ISTGT_TRACELOG(ISTGT_TRACE_NET, "iscsi_read() EOF (%s)\n",
+                   conn->initiator_name);
                conn->state = CONN_STATE_EXITING;
                return -1;
        }
@@ -471,7 +482,8 @@
                    (4 * total_ahs_len));
                rc = istgt_iscsi_read(conn, pdu->ahs, (4 * total_ahs_len));
                if (rc < 0) {
-                       ISTGT_ERRLOG("iscsi_read() failed\n");
+                       ISTGT_ERRLOG("iscsi_read() failed (errno=%d,%s)\n",
+                           errno, conn->initiator_name);
                        return -1;
                }
                if (rc == 0) {
@@ -497,7 +509,8 @@
                rc = istgt_iscsi_read(conn, pdu->header_digest,
                    ISCSI_DIGEST_LEN);
                if (rc < 0) {
-                       ISTGT_ERRLOG("iscsi_read() failed\n");
+                       ISTGT_ERRLOG("iscsi_read() failed (errno=%d,%s)\n",
+                           errno, conn->initiator_name);
                        {
                                int opcode = BGET8W(&pdu->bhs.opcode, 5, 6);
                                ISTGT_ERRLOG("Header Digest read error (opcode 
= 0x%x)\n",
@@ -540,8 +553,8 @@
                    data_len);
                rc = istgt_iscsi_read(conn, pdu->data, data_len);
                if (rc < 0) {
-                       ISTGT_ERRLOG("iscsi_read() failed (%d,errno=%d)\n",
-                           rc, errno);
+                       ISTGT_ERRLOG("iscsi_read() failed (%d,errno=%d,%s)\n",
+                           rc, errno, conn->initiator_name);
                        return -1;
                }
                if (rc == 0) {
@@ -577,7 +590,8 @@
                rc = istgt_iscsi_read(conn, pdu->data_digest,
                    ISCSI_DIGEST_LEN);
                if (rc < 0) {
-                       ISTGT_ERRLOG("iscsi_read() failed\n");
+                       ISTGT_ERRLOG("iscsi_read() failed (errno=%d,%s)\n",
+                           errno, conn->initiator_name);
                        return -1;
                }
                if (rc == 0) {
@@ -611,7 +625,7 @@
                }
                rc = MATCH_DIGEST_WORD(pdu->header_digest, crc32c);
                if (rc == 0) {
-                       ISTGT_ERRLOG("header digest error\n");
+                       ISTGT_ERRLOG("header digest error (%s)\n", 
conn->initiator_name);
                        return -1;
                }
        }
@@ -619,13 +633,197 @@
                crc32c = istgt_crc32c(pdu->data, data_len);
                rc = MATCH_DIGEST_WORD(pdu->data_digest, crc32c);
                if (rc == 0) {
-                       ISTGT_ERRLOG("data digest error\n");
+                       ISTGT_ERRLOG("data digest error (%s)\n", 
conn->initiator_name);
+                       return -1;
+               }
+       }
+
+       return total;
+}
+#else /* defined (ISTGT_USE_IOVEC) */
+static int
+istgt_iscsi_read_pdu(CONN_Ptr conn, ISCSI_PDU_Ptr pdu)
+{
+       struct iovec iovec[4]; /* AHS+HD+DATA+DD */
+       uint32_t crc32c;
+       time_t start, now;
+       int nbytes;
+       int total_ahs_len;
+       int data_len;
+       int segment_len;
+       int total;
+       int rc;
+       int i;
+
+       pdu->ahs = NULL;
+       pdu->total_ahs_len = 0;
+       pdu->data = NULL;
+       pdu->data_segment_len = 0;
+       total = 0;
+
+       /* BHS (require for all PDU) */
+       ISTGT_TRACELOG(ISTGT_TRACE_NET, "BHS read %d\n",
+           ISCSI_BHS_LEN);
+       errno = 0;
+       start = time(NULL);
+       rc = recv(conn->sock, &pdu->bhs, ISCSI_BHS_LEN, MSG_WAITALL);
+       if (rc < 0) {
+               now = time(NULL);
+               if (errno == ECONNRESET) {
+                       ISTGT_WARNLOG("Connection reset by peer (%s,time=%d)\n",
+                           conn->initiator_name, (int)difftime(now, start));
+                       conn->state = CONN_STATE_EXITING;
+               } else if (errno == ETIMEDOUT) {
+                       ISTGT_WARNLOG("Operation timed out (%s,time=%d)\n",
+                           conn->initiator_name, (int)difftime(now, start));
+                       conn->state = CONN_STATE_EXITING;
+               } else {
+                       ISTGT_ERRLOG("iscsi_read() failed 
(errno=%d,%s,time=%d)\n",
+                           errno, conn->initiator_name, (int)difftime(now, 
start));
+               }
+               return -1;
+       }
+       if (rc == 0) {
+               ISTGT_TRACELOG(ISTGT_TRACE_NET, "recv() EOF (%s)\n",
+                   conn->initiator_name);
+               conn->state = CONN_STATE_EXITING;
+               return -1;
+       }
+       if (rc != ISCSI_BHS_LEN) {
+               ISTGT_ERRLOG("invalid BHS length (%d,%s)\n", rc, 
conn->initiator_name);
+               return -1;
+       }
+       total += ISCSI_BHS_LEN;
+
+       /* AHS */
+       total_ahs_len = DGET8(&pdu->bhs.total_ahs_len);
+       if (total_ahs_len != 0) {
+               pdu->ahs = xmalloc(ISCSI_ALIGN((4 * total_ahs_len)));
+               pdu->total_ahs_len = total_ahs_len;
+               total += (4 * total_ahs_len);
+       } else {
+               pdu->ahs = NULL;
+               pdu->total_ahs_len = 0;
+       }
+       iovec[0].iov_base = pdu->ahs;
+       iovec[0].iov_len = 4 * pdu->total_ahs_len;
+
+       /* Header Digest */
+       iovec[1].iov_base = pdu->header_digest;
+       if (conn->header_digest) {
+               iovec[1].iov_len = ISCSI_DIGEST_LEN;
+               total += ISCSI_DIGEST_LEN;
+       } else {
+               iovec[1].iov_len = 0;
+       }
+
+       /* Data Segment */
+       data_len = DGET24(&pdu->bhs.data_segment_len[0]);
+       if (data_len != 0) {
+               if (conn->sess == NULL) {
+                       segment_len = DEFAULT_FIRSTBURSTLENGTH;
+               } else {
+                       segment_len = conn->MaxRecvDataSegmentLength;
+               }
+               if (data_len > segment_len) {
+                       ISTGT_ERRLOG("Data(%d) > Segment(%d)\n",
+                           data_len, segment_len);
+                       return -1;
+               }
+               if (ISCSI_ALIGN(data_len) <= ISTGT_SHORTDATASIZE) {
+                       pdu->data = pdu->shortdata;
+               } else {
+                       pdu->data = xmalloc(ISCSI_ALIGN(segment_len));
+               }
+               pdu->data_segment_len = data_len;
+               total += ISCSI_ALIGN(data_len);
+       } else {
+               pdu->data = NULL;
+               pdu->data_segment_len = 0;
+       }
+       iovec[2].iov_base = pdu->data;
+       iovec[2].iov_len = ISCSI_ALIGN(pdu->data_segment_len);
+
+       /* Data Digest */
+       iovec[3].iov_base = pdu->data_digest;
+       if (conn->data_digest && data_len != 0) {
+               iovec[3].iov_len = ISCSI_DIGEST_LEN;
+               total += ISCSI_DIGEST_LEN;
+       } else {
+               iovec[3].iov_len = 0;
+       }
+
+       /* read all bytes to iovec */
+       nbytes = total - ISCSI_BHS_LEN;
+       ISTGT_TRACELOG(ISTGT_TRACE_NET, "PDU read %d\n", nbytes);
+       errno = 0;
+       start = time(NULL);
+       while (nbytes > 0) {
+               rc = readv(conn->sock, &iovec[0], 4);
+               if (rc < 0) {
+                       now = time(NULL);
+                       ISTGT_ERRLOG("readv() failed 
(%d,errno=%d,%s,time=%d)\n",
+                           rc, errno, conn->initiator_name, (int)difftime(now, 
start));
+                       return -1;
+               }
+               if (rc == 0) {
+                       ISTGT_TRACELOG(ISTGT_TRACE_NET, "readv() EOF (%s)\n",
+                           conn->initiator_name);
+                       conn->state = CONN_STATE_EXITING;
+                       return -1;
+               }
+               nbytes -= rc;
+               if (nbytes == 0)
+                       break;
+               /* adjust iovec length */
+               for (i = 0; i < 4; i++) {
+                       if (iovec[i].iov_len != 0 && iovec[i].iov_len > 
(size_t)rc) {
+                               iovec[i].iov_base
+                                       = (void *) 
(((uintptr_t)iovec[i].iov_base) + rc);
+                               iovec[i].iov_len -= rc;
+                               break;
+                       } else {
+                               rc -= iovec[i].iov_len;
+                               iovec[i].iov_len = 0;
+                       }
+               }
+       }
+
+       /* check digest */
+       if (conn->header_digest) {
+               if (total_ahs_len == 0) {
+                       crc32c = istgt_crc32c((uint8_t *) &pdu->bhs,
+                           ISCSI_BHS_LEN);
+               } else {
+                       int upd_total = 0;
+                       crc32c = ISTGT_CRC32C_INITIAL;
+                       crc32c = istgt_update_crc32c((uint8_t *) &pdu->bhs,
+                           ISCSI_BHS_LEN, crc32c);
+                       upd_total += ISCSI_BHS_LEN;
+                       crc32c = istgt_update_crc32c((uint8_t *) pdu->ahs,
+                           (4 * total_ahs_len), crc32c);
+                       upd_total += (4 * total_ahs_len);
+                       crc32c = istgt_fixup_crc32c(upd_total, crc32c);
+                       crc32c = crc32c ^ ISTGT_CRC32C_XOR;
+               }
+               rc = MATCH_DIGEST_WORD(pdu->header_digest, crc32c);
+               if (rc == 0) {
+                       ISTGT_ERRLOG("header digest error (%s)\n", 
conn->initiator_name);
+                       return -1;
+               }
+       }
+       if (conn->data_digest && data_len != 0) {
+               crc32c = istgt_crc32c(pdu->data, ISCSI_ALIGN(data_len));
+               rc = MATCH_DIGEST_WORD(pdu->data_digest, crc32c);
+               if (rc == 0) {
+                       ISTGT_ERRLOG("data digest error (%s)\n", 
conn->initiator_name);
                        return -1;
                }
        }
 
        return total;
 }
+#endif /* defined (ISTGT_USE_IOVEC) */
 
 static int istgt_iscsi_write_pdu_internal(CONN_Ptr conn, ISCSI_PDU_Ptr pdu);
 static int istgt_iscsi_write_pdu_queue(CONN_Ptr conn, ISCSI_PDU_Ptr pdu, int 
req_type, int I_bit);
@@ -787,6 +985,7 @@
        return rc;
 }
 
+#if !defined (ISTGT_USE_IOVEC)
 static int
 istgt_iscsi_write_pdu_internal(CONN_Ptr conn, ISCSI_PDU_Ptr pdu)
 {
@@ -843,8 +1042,8 @@
                    total);
                rc = istgt_iscsi_write(conn, spp, total);
                if (rc < 0) {
-                       ISTGT_ERRLOG("iscsi_write() failed (errno=%d)\n",
-                           errno);
+                       ISTGT_ERRLOG("iscsi_write() failed (errno=%d,%s)\n",
+                           errno, conn->initiator_name);
                        return -1;
                }
                if (rc != total) {
@@ -860,7 +1059,8 @@
            ISCSI_BHS_LEN);
        rc = istgt_iscsi_write(conn, &pdu->bhs, ISCSI_BHS_LEN);
        if (rc < 0) {
-               ISTGT_ERRLOG("iscsi_write() failed (errno=%d)\n", errno);
+               ISTGT_ERRLOG("iscsi_write() failed (errno=%d,%s)\n", errno,
+                   conn->initiator_name);
                return -1;
        }
        if (rc != ISCSI_BHS_LEN) {
@@ -875,7 +1075,8 @@
                    (4 * total_ahs_len));
                rc = istgt_iscsi_write(conn, pdu->ahs, (4 * total_ahs_len));
                if (rc < 0) {
-                       ISTGT_ERRLOG("iscsi_write() failed\n");
+                       ISTGT_ERRLOG("iscsi_write() failed (errno=%d,%s)\n",
+                           errno, conn->initiator_name);
                        return -1;
                }
                if (rc != (4 * total_ahs_len)) {
@@ -909,7 +1110,8 @@
                rc = istgt_iscsi_write(conn, pdu->header_digest,
                    ISCSI_DIGEST_LEN);
                if (rc < 0) {
-                       ISTGT_ERRLOG("iscsi_write() failed\n");
+                       ISTGT_ERRLOG("iscsi_write() failed (errno=%d,%s)\n",
+                           errno, conn->initiator_name);
                        return -1;
                }
                if (rc != ISCSI_DIGEST_LEN) {
@@ -926,7 +1128,8 @@
                    data_len);
                rc = istgt_iscsi_write(conn, pdu->data, data_len);
                if (rc < 0) {
-                       ISTGT_ERRLOG("iscsi_write() failed\n");
+                       ISTGT_ERRLOG("iscsi_write() failed (errno=%d,%s)\n",
+                           errno, conn->initiator_name);
                        return -1;
                }
                if (rc != data_len) {
@@ -949,7 +1152,8 @@
                rc = istgt_iscsi_write(conn, pdu->data_digest,
                    ISCSI_DIGEST_LEN);
                if (rc < 0) {
-                       ISTGT_ERRLOG("iscsi_write() failed\n");
+                       ISTGT_ERRLOG("iscsi_write() failed (errno=%d,%s)\n",
+                           errno, conn->initiator_name);
                        return -1;
                }
                if (rc != ISCSI_DIGEST_LEN) {
@@ -962,6 +1166,121 @@
 
        return total;
 }
+#else /* defined (ISTGT_USE_IOVEC) */
+static int
+istgt_iscsi_write_pdu_internal(CONN_Ptr conn, ISCSI_PDU_Ptr pdu)
+{
+       struct iovec iovec[5]; /* BHS+AHS+HD+DATA+DD */
+       uint8_t *cp;
+       uint32_t crc32c;
+       time_t start, now;
+       int nbytes;
+       int enable_digest;
+       int opcode;
+       int total_ahs_len;
+       int data_len;
+       int total;
+       int rc;
+       int i;
+
+       cp = (uint8_t *) &pdu->bhs;
+       total_ahs_len = DGET8(&cp[4]);
+       data_len = DGET24(&cp[5]);
+       total = 0;
+
+       enable_digest = 1;
+       opcode = BGET8W(&cp[0], 5, 6);
+       if (opcode == ISCSI_OP_LOGIN_RSP) {
+               /* this PDU should be sent without digest */
+               enable_digest = 0;
+       }
+
+       /* BHS */
+       iovec[0].iov_base = &pdu->bhs;
+       iovec[0].iov_len = ISCSI_BHS_LEN;
+       total += ISCSI_BHS_LEN;
+
+       /* AHS */
+       iovec[1].iov_base = pdu->ahs;
+       iovec[1].iov_len = 4 * total_ahs_len;
+       total += (4 * total_ahs_len);
+
+       /* Header Digest */
+       iovec[2].iov_base = pdu->header_digest;
+       if (enable_digest && conn->header_digest) {
+               if (total_ahs_len == 0) {
+                       crc32c = istgt_crc32c((uint8_t *) &pdu->bhs,
+                           ISCSI_BHS_LEN);
+               } else {
+                       int upd_total = 0;
+                       crc32c = ISTGT_CRC32C_INITIAL;
+                       crc32c = istgt_update_crc32c((uint8_t *) &pdu->bhs,
+                           ISCSI_BHS_LEN, crc32c);
+                       upd_total += ISCSI_BHS_LEN;
+                       crc32c = istgt_update_crc32c((uint8_t *) pdu->ahs,
+                           (4 * total_ahs_len), crc32c);
+                       upd_total += (4 * total_ahs_len);
+                       crc32c = istgt_fixup_crc32c(upd_total, crc32c);
+                       crc32c = crc32c ^ ISTGT_CRC32C_XOR;
+               }
+               MAKE_DIGEST_WORD(pdu->header_digest, crc32c);
+
+               iovec[2].iov_len = ISCSI_DIGEST_LEN;
+               total += ISCSI_DIGEST_LEN;
+       } else {
+               iovec[2].iov_len = 0;
+       }
+
+       /* Data Segment */
+       iovec[3].iov_base = pdu->data;
+       iovec[3].iov_len = ISCSI_ALIGN(data_len);
+       total += ISCSI_ALIGN(data_len);
+
+       /* Data Digest */
+       iovec[4].iov_base = pdu->data_digest;
+       if (enable_digest && conn->data_digest && data_len != 0) {
+               crc32c = istgt_crc32c(pdu->data, ISCSI_ALIGN(data_len));
+               MAKE_DIGEST_WORD(pdu->data_digest, crc32c);
+
+               iovec[4].iov_len = ISCSI_DIGEST_LEN;
+               total += ISCSI_DIGEST_LEN;
+       } else {
+               iovec[4].iov_len = 0;
+       }
+
+       /* write all bytes from iovec */
+       nbytes = total;
+       ISTGT_TRACELOG(ISTGT_TRACE_NET, "PDU write %d\n", nbytes);
+       errno = 0;
+       start = time(NULL);
+       while (nbytes > 0) {
+               rc = writev(conn->sock, &iovec[0], 5);
+               if (rc < 0) {
+                       now = time(NULL);
+                       ISTGT_ERRLOG("writev() failed (errno=%d,%s,time=%d)\n",
+                           errno, conn->initiator_name, (int)difftime(now, 
start));
+                       return -1;
+               }
+               nbytes -= rc;
+               if (nbytes == 0)
+                       break;
+               /* adjust iovec length */
+               for (i = 0; i < 5; i++) {
+                       if (iovec[i].iov_len != 0 && iovec[i].iov_len > 
(size_t)rc) {
+                               iovec[i].iov_base
+                                       = (void *) 
(((uintptr_t)iovec[i].iov_base) + rc);
+                               iovec[i].iov_len -= rc;
+                               break;
+                       } else {
+                               rc -= iovec[i].iov_len;
+                               iovec[i].iov_len = 0;
+                       }
+               }
+       }
+
+       return total;
+}
+#endif /* defined (ISTGT_USE_IOVEC) */
 
 int
 istgt_iscsi_copy_pdu(ISCSI_PDU_Ptr dst_pdu, ISCSI_PDU_Ptr src_pdu)
@@ -3239,10 +3558,10 @@
                if (SN32_GT(CmdSN, conn->sess->ExpCmdSN)) {
                        if (conn->sess->connections > 1) {
                                struct timespec abstime;
-                               time_t now;
+                               time_t start, now;
 
                                SESS_MTX_UNLOCK(conn);
-                               now = time(NULL);
+                               start = now = time(NULL);
                                memset(&abstime, 0, sizeof abstime);
                                abstime.tv_sec = now + (MAX_MCSREVWAIT / 1000);
                                abstime.tv_nsec = (MAX_MCSREVWAIT % 1000) * 
1000000;
@@ -3269,8 +3588,11 @@
                                        }
                                }
                                if (rc < 0) {
-                                       ISTGT_ERRLOG("MCS: CmdSN(%u) error 
ExpCmdSN=%u\n",
-                                           CmdSN, conn->sess->ExpCmdSN);
+                                       now = time(NULL);
+                                       ISTGT_ERRLOG("MCS: CmdSN(%u) error 
ExpCmdSN=%u "
+                                           "(time=%d)\n",
+                                           CmdSN, conn->sess->ExpCmdSN,
+                                           (int)difftime(now, start));
                                        SESS_MTX_UNLOCK(conn);
                                        return -1;
                                }
@@ -5162,7 +5484,11 @@
                return NULL;
        }
        conn->kq = kq;
+#if defined (ISTGT_USE_IOVEC) && defined (NOTE_LOWAT)
+       ISTGT_EV_SET(&kev, conn->sock, EVFILT_READ, EV_ADD, NOTE_LOWAT, 
ISCSI_BHS_LEN, NULL);
+#else
        ISTGT_EV_SET(&kev, conn->sock, EVFILT_READ, EV_ADD, 0, 0, NULL);
+#endif
        rc = kevent(kq, &kev, 1, NULL, 0, NULL);
        if (rc == -1) {
                ISTGT_ERRLOG("kevent() failed\n");
@@ -5351,7 +5677,9 @@
                        conn->pdu.copy_pdu = 0;
                        rc = istgt_iscsi_read_pdu(conn, &conn->pdu);
                        if (rc < 0) {
-                               ISTGT_ERRLOG("conn->state = %d\n", conn->state);
+                               if (conn->state != CONN_STATE_EXITING) {
+                                       ISTGT_ERRLOG("conn->state = %d\n", 
conn->state);
+                               }
                                if (conn->state != CONN_STATE_RUNNING) {
                                        if (errno == EINPROGRESS) {
                                                sleep(1);
@@ -5788,6 +6116,14 @@
                ISTGT_ERRLOG("istgt_set_sendtimeo() failed\n");
                goto error_return;
        }
+#if defined (ISTGT_USE_IOVEC)
+       /* set low water mark */
+       rc = istgt_set_recvlowat(conn->sock, ISCSI_BHS_LEN);
+       if (rc != 0) {
+               ISTGT_ERRLOG("istgt_set_recvlowat() failed\n");
+               goto error_return;
+       }
+#endif
 
        rc = pipe(conn->task_pipe);
        if (rc != 0) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istgt-20120901/src/istgt_log.c 
new/istgt-20121028/src/istgt_log.c
--- old/istgt-20120901/src/istgt_log.c  2010-01-02 18:57:26.000000000 +0100
+++ new/istgt-20121028/src/istgt_log.c  2012-10-15 23:40:18.000000000 +0200
@@ -220,6 +220,22 @@
 }
 
 void
+istgtcontrol_open_log(void)
+{
+       if (g_log_facility != 0) {
+               openlog("istgtcontrol", LOG_PID, g_log_facility);
+       } else {
+               openlog("istgtcontrol", LOG_PID, ISTGT_LOG_FACILITY);
+       }
+}
+
+void
+istgtcontrol_close_log(void)
+{
+       closelog();
+}
+
+void
 istgt_set_trace_flag(int flag)
 {
        if (flag == ISTGT_TRACE_NONE) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istgt-20120901/src/istgt_log.h 
new/istgt-20121028/src/istgt_log.h
--- old/istgt-20120901/src/istgt_log.h  2012-07-29 01:00:11.000000000 +0200
+++ new/istgt-20121028/src/istgt_log.h  2012-10-15 23:40:18.000000000 +0200
@@ -91,6 +91,8 @@
 void istgt_warnlog(const char *file, const int line, const char *func, const 
char *format, ...) __attribute__((__format__(__printf__, 4, 5)));
 void istgt_open_log(void);
 void istgt_close_log(void);
+void istgtcontrol_open_log(void);
+void istgtcontrol_close_log(void);
 void istgt_set_trace_flag(int flag);
 void istgt_trace_dump(int flag, const char *label, const uint8_t *buf, size_t 
len);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istgt-20120901/src/istgt_lu_disk.c 
new/istgt-20121028/src/istgt_lu_disk.c
--- old/istgt-20120901/src/istgt_lu_disk.c      2012-09-01 07:30:41.000000000 
+0200
+++ new/istgt-20121028/src/istgt_lu_disk.c      2012-10-28 00:26:36.000000000 
+0200
@@ -1864,6 +1864,13 @@
                plen = 0x12 + 2;
                MODE_SENSE_PAGE_INIT(cp, plen, page, subpage);
                BDADD8(&cp[0], 1, 7); /* PS */
+               if (pc == 0x01) {
+                       // Changeable values
+                       BDADD8(&cp[2], 1, 2); /* WCE */
+                       BDADD8(&cp[2], 1, 0); /* RCD */
+                       len += plen;
+                       break;
+               }
                BDADD8(&cp[2], 1, 2); /* WCE */
                //BDADD8(&cp[2], 1, 0); /* RCD */
                {
@@ -5088,7 +5095,7 @@
        CONN_Ptr conn;
        ISTGT_LU_CMD_Ptr lu_cmd;
        struct timespec abstime;
-       time_t now;
+       time_t start, now;
        uint8_t *iobuf;
        char tmp[1];
        int abort_task = 0;
@@ -5257,7 +5264,7 @@
                                goto error_return;
                        }
 
-                       now = time(NULL);
+                       start = now = time(NULL);
                        abstime.tv_sec = now + (lu_task->condwait / 1000);
                        abstime.tv_nsec = (lu_task->condwait % 1000) * 1000000;
 #if 0
@@ -5279,8 +5286,11 @@
                                                spec->wait_lu_task = NULL;
                                                
MTX_UNLOCK(&spec->wait_lu_task_mutex);
                                                
MTX_UNLOCK(&lu_task->trans_mutex);
-                                               ISTGT_ERRLOG("timeout 
trans_cond CmdSN=%u\n",
-                                                   lu_task->lu_cmd.CmdSN);
+                                               now = time(NULL);
+                                               ISTGT_ERRLOG("timeout 
trans_cond CmdSN=%u "
+                                                   "(time=%d)\n",
+                                                   lu_task->lu_cmd.CmdSN,
+                                                   (int)difftime(now, start));
                                                /* timeout */
                                                return -1;
                                        }
@@ -5315,8 +5325,9 @@
                                }
                                if (rc == ETIMEDOUT) {
                                        lu_task->error = 1;
-                                       ISTGT_ERRLOG("timeout trans_cond 
CmdSN=%u\n",
-                                           lu_task->lu_cmd.CmdSN);
+                                       now = time(NULL);
+                                       ISTGT_ERRLOG("timeout trans_cond 
CmdSN=%u (time=%d)\n",
+                                           lu_task->lu_cmd.CmdSN, 
(int)difftime(now, start));
                                        return -1;
                                }
                                lu_task->error = 1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istgt-20120901/src/istgt_lu_dvd.c 
new/istgt-20121028/src/istgt_lu_dvd.c
--- old/istgt-20120901/src/istgt_lu_dvd.c       2012-09-01 04:19:35.000000000 
+0200
+++ new/istgt-20121028/src/istgt_lu_dvd.c       2012-10-28 00:26:36.000000000 
+0200
@@ -1265,6 +1265,13 @@
                plen = 0x12 + 2;
                MODE_SENSE_PAGE_INIT(cp, plen, page, subpage);
                BDADD8(&cp[0], 1, 7); /* PS */
+               if (pc == 0x01) {
+                       // Changeable values
+                       BDADD8(&cp[2], 1, 2); /* WCE */
+                       BDADD8(&cp[2], 1, 0); /* RCD */
+                       len += plen;
+                       break;
+               }
                BDADD8(&cp[2], 1, 2); /* WCE */
                //BDADD8(&cp[2], 1, 0); /* RCD */
                if (spec->write_cache == 1) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istgt-20120901/src/istgt_lu_tape.c 
new/istgt-20121028/src/istgt_lu_tape.c
--- old/istgt-20120901/src/istgt_lu_tape.c      2012-09-01 04:19:35.000000000 
+0200
+++ new/istgt-20121028/src/istgt_lu_tape.c      2012-10-28 00:26:36.000000000 
+0200
@@ -2368,7 +2368,7 @@
                /* Current values */
        } else if (pc == 0x01) {
                /* Changeable values */
-               if (page != 0x08) {
+               if (page != 0x0f) {
                        /* not supported */
                        return -1;
                }
@@ -2417,6 +2417,17 @@
 
                plen = 0x0e + 2;
                MODE_SENSE_PAGE_INIT(cp, plen, page, subpage);
+               if (pc == 0x01) {
+                       // Changeable values
+                       BDADD8(&cp[2], 1, 7);       /* DCE data compression 
enable */
+                       BDADD8(&cp[2], 1, 6);       /* DCC data compression 
capable */
+                       BDADD8(&cp[3], 1, 7);       /* DDE data decompression 
enable */
+                       BDADD8W(&cp[3], 0, 6, 2);   /* RED report exception on 
decompression */
+                       DSET32(&cp[4], 0xffffffffU); /* COMPRESSION ALGORITHM */
+                       DSET32(&cp[8], 0xffffffffU); /* DECOMPRESSION ALGORITHM 
*/
+                       len += plen;
+                       break;
+               }
                if (spec->compression) {
                        BDADD8(&cp[2], 1, 7);   /* DCE=1 compression enable */
                } else {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istgt-20120901/src/istgt_sock.c 
new/istgt-20121028/src/istgt_sock.c
--- old/istgt-20120901/src/istgt_sock.c 2012-07-29 01:00:11.000000000 +0200
+++ new/istgt-20121028/src/istgt_sock.c 2012-10-28 00:26:36.000000000 +0200
@@ -41,6 +41,7 @@
 #include <netinet/tcp.h>
 
 #include "istgt.h"
+#include "istgt_log.h"
 #include "istgt_sock.h"
 #include "istgt_misc.h"
 
@@ -70,11 +71,13 @@
        salen = sizeof sa;
        rc = getsockname(sock, (struct sockaddr *) &sa, &salen);
        if (rc != 0) {
+               ISTGT_ERRLOG("getsockname() failed (errno=%d)\n", errno);
                return -1;
        }
        rc = getnameinfo((struct sockaddr *) &sa, salen,
            saddr, slen, NULL, 0, NI_NUMERICHOST);
        if (rc != 0) {
+               ISTGT_ERRLOG("getnameinfo() failed (errno=%d)\n", errno);
                return -1;
        }
 
@@ -82,11 +85,13 @@
        salen = sizeof sa;
        rc = getpeername(sock, (struct sockaddr *) &sa, &salen);
        if (rc != 0) {
+               ISTGT_ERRLOG("getpeername() failed (errno=%d)\n", errno);
                return -1;
        }
        rc = getnameinfo((struct sockaddr *) &sa, salen,
            caddr, clen, NULL, 0, NI_NUMERICHOST);
        if (rc != 0) {
+               ISTGT_ERRLOG("getnameinfo() failed (errno=%d)\n", errno);
                return -1;
        }
 
@@ -131,6 +136,7 @@
        hints.ai_flags |= AI_NUMERICHOST;
        rc = getaddrinfo(ip, portnum, &hints, &res0);
        if (rc != 0) {
+               ISTGT_ERRLOG("getaddrinfo() failed (errno=%d)\n", errno);
                return -1;
        }
 
@@ -219,6 +225,7 @@
        hints.ai_flags = AI_NUMERICSERV;
        rc = getaddrinfo(host, portnum, &hints, &res0);
        if (rc != 0) {
+               ISTGT_ERRLOG("getaddrinfo() failed (errno=%d)\n", errno);
                return -1;
        }
 
@@ -288,6 +295,19 @@
        if (rc != 0)
                return -1;
        return 0;
+}
+
+int
+istgt_set_recvlowat(int s, int nbytes)
+{
+       int val;
+       int rc;
+
+       val = nbytes;
+       rc = setsockopt(s, SOL_SOCKET, SO_RCVLOWAT, &val, sizeof val);
+       if (rc != 0)
+               return -1;
+       return 0;
 }
 
 #ifdef USE_POLLWAIT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istgt-20120901/src/istgt_sock.h 
new/istgt-20121028/src/istgt_sock.h
--- old/istgt-20120901/src/istgt_sock.h 2010-01-02 18:57:26.000000000 +0100
+++ new/istgt-20121028/src/istgt_sock.h 2012-10-28 00:26:36.000000000 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2010 Daisuke Aoyama <[email protected]>.
+ * Copyright (C) 2008-2012 Daisuke Aoyama <[email protected]>.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -36,6 +36,7 @@
 int istgt_connect(const char *host, int port);
 int istgt_set_recvtimeout(int s, int msec);
 int istgt_set_sendtimeout(int s, int msec);
+int istgt_set_recvlowat(int s, int nbytes);
 ssize_t istgt_read_socket(int s, void *buf, size_t nbytes, int timeout);
 ssize_t istgt_write_socket(int s, const void *buf, size_t nbytes, int timeout);
 ssize_t istgt_readline_socket(int sock, char *buf, size_t size, char *tmp, 
size_t tmpsize, int *tmpidx, int *tmpcnt, int timeout);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istgt-20120901/src/istgt_ver.h 
new/istgt-20121028/src/istgt_ver.h
--- old/istgt-20120901/src/istgt_ver.h  2012-09-01 04:19:35.000000000 +0200
+++ new/istgt-20121028/src/istgt_ver.h  2012-10-28 00:26:36.000000000 +0200
@@ -29,6 +29,6 @@
 #define ISTGT_VER_H
 
 #define ISTGT_VERSION "0.5"
-#define ISTGT_EXTRA_VERSION "20120901"
+#define ISTGT_EXTRA_VERSION "20121028"
 
 #endif /* ISTGT_VER_H */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/istgt-20120901/src/istgtcontrol.c 
new/istgt-20121028/src/istgtcontrol.c
--- old/istgt-20120901/src/istgtcontrol.c       2012-08-14 21:52:53.000000000 
+0200
+++ new/istgt-20121028/src/istgtcontrol.c       2012-10-15 23:40:18.000000000 
+0200
@@ -40,6 +40,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <syslog.h>
 #include <sys/types.h>
 
 #include "istgt.h"
@@ -993,6 +994,9 @@
                                uctl->req_auth_auto = 1;
                                uctl->req_auth = 0;
                                uctl->req_auth_mutual = 0;
+                       } else if (strcasecmp(val, "None") == 0) {
+                               uctl->req_auth = 0;
+                               uctl->req_auth_mutual = 0;
                        } else {
                                fprintf(stderr, "unknown auth\n");
                                return -1;
@@ -1208,6 +1212,8 @@
        uctl->config = config;
        //istgt_print_config(config);
 
+       istgtcontrol_open_log();
+
        /* take specified command */
        if (argc < 1) {
        error_usage_return:
@@ -1256,7 +1262,12 @@
        }
 
        /* build parameters */
-       uctl_init(uctl);
+       rc = uctl_init(uctl);
+       if (rc < 0) {
+               fprintf(stderr, "uctl_init() failed\n");
+               istgt_free_config(config);
+               exit(EXIT_FAILURE);
+       }
        uctl->recvtmpcnt = 0;
        uctl->recvtmpidx = 0;
        uctl->recvtmpsize = sizeof uctl->recvtmp;
@@ -1443,6 +1454,7 @@
        xfree(banner);
        xfree(cmd);
        istgt_free_config(config);
+       istgtcontrol_close_log();
 
        /* return value as execution result */
        if (exec_result != UCTL_CMD_OK) {

-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to