Hello community,
here is the log from the commit of package istgt for openSUSE:Factory checked in at 2012-09-11 09:08:13
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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-08-14 14:26:49.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.istgt.new/istgt.changes 2012-09-11 09:08:14.000000000 +0200
@@ -1,0 +2,28 @@
+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
+
+-------------------------------------------------------------------
Old:
----
add-linux-rc.patch
istgt-20120811.tar.gz
linux-rc-reload.patch
no_CMPXCHG_on_i386.patch
New:
----
istgt-20120901.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ istgt.spec ++++++
--- /var/tmp/diff_new_pack.8K5ZV9/_old 2012-09-11 09:08:17.000000000 +0200
+++ /var/tmp/diff_new_pack.8K5ZV9/_new 2012-09-11 09:08:17.000000000 +0200
@@ -17,9 +17,9 @@
Name: istgt
-Version: 0.7
-Release: 20120811
-%define upstreamrel 20120811
+Version: 0.8
+Release: 20120901
+%define upstreamrel 20120901
Summary: Userspace iSCSI Target
License: BSD-2-Clause
Group: Productivity/Networking/Other
@@ -35,9 +35,6 @@
BuildRoot: %{_tmppath}/%{name}-%{version}-build
Patch1: fix-installdir.patch
Patch2: add-istgtcontrol-manpage.patch
-Patch6: add-linux-rc.patch
-Patch7: linux-rc-reload.patch
-Patch8: no_CMPXCHG_on_i386.patch
%description
This software (istgt) is the implementation of iSCSI target
@@ -59,9 +56,6 @@
%setup -q -n istgt-%{upstreamrel}
%patch1 -p1
%patch2 -p1
-%patch6 -p1
-%patch7 -p1
-%patch8 -p1
autoconf
%configure
++++++ istgt-20120811.tar.gz -> istgt-20120901.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/ChangeLog.jp new/istgt-20120901/ChangeLog.jp
--- old/istgt-20120811/ChangeLog.jp 2012-08-10 17:11:54.000000000 +0200
+++ new/istgt-20120901/ChangeLog.jp 2012-09-01 04:19:35.000000000 +0200
@@ -1,3 +1,41 @@
+2012/09/01
+ 2012/09/01版
+ サポート外のMODE_SENSEにINVALID FIELD IN CDBを返すように変更
+
+2012/08/28
+ 2012/08/28版
+ シグナルスレッドの終了確認後にリソース解放するように変更
+
+2012/08/27
+ ATSで毎回mallocを発行しないよう変更
+
+2012/08/24
+ READ DEFECT DATA(10)/READ DEFECT DATA(12)を追加
+ ダミーのATA PASS-THROUGH(16)/ATA PASS-THROUGH(12)を追加
+ ダミーのLOG_SELECT/LOG_SENSEを追加
+ Linuxのinitスクリプトを追加
+ (Thanks to David Disseldorp)
+
+2012/08/21
+ LUのreload時に失敗した場合は設定を戻す処理を追加
+
+2012/08/19
+ 処理する拡張子に qcow, qcow2, qed, vhdx を追加
+ VirtualBox 4.2.X 対応
+ kqueue未使用時にpoll表示を追加
+ 起動時にアトミック関数の利用状況を記録
+ gccビルトイン関数をconfigureで調査
+ mutexの変更漏れを修正
+ エラーメッセージの間違い修正
+
+2012/08/13
+ ダミーのシグナル関数を追加
+ ループ終了コマンドの位置を変更
+
+2012/08/12
+ i386でgccビルトイン関数がエラーを出すので除外
+ gccで警告が出る部分を修正
+
2012/08/11
2012/08/11版
shutdown関数をvbox用で分離
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/configure new/istgt-20120901/configure
--- old/istgt-20120811/configure 2012-08-09 14:19:36.000000000 +0200
+++ new/istgt-20120901/configure 2012-08-24 12:19:24.000000000 +0200
@@ -3384,9 +3384,13 @@
case "$host_os" in
*linux*)
- vboxinc="/usr/src/virtualbox/*/include"
+ tmp="/usr/src/virtualbox/*/include"
+ if test -d "`echo $tmp`"; then
+ vboxinc=$tmp
+ fi
vboxlib="/usr/lib/virtualbox"
- #AC_SUBST([rctemplate], ["istgt_linux.sh.in"])
+ rctemplate="istgt_linux.sh.in"
+
rcdir='/etc/init.d'
@@ -4927,6 +4931,27 @@
$as_echo "#define USE_VBOXVD 1" >>confdefs.h
+ # define vbox include version
+
+ vbox_major=`$SED -e '/^VBOX_VERSION_MAJOR[ ]*=/!d' -e 's/.*=[^0-9]*\([0-9]*\).*/\1/' $vboxinc/../Config.kmk`
+ vbox_minor=`$SED -e '/^VBOX_VERSION_MINOR[ ]*=/!d' -e 's/.*=[^0-9]*\([0-9]*\).*/\1/' $vboxinc/../Config.kmk`
+ vbox_build=`$SED -e '/^VBOX_VERSION_BUILD[ ]*=/!d' -e 's/.*=[^0-9]*\([0-9]*\).*/\1/' $vboxinc/../Config.kmk`
+
+
+cat >>confdefs.h <<_ACEOF
+#define ISTGT_VBOXINC_VERSION_MAJOR $vbox_major
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define ISTGT_VBOXINC_VERSION_MINOR $vbox_minor
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define ISTGT_VBOXINC_VERSION_BUILD $vbox_build
+_ACEOF
+
fi
# check for PTHREAD_MUTEX_ADAPTIVE_NP
@@ -5113,6 +5138,75 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $atomic" >&5
$as_echo "$atomic" >&6; }
+# for gcc builtin
+#AC_CHECK_FUNCS([__sync_fetch_and_add __sync_val_compare_and_swap])
+#AC_CHECK_FUNCS([__sync_synchronize])
+
+gcc_atomic="no"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc builtin atomic operations" >&5
+$as_echo_n "checking for gcc builtin atomic operations... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#if HAVE_SYS_TYPES_H
+#include
+#endif
+
+int
+main ()
+{
+
+ unsigned int x, y;
+ y = __sync_fetch_and_add(&x, 0);
+ __sync_val_compare_and_swap(&x, y, 2);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+$as_echo "#define USE_GCC_ATOMIC 1" >>confdefs.h
+
+
+$as_echo "#define HAVE_GCC_ATOMIC_FETCH_AND_ADD_UINT 1" >>confdefs.h
+
+
+$as_echo "#define HAVE_GCC_ATOMIC_VAL_COMPARE_AND_SWAP_UINT 1" >>confdefs.h
+
+gcc_atomic="yes"
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#if HAVE_SYS_TYPES_H
+#include
+#endif
+
+int
+main ()
+{
+
+ __sync_synchronize();
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+$as_echo "#define HAVE_GCC_ATOMIC_SYNCHRONIZE 1" >>confdefs.h
+
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_atomic" >&5
+$as_echo "$gcc_atomic" >&6; }
+
ac_config_files="$ac_config_files Makefile src/Makefile etc/Makefile doc/Makefile"
ac_config_files="$ac_config_files src/build.h"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/configure.in new/istgt-20120901/configure.in
--- old/istgt-20120811/configure.in 2012-08-09 14:19:36.000000000 +0200
+++ new/istgt-20120901/configure.in 2012-08-24 12:18:04.000000000 +0200
@@ -26,9 +26,12 @@
AC_CANONICAL_HOST
case "$host_os" in
*linux*)
- vboxinc="/usr/src/virtualbox/*/include"
+ tmp="/usr/src/virtualbox/*/include"
+ if test -d "`echo $tmp`"; then
+ vboxinc=$tmp
+ fi
vboxlib="/usr/lib/virtualbox"
- #AC_SUBST([rctemplate], ["istgt_linux.sh.in"])
+ AC_SUBST([rctemplate], ["istgt_linux.sh.in"])
AC_SUBST([rcdir], ['/etc/init.d'])
AC_DEFINE([_GNU_SOURCE], 1, [Define if linux host])
;;
@@ -260,6 +263,15 @@
LDFLAGS="$LDFLAGS -Wl,-rpath,$vboxlib"
LIBS="$LIBS $vboxlib/VBoxDDU.so $vboxlib/VBoxRT.so"
AC_DEFINE([USE_VBOXVD], 1, [Use vbox virtual disk support])
+ # define vbox include version
+ changequote(<<, >>)
+ vbox_major=`$SED -e '/^VBOX_VERSION_MAJOR[ ]*=/!d' -e 's/.*=[^0-9]*\([0-9]*\).*/\1/' $vboxinc/../Config.kmk`
+ vbox_minor=`$SED -e '/^VBOX_VERSION_MINOR[ ]*=/!d' -e 's/.*=[^0-9]*\([0-9]*\).*/\1/' $vboxinc/../Config.kmk`
+ vbox_build=`$SED -e '/^VBOX_VERSION_BUILD[ ]*=/!d' -e 's/.*=[^0-9]*\([0-9]*\).*/\1/' $vboxinc/../Config.kmk`
+ changequote([, ])
+ AC_DEFINE_UNQUOTED([ISTGT_VBOXINC_VERSION_MAJOR], [$vbox_major], [VBox include major])
+ AC_DEFINE_UNQUOTED([ISTGT_VBOXINC_VERSION_MINOR], [$vbox_minor], [VBox include minor])
+ AC_DEFINE_UNQUOTED([ISTGT_VBOXINC_VERSION_BUILD], [$vbox_build], [VBox include build])
fi
# check for PTHREAD_MUTEX_ADAPTIVE_NP
@@ -340,6 +352,39 @@
)
AC_MSG_RESULT($atomic)
+# for gcc builtin
+#AC_CHECK_FUNCS([__sync_fetch_and_add __sync_val_compare_and_swap])
+#AC_CHECK_FUNCS([__sync_synchronize])
+
+gcc_atomic="no"
+AC_MSG_CHECKING([for gcc builtin atomic operations])
+AC_TRY_LINK([
+#if HAVE_SYS_TYPES_H
+#include
+#endif
+],
+[
+ unsigned int x, y;
+ y = __sync_fetch_and_add(&x, 0);
+ __sync_val_compare_and_swap(&x, y, 2);
+],
+[AC_DEFINE([USE_GCC_ATOMIC], [1], [Use gcc builtin atomic])
+AC_DEFINE([HAVE_GCC_ATOMIC_FETCH_AND_ADD_UINT], [1], [Define 1 if you have the function.])
+AC_DEFINE([HAVE_GCC_ATOMIC_VAL_COMPARE_AND_SWAP_UINT], [1], [Define 1 if you have the function.])
+gcc_atomic="yes"]
+)
+AC_TRY_LINK([
+#if HAVE_SYS_TYPES_H
+#include
+#endif
+],
+[
+ __sync_synchronize();
+],
+[AC_DEFINE([HAVE_GCC_ATOMIC_SYNCHRONIZE], [1], [Define 1 if you have the function.])]
+)
+AC_MSG_RESULT($gcc_atomic)
+
AC_CONFIG_FILES([Makefile src/Makefile etc/Makefile doc/Makefile])
AC_CONFIG_FILES([src/build.h])
AC_OUTPUT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/etc/Makefile.in new/istgt-20120901/etc/Makefile.in
--- old/istgt-20120811/etc/Makefile.in 2012-07-28 21:45:50.000000000 +0200
+++ new/istgt-20120901/etc/Makefile.in 2012-08-24 12:18:04.000000000 +0200
@@ -25,7 +25,7 @@
document =
sample = auth.conf istgtcontrol.conf \
istgt.large.conf.in istgt.conf.in \
- istgt.sh.in istgt_netbsd.sh.in # istgt_linux.sh.in
+ istgt.sh.in istgt_netbsd.sh.in istgt_linux.sh.in
rctemplate = @rctemplate@
rcdir = @rcdir@
rcfile = $(rctemplate:.sh.in=.sh)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/etc/istgt_linux.sh.in new/istgt-20120901/etc/istgt_linux.sh.in
--- old/istgt-20120811/etc/istgt_linux.sh.in 1970-01-01 01:00:00.000000000 +0100
+++ new/istgt-20120901/etc/istgt_linux.sh.in 2012-08-24 12:18:04.000000000 +0200
@@ -0,0 +1,62 @@
+#!/bin/sh
+#
+### BEGIN INIT INFO
+# Provides: istgt
+# Required-Start: $remote_fs $syslog $named
+# Required-Stop: $remote_fs $syslog
+# Should-Start: network-remotefs
+# Should-Stop: network-remotefs
+# Default-Start: 3 5
+# Default-Stop: 0 1 2 6
+# Short-Description: Userspace iSCSI target daemon
+# Description: Userspace iSCSI target daemon
+### END INIT INFO
+
+. /etc/rc.status
+rc_reset
+
+name="istgt"
+
+: ${istgt_config="%%SYSCONFDIR%%/istgt/istgt.conf"}
+: ${istgt_pidfile="/var/run/istgt.pid"}
+: ${istgt_flags=""}
+
+required_files="${istgt_config}"
+pidfile="${istgt_pidfile}"
+command="%%SBINDIR%%/istgt"
+command_args="-c ${istgt_config} ${istgt_flags}"
+
+case "$1" in
+ start)
+ echo "Starting iSCSI target daemon (${name})"
+ startproc $command $command_args
+ rc_status -v
+ ;;
+ stop)
+ echo "Shutting down iSCSI target daemon (${name})"
+ killproc -p $istgt_pidfile -TERM $command
+ rc_status -v
+ rm -f $istgt_pidfile 2>/dev/null
+ ;;
+ restart)
+ $0 stop
+ $0 start
+ rc_status
+ ;;
+ force-reload|reload)
+ echo "Reloading iSCSI target daemon (${name})"
+ killproc -p $istgt_pidfile -HUP $command
+ rc_status -v
+ ;;
+ status)
+ echo "Checking for iSCSI target daemon (${name})"
+ checkproc -p $istgt_pidfile $command
+ rc_status -v
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|restart|status}"
+ exit 1
+ ;;
+esac
+
+rc_exit
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/src/config.h.in new/istgt-20120901/src/config.h.in
--- old/istgt-20120811/src/config.h.in 2012-08-09 14:19:36.000000000 +0200
+++ new/istgt-20120901/src/config.h.in 2012-08-19 06:51:15.000000000 +0200
@@ -39,6 +39,15 @@
/* Define to 1 if you have the `ftruncate' function. */
#undef HAVE_FTRUNCATE
+/* Define 1 if you have the function. */
+#undef HAVE_GCC_ATOMIC_FETCH_AND_ADD_UINT
+
+/* Define 1 if you have the function. */
+#undef HAVE_GCC_ATOMIC_SYNCHRONIZE
+
+/* Define 1 if you have the function. */
+#undef HAVE_GCC_ATOMIC_VAL_COMPARE_AND_SWAP_UINT
+
/* Define to 1 if you have the header file. */
#undef HAVE_INTTYPES_H
@@ -192,6 +201,15 @@
/* Define to 1 if you have the header file. */
#undef HAVE_UUID_H
+/* VBox include build */
+#undef ISTGT_VBOXINC_VERSION_BUILD
+
+/* VBox include major */
+#undef ISTGT_VBOXINC_VERSION_MAJOR
+
+/* VBox include minor */
+#undef ISTGT_VBOXINC_VERSION_MINOR
+
/* Define to 1 if `lstat' dereferences a symlink specified with a trailing
slash. */
#undef LSTAT_FOLLOWS_SLASHED_SYMLINK
@@ -220,6 +238,9 @@
/* Use atomic */
#undef USE_ATOMIC
+/* Use gcc builtin atomic */
+#undef USE_GCC_ATOMIC
+
/* Use vbox virtual disk support */
#undef USE_VBOXVD
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/src/istgt.c new/istgt-20120901/src/istgt.c
--- old/istgt-20120811/src/istgt.c 2012-08-09 14:19:36.000000000 +0200
+++ new/istgt-20120901/src/istgt.c 2012-08-27 22:19:22.000000000 +0200
@@ -1762,7 +1762,14 @@
while (istgt->pg_reload == 0) {
pthread_cond_wait(&istgt->reload_cond, &istgt->reload_mutex);
}
+ rc = istgt->pg_reload;
MTX_UNLOCK(&istgt->reload_mutex);
+ if (rc < 0) {
+ if (istgt_get_state(istgt) != ISTGT_STATE_RUNNING) {
+ ISTGT_WARNLOG("pg_reload abort\n");
+ return -1;
+ }
+ }
return 0;
}
@@ -1788,7 +1795,14 @@
while (istgt->pg_reload == 0) {
pthread_cond_wait(&istgt->reload_cond, &istgt->reload_mutex);
}
+ rc = istgt->pg_reload;
MTX_UNLOCK(&istgt->reload_mutex);
+ if (rc < 0) {
+ if (istgt_get_state(istgt) != ISTGT_STATE_RUNNING) {
+ ISTGT_WARNLOG("pg_reload abort\n");
+ return -1;
+ }
+ }
return 0;
}
@@ -2001,6 +2015,21 @@
}
+static void
+istgt_sigint(int signo __attribute__((__unused__)))
+{
+}
+
+static void
+istgt_sigterm(int signo __attribute__((__unused__)))
+{
+}
+
+static void
+istgt_sighup(int signo __attribute__((__unused__)))
+{
+}
+
#ifdef SIGINFO
static void
istgt_siginfo(int signo __attribute__((__unused__)))
@@ -2052,15 +2081,15 @@
switch (signo) {
case SIGINT:
printf("SIGINT catch\n");
+ istgt_stop_loop(istgt);
istgt_set_state(istgt, ISTGT_STATE_EXITING);
istgt_lu_set_all_state(istgt, ISTGT_STATE_EXITING);
- istgt_stop_loop(istgt);
break;
case SIGTERM:
printf("SIGTERM catch\n");
+ istgt_stop_loop(istgt);
istgt_set_state(istgt, ISTGT_STATE_EXITING);
istgt_lu_set_all_state(istgt, ISTGT_STATE_EXITING);
- istgt_stop_loop(istgt);
break;
case SIGQUIT:
printf("SIGQUIT catch\n");
@@ -2571,6 +2600,7 @@
#endif /* ISTGT_USE_KQUEUE */
ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "loop ended\n");
istgt_set_state(istgt, ISTGT_STATE_EXITING);
+ istgt_lu_set_all_state(istgt, ISTGT_STATE_EXITING);
return 0;
}
@@ -2603,7 +2633,8 @@
const char *logpriority = NULL;
CONFIG *config;
pthread_t sigthread;
- struct sigaction sigact, sigoldact_pipe, sigoldact_info;
+ struct sigaction sigact, sigoldact_pipe, sigoldact_int, sigoldact_term;
+ struct sigaction sigoldact_hup, sigoldact_info;
struct sigaction sigoldact_wakeup, sigoldact_io;
sigset_t signew, sigold;
int retry = 10;
@@ -2738,7 +2769,16 @@
}
#ifdef ISTGT_USE_KQUEUE
ISTGT_NOTICELOG("using kqueue\n");
+#else
+ ISTGT_NOTICELOG("using poll\n");
#endif /* ISTGT_USE_KQUEUE */
+#ifdef USE_ATOMIC
+ ISTGT_NOTICELOG("using host atomic\n");
+#elif defined (USE_GCC_ATOMIC)
+ ISTGT_NOTICELOG("using gcc atomic\n");
+#else
+ ISTGT_NOTICELOG("using generic atomic\n");
+#endif /* USE_ATOMIC */
#ifdef ISTGT_USE_CRC32C_TABLE
/* build crc32c table */
@@ -2786,6 +2826,9 @@
ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "setup signal handler\n");
memset(&sigact, 0, sizeof sigact);
memset(&sigoldact_pipe, 0, sizeof sigoldact_pipe);
+ memset(&sigoldact_int, 0, sizeof sigoldact_int);
+ memset(&sigoldact_term, 0, sizeof sigoldact_term);
+ memset(&sigoldact_hup, 0, sizeof sigoldact_hup);
memset(&sigoldact_info, 0, sizeof sigoldact_info);
memset(&sigoldact_wakeup, 0, sizeof sigoldact_wakeup);
memset(&sigoldact_io, 0, sizeof sigoldact_io);
@@ -2796,6 +2839,27 @@
ISTGT_ERRLOG("sigaction(SIGPIPE) failed\n");
goto initialize_error;
}
+ sigact.sa_handler = istgt_sigint;
+ sigemptyset(&sigact.sa_mask);
+ rc = sigaction(SIGINT, &sigact, &sigoldact_int);
+ if (rc < 0) {
+ ISTGT_ERRLOG("sigaction(SIGINT) failed\n");
+ goto initialize_error;
+ }
+ sigact.sa_handler = istgt_sigterm;
+ sigemptyset(&sigact.sa_mask);
+ rc = sigaction(SIGTERM, &sigact, &sigoldact_term);
+ if (rc < 0) {
+ ISTGT_ERRLOG("sigaction(SIGTERM) failed\n");
+ goto initialize_error;
+ }
+ sigact.sa_handler = istgt_sighup;
+ sigemptyset(&sigact.sa_mask);
+ rc = sigaction(SIGHUP, &sigact, &sigoldact_hup);
+ if (rc < 0) {
+ ISTGT_ERRLOG("sigaction(SIGHUP) failed\n");
+ goto initialize_error;
+ }
#ifdef SIGINFO
sigact.sa_handler = istgt_siginfo;
sigemptyset(&sigact.sa_mask);
@@ -2927,6 +2991,13 @@
ISTGT_NOTICELOG("istgt version %s (%s) exiting\n", ISTGT_VERSION,
ISTGT_EXTRA_VERSION);
+ /* stop signal thread */
+ rc = pthread_join(sigthread, NULL);
+ if (rc != 0) {
+ ISTGT_ERRLOG("pthread_join() failed\n");
+ exit (EXIT_FAILURE);
+ }
+
/* cleanup */
istgt_close_all_portals(istgt);
istgt_close_uctl_portal(istgt);
@@ -2939,12 +3010,5 @@
istgt_free_config(config);
istgt->state = ISTGT_STATE_SHUTDOWN;
- /* stop signal thread */
- rc = pthread_join(sigthread, NULL);
- if (rc != 0) {
- ISTGT_ERRLOG("pthread_join() failed\n");
- exit (EXIT_FAILURE);
- }
-
return 0;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/src/istgt.h new/istgt-20120901/src/istgt.h
--- old/istgt-20120811/src/istgt.h 2012-08-09 14:19:36.000000000 +0200
+++ new/istgt-20120901/src/istgt.h 2012-08-18 23:04:12.000000000 +0200
@@ -311,8 +311,8 @@
#error "no atomic operation"
#endif
}
-#else /* !USE_ATOMIC */
-#if ISTGT_GNUC_PREREQ(4, 1)
+#elif defined (USE_GCC_ATOMIC)
+/* gcc >= 4.1 builtin functions */
static inline __attribute__((__always_inline__)) int
istgt_get_state(ISTGT_Ptr istgt)
{
@@ -328,9 +328,11 @@
state_old = __sync_fetch_and_add((unsigned int *)&istgt->state, 0);
} while (__sync_val_compare_and_swap((unsigned int *)&istgt->state,
state_old, state) != state_old);
+#if defined (HAVE_GCC_ATOMIC_SYNCHRONIZE)
__sync_synchronize();
+#endif
}
-#else /* GCC < 4.1 */
+#else /* !USE_ATOMIC && !USE_GCC_ATOMIC */
static inline __attribute__((__always_inline__)) int
istgt_get_state(ISTGT_Ptr istgt)
{
@@ -348,7 +350,6 @@
istgt->state = state;
MTX_UNLOCK(&istgt->state_mutex);
}
-#endif /* GCC >= 4.1 */
#endif /* USE_ATOMIC */
#endif /* ISTGT_H */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/src/istgt_conf.c new/istgt-20120901/src/istgt_conf.c
--- old/istgt-20120811/src/istgt_conf.c 2010-01-02 18:57:26.000000000 +0100
+++ new/istgt-20120901/src/istgt_conf.c 2012-08-24 12:18:04.000000000 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008-2010 Daisuke Aoyama .
+ * Copyright (C) 2008-2012 Daisuke Aoyama .
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -44,6 +44,8 @@
static void istgt_free_all_cf_section(CF_SECTION *sp);
static void istgt_free_all_cf_item(CF_ITEM *ip);
static void istgt_free_all_cf_value(CF_VALUE *vp);
+static void istgt_append_cf_item(CF_SECTION *sp, CF_ITEM *ip);
+static void istgt_append_cf_value(CF_ITEM *ip, CF_VALUE *vp);
CONFIG *
istgt_allocate_config(void)
@@ -185,6 +187,34 @@
}
}
+void
+istgt_copy_cf_item(CF_SECTION *sp_dst, CF_SECTION *sp_src)
+{
+ CF_ITEM *ip, *ip_old;
+ CF_VALUE *vp, *vp_old;
+
+ istgt_free_all_cf_item(sp_dst->item);
+ sp_dst->item = NULL;
+
+ ip_old = sp_src->item;
+ while (ip_old != NULL) {
+ ip = istgt_allocate_cf_item();
+ istgt_append_cf_item(sp_dst, ip);
+ ip->key = xstrdup(ip_old->key);
+ ip->val = NULL;
+
+ vp_old = ip_old->val;
+ while (vp_old != NULL) {
+ vp = istgt_allocate_cf_value();
+ istgt_append_cf_value(ip, vp);
+ vp->value = xstrdup(vp_old->value);
+
+ vp_old = vp_old->next;
+ }
+ ip_old = ip_old->next;
+ }
+}
+
CF_SECTION *
istgt_find_cf_section(CONFIG *cp, const char *name)
{
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/src/istgt_conf.h new/istgt-20120901/src/istgt_conf.h
--- old/istgt-20120811/src/istgt_conf.h 2010-01-02 18:57:26.000000000 +0100
+++ new/istgt-20120901/src/istgt_conf.h 2012-08-24 12:18:04.000000000 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008-2010 Daisuke Aoyama .
+ * Copyright (C) 2008-2012 Daisuke Aoyama .
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -69,6 +69,7 @@
CONFIG *istgt_allocate_config(void);
void istgt_free_config(CONFIG *cp);
+void istgt_copy_cf_item(CF_SECTION *sp_dst, CF_SECTION *sp_src);
CF_SECTION *istgt_find_cf_section(CONFIG *cp, const char *name);
CF_ITEM *istgt_find_cf_nitem(CF_SECTION *sp, const char *key, int idx);
CF_ITEM *istgt_find_cf_item(CF_SECTION *sp, const char *key);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/src/istgt_iscsi.c new/istgt-20120901/src/istgt_iscsi.c
--- old/istgt-20120811/src/istgt_iscsi.c 2012-08-09 14:19:36.000000000 +0200
+++ new/istgt-20120901/src/istgt_iscsi.c 2012-08-18 23:04:12.000000000 +0200
@@ -5821,7 +5821,7 @@
ISTGT_ERRLOG("cond_init() failed\n");
goto error_return;
}
- rc = pthread_mutex_init(&conn->r2t_mutex, NULL);
+ rc = pthread_mutex_init(&conn->r2t_mutex, &istgt->mutex_attr);
if (rc != 0) {
ISTGT_ERRLOG("mutex_init() failed\n");
goto error_return;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/src/istgt_lu.c new/istgt-20120901/src/istgt_lu.c
--- old/istgt-20120811/src/istgt_lu.c 2012-08-09 14:19:36.000000000 +0200
+++ new/istgt-20120901/src/istgt_lu.c 2012-08-24 12:18:04.000000000 +0200
@@ -2281,6 +2281,18 @@
return 1;
}
+static int
+istgt_lu_copy_sp(CF_SECTION *sp, CONFIG *config_old)
+{
+ CF_SECTION *sp_old;
+
+ sp_old = istgt_find_cf_section(config_old, sp->name);
+ if (sp_old == NULL)
+ return -1;
+ istgt_copy_cf_item(sp, sp_old);
+ return 0;
+}
+
static int istgt_lu_create_thread(ISTGT_Ptr istgt, ISTGT_LU_Ptr lu);
int
@@ -2361,6 +2373,10 @@
ISTGT_ERRLOG("update active LU%d: Name=%s, "
"# of TSIH=%d\n",
lu->num, lu->name, lu->maxtsih - 1);
+ rc = istgt_lu_copy_sp(sp, istgt->config_old);
+ if (rc < 0) {
+ /* ignore error */
+ }
MTX_UNLOCK(&lu->mutex);
MTX_UNLOCK(&istgt->mutex);
goto skip_lu;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/src/istgt_lu.h new/istgt-20120901/src/istgt_lu.h
--- old/istgt-20120811/src/istgt_lu.h 2012-08-09 00:48:09.000000000 +0200
+++ new/istgt-20120901/src/istgt_lu.h 2012-08-27 13:46:50.000000000 +0200
@@ -92,6 +92,7 @@
#define MAX_INQUIRY_SERIAL 16
#define ISTGT_LU_WORK_BLOCK_SIZE (1ULL * 1024ULL * 1024ULL)
+#define ISTGT_LU_WORK_ATS_BLOCK_SIZE (1ULL * 1024ULL * 1024ULL)
#define ISTGT_LU_MAX_WRITE_CACHE_SIZE (8ULL * 1024ULL * 1024ULL)
#define ISTGT_LU_MEDIA_SIZE_MIN (1ULL * 1024ULL * 1024ULL)
#define ISTGT_LU_MEDIA_EXTEND_UNIT (256ULL * 1024ULL * 1024ULL)
@@ -369,6 +370,8 @@
/* for ats */
pthread_mutex_t ats_mutex;
+ int watssize;
+ uint8_t *watsbuf;
int queue_depth;
pthread_mutex_t cmd_queue_mutex;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/src/istgt_lu_disk.c new/istgt-20120901/src/istgt_lu_disk.c
--- old/istgt-20120811/src/istgt_lu_disk.c 2012-08-10 17:11:54.000000000 +0200
+++ new/istgt-20120901/src/istgt_lu_disk.c 2012-09-01 07:30:41.000000000 +0200
@@ -430,6 +430,15 @@
if (n > 5 && strcasecmp(file + (n - 5), ".vmdk") == 0)
return "VMDK";
+ if (n > 5 && strcasecmp(file + (n - 5), ".qcow") == 0)
+ return "QCOW";
+ if (n > 6 && strcasecmp(file + (n - 6), ".qcow2") == 0)
+ return "QCOW";
+ if (n > 4 && strcasecmp(file + (n - 4), ".qed") == 0)
+ return "QED";
+ if (n > 5 && strcasecmp(file + (n - 5), ".vhdx") == 0)
+ return "VHDX";
+
return "RAW";
}
@@ -496,6 +505,8 @@
spec->req_write_cache = 0;
spec->err_write_cache = 0;
spec->thin_provisioning = 0;
+ spec->watssize = 0;
+ spec->watsbuf = NULL;
rc = pthread_mutex_init(&spec->ats_mutex, NULL);
if (rc != 0) {
@@ -557,7 +568,10 @@
spec->disktype = istgt_get_disktype_by_ext(spec->file);
if (strcasecmp(spec->disktype, "VDI") == 0
|| strcasecmp(spec->disktype, "VHD") == 0
- || strcasecmp(spec->disktype, "VMDK") == 0) {
+ || strcasecmp(spec->disktype, "VMDK") == 0
+ || strcasecmp(spec->disktype, "QCOW") == 0
+ || strcasecmp(spec->disktype, "QED") == 0
+ || strcasecmp(spec->disktype, "VHDX") == 0) {
rc = istgt_lu_disk_vbox_lun_init(spec, istgt, lu);
if (rc < 0) {
ISTGT_ERRLOG("LU%d: LUN%d: lu_disk_vbox_lun_init() failed\n",
@@ -738,7 +752,10 @@
if (strcasecmp(spec->disktype, "VDI") == 0
|| strcasecmp(spec->disktype, "VHD") == 0
- || strcasecmp(spec->disktype, "VMDK") == 0) {
+ || strcasecmp(spec->disktype, "VMDK") == 0
+ || strcasecmp(spec->disktype, "QCOW") == 0
+ || strcasecmp(spec->disktype, "QED") == 0
+ || strcasecmp(spec->disktype, "VHDX") == 0) {
rc = istgt_lu_disk_vbox_lun_shutdown(spec, istgt, lu);
if (rc < 0) {
ISTGT_ERRLOG("LU%d: lu_disk_vbox_lun_shutdown() failed\n",
@@ -789,6 +806,7 @@
//ISTGT_ERRLOG("LU%d: mutex_destroy() failed\n", lu->num);
/* ignore error */
}
+ xfree(spec->watsbuf);
xfree(spec->wbuf);
xfree(spec);
lu->lun[i].spec = NULL;
@@ -1552,7 +1570,7 @@
/* WSNZ(0) */
BDSET8(&data[4], 0, 0); /* support zero length in WRITE SAME */
/* MAXIMUM COMPARE AND WRITE LENGTH */
- blocks = ISTGT_LU_WORK_BLOCK_SIZE / (uint32_t) spec->blocklen;
+ blocks = ISTGT_LU_WORK_ATS_BLOCK_SIZE / (uint32_t) spec->blocklen;
if (blocks > 0xff) {
blocks = 0xff;
}
@@ -1785,7 +1803,7 @@
/* Changeable values */
if (page != 0x08) {
/* not supported */
- return 0;
+ return -1;
}
} else if (pc == 0x02) {
/* Default values */
@@ -2082,6 +2100,9 @@
data[3] = len; /* Block Descripter Length */
plen = istgt_lu_disk_scsi_mode_sense_page(spec, conn, cdb, pc, page, subpage, &cp[0], alloc_len);
+ if (plen < 0) {
+ return -1;
+ }
cp += plen;
total = hlen + len + plen;
@@ -2140,6 +2161,9 @@
DSET16(&data[6], len); /* Block Descripter Length */
plen = istgt_lu_disk_scsi_mode_sense_page(spec, conn, cdb, pc, page, subpage, &cp[0], alloc_len);
+ if (plen < 0) {
+ return -1;
+ }
cp += plen;
total = hlen + len + plen;
@@ -2265,6 +2289,72 @@
return 0;
}
+static int
+istgt_lu_disk_scsi_read_defect10(ISTGT_LU_DISK *spec __attribute__((__unused__)), CONN_Ptr conn __attribute__((__unused__)), uint8_t *cdb __attribute__((__unused__)), int req_plist, int req_glist, int list_format, uint8_t *data, int alloc_len)
+{
+ uint8_t *cp;
+ int hlen = 0, len = 0;
+ int total;
+
+ if (alloc_len < 4) {
+ return -1;
+ }
+
+ data[0] = 0; /* Reserved */
+ data[1] = 0;
+ if (req_plist) {
+ BDADD8(&data[1], 1, 4); /* PLISTV */
+ }
+ if (req_glist) {
+ BDADD8(&data[1], 1, 3); /* GLISTV */
+ }
+ BDADD8W(&data[1], list_format, 2, 3); /* DEFECT LIST FORMAT */
+ DSET16(&data[2], 0); /* DEFECT LIST LENGTH */
+ hlen = 4;
+
+ cp = &data[4];
+ /* defect list (if any) */
+ len = 0;
+
+ total = hlen + len;
+ DSET16(&data[2], total - hlen); /* DEFECT LIST LENGTH */
+ return total;
+}
+
+static int
+istgt_lu_disk_scsi_read_defect12(ISTGT_LU_DISK *spec __attribute__((__unused__)), CONN_Ptr conn __attribute__((__unused__)), uint8_t *cdb __attribute__((__unused__)), int req_plist, int req_glist, int list_format, uint8_t *data, int alloc_len)
+{
+ uint8_t *cp;
+ int hlen = 0, len = 0;
+ int total;
+
+ if (alloc_len < 8) {
+ return -1;
+ }
+
+ data[0] = 0; /* Reserved */
+ data[1] = 0;
+ if (req_plist) {
+ BDADD8(&data[1], 1, 4); /* PLISTV */
+ }
+ if (req_glist) {
+ BDADD8(&data[1], 1, 3); /* GLISTV */
+ }
+ BDADD8W(&data[1], list_format, 2, 3); /* DEFECT LIST FORMAT */
+ data[2] = 0; /* Reserved */
+ data[3] = 0; /* Reserved */
+ DSET32(&data[4], 0); /* DEFECT LIST LENGTH */
+ hlen = 8;
+
+ cp = &data[8];
+ /* defect list (if any) */
+ len = 0;
+
+ total = hlen + len;
+ DSET32(&data[4], total - hlen); /* DEFECT LIST LENGTH */
+ return total;
+}
+
#if 0
static int
istgt_lu_disk_scsi_request_sense(ISTGT_LU_DISK *spec, CONN_Ptr conn, uint8_t *cdb, int desc, uint8_t *data, int alloc_len)
@@ -4151,7 +4241,6 @@
static int
istgt_lu_disk_lbwrite_ats(ISTGT_LU_DISK *spec, CONN_Ptr conn, ISTGT_LU_CMD_Ptr lu_cmd, uint64_t lba, uint32_t len)
{
- uint8_t *tmp;
uint8_t *data;
uint64_t maxlba;
uint64_t llen;
@@ -4205,7 +4294,16 @@
return -1;
}
- tmp = xmalloc(nbytes);
+ if (spec->watsbuf == NULL) {
+ spec->watssize = ISTGT_LU_WORK_ATS_BLOCK_SIZE;
+ spec->watsbuf = xmalloc(spec->watssize);
+ }
+ if (nbytes > (uint64_t) spec->watssize) {
+ ISTGT_ERRLOG("nbytes(%zu) > watssize(%zu)\n",
+ (size_t) nbytes, (size_t) spec->watssize);
+ return -1;
+ }
+
spec->req_write_cache = 0;
/* start atomic test and set */
MTX_LOCK(&spec->ats_mutex);
@@ -4214,27 +4312,24 @@
if (rc < 0) {
MTX_UNLOCK(&spec->ats_mutex);
ISTGT_ERRLOG("lu_disk_seek() failed\n");
- xfree(tmp);
return -1;
}
- rc = spec->read(spec, tmp, nbytes);
+ rc = spec->read(spec, spec->watsbuf, nbytes);
if (rc < 0 || (uint64_t) rc != nbytes) {
MTX_UNLOCK(&spec->ats_mutex);
ISTGT_ERRLOG("lu_disk_read() failed\n");
- xfree(tmp);
return -1;
}
#if 0
ISTGT_TRACEDUMP(ISTGT_TRACE_DEBUG, "ATS VERIFY", data, nbytes);
ISTGT_TRACEDUMP(ISTGT_TRACE_DEBUG, "ATS WRITE", data + nbytes, nbytes);
- ISTGT_TRACEDUMP(ISTGT_TRACE_DEBUG, "ATS DATA", tmp, nbytes);
+ ISTGT_TRACEDUMP(ISTGT_TRACE_DEBUG, "ATS DATA", spec->watsbuf, nbytes);
#endif
- if (memcmp(tmp, data, nbytes) != 0) {
+ if (memcmp(spec->watsbuf, data, nbytes) != 0) {
MTX_UNLOCK(&spec->ats_mutex);
//ISTGT_ERRLOG("compare failed\n");
- xfree(tmp);
/* MISCOMPARE DURING VERIFY OPERATION */
BUILD_SENSE(MISCOMPARE, 0x1d, 0x00);
return -1;
@@ -4244,14 +4339,12 @@
if (rc < 0) {
MTX_UNLOCK(&spec->ats_mutex);
ISTGT_ERRLOG("lu_disk_seek() failed\n");
- xfree(tmp);
return -1;
}
rc = spec->write(spec, data + nbytes, nbytes);
if (rc < 0 || (uint64_t) rc != nbytes) {
MTX_UNLOCK(&spec->ats_mutex);
ISTGT_ERRLOG("lu_disk_write() failed\n");
- xfree(tmp);
return -1;
}
ISTGT_TRACELOG(ISTGT_TRACE_SCSI, "Wrote %"PRId64"/%"PRIu64" bytes\n",
@@ -4259,7 +4352,6 @@
MTX_UNLOCK(&spec->ats_mutex);
/* end atomic test and set */
- xfree(tmp);
lu_cmd->data_len = nbytes * 2;
@@ -5801,6 +5893,8 @@
data_len = istgt_lu_disk_scsi_mode_sense6(spec, conn, cdb, dbd, pc, page, subpage, data, data_alloc_len);
if (data_len < 0) {
+ /* INVALID FIELD IN CDB */
+ BUILD_SENSE(ILLEGAL_REQUEST, 0x24, 0x00);
lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
break;
}
@@ -5851,6 +5945,8 @@
data_len = istgt_lu_disk_scsi_mode_sense10(spec, conn, cdb, llbaa, dbd, pc, page, subpage, data, data_alloc_len);
if (data_len < 0) {
+ /* INVALID FIELD IN CDB */
+ BUILD_SENSE(ILLEGAL_REQUEST, 0x24, 0x00);
lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
break;
}
@@ -5862,14 +5958,12 @@
break;
}
-#if 0
case SPC_LOG_SELECT:
case SPC_LOG_SENSE:
/* INVALID COMMAND OPERATION CODE */
BUILD_SENSE(ILLEGAL_REQUEST, 0x20, 0x00);
lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
break;
-#endif
case SPC_REQUEST_SENSE:
{
@@ -6424,7 +6518,7 @@
transfer_len = (uint32_t) DGET8(&cdb[13]);
group_no = BGET8W(&cdb[14], 4, 5);
- maxlen = ISTGT_LU_WORK_BLOCK_SIZE / spec->blocklen;
+ maxlen = ISTGT_LU_WORK_ATS_BLOCK_SIZE / spec->blocklen;
if (maxlen > 0xff) {
maxlen = 0xff;
}
@@ -6517,6 +6611,74 @@
break;
}
+ case SBC_READ_DEFECT_DATA_10:
+ {
+ int req_plist, req_glist, list_format;
+
+ if (lu_cmd->R_bit == 0) {
+ ISTGT_ERRLOG("R_bit == 0\n");
+ lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
+ return -1;
+ }
+
+ req_plist = BGET8(&cdb[2], 4);
+ req_glist = BGET8(&cdb[2], 3);
+ list_format = BGET8W(&cdb[2], 2, 3);
+
+ allocation_len = (uint32_t) DGET16(&cdb[7]);
+ if (allocation_len > (size_t) data_alloc_len) {
+ ISTGT_ERRLOG("data_alloc_len(%d) too small\n",
+ data_alloc_len);
+ lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
+ return -1;
+ }
+ memset(data, 0, allocation_len);
+
+ data_len = istgt_lu_disk_scsi_read_defect10(spec, conn, cdb,
+ req_plist, req_glist, list_format, data, data_alloc_len);
+ if (data_len < 0) {
+ lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
+ break;
+ }
+ lu_cmd->data_len = DMIN32((size_t)data_len, lu_cmd->transfer_len);
+ lu_cmd->status = ISTGT_SCSI_STATUS_GOOD;
+ break;
+ }
+
+ case SBC_READ_DEFECT_DATA_12:
+ {
+ int req_plist, req_glist, list_format;
+
+ if (lu_cmd->R_bit == 0) {
+ ISTGT_ERRLOG("R_bit == 0\n");
+ lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
+ return -1;
+ }
+
+ req_plist = BGET8(&cdb[2], 4);
+ req_glist = BGET8(&cdb[2], 3);
+ list_format = BGET8W(&cdb[2], 2, 3);
+
+ allocation_len = DGET32(&cdb[6]);
+ if (allocation_len > (size_t) data_alloc_len) {
+ ISTGT_ERRLOG("data_alloc_len(%d) too small\n",
+ data_alloc_len);
+ lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
+ return -1;
+ }
+ memset(data, 0, allocation_len);
+
+ data_len = istgt_lu_disk_scsi_read_defect12(spec, conn, cdb,
+ req_plist, req_glist, list_format, data, data_alloc_len);
+ if (data_len < 0) {
+ lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
+ break;
+ }
+ lu_cmd->data_len = DMIN32((size_t)data_len, lu_cmd->transfer_len);
+ lu_cmd->status = ISTGT_SCSI_STATUS_GOOD;
+ break;
+ }
+
case SCC_MAINTENANCE_IN:
ISTGT_TRACELOG(ISTGT_TRACE_SCSI, "MAINTENANCE_IN\n");
switch (BGET8W(&cdb[1], 4, 5)) { /* SERVICE ACTION */
@@ -6698,6 +6860,12 @@
break;
/* XXX TODO: fix */
+ case 0x85: /* ATA PASS-THROUGH(16) */
+ case 0xA1: /* ATA PASS-THROUGH(12) */
+ /* INVALID COMMAND OPERATION CODE */
+ BUILD_SENSE(ILLEGAL_REQUEST, 0x20, 0x00);
+ lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
+ break;
case SPC_EXTENDED_COPY:
/* INVALID COMMAND OPERATION CODE */
BUILD_SENSE(ILLEGAL_REQUEST, 0x20, 0x00);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/src/istgt_lu_disk_vbox.c new/istgt-20120901/src/istgt_lu_disk_vbox.c
--- old/istgt-20120811/src/istgt_lu_disk_vbox.c 2012-08-10 17:11:54.000000000 +0200
+++ new/istgt-20120901/src/istgt_lu_disk_vbox.c 2012-08-19 06:51:15.000000000 +0200
@@ -54,6 +54,7 @@
#ifdef USE_VBOXVD
#define IN_RING3
+#include "iprt/buildconfig.h"
#include "VBox/vd.h"
typedef struct istgt_lu_disk_vbox_t {
@@ -86,9 +87,37 @@
istgt_lu_disk_open_vbox(ISTGT_LU_DISK *spec, int flags, int mode __attribute__((__unused__)))
{
ISTGT_LU_DISK_VBOX *exspec = (ISTGT_LU_DISK_VBOX *)spec->exspec;
+ PVDINTERFACE pIf;
+ uint32_t major, minor, build;
unsigned uOpenFlags;
int rc;
+ major = RTBldCfgVersionMajor();
+ minor = RTBldCfgVersionMinor();
+ build = RTBldCfgVersionBuild();
+ if (major > 4 || (major == 4 && minor >= 2)) {
+ // VBoxDDU >= 4.2
+ if (ISTGT_VBOXINC_VERSION_MAJOR < 4 ||
+ (ISTGT_VBOXINC_VERSION_MAJOR == 4 && ISTGT_VBOXINC_VERSION_MINOR < 2)) {
+ ISTGT_ERRLOG("VBox library is newer than istgt\n");
+ return -1;
+ }
+ } else {
+ // VBoxDDU < 4.2
+ if (ISTGT_VBOXINC_VERSION_MAJOR > 4 ||
+ (ISTGT_VBOXINC_VERSION_MAJOR == 4 && ISTGT_VBOXINC_VERSION_MINOR >= 2)) {
+ ISTGT_ERRLOG("VBox library is older than istgt\n");
+ return -1;
+ }
+ if (strcasecmp(spec->disktype, "QCOW") == 0
+ || strcasecmp(spec->disktype, "QED") == 0
+ || strcasecmp(spec->disktype, "VHDX") == 0) {
+ ISTGT_ERRLOG("VD format(%s) is not supported in this version.\n",
+ spec->disktype);
+ return -1;
+ }
+ }
+
if ((flags & O_ACCMODE) == O_RDONLY) {
uOpenFlags = VD_OPEN_FLAGS_READONLY;
} else if ((flags & O_ACCMODE) == O_RDWR) {
@@ -103,22 +132,32 @@
exspec->pVDIfsImage = NULL;
exspec->enmType = VDTYPE_HDD;
+#if ((ISTGT_VBOXINC_VERSION_MAJOR > 4) || (ISTGT_VBOXINC_VERSION_MAJOR == 4 && ISTGT_VBOXINC_VERSION_MINOR >= 2))
+ exspec->VDIfError.pfnError = istgt_lu_disk_vbox_error;
+ exspec->VDIfError.pfnMessage = NULL;
+ pIf = (PVDINTERFACE)&exspec->VDIfError;
+
+ rc = VDInterfaceAdd(pIf, "VD interface error", VDINTERFACETYPE_ERROR,
+ spec, sizeof(VDINTERFACEERROR), &exspec->pVDIfs);
+#else /* VBox < 4.2 */
exspec->VDIfError.cbSize = sizeof(VDINTERFACEERROR);
exspec->VDIfError.enmInterface = VDINTERFACETYPE_ERROR;
exspec->VDIfError.pfnError = istgt_lu_disk_vbox_error;
exspec->VDIfError.pfnMessage = NULL;
+ pIf = &exspec->VDIfsDisk;
- rc = VDInterfaceAdd(&exspec->VDIfsDisk, "VD interface error", VDINTERFACETYPE_ERROR,
+ rc = VDInterfaceAdd(pIf, "VD interface error", VDINTERFACETYPE_ERROR,
&exspec->VDIfError, spec, &exspec->pVDIfs);
+#endif /* VBox >= 4.2 */
if (RT_FAILURE(rc)) {
ISTGT_ERRLOG("VDInterfaceAdd error\n");
return -1;
}
- rc = VDCreate(&exspec->VDIfsDisk, exspec->enmType, &exspec->pDisk);
+ rc = VDCreate(exspec->pVDIfs, exspec->enmType, &exspec->pDisk);
if (RT_FAILURE(rc)) {
ISTGT_ERRLOG("VDCreate error\n");
- VDInterfaceRemove(&exspec->VDIfsDisk, &exspec->pVDIfs);
+ VDInterfaceRemove(pIf, &exspec->pVDIfs);
exspec->pDisk = NULL;
exspec->pVDIfs = NULL;
exspec->pVDIfsImage = NULL;
@@ -129,7 +168,7 @@
if (RT_FAILURE(rc)) {
ISTGT_ERRLOG("VDOpen error\n");
VDDestroy(exspec->pDisk);
- VDInterfaceRemove(&exspec->VDIfsDisk, &exspec->pVDIfs);
+ VDInterfaceRemove(pIf, &exspec->pVDIfs);
exspec->pDisk = NULL;
exspec->pVDIfs = NULL;
exspec->pVDIfsImage = NULL;
@@ -142,21 +181,27 @@
istgt_lu_disk_close_vbox(ISTGT_LU_DISK *spec)
{
ISTGT_LU_DISK_VBOX *exspec = (ISTGT_LU_DISK_VBOX *)spec->exspec;
+ PVDINTERFACE pIf;
bool fDelete = false;
int rc;
+#if ((ISTGT_VBOXINC_VERSION_MAJOR > 4) || (ISTGT_VBOXINC_VERSION_MAJOR == 4 && ISTGT_VBOXINC_VERSION_MINOR >= 2))
+ pIf = (PVDINTERFACE)&exspec->VDIfError;
+#else /* VBox < 4.2 */
+ pIf = &exspec->VDIfsDisk;
+#endif /* VBox >= 4.2 */
rc = VDClose(exspec->pDisk, fDelete);
if (RT_FAILURE(rc)) {
ISTGT_ERRLOG("VDClose error\n");
VDDestroy(exspec->pDisk);
- VDInterfaceRemove(&exspec->VDIfsDisk, &exspec->pVDIfs);
+ VDInterfaceRemove(pIf, &exspec->pVDIfs);
exspec->pDisk = NULL;
exspec->pVDIfs = NULL;
exspec->pVDIfsImage = NULL;
return -1;
}
VDDestroy(exspec->pDisk);
- VDInterfaceRemove(&exspec->VDIfsDisk, &exspec->pVDIfs);
+ VDInterfaceRemove(pIf, &exspec->pVDIfs);
exspec->pDisk = NULL;
exspec->pVDIfs = NULL;
exspec->pVDIfsImage = NULL;
@@ -199,7 +244,7 @@
offset = spec->foffset;
rc = VDWrite(exspec->pDisk, offset, buf, (size_t)nbytes);
if (RT_FAILURE(rc)) {
- ISTGT_ERRLOG("VDRead error\n");
+ ISTGT_ERRLOG("VDWrite error\n");
return -1;
}
spec->foffset += nbytes;
@@ -302,27 +347,30 @@
printf("LU%d: LUN%d %"PRIu64" blocks, %"PRIu64" bytes/block\n",
spec->num, spec->lun, spec->blockcnt, spec->blocklen);
- rc = VDGetUuid(exspec->pDisk, 0, &exspec->uuid);
- if (RT_FAILURE(rc)) {
- ISTGT_ERRLOG("LU%d: LUN%d: uuid error\n", spec->num, spec->lun);
- spec->close(spec);
- return -1;
+ if (strcasecmp(spec->disktype, "VDI") == 0
+ || strcasecmp(spec->disktype, "VHD") == 0
+ || strcasecmp(spec->disktype, "VMDK") == 0) {
+ rc = VDGetUuid(exspec->pDisk, 0, &exspec->uuid);
+ if (RT_FAILURE(rc)) {
+ ISTGT_ERRLOG("LU%d: LUN%d: uuid error\n", spec->num, spec->lun);
+ spec->close(spec);
+ return -1;
+ }
+ printf("LU%d: LUN%d UUID="
+ "%8.8x-%4.4x-%4.4x-%2.2x%2.2x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x\n",
+ spec->num, spec->lun,
+ exspec->uuid.Gen.u32TimeLow,
+ exspec->uuid.Gen.u16TimeMid,
+ exspec->uuid.Gen.u16TimeHiAndVersion,
+ exspec->uuid.Gen.u8ClockSeqHiAndReserved,
+ exspec->uuid.Gen.u8ClockSeqLow,
+ exspec->uuid.Gen.au8Node[0],
+ exspec->uuid.Gen.au8Node[1],
+ exspec->uuid.Gen.au8Node[2],
+ exspec->uuid.Gen.au8Node[3],
+ exspec->uuid.Gen.au8Node[4],
+ exspec->uuid.Gen.au8Node[5]);
}
- printf("LU%d: LUN%d UUID="
- "%8.8x-%4.4x-%4.4x-%2.2x%2.2x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x\n",
- spec->num, spec->lun,
- exspec->uuid.Gen.u32TimeLow,
- exspec->uuid.Gen.u16TimeMid,
- exspec->uuid.Gen.u16TimeHiAndVersion,
- exspec->uuid.Gen.u8ClockSeqHiAndReserved,
- exspec->uuid.Gen.u8ClockSeqLow,
- exspec->uuid.Gen.au8Node[0],
- exspec->uuid.Gen.au8Node[1],
- exspec->uuid.Gen.au8Node[2],
- exspec->uuid.Gen.au8Node[3],
- exspec->uuid.Gen.au8Node[4],
- exspec->uuid.Gen.au8Node[5]);
-
return 0;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/src/istgt_lu_dvd.c new/istgt-20120901/src/istgt_lu_dvd.c
--- old/istgt-20120811/src/istgt_lu_dvd.c 2012-07-29 01:00:11.000000000 +0200
+++ new/istgt-20120901/src/istgt_lu_dvd.c 2012-09-01 04:19:35.000000000 +0200
@@ -1222,7 +1222,7 @@
/* Changeable values */
if (page != 0x08) {
/* not supported */
- return 0;
+ return -1;
}
} else if (pc == 0x02) {
/* Default values */
@@ -1473,6 +1473,9 @@
data[3] = len; /* Block Descripter Length */
plen = istgt_lu_dvd_scsi_mode_sense_page(spec, conn, cdb, pc, page, subpage, &cp[0], alloc_len);
+ if (plen < 0) {
+ return -1;
+ }
cp += plen;
total = hlen + len + plen;
@@ -1553,6 +1556,9 @@
DSET16(&data[6], len); /* Block Descripter Length */
plen = istgt_lu_dvd_scsi_mode_sense_page(spec, conn, cdb, pc, page, subpage, &cp[0], alloc_len);
+ if (plen < 0) {
+ return -1;
+ }
cp += plen;
total = hlen + len + plen;
@@ -3308,6 +3314,8 @@
data_len = istgt_lu_dvd_scsi_mode_sense6(spec, conn, cdb, dbd, pc, page, subpage, data, data_alloc_len);
if (data_len < 0) {
+ /* INVALID FIELD IN CDB */
+ BUILD_SENSE(ILLEGAL_REQUEST, 0x24, 0x00);
lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
break;
}
@@ -3347,6 +3355,8 @@
data_len = istgt_lu_dvd_scsi_mode_sense10(spec, conn, cdb, llbaa, dbd, pc, page, subpage, data, data_alloc_len);
if (data_len < 0) {
+ /* INVALID FIELD IN CDB */
+ BUILD_SENSE(ILLEGAL_REQUEST, 0x24, 0x00);
lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
break;
}
@@ -3358,14 +3368,12 @@
break;
}
-#if 0
case SPC_LOG_SELECT:
case SPC_LOG_SENSE:
/* INVALID COMMAND OPERATION CODE */
BUILD_SENSE(ILLEGAL_REQUEST, 0x20, 0x00);
lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
break;
-#endif
case SPC_REQUEST_SENSE:
ISTGT_TRACELOG(ISTGT_TRACE_SCSI, "REQUEST_SENSE\n");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/src/istgt_lu_tape.c new/istgt-20120901/src/istgt_lu_tape.c
--- old/istgt-20120811/src/istgt_lu_tape.c 2012-07-29 01:00:11.000000000 +0200
+++ new/istgt-20120901/src/istgt_lu_tape.c 2012-09-01 04:19:35.000000000 +0200
@@ -2370,7 +2370,7 @@
/* Changeable values */
if (page != 0x08) {
/* not supported */
- return 0;
+ return -1;
}
} else if (pc == 0x02) {
/* Default values */
@@ -2641,6 +2641,9 @@
data[3] = len; /* Block Descripter Length */
plen = istgt_lu_tape_scsi_mode_sense_page(spec, conn, cdb, pc, page, subpage, &cp[0], alloc_len);
+ if (plen < 0) {
+ return -1;
+ }
cp += plen;
total = hlen + len + plen;
@@ -2724,6 +2727,9 @@
DSET16(&data[6], len); /* Block Descripter Length */
plen = istgt_lu_tape_scsi_mode_sense_page(spec, conn, cdb, pc, page, subpage, &cp[0], alloc_len);
+ if (plen < 0) {
+ return -1;
+ }
cp += plen;
total = hlen + len + plen;
@@ -4778,6 +4784,8 @@
data_len = istgt_lu_tape_scsi_mode_sense6(spec, conn, cdb, dbd, pc, page, subpage, data, data_alloc_len);
if (data_len < 0) {
+ /* INVALID FIELD IN CDB */
+ BUILD_SENSE(ILLEGAL_REQUEST, 0x24, 0x00);
lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
break;
}
@@ -4817,6 +4825,8 @@
data_len = istgt_lu_tape_scsi_mode_sense10(spec, conn, cdb, llbaa, dbd, pc, page, subpage, data, data_alloc_len);
if (data_len < 0) {
+ /* INVALID FIELD IN CDB */
+ BUILD_SENSE(ILLEGAL_REQUEST, 0x24, 0x00);
lu_cmd->status = ISTGT_SCSI_STATUS_CHECK_CONDITION;
break;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/src/istgt_proto.h new/istgt-20120901/src/istgt_proto.h
--- old/istgt-20120811/src/istgt_proto.h 2012-08-09 00:48:09.000000000 +0200
+++ new/istgt-20120901/src/istgt_proto.h 2012-08-18 23:04:12.000000000 +0200
@@ -208,8 +208,8 @@
#error "no atomic operation"
#endif
}
-#else /* !USE_ATOMIC */
-#if ISTGT_GNUC_PREREQ(4, 1)
+#elif defined (USE_GCC_ATOMIC)
+/* gcc >= 4.1 builtin functions */
static inline __attribute__((__always_inline__)) int
istgt_lu_get_state(ISTGT_LU_Ptr lu)
{
@@ -225,9 +225,11 @@
state_old = __sync_fetch_and_add((unsigned int *)&lu->state, 0);
} while (__sync_val_compare_and_swap((unsigned int *)&lu->state,
state_old, state) != state_old);
+#if defined (HAVE_GCC_ATOMIC_SYNCHRONIZE)
__sync_synchronize();
+#endif
}
-#else /* GCC < 4.1 */
+#else /* !USE_ATOMIC && !USE_GCC_ATOMIC */
static inline __attribute__((__always_inline__)) int
istgt_lu_get_state(ISTGT_LU_Ptr lu)
{
@@ -245,7 +247,6 @@
lu->state = state;
MTX_UNLOCK(&lu->state_mutex);
}
-#endif /* GCC >= 4.1 */
#endif /* USE_ATOMIC */
#endif /* ISTGT_PROTO_H */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/src/istgt_ver.h new/istgt-20120901/src/istgt_ver.h
--- old/istgt-20120811/src/istgt_ver.h 2012-08-10 17:11:54.000000000 +0200
+++ new/istgt-20120901/src/istgt_ver.h 2012-09-01 04:19:35.000000000 +0200
@@ -29,6 +29,6 @@
#define ISTGT_VER_H
#define ISTGT_VERSION "0.5"
-#define ISTGT_EXTRA_VERSION "20120811"
+#define ISTGT_EXTRA_VERSION "20120901"
#endif /* ISTGT_VER_H */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/istgt-20120811/src/istgtcontrol.c new/istgt-20120901/src/istgtcontrol.c
--- old/istgt-20120811/src/istgtcontrol.c 2012-07-29 01:00:11.000000000 +0200
+++ new/istgt-20120901/src/istgtcontrol.c 2012-08-14 21:52:53.000000000 +0200
@@ -1129,7 +1129,7 @@
break;
case 'l':
l = strtol(optarg, NULL, 10);
- if (l < 0 || l > 0x3fffU) {
+ if (l < 0 || l > 0x3fff) {
fatal("invalid lun %s\n", optarg);
}
lun = (int) l;
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org