Hello community,
here is the log from the commit of package istgt.3333 for openSUSE:13.1:Update checked in at 2014-12-27 21:03:44
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:13.1:Update/istgt.3333 (Old)
and /work/SRC/openSUSE:13.1:Update/.istgt.3333.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "istgt.3333"
Changes:
--------
New Changes file:
--- /dev/null 2014-12-25 22:38:16.200041506 +0100
+++ /work/SRC/openSUSE:13.1:Update/.istgt.3333.new/istgt.changes 2014-12-27 21:03:45.000000000 +0100
@@ -0,0 +1,149 @@
+-------------------------------------------------------------------
+Tue Dec 16 00:11:14 UTC 2014 - ddiss@suse.com
+
+- Fix paths in sample conf and doc files; (boo#910112).
+
+-------------------------------------------------------------------
+Wed Jul 10 14:03:25 UTC 2013 - ddiss@suse.com
+
+- Add SCSI target fixes:
+ + disk-support-0-len-read-and-write-CBDs.patch
+ + lu-perform-lba-range-check-before-0-byte-fastpath.patch
+ + lu-add-sense-data-to-out-of-range-read-and-write-err.patch
+
+- Cleanup shutdown logic:
+ + iscsi-cancel-conn-worker-threads-using-the-task_pipe.patch
+
+- Remove openssl dependency:
+ + md5-add-RFC1321-based-RSA-free-MD5-library.patch
+ + md5-use-in-tree-libmd5-rfc-rather-than-libcrypto.patch
+
+-------------------------------------------------------------------
+Tue Apr 9 22:55:33 UTC 2013 - schwab@suse.de
+
+- Move configure run to %build section
+
+-------------------------------------------------------------------
+Tue Nov 6 13:07:35 UTC 2012 - ddiss@suse.com
+
+- 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
+
+-------------------------------------------------------------------
+Mon Sep 3 16:18:19 UTC 2012 - ddiss@suse.com
+
+- Update to upstream istgt-20120901.tar.gz release.
+ + Remove linux init script patches, now upstream.
+
+- Japanese -> English ChangeLog.jp via Google Translate:
+ + Changed to return INVALID FIELD IN CDB to MODE_SENSE unsupported
+ + Change so as to release resources after the end of the confirmation signal
+ thread
+ + Changed to not issue a malloc each time ATS
+ + Add (12) READ DEFECT DATA (10) / READ DEFECT DATA
+ + Add (12) (16) / ATA PASS-THROUGH ATA PASS-THROUGH dummy
+ + Add LOG_SELECT / LOG_SENSE of dummy
+ + Add the init scripts of Linux
+ + If you fail at reload of LU added the processing settings back
+ + Add qcow, qcow2, qed, an extension to handle vhdx
+ + 4.2.X VirtualBox support
+ + Add a poll to display when not in use kqueue
+ + Record usage of atomic functions at startup
+ + investigation gcc configure the built-in function
+ + Fix leak of mutex change
+ + Mistake correction of the error message
+ + Add a dummy signal function
+ + Change the position of the command loop termination
+ + Since the built-in function exclusion gcc gives an error on i386
+ + Fixed a warning will be issued in the gcc parts
+
+-------------------------------------------------------------------
+Mon Aug 13 09:24:38 UTC 2012 - ddiss@suse.com
+
+- Update to upstream istgt-20120811.tar.gz release, which adds support for
+ VirtualBox VirtualDisks.
+
+- Japanese -> English ChangeLog.jp via Google Translate:
+ + separated by a vbox for a shutdown function
+ + Modified to specify the mutex ADAPTIVE_NP to some of the
+ + Corresponding to the virtual drive using a shared library of VirtualBox
+
+- Add no_CMPXCHG_on_i386.patch.
+
+-------------------------------------------------------------------
+Wed Aug 8 11:36:48 UTC 2012 - ddiss@suse.com
+
+- Update to upstream istgt-20120807.tar.gz release.
+
+- Japanese -> English ChangeLog.jp via Google Translate:
+ + Fix transfer locked position
+ + Add a task buffer allocation size
+ + Forgetting to fix error handling when
+ + Modified to log the number of leave to reload
+ + Modified so that it can continue with the error when reload
+ + EV_SET of NetBSD fix a warning
+ + add a function to get status of using the built-in functions since gcc4.1
+ + Organize and unnecessary variable function
+ + Fixed memory leak at the end of
+ + Change if there is more than one LUN queue to run twice in a loop
+ + Add (except during the connection) process of changing the LU
+ + Modified so as to keep the number of elements in the queue
+ + Reduce the time lock of the queue, so as not to fix in the PG SendTargets inaccessible
+ + Change does not come out of the loop as to when a configuration error PG
+ + Issue a stop request to accept loop when receiving SIGTERM / INT
+ + Issues a connection request to stop all threads at the end
+ + Change so as to perform without a lock at the end of the state
+ + Add a script for NetBSD
+ + Add syslogd mountlate: LOGIN, REQUIRE: BEFORE the startup script
+ + Fix configure.in / Makefile.in
+ + fix the warning is in gcc and clang
+ + -Wextra-Wformat compiler warnings, such as adding
+
+- Install Linux rc script into /etc/init.d rather than /etc/rc.d
+
+-------------------------------------------------------------------
+Wed Aug 1 09:35:45 UTC 2012 - ddiss@suse.com
+
+- Remove unnecessary %clean section from spec file.
+
+-------------------------------------------------------------------
+Mon Jul 30 11:42:49 UTC 2012 - ddiss@suse.com
+
+- Remove fix-autosize.patch catering for symlinked devices.
+ + Symlink devices can be enabled with the '--enable-symlink-device'
+ configure option.
+
+-------------------------------------------------------------------
+Mon Jul 30 11:39:42 UTC 2012 - ddiss@suse.com
+
+- Add support for (force-)reload init script arguments.
+ + Sends a SIGHUP to the istgt daemon.
+
+-------------------------------------------------------------------
+Thu Jul 26 13:59:41 UTC 2012 - ddiss@suse.com
+
+- Update to upstream istgt-20120726.tar.gz tarball.
+ + Drop unneeded fix-as-needed-build.patch & fix-mandir.patch patches.
+
+-------------------------------------------------------------------
+Fri Jun 1 11:10:20 UTC 2012 - ddiss@suse.com
+
+- Add Linux style System-V init scipt.
+
+-------------------------------------------------------------------
+Thu May 31 13:41:56 UTC 2012 - ddiss@suse.com
+
+- Initial check in with istgt-20111008.tar.gz from
+ http://shell.peach.ne.jp/aoyama/archives/1741 and patches from Debian.
+
+ See istgt-20111008/ChangeLog.jp in the source package for a summary of
+ changes up until now.
New:
----
add-istgtcontrol-manpage.patch
disk-support-0-len-read-and-write-CBDs.patch
fix-installdir.patch
iscsi-cancel-conn-worker-threads-using-the-task_pipe.patch
istgt-20121028.tar.gz
istgt.changes
istgt.spec
lu-add-sense-data-to-out-of-range-read-and-write-err.patch
lu-perform-lba-range-check-before-0-byte-fastpath.patch
md5-add-RFC1321-based-RSA-free-MD5-library.patch
md5-use-in-tree-libmd5-rfc-rather-than-libcrypto.patch
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ istgt.spec ++++++
#
# spec file for package istgt
#
# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via http://bugs.opensuse.org/
#
Name: istgt
Version: 0.10
Release: 0
%define upstreamrel 20121028
Summary: Userspace iSCSI Target
License: BSD-2-Clause
Group: Productivity/Networking/Other
Url: http://www.peach.ne.jp/archives/istgt/
Source: istgt-%{upstreamrel}.tar.gz
Requires: bash
BuildRequires: autoconf
BuildRoot: %{_tmppath}/%{name}-%{version}-build
Patch1: fix-installdir.patch
Patch2: add-istgtcontrol-manpage.patch
Patch3: disk-support-0-len-read-and-write-CBDs.patch
Patch4: lu-perform-lba-range-check-before-0-byte-fastpath.patch
Patch5: lu-add-sense-data-to-out-of-range-read-and-write-err.patch
Patch6: iscsi-cancel-conn-worker-threads-using-the-task_pipe.patch
Patch7: md5-add-RFC1321-based-RSA-free-MD5-library.patch
Patch8: md5-use-in-tree-libmd5-rfc-rather-than-libcrypto.patch
%description
This software (istgt) is the implementation of iSCSI target
(refer to RFC3720 about iSCSI) developed for FreeBSD.
It includes iSCSI protocol processor and SPC-3 (SCSI Primary
Commands - 3) based logical unit emulation.
Key Features:
* MCS/MPIO for failover (up to 255 concurrent sessions)
* Multipath I/O (only support Microsoft MPIO/VMware ESXi)
* SPC-3 Persistent Reservation for cluster nodes
* 64bit LBA for over 2TB
* Header/Data digest by CRC32C
* CHAP w/Mutual authentication
* Multiple LUNs and ACLs for portals
* IPv6/IPv4 dual support
%prep
%setup -q -n istgt-%{upstreamrel}
%patch1 -p1
%patch2 -p1
%patch3 -p0
%patch4 -p0
%patch5 -p0
%patch6 -p0
%patch7 -p0
%patch8 -p0
autoconf
%build
%configure --with-configdir=%{_sysconfdir}/istgt
make
%install
make install DESTDIR=$RPM_BUILD_ROOT
%post
/sbin/ldconfig
%preun
%{?stop_on_removal:%{stop_on_removal istgt}}
%postun
/sbin/ldconfig
%{?restart_on_update:%{restart_on_update istgt}}
%{?insserv_cleanup:%{insserv_cleanup}}
%files
%defattr(-,root,root)
%{_sbindir}/istgt
%{_sbindir}/istgtcontrol
%dir %{_sysconfdir}/istgt/
%config %{_sysconfdir}/istgt/*.conf.sample
%{_sysconfdir}/init.d/istgt
%doc %{_mandir}/man1/istgt.1.gz
%doc %{_mandir}/man1/istgtcontrol.1.gz
%changelog
++++++ add-istgtcontrol-manpage.patch ++++++
Description: Add istgtcontrol manpage
Add the manpages for the istgtcontrol.1 command. Modified files:
.
* doc/istgtcontrol.1.in - new file
* doc/Makefile.in - change Makefile to make use of the Makefile
Forwarded: Yes
Author: Arno Töll
From 4441406e6bfd8de8fedde118bc08346e449c9eb4 Mon Sep 17 00:00:00 2001 From: David Disseldorp
Date: Tue, 26 Mar 2013 17:51:10 +0100 Subject: [PATCH 1/7] disk: support 0 len read and write CBDs
---
src/istgt_lu_disk.c | 78 ++++++++++++++++++++++++++++-------------------------
1 file changed, 42 insertions(+), 36 deletions(-)
diff --git src/istgt_lu_disk.c src/istgt_lu_disk.c
index bf0e1b4..2850955 100644
--- src/istgt_lu_disk.c
+++ src/istgt_lu_disk.c
@@ -6077,12 +6077,6 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr lu_cmd)
}
}
- if (lu_cmd->R_bit == 0) {
- ISTGT_ERRLOG("R_bit == 0\n");
- lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
- return -1;
- }
-
dpo = BGET8(&cdb[1], 4);
fua = BGET8(&cdb[1], 3);
fua_nv = BGET8(&cdb[1], 1);
@@ -6091,6 +6085,13 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr lu_cmd)
ISTGT_TRACELOG(ISTGT_TRACE_SCSI,
"READ_10(lba %"PRIu64", len %u blocks)\n",
lba, transfer_len);
+
+ if ((lu_cmd->R_bit == 0) && (transfer_len > 0)) {
+ ISTGT_ERRLOG("R_bit == 0\n");
+ lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
+ return -1;
+ }
+
rc = istgt_lu_disk_lbread(spec, conn, lu_cmd, lba, transfer_len);
if (rc < 0) {
ISTGT_ERRLOG("lu_disk_lbread() failed\n");
@@ -6113,12 +6114,6 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr lu_cmd)
}
}
- if (lu_cmd->R_bit == 0) {
- ISTGT_ERRLOG("R_bit == 0\n");
- lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
- return -1;
- }
-
dpo = BGET8(&cdb[1], 4);
fua = BGET8(&cdb[1], 3);
fua_nv = BGET8(&cdb[1], 1);
@@ -6127,6 +6122,13 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr lu_cmd)
ISTGT_TRACELOG(ISTGT_TRACE_SCSI,
"READ_12(lba %"PRIu64", len %u blocks)\n",
lba, transfer_len);
+
+ if ((lu_cmd->R_bit == 0) && (transfer_len > 0)) {
+ ISTGT_ERRLOG("R_bit == 0\n");
+ lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
+ return -1;
+ }
+
rc = istgt_lu_disk_lbread(spec, conn, lu_cmd, lba, transfer_len);
if (rc < 0) {
ISTGT_ERRLOG("lu_disk_lbread() failed\n");
@@ -6149,12 +6151,6 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr lu_cmd)
}
}
- if (lu_cmd->R_bit == 0) {
- ISTGT_ERRLOG("R_bit == 0\n");
- lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
- return -1;
- }
-
dpo = BGET8(&cdb[1], 4);
fua = BGET8(&cdb[1], 3);
fua_nv = BGET8(&cdb[1], 1);
@@ -6163,6 +6159,13 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr lu_cmd)
ISTGT_TRACELOG(ISTGT_TRACE_SCSI,
"READ_16(lba %"PRIu64", len %u blocks)\n",
lba, transfer_len);
+
+ if ((lu_cmd->R_bit == 0) && (transfer_len > 0)) {
+ ISTGT_ERRLOG("R_bit == 0\n");
+ lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
+ return -1;
+ }
+
rc = istgt_lu_disk_lbread(spec, conn, lu_cmd, lba, transfer_len);
if (rc < 0) {
ISTGT_ERRLOG("lu_disk_lbread() failed\n");
@@ -6220,12 +6223,6 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr lu_cmd)
}
}
- if (lu_cmd->W_bit == 0) {
- ISTGT_ERRLOG("W_bit == 0\n");
- lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
- return -1;
- }
-
dpo = BGET8(&cdb[1], 4);
fua = BGET8(&cdb[1], 3);
fua_nv = BGET8(&cdb[1], 1);
@@ -6234,6 +6231,13 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr lu_cmd)
ISTGT_TRACELOG(ISTGT_TRACE_SCSI,
"WRITE_10(lba %"PRIu64", len %u blocks)\n",
lba, transfer_len);
+
+ if ((lu_cmd->W_bit == 0) && (transfer_len > 0)) {
+ ISTGT_ERRLOG("W_bit == 0\n");
+ lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
+ return -1;
+ }
+
rc = istgt_lu_disk_lbwrite(spec, conn, lu_cmd, lba, transfer_len);
if (rc < 0) {
ISTGT_ERRLOG("lu_disk_lbwrite() failed\n");
@@ -6257,12 +6261,6 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr lu_cmd)
}
}
- if (lu_cmd->W_bit == 0) {
- ISTGT_ERRLOG("W_bit == 0\n");
- lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
- return -1;
- }
-
dpo = BGET8(&cdb[1], 4);
fua = BGET8(&cdb[1], 3);
fua_nv = BGET8(&cdb[1], 1);
@@ -6271,6 +6269,13 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr lu_cmd)
ISTGT_TRACELOG(ISTGT_TRACE_SCSI,
"WRITE_12(lba %"PRIu64", len %u blocks)\n",
lba, transfer_len);
+
+ if ((lu_cmd->W_bit == 0) && (transfer_len > 0)) {
+ ISTGT_ERRLOG("W_bit == 0\n");
+ lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
+ return -1;
+ }
+
rc = istgt_lu_disk_lbwrite(spec, conn, lu_cmd, lba, transfer_len);
if (rc < 0) {
ISTGT_ERRLOG("lu_disk_lbwrite() failed\n");
@@ -6294,12 +6299,6 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr lu_cmd)
}
}
- if (lu_cmd->W_bit == 0) {
- ISTGT_ERRLOG("W_bit == 0\n");
- lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
- return -1;
- }
-
dpo = BGET8(&cdb[1], 4);
fua = BGET8(&cdb[1], 3);
fua_nv = BGET8(&cdb[1], 1);
@@ -6308,6 +6307,13 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr lu_cmd)
ISTGT_TRACELOG(ISTGT_TRACE_SCSI,
"WRITE_16(lba %"PRIu64", len %u blocks)\n",
lba, transfer_len);
+
+ if ((lu_cmd->W_bit == 0) && (transfer_len > 0)) {
+ ISTGT_ERRLOG("W_bit == 0\n");
+ lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
+ return -1;
+ }
+
rc = istgt_lu_disk_lbwrite(spec, conn, lu_cmd, lba, transfer_len);
if (rc < 0) {
ISTGT_ERRLOG("lu_disk_lbwrite() failed\n");
--
1.8.1.4
++++++ fix-installdir.patch ++++++
Description: Install binaries to $PREFIX/sbin instead of $PREFIX/bin
.
* src/Makefile.in: Fix paths hardcoded to the install target
* doc/istgt.1.in: Reflect change in resulting man page
Forwarded: not-needed
Author: Arno Töll
From 88f929d2c17739e88eaed15fe22c6c898c7dde4d Mon Sep 17 00:00:00 2001 From: David Disseldorp
Date: Wed, 27 Mar 2013 18:30:27 +0100 Subject: [PATCH 4/7] iscsi: cancel conn worker threads using the task_pipe
Currently istgt_iscsi_drop_*_conns() use pthread_cancel() to tell the connection worker thread to exit. This is unnecessary, as the worker thread already accepts exit requests via the task_pipe. --- src/istgt_iscsi.c | 87 ++++++++++--------------------------------------------- 1 file changed, 16 insertions(+), 71 deletions(-) diff --git src/istgt_iscsi.c src/istgt_iscsi.c index 1ca226c..5fa5fbc 100644 --- src/istgt_iscsi.c +++ src/istgt_iscsi.c @@ -5260,9 +5260,8 @@ wait_all_task(CONN_Ptr conn) } static void -worker_cleanup(void *arg) +worker_cleanup(CONN_Ptr conn) { - CONN_Ptr conn = (CONN_Ptr) arg; ISTGT_LU_Ptr lu; int rc; @@ -5534,9 +5533,6 @@ worker(void *arg) conn->exec_lu_task = NULL; lu_task = NULL; - pthread_cleanup_push(worker_cleanup, conn); - pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); - conn->use_sender = 0; if (conn->istgt->swmode >= ISTGT_SWMODE_NORMAL) { /* create sender thread */ @@ -5585,7 +5581,6 @@ worker(void *arg) } } - pthread_testcancel(); if (conn->state != CONN_STATE_RUNNING) { break; } @@ -5701,9 +5696,6 @@ worker(void *arg) execute_pdu: opcode = BGET8W(&conn->pdu.bhs.opcode, 5, 6); -#if 0 - pthread_testcancel(); -#endif if (conn->state != CONN_STATE_RUNNING) { break; } @@ -5913,62 +5905,7 @@ worker(void *arg) cleanup_exit: ; - pthread_cleanup_pop(0); - conn->state = CONN_STATE_EXITING; - if (conn->sess != NULL) { - SESS_MTX_LOCK(conn); - lu = conn->sess->lu; - if (lu != NULL && lu->queue_depth != 0) { - rc = istgt_lu_clear_task_IT(conn, lu); - if (rc < 0) { - ISTGT_ERRLOG("lu_clear_task_IT() failed\n"); - } - istgt_clear_all_transfer_task(conn); - } - SESS_MTX_UNLOCK(conn); - } - if (conn->pdu.copy_pdu == 0) { - xfree(conn->pdu.ahs); - conn->pdu.ahs = NULL; - if (conn->pdu.data != conn->pdu.shortdata) { - xfree(conn->pdu.data); - } - conn->pdu.data = NULL; - } - wait_all_task(conn); - - if (conn->use_sender) { - ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "stop sender thread (%d)\n", conn->id); - /* stop sender thread */ - MTX_LOCK(&conn->result_queue_mutex); - rc = pthread_cond_broadcast(&conn->result_queue_cond); - MTX_UNLOCK(&conn->result_queue_mutex); - if (rc != 0) { - ISTGT_ERRLOG("cond_broadcast() failed\n"); - /* ignore errors */ - } - rc = pthread_join(conn->sender_thread, NULL); - if (rc != 0) { - ISTGT_ERRLOG("pthread_join() failed\n"); - /* ignore errors */ - } - } - - close(conn->sock); -#ifdef ISTGT_USE_KQUEUE - close(kq); - conn->kq = -1; -#endif /* ISTGT_USE_KQUEUE */ - sleep(1); - ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "worker %d end\n", conn->id); - - /* cleanup conn & sess */ - ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "cleanup LOCK\n"); - MTX_LOCK(&g_conns_mutex); - g_conns[conn->id] = NULL; - istgt_remove_conn(conn); - MTX_UNLOCK(&g_conns_mutex); - ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "cleanup UNLOCK\n"); + worker_cleanup(conn); return NULL; } @@ -6697,7 +6634,6 @@ istgt_iscsi_drop_all_conns(CONN_Ptr conn) istgt_yield(); sleep(1); if (num > max_conns + 1) { - printf("try pthread_cancel\n"); for (i = 0; i < g_nconns; i++) { xconn = g_conns[i]; if (xconn == NULL) @@ -6719,9 +6655,14 @@ istgt_iscsi_drop_all_conns(CONN_Ptr conn) xconn->initiator_addr, xconn->cid); } - rc = pthread_cancel(xconn->thread); + rc = write(xconn->task_pipe[1], "E", 1); + if (rc < 0 || rc != 1) { + ISTGT_ERRLOG("write() failed\n"); + continue; + } + rc = pthread_join(xconn->thread, NULL); if (rc != 0) { - ISTGT_ERRLOG("pthread_cancel() failed rc=%d\n", rc); + ISTGT_ERRLOG("pthread_join() failed rc=%d\n", rc); } } } @@ -6781,7 +6722,6 @@ istgt_iscsi_drop_old_conns(CONN_Ptr conn) istgt_yield(); sleep(1); if (num > max_conns + 1) { - printf("try pthread_cancel\n"); for (i = 0; i < g_nconns; i++) { xconn = g_conns[i]; if (xconn == NULL) @@ -6803,9 +6743,14 @@ istgt_iscsi_drop_old_conns(CONN_Ptr conn) xconn->initiator_addr, xconn->cid); } - rc = pthread_cancel(xconn->thread); + rc = write(xconn->task_pipe[1], "E", 1); + if (rc < 0 || rc != 1) { + ISTGT_ERRLOG("write() failed\n"); + continue; + } + rc = pthread_join(xconn->thread, NULL); if (rc != 0) { - ISTGT_ERRLOG("pthread_cancel() failed rc=%d\n", rc); + ISTGT_ERRLOG("pthread_join() failed rc=%d\n", rc); } } } -- 1.8.1.4 ++++++ lu-add-sense-data-to-out-of-range-read-and-write-err.patch ++++++
From 27cfa2b5fd417d6ba7cf72486c90e203314f569e Mon Sep 17 00:00:00 2001 From: David Disseldorp
Date: Tue, 26 Mar 2013 18:56:32 +0100 Subject: [PATCH 3/7] lu: add sense data to out of range read and write errors
ILLEGAL_REQUEST/LOGICAL BLOCK ADDRESS OUT OF RANGE. --- src/istgt_lu_disk.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git src/istgt_lu_disk.c src/istgt_lu_disk.c index 277e8d2..807b47f 100644 --- src/istgt_lu_disk.c +++ src/istgt_lu_disk.c @@ -4031,7 +4031,13 @@ istgt_lu_disk_lbread(ISTGT_LU_DISK *spec, CONN_Ptr conn __attribute__((__unused_ maxlba, lba, len); if (lba >= maxlba || llen > maxlba || lba > (maxlba - llen)) { + uint8_t *sense_data; + size_t *sense_len; ISTGT_ERRLOG("end of media\n"); + sense_data = lu_cmd->sense_data; + sense_len = &lu_cmd->sense_data_len; + *sense_len = 0; + BUILD_SENSE(ILLEGAL_REQUEST, 0x21, 0x00); return -1; } @@ -4090,7 +4096,13 @@ istgt_lu_disk_lbwrite(ISTGT_LU_DISK *spec, CONN_Ptr conn, ISTGT_LU_CMD_Ptr lu_cm maxlba, lba, len); if (lba >= maxlba || llen > maxlba || lba > (maxlba - llen)) { + uint8_t *sense_data; + size_t *sense_len; ISTGT_ERRLOG("end of media\n"); + sense_data = lu_cmd->sense_data; + sense_len = &lu_cmd->sense_data_len; + *sense_len = 0; + BUILD_SENSE(ILLEGAL_REQUEST, 0x21, 0x00); return -1; } @@ -4150,12 +4162,18 @@ istgt_lu_disk_lbwrite_same(ISTGT_LU_DISK *spec, CONN_Ptr conn, ISTGT_LU_CMD_Ptr uint64_t nblocks; uint64_t wblocks; int64_t rc; + uint8_t *sense_data; + size_t *sense_len; + sense_data = lu_cmd->sense_data; + sense_len = &lu_cmd->sense_data_len; + *sense_len = 0; maxlba = spec->blockcnt; llen = (uint64_t) len; if (llen == 0) { if (lba >= maxlba) { ISTGT_ERRLOG("end of media\n"); + BUILD_SENSE(ILLEGAL_REQUEST, 0x21, 0x00); return -1; } llen = maxlba - lba; @@ -4170,6 +4188,7 @@ istgt_lu_disk_lbwrite_same(ISTGT_LU_DISK *spec, CONN_Ptr conn, ISTGT_LU_CMD_Ptr if (lba >= maxlba || llen > maxlba || lba > (maxlba - llen)) { ISTGT_ERRLOG("end of media\n"); + BUILD_SENSE(ILLEGAL_REQUEST, 0x21, 0x00); return -1; } -- 1.8.1.4 ++++++ lu-perform-lba-range-check-before-0-byte-fastpath.patch ++++++
From 87d106f8ab70594bb6456122da9b1f9e0d5328c9 Mon Sep 17 00:00:00 2001 From: David Disseldorp
Date: Tue, 26 Mar 2013 18:14:50 +0100 Subject: [PATCH 2/7] lu: perform lba range check before 0 byte fastpath
0 byte IOs are subject to the same lba checks as normal IOs. --- src/istgt_lu_disk.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git src/istgt_lu_disk.c src/istgt_lu_disk.c index 2850955..277e8d2 100644 --- src/istgt_lu_disk.c +++ src/istgt_lu_disk.c @@ -4020,12 +4020,6 @@ istgt_lu_disk_lbread(ISTGT_LU_DISK *spec, CONN_Ptr conn __attribute__((__unused_ uint64_t nbytes; int64_t rc; - if (len == 0) { - lu_cmd->data = NULL; - lu_cmd->data_len = 0; - return 0; - } - maxlba = spec->blockcnt; llen = (uint64_t) len; blen = spec->blocklen; @@ -4041,6 +4035,12 @@ istgt_lu_disk_lbread(ISTGT_LU_DISK *spec, CONN_Ptr conn __attribute__((__unused_ return -1; } + if (len == 0) { + lu_cmd->data = NULL; + lu_cmd->data_len = 0; + return 0; + } + if (nbytes > lu_cmd->iobufsize) { ISTGT_ERRLOG("nbytes(%zu) > iobufsize(%zu)\n", (size_t) nbytes, lu_cmd->iobufsize); @@ -4079,11 +4079,6 @@ istgt_lu_disk_lbwrite(ISTGT_LU_DISK *spec, CONN_Ptr conn, ISTGT_LU_CMD_Ptr lu_cm uint64_t nbytes; int64_t rc; - if (len == 0) { - lu_cmd->data_len = 0; - return 0; - } - maxlba = spec->blockcnt; llen = (uint64_t) len; blen = spec->blocklen; @@ -4099,6 +4094,11 @@ istgt_lu_disk_lbwrite(ISTGT_LU_DISK *spec, CONN_Ptr conn, ISTGT_LU_CMD_Ptr lu_cm return -1; } + if (len == 0) { + lu_cmd->data_len = 0; + return 0; + } + if (nbytes > lu_cmd->iobufsize) { ISTGT_ERRLOG("nbytes(%zu) > iobufsize(%zu)\n", (size_t) nbytes, lu_cmd->iobufsize); -- 1.8.1.4 ++++++ md5-add-RFC1321-based-RSA-free-MD5-library.patch ++++++
From 901515c5a232f635a0fb0f38ca158c37f8993836 Mon Sep 17 00:00:00 2001 From: David Disseldorp
Date: Fri, 5 Apr 2013 16:08:07 +0200 Subject: [PATCH 5/7] md5: add RFC1321-based (RSA-free) MD5 library
Obtained from http://libmd5-rfc.sourceforge.net/:
This is a very small C library implementing RFC1321, the MD5 message
digest function. Unlike the existing W3C libmd5, it was written from the
specifications (not the sample code) in RFC1321, and therefore is not
required to acknowledge RSA in any way.
---
src/Makefile.in | 8 +-
src/md5.c | 381 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/md5.h | 91 ++++++++++++++
3 files changed, 476 insertions(+), 4 deletions(-)
create mode 100644 src/md5.c
create mode 100644 src/md5.h
diff --git src/Makefile.in src/Makefile.in
index ee223a3..efd7906 100644
--- src/Makefile.in
+++ src/Makefile.in
@@ -38,18 +38,18 @@ source = istgt.c istgt_iscsi.c istgt_iscsi_param.c \
istgt_lu.c istgt_lu_disk.c istgt_lu_disk_vbox.c \
istgt_lu_dvd.c istgt_lu_tape.c istgt_lu_pass.c istgt_lu_ctl.c \
istgt_log.c istgt_conf.c istgt_sock.c istgt_misc.c \
- istgt_queue.c istgt_crc32c.c istgt_md5.c
+ istgt_queue.c istgt_crc32c.c istgt_md5.c md5.c
header = istgt_ver.h istgt.h istgt_iscsi.h istgt_iscsi_param.h \
istgt_scsi.h istgt_proto.h istgt_lu.h \
istgt_log.h istgt_conf.h istgt_sock.h \
- istgt_misc.h istgt_queue.h istgt_crc32c.h istgt_md5.h
+ istgt_misc.h istgt_queue.h istgt_crc32c.h istgt_md5.h md5.h
document =
sample =
ctl_source = istgtcontrol.c istgt_conf.c istgt_log.c istgt_sock.c istgt_misc.c \
- istgt_md5.c
+ istgt_md5.c md5.c
ctl_header = istgt_ver.h istgt_conf.h istgt_log.h istgt_sock.h istgt_misc.h \
- istgt_md5.h
+ istgt_md5.h md5.h
ISTGT = $(source:.c=.o)
ISTGTCONTROL = $(ctl_source:.c=.o)
diff --git src/md5.c src/md5.c
new file mode 100644
index 0000000..c35d96c
--- /dev/null
+++ src/md5.c
@@ -0,0 +1,381 @@
+/*
+ Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved.
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ L. Peter Deutsch
+ ghost@aladdin.com
+
+ */
+/* $Id: md5.c,v 1.6 2002/04/13 19:20:28 lpd Exp $ */
+/*
+ Independent implementation of MD5 (RFC 1321).
+
+ This code implements the MD5 Algorithm defined in RFC 1321, whose
+ text is available at
+ http://www.ietf.org/rfc/rfc1321.txt
+ The code is derived from the text of the RFC, including the test suite
+ (section A.5) but excluding the rest of Appendix A. It does not include
+ any code or documentation that is identified in the RFC as being
+ copyrighted.
+
+ The original and principal author of md5.c is L. Peter Deutsch
+
From aa3ef98403259dd6b03ea73161a7ef3c6bff478b Mon Sep 17 00:00:00 2001 From: David Disseldorp
Date: Fri, 5 Apr 2013 16:13:36 +0200 Subject: [PATCH 6/7] md5: use in tree libmd5-rfc, rather than libcrypto
Currently libcrypto (openssl) is linked purely for md5 calculation
utilities. Use the tiny in tree libmd5-rfc library instead, and do away
with the libcrypto dependency.
---
configure | 45 ---------------------------------------------
configure.in | 1 -
src/istgt_md5.c | 20 +++++++-------------
src/istgt_md5.h | 6 +++---
4 files changed, 10 insertions(+), 62 deletions(-)
diff --git configure configure
index c4a9174..c46e423 100755
--- configure
+++ configure
@@ -3472,51 +3472,6 @@ _ACEOF
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MD5_Update in -lcrypto" >&5
-$as_echo_n "checking for MD5_Update in -lcrypto... " >&6; }
-if ${ac_cv_lib_crypto_MD5_Update+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lcrypto $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char MD5_Update ();
-int
-main ()
-{
-return MD5_Update ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_crypto_MD5_Update=yes
-else
- ac_cv_lib_crypto_MD5_Update=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_MD5_Update" >&5
-$as_echo "$ac_cv_lib_crypto_MD5_Update" >&6; }
-if test "x$ac_cv_lib_crypto_MD5_Update" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBCRYPTO 1
-_ACEOF
-
- LIBS="-lcrypto $LIBS"
-
-fi
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cam_open_spec_device in -lcam" >&5
$as_echo_n "checking for cam_open_spec_device in -lcam... " >&6; }
if ${ac_cv_lib_cam_cam_open_spec_device+:} false; then :
diff --git configure.in configure.in
index 40ccecd..4eca28a 100644
--- configure.in
+++ configure.in
@@ -60,7 +60,6 @@ esac
# Checks for libraries.
AC_CHECK_LIB([pthread], [pthread_create])
-AC_CHECK_LIB([crypto], [MD5_Update])
AC_CHECK_LIB([cam], [cam_open_spec_device])
# Checks for header files.
diff --git src/istgt_md5.c src/istgt_md5.c
index 5a12abc..3e2f00f 100644
--- src/istgt_md5.c
+++ src/istgt_md5.c
@@ -33,42 +33,36 @@
#include