You can subscribe to this list here.
2010 |
Jan
|
Feb
|
Mar
(16) |
Apr
(25) |
May
(8) |
Jun
(22) |
Jul
(71) |
Aug
(36) |
Sep
(22) |
Oct
(31) |
Nov
(88) |
Dec
(40) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2011 |
Jan
(128) |
Feb
(35) |
Mar
(28) |
Apr
(33) |
May
(18) |
Jun
(8) |
Jul
(21) |
Aug
(18) |
Sep
(6) |
Oct
(19) |
Nov
(12) |
Dec
(44) |
2012 |
Jan
(31) |
Feb
(48) |
Mar
(31) |
Apr
(11) |
May
(13) |
Jun
(15) |
Jul
(13) |
Aug
(18) |
Sep
(7) |
Oct
(25) |
Nov
(21) |
Dec
(13) |
2013 |
Jan
(17) |
Feb
(18) |
Mar
(21) |
Apr
(35) |
May
(30) |
Jun
(4) |
Jul
|
Aug
(1) |
Sep
(8) |
Oct
(30) |
Nov
(13) |
Dec
|
From: Cyril H. <su...@li...> - 2013-09-09 13:26:43
|
The branch, master, has been updated via 0f3ac8c323de141fb2d3fb4339819ee117e58124 (commit) via ce0dffef2ec0eecc73722d97feb2f81feea093f3 (commit) via 631d16671d876524588320ee71fd23fe22750307 (commit) via cbf52ab4816e19c953422b9fa9c60b422d372b67 (commit) via fe85aeebf044b6409d8816bc64a3ec3421f278b5 (commit) via d21b95814cc8ec30cce258de6f9b8c11ea492eb4 (commit) via e11382aaac69b2258457df87275ea8fb5ae3dd6a (commit) via 39773188a14267206c6b7446058e5c6e8ca4431e (commit) via a8c42db5f9314211811c36275a21f83902830dc5 (commit) via 4691f01fd45b333ca2b80212320400d07d861432 (commit) via 4b3007a8e16522b26cfb8233530736554a53ae9c (commit) via ff3936a916d119d020cc2ab8da22460a34fca612 (commit) via 3324212e729281aee66911eeda400ea5639332fc (commit) via 7037cea484ee5c807c753ff50d4fcfd4746f5942 (commit) via 89b2497d859b8c7892dc3aab3438a05fa12a23d7 (commit) via d11261662672d14c80e1579672197407f05457bc (commit) via b3c4fbe3e23a06970008f762b6e696c417692b78 (commit) via 3e0e33657d4323f704a0622c4094a9a4a0192b2a (commit) via 80ab8bc049410533b7fc7ce301693deadcbb3e3d (commit) via df7d484a052a3996d0e0eb84c9a1fdfadf5cb58b (commit) via 371375c6ab8cb9b666942eb288b80cc741f542ef (commit) via 5ab9e96fac3439d29214baf59e0c6776ab53028f (commit) via 9fc105cc44426e4d7125d0121f07b09589389454 (commit) from 858a5767b75e94ddfcdcd20fb9efb955c25e393f (commit) - Log ----------------------------------------------------------------- commit 0f3ac8c323de141fb2d3fb4339819ee117e58124 Author: Stanislav Kholmanskikh <sta...@or...> Date: Thu Sep 5 11:01:49 2013 +0400 syscalls/getgroups: added checks for 16-bit getgroups() syscall getgroups01_16 and getgroups03_16 did not use 16-bit versions of getgroups() syscall. Fixed this in the same manner like syscalls/setgroups. Signed-off-by: Stanislav Kholmanskikh <sta...@or...> Reviewed-by: Cyril Hrubis <ch...@su...> commit ce0dffef2ec0eecc73722d97feb2f81feea093f3 Author: Stanislav Kholmanskikh <sta...@or...> Date: Thu Sep 5 11:01:48 2013 +0400 fixes for 16-bit syscalls testcases syscalls/setgroups: moved compat_16.h to ../utils. This header will be common for all 16-bit syscalls definitions. Signed-off-by: Stanislav Kholmanskikh <sta...@or...> Reviewed-by: Cyril Hrubis <ch...@su...> commit 631d16671d876524588320ee71fd23fe22750307 Author: Stanislav Kholmanskikh <sta...@or...> Date: Thu Sep 5 11:01:47 2013 +0400 syscalls/utils/compat_16.mk: fix build dependencies If we create/modify/touch file syscalls/utils/compat_16.h and execute 'make' in any of syscalls directories which includes compat_16.mk, then nothing will happen, because this approach: %.c: $(COMPAT_16_H) is not working. Fixed this. Signed-off-by: Stanislav Kholmanskikh <sta...@or...> Reviewed-by: Cyril Hrubis <ch...@su...> commit cbf52ab4816e19c953422b9fa9c60b422d372b67 Author: Jan Stancek <jst...@re...> Date: Thu Sep 5 09:22:31 2013 +0200 proc01: add nfsd/pool_stats to list of known issues This file is available if /proc/fs/nfsd filesystem is mounted, but it can be opened only when nfs server is running. Signed-off-by: Jan Stancek <jst...@re...> Acked-by: Cyril Hrubis <ch...@su...> commit fe85aeebf044b6409d8816bc64a3ec3421f278b5 Author: Cyril Hrubis <ch...@su...> Date: Wed Sep 4 16:46:46 2013 +0200 timer_getoverrun01: Cleanup. Basically this is more or less rewrite to get rid of the mess that was there previously. Signed-off-by: Cyril Hrubis <ch...@su...> commit d21b95814cc8ec30cce258de6f9b8c11ea492eb4 Author: Cyril Hrubis <ch...@su...> Date: Wed Sep 4 16:29:35 2013 +0200 timer_gettime01: Cleanup. Basically this is more or less rewrite to get rid of the mess that was there previously. Signed-off-by: Cyril Hrubis <ch...@su...> commit e11382aaac69b2258457df87275ea8fb5ae3dd6a Author: DAN LI <li...@cn...> Date: Tue Sep 3 10:17:09 2013 +0800 quotactl/quotactl02.c: create a case to test basic flags of quotactl(2) Test basic xqm-related flags of quotactl() syscall. Signed-off-by: DAN LI <li...@cn...> commit 39773188a14267206c6b7446058e5c6e8ca4431e Author: DAN LI <li...@cn...> Date: Tue Aug 27 14:26:16 2013 +0800 Check if xfs quota is available Define HAVE_XFS_QUOTA to show if xfs quota is available. Signed-off-by: DAN LI <li...@cn...> Signed-off-by: Cyril Hrubis <ch...@su...> commit a8c42db5f9314211811c36275a21f83902830dc5 Author: Cyril Hrubis <ch...@su...> Date: Wed Sep 4 12:41:42 2013 +0200 LTP 20130904 Signed-off-by: Cyril Hrubis <ch...@su...> commit 4691f01fd45b333ca2b80212320400d07d861432 Author: Anders Roxell <and...@li...> Date: Tue Sep 3 09:42:35 2013 +0200 runltp: rework echo -n to printf POSIX-compliant Signed-off-by: Anders Roxell <and...@li...> commit 4b3007a8e16522b26cfb8233530736554a53ae9c Author: Cyril Hrubis <ch...@su...> Date: Mon Sep 2 16:13:16 2013 +0200 configure: Add _FORTIFY_SOURCE=2 Add -D_FORTIFY_SOURCE=2 into CPPFLAGS if: o it's not allready set in system headers o optimalization is enabled Signed-off-by: Cyril Hrubis <ch...@su...> commit ff3936a916d119d020cc2ab8da22460a34fca612 Author: Anders Roxell <and...@li...> Date: Thu Aug 29 15:55:47 2013 +0200 realtime parser: remove unused and depricated imports Signed-off-by: Anders Roxell <and...@li...> commit 3324212e729281aee66911eeda400ea5639332fc Author: Dave Kleikamp <dav...@or...> Date: Wed Aug 28 08:07:23 2013 -0500 ltp: Fix races in mmap1 Make map_address a volatile pointer so that it is dereferenced in read_mem() after read_lock is set. Also read_lock must protect the verbose printf that reads from map_address as well. Signed-off-by: Dave Kleikamp <dav...@or...> Reviewed-by: Cyril Hrubis <ch...@su...> commit 7037cea484ee5c807c753ff50d4fcfd4746f5942 Author: Stanislav Kholmanskikh <sta...@or...> Date: Tue Aug 27 16:49:52 2013 +0400 lib/numa_helper.c: fix nodemask_size Now nodemask_size is rounded up to the next multiple of sizeof(unsigned long). Signed-off-by: Stanislav Kholmanskikh <sta...@or...> Reviewed-by: Jan Stancek <jst...@re...> Acked-by: Cyril Hrubis <ch...@su...> commit 89b2497d859b8c7892dc3aab3438a05fa12a23d7 Author: Stanislav Kholmanskikh <sta...@or...> Date: Tue Aug 27 16:49:51 2013 +0400 syscalls/migrate_pages: fix nodemask memory allocation In accordance to man migrate_pages(), mbind() the bit mask size should be rounded to next multiple of sizeof(unsigned long). Signed-off-by: Stanislav Kholmanskikh <sta...@or...> Reviewed-by: Jan Stancek <jst...@re...> Acked-by: Cyril Hrubis <ch...@su...> commit d11261662672d14c80e1579672197407f05457bc Author: Stanislav Kholmanskikh <sta...@or...> Date: Tue Aug 27 16:49:50 2013 +0400 Added LTP_ALIGN, __LTP_ALIGN_MASK macros Signed-off-by: Stanislav Kholmanskikh <sta...@or...> Reviewed-by: Jan Stancek <jst...@re...> Acked-by: Cyril Hrubis <ch...@su...> commit b3c4fbe3e23a06970008f762b6e696c417692b78 Author: Cyril Hrubis <ch...@su...> Date: Wed Aug 28 14:41:57 2013 +0200 lib: tst_mkfs: Add force option for xfs. The mkfs.xfs aborts if it finds a filesystem superblock on the device, which is the case here as we reuse one device for all tests. So we append force option to mkfs.xfs automatically. Signed-off-by: Cyril Hrubis <ch...@su...> commit 3e0e33657d4323f704a0622c4094a9a4a0192b2a Author: DAN LI <li...@cn...> Date: Tue Aug 27 11:14:20 2013 +0800 mount/mount05.c: format the device when necessary Format the device only when "-D device" & "-T type" are specified. Signed-off-by: DAN LI <li...@cn...> Reviewed-by: Wanlong Gao <gao...@cn...> Acked-by: Cyril Hrubis <ch...@su...> commit 80ab8bc049410533b7fc7ce301693deadcbb3e3d Author: Jan Stancek <jst...@re...> Date: Tue Aug 27 11:05:32 2013 +0200 proc01: add use-gss-proxy to known_issues list Following commit implemented non-blocking read for use-gss-proxy: commit b161c144404c18f6a9e20e46b63828ae3c2eb093 Author: J. Bruce Fields <bf...@re...> Date: Fri May 24 09:47:49 2013 -0400 svcrpc: implement O_NONBLOCK behavior for use-gss-proxy Prior to this commit non-block read hanged, but it happened only in -rc kernels, which we can ignore. Note, that this proc entry is available only when you load module auth_rpcgss. Signed-off-by: Jan Stancek <jst...@re...> Acked-by: Cyril Hrubis <ch...@su...> Signed-off-by: Wanlong Gao <gao...@cn...> commit df7d484a052a3996d0e0eb84c9a1fdfadf5cb58b Author: Jan Stancek <jst...@re...> Date: Tue Aug 27 14:16:19 2013 +0200 lib/mem: remove unnecessary params in path_exist These are applied in snprintf above. Signed-off-by: Jan Stancek <jst...@re...> commit 371375c6ab8cb9b666942eb288b80cc741f542ef Author: Dave Kleikamp <dav...@or...> Date: Tue Aug 20 15:34:39 2013 -0500 lib/mem: handle missing online file gather_node_cpus() fails if the /sys/devices/system/node/nodeX/cpuX/online file is missing for any cpu other than cpu0. The absence of the online file should not be treated as a failure, but as an indication that the cpu is not hot-pluggable and cannot be taken offline. Signed-off-by: Dave Kleikamp <dav...@or...> Reviewed-by: Wanlong Gao <gao...@cn...> Reviewed-by: Jan Stancek <jst...@re...> commit 5ab9e96fac3439d29214baf59e0c6776ab53028f Author: Jan Stancek <jst...@re...> Date: Wed Aug 14 13:28:33 2013 +0200 open_posix_testsuite/../mq_timedsend/12-1: fix race Test can send SIGUSR1 signal after thread has already completed and report failure from main() and success from a_thread_func(): conformance/interfaces/mq_timedsend/12-1: execution: UNRESOLVED: Output: Error: in pthread_kill : Success thread: mq_timedsend interrupted by signal and correctly set errno to EINTR Synchronize exit of a_thread_func(), so that thread can exit only after loop sending SIGUSR1 completed. Signed-off-by: Jan Stancek <jst...@re...> Acked-by: Cyril Hrubis <ch...@su...> commit 9fc105cc44426e4d7125d0121f07b09589389454 Author: Jan Stancek <jst...@re...> Date: Wed Jul 24 08:39:24 2013 +0200 open_posix_testsuite/../mq_timedsend/12-1: fix long lines Fix lines going over 80 characters. Signed-off-by: Jan Stancek <jst...@re...> ----------------------------------------------------------------------- Summary of changes: VERSION | 2 +- configure.ac | 3 +- include/compiler.h | 6 + lib/tst_mkfs.c | 19 ++- m4/{ltp-time.m4 => ltp-fortify_source.m4} | 32 ++- m4/{ltp-keyctl.m4 => ltp-xfs_quota.m4} | 29 ++- runltp | 18 +- runtest/syscalls | 1 + testcases/kernel/fs/proc/proc01.c | 2 + testcases/kernel/lib/numa_helper.c | 9 +- testcases/kernel/mem/lib/mem.c | 18 +- testcases/kernel/mem/mtest06/mmap1.c | 8 +- testcases/kernel/syscalls/.gitignore | 1 + testcases/kernel/syscalls/getgroups/getgroups01.c | 22 +- testcases/kernel/syscalls/getgroups/getgroups03.c | 17 +- .../syscalls/migrate_pages/migrate_pages01.c | 4 +- .../syscalls/migrate_pages/migrate_pages02.c | 4 +- testcases/kernel/syscalls/mount/mount05.c | 8 +- testcases/kernel/syscalls/quotactl/quotactl02.c | 249 ++++++++++++++++++++ testcases/kernel/syscalls/setgroups/compat_16.h | 85 ------- testcases/kernel/syscalls/setgroups/setgroups01.c | 5 +- testcases/kernel/syscalls/setgroups/setgroups02.c | 4 +- testcases/kernel/syscalls/setgroups/setgroups03.c | 2 +- testcases/kernel/syscalls/setgroups/setgroups04.c | 2 +- .../syscalls/timer_getoverrun/timer_getoverrun01.c | 215 ++++------------- .../syscalls/timer_gettime/timer_gettime01.c | 206 +++++------------ testcases/kernel/syscalls/utils/compat_16.h | 57 +++++ testcases/kernel/syscalls/utils/compat_16.mk | 6 +- .../conformance/interfaces/mq_timedsend/12-1.c | 185 ++++++++------- testcases/realtime/scripts/parser.py | 2 +- 30 files changed, 636 insertions(+), 585 deletions(-) copy m4/{ltp-time.m4 => ltp-fortify_source.m4} (60%) copy m4/{ltp-keyctl.m4 => ltp-xfs_quota.m4} (57%) create mode 100644 testcases/kernel/syscalls/quotactl/quotactl02.c delete mode 100644 testcases/kernel/syscalls/setgroups/compat_16.h create mode 100644 testcases/kernel/syscalls/utils/compat_16.h diff --git a/VERSION b/VERSION index d9a931a..c0a4855 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -20130503 +20130904 diff --git a/configure.ac b/configure.ac index f0fc6b0..940f4f7 100644 --- a/configure.ac +++ b/configure.ac @@ -144,7 +144,7 @@ else fi # END testsuites knobs - +LTP_CHECK_FORTIFY_SOURCE LTP_CHECK_MKDTEMP LTP_CHECK_CAPABILITY_SUPPORT LTP_CHECK_CRYPTO @@ -168,5 +168,6 @@ LTP_CHECK_ACL_SUPPORT LTP_CHECK_FS_IOC_FLAGS LTP_CHECK_MREMAP_FIXED LTP_CHECK_KERNEL_DEVEL +LTP_CHECK_XFS_QUOTACTL AC_OUTPUT diff --git a/include/compiler.h b/include/compiler.h index ec714fe..4b41f65 100644 --- a/include/compiler.h +++ b/include/compiler.h @@ -15,4 +15,10 @@ #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) #endif +/* Round x to the next multiple of a. + * a should be a power of 2. + */ +#define LTP_ALIGN(x, a) __LTP_ALIGN_MASK(x, (typeof(x))(a) - 1) +#define __LTP_ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask)) + #endif /* __LTP_COMPILER_H__ */ diff --git a/lib/tst_mkfs.c b/lib/tst_mkfs.c index cfdcb3e..bacf976 100644 --- a/lib/tst_mkfs.c +++ b/lib/tst_mkfs.c @@ -27,12 +27,23 @@ void tst_mkfs(void (cleanup_fn)(void), const char *dev, if (!fs_type) tst_brkm(TBROK, cleanup_fn, "No fs_type specified"); - const char *argv[] = {"mkfs", "-t", fs_type, fs_opts, dev, NULL}; + const char *argv[] = {"mkfs", "-t", fs_type, NULL, NULL, NULL, NULL}; + int pos = 3; - if (!fs_opts) { - argv[3] = dev; - argv[4] = NULL; + /* + * The mkfs.xfs aborts if it finds a filesystem superblock + * on the device, which is the case here as we reuse one + * device for all tests. + */ + if (!strcmp(fs_type, "xfs")) { + tst_resm(TINFO, "Appending '-f' force flag to mkfs.xfs"); + argv[pos++] = "-f"; } + if (fs_opts) + argv[pos++] = fs_opts; + + argv[pos] = dev; + tst_run_cmd(cleanup_fn, argv, "/dev/null", NULL); } diff --git a/m4/ltp-time.m4 b/m4/ltp-fortify_source.m4 similarity index 60% copy from m4/ltp-time.m4 copy to m4/ltp-fortify_source.m4 index b498726..ffb22b4 100644 --- a/m4/ltp-time.m4 +++ b/m4/ltp-fortify_source.m4 @@ -1,5 +1,5 @@ dnl -dnl Copyright (c) Copyrights-are-for-losers, Inc 2010 +dnl Copyright (c) 2013 Cyril Hrubis <ch...@su...> dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by @@ -15,21 +15,25 @@ dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA dnl -dnl Author: Garrett Cooper <yan...@gm...> -dnl dnl -dnl LTP_CHECK_TIME -dnl -dnl For all directly related time syscalls. -dnl -dnl ---------------------------- +dnl LTP_CHECK_FORTIFY_SOURCE +dnl ------------------------ dnl -AC_DEFUN([LTP_CHECK_TIME],[ - AC_CHECK_DECLS([CLOCK_MONOTONIC_RAW, CLOCK_REALTIME_COARSE, CLOCK_MONOTONIC_COARSE],,,[ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE +AC_DEFUN([LTP_CHECK_FORTIFY_SOURCE],[dnl + AC_MSG_CHECKING(whether to define _FORTIFY_SOURCE=2) + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ +#include <stdio.h> + +int main(void) +{ +#if !defined _FORTIFY_SOURCE && defined __OPTIMIZE__ && __OPTIMIZE__ + return 0; +#else +# error Compiling without optimalizations #endif -#include <time.h> -]) +} +])],[CPPFLAGS="$CPPFLAGS -D_FORTIFY_SOURCE=2" +AC_MSG_RESULT(yes)], +[AC_MSG_RESULT(no)]) ]) diff --git a/m4/ltp-keyctl.m4 b/m4/ltp-xfs_quota.m4 similarity index 57% copy from m4/ltp-keyctl.m4 copy to m4/ltp-xfs_quota.m4 index 34818b2..c9ee335 100644 --- a/m4/ltp-keyctl.m4 +++ b/m4/ltp-xfs_quota.m4 @@ -1,5 +1,6 @@ dnl -dnl Copyright (c) Linux Test Project, 2010 +dnl Copyright (c) 2013 Fujitsu Ltd. +dnl Author: DAN LI <li...@cn...> dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by @@ -17,20 +18,24 @@ dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA dnl dnl -dnl LTP_CHECK_SYSCALL_KEYCTL +dnl LTP_CHECK_XFS_QUOTACTL dnl ---------------------------- dnl -AC_DEFUN([LTP_CHECK_SYSCALL_KEYCTL],[AC_LINK_IFELSE([AC_LANG_SOURCE([ -#include <sys/types.h> -#include <keyutils.h> +AC_DEFUN([LTP_CHECK_XFS_QUOTACTL],[dnl + AC_MSG_CHECKING([for XFS quota (xfs/xqm.h)]) + AC_LINK_IFELSE([AC_LANG_SOURCE([ +#include <xfs/xqm.h> +#include <sys/quota.h> int main(void) { - key_serial_t akey; - (void) keyctl(KEYCTL_READ, akey); - return 0; -}])],[has_keyctl_syscall="yes"]) -if test "x$has_keyctl_syscall" = "xyes"; then - AC_DEFINE(HAVE_KEYCTL_SYSCALL,1,[Define to 1 if you have the libkeyutils development package and keyctl syscall on your system]) + struct fs_quota_stat qstat; + return quotactl(QCMD(Q_XGETQSTAT, USRQUOTA), "/dev/null", geteuid(), + (caddr_t) &qstat); +}])],[has_xfs_quota="yes"]) + +if test "x$has_xfs_quota" = xyes; then + AC_DEFINE(HAVE_XFS_QUOTA,1,[Define to 1 if you have xfs quota]) + AC_MSG_RESULT(yes) else - AC_DEFINE(HAVE_KEYCTL_SYSCALL,0,[Define to 1 if you have the libkeyutils development package and keyctl syscall on your system]) + AC_MSG_RESULT(no) fi ]) diff --git a/runltp b/runltp index a419bf8..e86f5c7 100755 --- a/runltp +++ b/runltp @@ -537,18 +537,16 @@ main() { [ -z "$RHOST" ] && \ { - echo \ - "INFO: Enter RHOST = 'name of the remote host machine'" - echo -n "-> " + printf "INFO: Enter RHOST = 'name of the remote host machine'" + printf "\n-> " read RHOST } [ -z "$PASSWD" ] && \ { - echo " " - echo \ - "INFO: Enter PASSWD = 'root passwd of the remote host machine'" - echo -n "-> " + printf "\nINFO: " + printf "Enter PASSWD = 'root passwd of the remote host machine'" + printf "\n-> " read PASSWD } export RHOST=$RHOST @@ -733,15 +731,15 @@ main() #$PAN_COMMAND #Duplicated code here, because otherwise if we fail, only "PAN_COMMAND" gets output ## Display the Output/Log/Failed/HTML file names here - echo -e "LOG File: \c" + printf "LOG File: " echo $LOGFILE | cut -b4- if [ "$OUTPUTFILE" ]; then - echo -e "OUTPUT File: \c" + printf "OUTPUT File: " echo $OUTPUTFILE | cut -b4- fi - echo -e "FAILED COMMAND File: \c" + printf "FAILED COMMAND File: " echo $FAILCMDFILE | cut -b4- if [ "$HTMLFILE" ]; then diff --git a/runtest/syscalls b/runtest/syscalls index 76858ed..b778b64 100644 --- a/runtest/syscalls +++ b/runtest/syscalls @@ -770,6 +770,7 @@ pwrite03_64 pwrite03_64 pwrite04_64 pwrite04_64 quotactl01 quotactl01 +quotactl02 quotactl02 -D DEVICE read01 read01 read02 read02 diff --git a/testcases/kernel/fs/proc/proc01.c b/testcases/kernel/fs/proc/proc01.c index f2aa483..73a55c8 100644 --- a/testcases/kernel/fs/proc/proc01.c +++ b/testcases/kernel/fs/proc/proc01.c @@ -85,6 +85,7 @@ static const struct mapping known_issues[] = { {"open", "/proc/sal/cmc/data", EBUSY}, {"open", "/proc/sal/init/data", EBUSY}, {"open", "/proc/sal/mca/data", EBUSY}, + {"open", "/proc/fs/nfsd/pool_stats", ENODEV}, {"read", "/proc/acpi/event", EAGAIN}, {"read", "/proc/kmsg", EAGAIN}, {"read", "/proc/sal/cpe/event", EAGAIN}, @@ -106,6 +107,7 @@ static const struct mapping known_issues[] = { {"read", "/proc/fs/nfsd/filehandle", EINVAL}, {"read", "/proc/fs/nfsd/.getfs", EINVAL}, {"read", "/proc/fs/nfsd/.getfd", EINVAL}, + {"read", "/proc/self/net/rpc/use-gss-proxy", EAGAIN}, {"", "", 0} }; diff --git a/testcases/kernel/lib/numa_helper.c b/testcases/kernel/lib/numa_helper.c index 4157816..a5698bb 100644 --- a/testcases/kernel/lib/numa_helper.c +++ b/testcases/kernel/lib/numa_helper.c @@ -60,7 +60,7 @@ unsigned long get_max_node(void) #if HAVE_NUMA_H static void get_nodemask_allnodes(nodemask_t * nodemask, unsigned long max_node) { - unsigned long nodemask_size = max_node / 8 + 1; + unsigned long nodemask_size = max_node / 8; int i; char fn[64]; struct stat st; @@ -76,7 +76,7 @@ static void get_nodemask_allnodes(nodemask_t * nodemask, unsigned long max_node) static int filter_nodemask_mem(nodemask_t * nodemask, unsigned long max_node) { #if MPOL_F_MEMS_ALLOWED - unsigned long nodemask_size = max_node / 8 + 1; + unsigned long nodemask_size = max_node / 8; memset(nodemask, 0, nodemask_size); /* * avoid numa_get_mems_allowed(), because of bug in getpol() @@ -164,8 +164,9 @@ int get_allowed_nodes_arr(int flag, int *num_nodes, int **nodes) *nodes = NULL; #if HAVE_NUMA_H - unsigned long max_node = get_max_node(); - unsigned long nodemask_size = max_node / 8 + 1; + unsigned long max_node = LTP_ALIGN(get_max_node(), + sizeof(unsigned long)*8); + unsigned long nodemask_size = max_node / 8; nodemask = malloc(nodemask_size); if (nodes) diff --git a/testcases/kernel/mem/lib/mem.c b/testcases/kernel/mem/lib/mem.c index 9bc926e..188a5ef 100644 --- a/testcases/kernel/mem/lib/mem.c +++ b/testcases/kernel/mem/lib/mem.c @@ -783,19 +783,17 @@ static void gather_node_cpus(char *cpus, long nd) for (i = 0; i < ncpus; i++) { snprintf(path, BUFSIZ, PATH_SYS_SYSTEM "/node/node%ld/cpu%d", nd, i); - if (path_exist(path, nd, i)) { + if (path_exist(path)) { snprintf(path1, BUFSIZ, "%s/online", path); /* - * No cpu0/online knob, as it can't support to - * on/offline cpu0, so if the 'nd' node contains - * cpu0, it should skip to check cpu0/online's value. + * if there is no online knob, then the cpu cannot + * be taken offline */ - if (i == 0) - goto next; - SAFE_FILE_SCANF(cleanup, path1, "%ld", &online); - if (online == 0) - continue; -next: + if (path_exist(path1)) { + SAFE_FILE_SCANF(cleanup, path1, "%ld", &online); + if (online == 0) + continue; + } sprintf(buf, "%d,", i); strcat(cpus, buf); } diff --git a/testcases/kernel/mem/mtest06/mmap1.c b/testcases/kernel/mem/mtest06/mmap1.c index 7c80bb4..cd1127f 100644 --- a/testcases/kernel/mem/mtest06/mmap1.c +++ b/testcases/kernel/mem/mtest06/mmap1.c @@ -62,7 +62,7 @@ } while (0) static int verbose_print = 0; -static char *map_address; +static char *volatile map_address; static jmp_buf jmpbuf; static volatile char read_lock = 0; @@ -228,11 +228,13 @@ void *read_mem(void *ptr) tst_resm(TINFO, "page fault occurred due to " "a read after an unmap"); } else { - if (verbose_print) + if (verbose_print) { + read_lock = 1; tst_resm(TINFO, "read_mem(): content of memory: %s", (char *)map_address); - + read_lock = 0; + } for (j = 0; j < args[1]; j++) { read_lock = 1; if (map_address[j] != 'a') diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore index 9a8c14c..f8f02d5 100644 --- a/testcases/kernel/syscalls/.gitignore +++ b/testcases/kernel/syscalls/.gitignore @@ -634,6 +634,7 @@ /pwrite/pwrite04 /pwrite/pwrite04_64 /quotactl/quotactl01 +/quotactl/quotactl02 /read/read01 /read/read02 /read/read03 diff --git a/testcases/kernel/syscalls/getgroups/getgroups01.c b/testcases/kernel/syscalls/getgroups/getgroups01.c index 1d58109..f319ebf 100644 --- a/testcases/kernel/syscalls/getgroups/getgroups01.c +++ b/testcases/kernel/syscalls/getgroups/getgroups01.c @@ -52,8 +52,10 @@ #include <grp.h> #include <sys/param.h> #include <sys/types.h> + #include "test.h" #include "usctest.h" +#include "compat_16.h" static void setup(void); static void cleanup(void); @@ -61,14 +63,14 @@ static void cleanup(void); char *TCID = "getgroups01"; int TST_TOTAL = 4; -static gid_t gidset[NGROUPS]; -static gid_t cmpset[NGROUPS]; +static GID_T gidset[NGROUPS]; +static GID_T cmpset[NGROUPS]; int main(int ac, char **av) { int lc; char *msg; - gid_t group; + GID_T group; int i; int entries; @@ -83,7 +85,7 @@ int main(int ac, char **av) tst_count = 0; - TEST(getgroups(-1, gidset)); + TEST(GETGROUPS(cleanup, -1, gidset)); if (TEST_RETURN == 0) { tst_resm(TFAIL, "getgroups succeeded unexpectedly"); @@ -101,14 +103,14 @@ int main(int ac, char **av) * return and the the gidset array is not modified. * This is a POSIX special case. */ - memset(gidset, 052, NGROUPS * sizeof(gid_t)); - memset(cmpset, 052, NGROUPS * sizeof(gid_t)); + memset(gidset, 052, NGROUPS * sizeof(GID_T)); + memset(cmpset, 052, NGROUPS * sizeof(GID_T)); - TEST(getgroups(0, gidset)); + TEST(GETGROUPS(cleanup, 0, gidset)); if (TEST_RETURN == -1) { tst_resm(TFAIL | TTERRNO, "getgroups failed unexpectedly"); } else if (STD_FUNCTIONAL_TEST) { - if (memcmp(cmpset, gidset, NGROUPS * sizeof(gid_t)) != 0) + if (memcmp(cmpset, gidset, NGROUPS * sizeof(GID_T)) != 0) tst_resm(TFAIL, "getgroups modified the gidset array"); else @@ -126,7 +128,7 @@ int main(int ac, char **av) "getgroups returned %ld; unable to test that using ngrps >=1 but less than number of grps", TEST_RETURN); } else { - TEST(getgroups(TEST_RETURN - 1, gidset)); + TEST(GETGROUPS(cleanup, TEST_RETURN - 1, gidset)); if (TEST_RETURN == -1) { if (STD_FUNCTIONAL_TEST) { if (errno == EINVAL) @@ -145,7 +147,7 @@ int main(int ac, char **av) } } - TEST(getgroups(NGROUPS, gidset)); + TEST(GETGROUPS(cleanup, NGROUPS, gidset)); if ((entries = TEST_RETURN) == -1) { tst_resm(TFAIL | TTERRNO, "getgroups failed unexpectedly"); diff --git a/testcases/kernel/syscalls/getgroups/getgroups03.c b/testcases/kernel/syscalls/getgroups/getgroups03.c index 1e25756..5e46792 100644 --- a/testcases/kernel/syscalls/getgroups/getgroups03.c +++ b/testcases/kernel/syscalls/getgroups/getgroups03.c @@ -41,6 +41,7 @@ #include "test.h" #include "usctest.h" +#include "compat_16.h" #define TESTUSER "root" @@ -48,8 +49,8 @@ char *TCID = "getgroups03"; int TST_TOTAL = 1; static int ngroups; -static gid_t groups_list[NGROUPS]; -static gid_t groups[NGROUPS]; +static GID_T groups_list[NGROUPS]; +static GID_T groups[NGROUPS]; static void verify_groups(int ret_ngroups); static void setup(void); @@ -70,7 +71,7 @@ int main(int ac, char **av) tst_count = 0; - TEST(getgroups(gidsetsize, groups_list)); + TEST(GETGROUPS(cleanup, gidsetsize, groups_list)); if (TEST_RETURN == -1) { tst_resm(TFAIL | TTERRNO, "getgroups failed"); @@ -88,18 +89,18 @@ int main(int ac, char **av) } /* - * readgroups(gid_t *) - Read supplimentary group ids of "root" user + * readgroups(GID_T *) - Read supplimentary group ids of "root" user * Scans the /etc/group file to get IDs of all the groups to which TESTUSER * belongs and puts them into the array passed. * Returns the no of gids read. */ -static int readgroups(gid_t groups[NGROUPS]) +static int readgroups(GID_T groups[NGROUPS]) { struct group *grp; int ngrps = 0; int i; int found; - gid_t g; + GID_T g; setgrent(); @@ -151,7 +152,7 @@ static void setup(void) * testcase will fail. So execute setgroups() before executing * getgroups() */ - if (setgroups(ngroups, groups) == -1) + if (SETGROUPS(cleanup, ngroups, groups) == -1) tst_brkm(TBROK | TERRNO, cleanup, "setgroups failed"); } @@ -165,7 +166,7 @@ static void setup(void) static void verify_groups(int ret_ngroups) { int i, j; - gid_t egid; + GID_T egid; int egid_flag = 1; int fflag = 1; diff --git a/testcases/kernel/syscalls/migrate_pages/migrate_pages01.c b/testcases/kernel/syscalls/migrate_pages/migrate_pages01.c index c23e8b0..876d657 100644 --- a/testcases/kernel/syscalls/migrate_pages/migrate_pages01.c +++ b/testcases/kernel/syscalls/migrate_pages/migrate_pages01.c @@ -247,8 +247,8 @@ static void setup(void) tst_brkm(TBROK | TERRNO, NULL, "get_allowed_nodes_arr: %d", ret); - sane_max_node = get_max_node(); - sane_nodemask_size = sane_max_node / 8 + 1; + sane_max_node = LTP_ALIGN(get_max_node(), sizeof(unsigned long)*8); + sane_nodemask_size = sane_max_node / 8; sane_old_nodes = SAFE_MALLOC(NULL, sane_nodemask_size); sane_new_nodes = SAFE_MALLOC(NULL, sane_nodemask_size); memset(sane_old_nodes, 0, sane_nodemask_size); diff --git a/testcases/kernel/syscalls/migrate_pages/migrate_pages02.c b/testcases/kernel/syscalls/migrate_pages/migrate_pages02.c index 49129e0..981022d 100644 --- a/testcases/kernel/syscalls/migrate_pages/migrate_pages02.c +++ b/testcases/kernel/syscalls/migrate_pages/migrate_pages02.c @@ -109,8 +109,8 @@ static int migrate_to_node(pid_t pid, int node) tst_resm(TINFO, "pid(%d) migrate pid %d to node -> %d", getpid(), pid, node); - max_node = get_max_node(); - nodemask_size = max_node / 8 + 1; + max_node = LTP_ALIGN(get_max_node(), sizeof(unsigned long)*8); + nodemask_size = max_node / 8; old_nodes = SAFE_MALLOC(NULL, nodemask_size); new_nodes = SAFE_MALLOC(NULL, nodemask_size); diff --git a/testcases/kernel/syscalls/mount/mount05.c b/testcases/kernel/syscalls/mount/mount05.c index 4b2a07c..fb5a385 100644 --- a/testcases/kernel/syscalls/mount/mount05.c +++ b/testcases/kernel/syscalls/mount/mount05.c @@ -113,7 +113,6 @@ int main(int argc, char *argv[]) void setup(void) { tst_require_root(NULL); - tst_mkfs(NULL, device, fstype, NULL); tst_sig(NOFORK, DEF_HANDLER, cleanup); @@ -122,9 +121,12 @@ void setup(void) SAFE_MKDIR(cleanup, mntpoint_src, DIR_MODE); SAFE_MKDIR(cleanup, mntpoint_des, DIR_MODE); - if (dflag && tflag) + if (dflag) { + tst_mkfs(NULL, device, fs_type, NULL); + if (mount(device, mntpoint_src, fs_type, 0, NULL) == -1) tst_brkm(TBROK | TERRNO, cleanup, "mount failed"); + } SAFE_FILE_PRINTF(cleanup, file_src, "TEST FILE"); @@ -133,7 +135,7 @@ void setup(void) void cleanup(void) { - if (dflag && tflag) + if (dflag) if (umount(mntpoint_src) != 0) tst_brkm(TBROK | TTERRNO, NULL, "umount(2) failed"); diff --git a/testcases/kernel/syscalls/quotactl/quotactl02.c b/testcases/kernel/syscalls/quotactl/quotactl02.c new file mode 100644 index 0000000..aa6b339 --- /dev/null +++ b/testcases/kernel/syscalls/quotactl/quotactl02.c @@ -0,0 +1,249 @@ +/* + * Copyright (c) 2013 Fujitsu Ltd. + * Author: DAN LI <li...@cn...> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/* + * Description: + * This tests basic flags of quotactl() syscall: + * 1) Q_XQUOTAOFF - Turn off quotas for an XFS file system. + * 2) Q_XQUOTAON - Turn on quotas for an XFS file system. + * 3) Q_XGETQUOTA - Get disk quota limits and current usage for user id. + * 4) Q_XSETQLIM - Set disk quota limits for user id. + * 5) Q_XGETQSTAT - Get XFS file system specific quota information. + */ + +#define _GNU_SOURCE +#include <fcntl.h> +#include <unistd.h> +#include <sys/syscall.h> +#include <stdio.h> +#include <errno.h> +#include <sys/mount.h> +#include <linux/fs.h> +#include <sys/types.h> + +#include "config.h" +#if defined(HAVE_XFS_QUOTA) +#include <xfs/xqm.h> +#endif +#include "test.h" +#include "usctest.h" +#include "linux_syscall_numbers.h" +#include "safe_macros.h" + +#define USRQCMD(cmd) ((cmd) << 8) +#define RTBLIMIT 2000 + +char *TCID = "quotactl02"; +int TST_TOTAL = 5; + +#if defined(HAVE_XFS_QUOTA) +static void check_qoff(void); +static void check_qon(void); +static void check_getq(void); +static void setup_setqlim(void), check_setqlim(void); +static void check_getqstat(void); + +static void setup(void); +static void cleanup(void); +static void help(void); + +static int i; +static int uid; +static int dflag; +static char *block_dev; +static struct fs_disk_quota dquota; +static struct fs_quota_stat qstat; +static unsigned int qflag = XFS_QUOTA_UDQ_ENFD; +static const char mntpoint[] = "mnt_point"; + +static option_t options[] = { + {"D:", &dflag, &block_dev}, + {NULL, NULL, NULL}, +}; + +static struct test_case_t { + int cmd; + void *addr; + void (*func_test) (); + void (*func_setup) (); +} TC[] = { + {Q_XQUOTAOFF, &qflag, check_qoff, NULL}, + {Q_XQUOTAON, &qflag, check_qon, NULL}, + {Q_XGETQUOTA, &dquota, check_getq, NULL}, + {Q_XSETQLIM, &dquota, check_setqlim, setup_setqlim}, + {Q_XGETQSTAT, &qstat, check_getqstat, NULL}, +}; + +int main(int argc, char *argv[]) +{ + int lc; + char *msg; + + msg = parse_opts(argc, argv, options, &help); + if (msg != NULL) + tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); + + if (!dflag) + tst_brkm(TBROK, NULL, + "you must specify the device used for mounting with " + "the -D option"); + + setup(); + + for (lc = 0; TEST_LOOPING(lc); ++lc) { + + tst_count = 0; + + for (i = 0; i < TST_TOTAL; i++) { + + if (TC[i].func_setup != NULL) + (*TC[i].func_setup) (); + + TEST(ltp_syscall(__NR_quotactl, + USRQCMD(TC[i].cmd), block_dev, + uid, TC[i].addr)); + + if (TEST_RETURN != 0) + tst_resm(TFAIL | TERRNO, + "cmd=0x%x failed", TC[i].cmd); + + if (STD_FUNCTIONAL_TEST) + (*TC[i].func_test) (); + else + tst_resm(TPASS, "quotactl call succeeded"); + + } + } + cleanup(); + tst_exit(); +} + +static void check_qoff(void) +{ + int ret; + + ret = ltp_syscall(__NR_quotactl, USRQCMD(Q_XGETQSTAT), + block_dev, uid, &qstat); + if (ret != 0) + tst_brkm(TBROK | TERRNO, cleanup, "fail to get quota stat"); + + if (qstat.qs_flags & XFS_QUOTA_UDQ_ENFD) { + tst_resm(TFAIL, "enforcement is not off"); + return; + } + + tst_resm(TPASS, "enforcement is off"); +} + +static void check_qon(void) +{ + int ret; + ret = ltp_syscall(__NR_quotactl, USRQCMD(Q_XGETQSTAT), + block_dev, uid, &qstat); + if (ret != 0) + tst_brkm(TBROK | TERRNO, cleanup, "fail to get quota stat"); + + if (!(qstat.qs_flags & XFS_QUOTA_UDQ_ENFD)) { + tst_resm(TFAIL, "enforcement is off"); + return; + } + + tst_resm(TPASS, "enforcement is on"); +} + +static void check_getq(void) +{ + if (!(dquota.d_flags & XFS_USER_QUOTA)) { + tst_resm(TFAIL, "get incorrect quota type"); + return; + } + + tst_resm(TPASS, "get the right quota type"); +} + +static void setup_setqlim(void) +{ + dquota.d_rtb_hardlimit = RTBLIMIT; + dquota.d_fieldmask = FS_DQ_LIMIT_MASK; +} + +static void check_setqlim(void) +{ + int ret; + ret = ltp_syscall(__NR_quotactl, USRQCMD(Q_XGETQUOTA), + block_dev, uid, &dquota); + if (ret != 0) + tst_brkm(TFAIL | TERRNO, NULL, + "fail to get quota information"); + + if (dquota.d_rtb_hardlimit != RTBLIMIT) { + tst_resm(TFAIL, "limit on RTB, except %lu get %lu", + (uint64_t)RTBLIMIT, + (uint64_t)dquota.d_rtb_hardlimit); + return; + } + + tst_resm(TPASS, "quotactl works fine with Q_XSETQLIM"); +} + +static void check_getqstat(void) +{ + if (qstat.qs_version != FS_QSTAT_VERSION) { + tst_resm(TFAIL, "get incorrect qstat version"); + return; + } + + tst_resm(TPASS, "get correct qstat version"); +} + +static void setup(void) +{ + + tst_require_root(NULL); + + TEST_PAUSE; + + tst_tmpdir(); + + SAFE_MKDIR(cleanup, mntpoint, 0755); + + tst_mkfs(NULL, block_dev, "xfs", NULL); + + if (mount(block_dev, mntpoint, "xfs", 0, "uquota") < 0) + tst_brkm(TFAIL | TERRNO, NULL, "mount(2) fail"); + +} + +static void cleanup(void) +{ + if (umount(mntpoint) < 0) + tst_resm(TFAIL | TERRNO, "umount(2) fail"); + + TEST_CLEANUP; + tst_rmdir(); +} + +static void help(void) +{ + printf("-D device : device used for mounting.\n"); +} +#else +int main(void) +{ + tst_brkm(TCONF, NULL, "This system doesn't support xfs quota"); +} +#endif diff --git a/testcases/kernel/syscalls/setgroups/compat_16.h b/testcases/kernel/syscalls/setgroups/compat_16.h deleted file mode 100644 index 0de4e78..0000000 --- a/testcases/kernel/syscalls/setgroups/compat_16.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * - * Copyright (c) Red Hat Inc., 2008 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/* Author: Masatake YAMATO <ya...@re...> */ - -#ifndef __SETGROUPS_COMPAT_16_H__ -#define __SETGROUPS_COMPAT_16_H__ - -#include "compat_gid.h" -#include "linux_syscall_numbers.h" - - -/* For avoiding circular dependency. */ -extern void cleanup(void); - -#ifdef TST_USE_COMPAT16_SYSCALL - -long -SETGROUPS(size_t gidsetsize, GID_T *list) -{ - return ltp_syscall(__NR_setgroups, gidsetsize, list); -} - -int -GETGROUPS(int size16, GID_T *list16) -{ - int r; - int i; - - gid_t *list32; - - list32 = malloc(size16 * sizeof(gid_t)); - if (list32 == NULL) - tst_brkm(TBROK, NULL, "malloc failed to alloc %zu errno " - " %d ", size16 * sizeof(gid_t), errno); - - r = getgroups(size16, list32); - if (r < 0) - goto out; - - for (i = 0; i < r; i++) { - if (!GID_SIZE_CHECK(list32[i])) - tst_brkm(TBROK, - cleanup, - "gid returned from getgroups is too large for testing setgroups32"); - list16[i] = (GID_T)list32[i]; - } - - out: - free(list32); - return r; -} - -#else -int -SETGROUPS(size_t size, const GID_T *list) -{ - return setgroups(size, list); -} - -int -GETGROUPS(int size, GID_T *list) -{ - return getgroups(size, list); -} - -#endif /* TST_USE_COMPAT16_SYSCALL */ - -#endif /* __SETGROUPS_COMPAT_16_H__ */ diff --git a/testcases/kernel/syscalls/setgroups/setgroups01.c b/testcases/kernel/syscalls/setgroups/setgroups01.c index 9d70612..d5ecc16 100644 --- a/testcases/kernel/syscalls/setgroups/setgroups01.c +++ b/testcases/kernel/syscalls/setgroups/setgroups01.c @@ -158,7 +158,7 @@ int main(int ac, char **av) /* * Call setgroups(2) */ - TEST(SETGROUPS(ngrps, list)); + TEST(SETGROUPS(cleanup, ngrps, list)); /* check return code */ if (TEST_RETURN == -1) { @@ -202,7 +202,8 @@ void setup() TEST_PAUSE; - if ((ngrps = GETGROUPS(len, list)) == -1) { + ngrps = GETGROUPS(cleanup, len, list); + if (ngrps == -1) { tst_brkm(TBROK, cleanup, "getgroups(%d, list) Failure. errno=%d : %s", len, errno, strerror(errno)); diff --git a/testcases/kernel/syscalls/setgroups/setgroups02.c b/testcases/kernel/syscalls/setgroups/setgroups02.c index 6829f24..eb9272e 100644 --- a/testcases/kernel/syscalls/setgroups/setgroups02.c +++ b/testcases/kernel/syscalls/setgroups/setgroups02.c @@ -105,7 +105,7 @@ int main(int ac, char **av) * Call setgroups() to set supplimentary group IDs of * the calling super-user process to gid of TESTUSER. */ - TEST(SETGROUPS(gidsetsize, groups_list)); + TEST(SETGROUPS(cleanup, gidsetsize, groups_list)); if (TEST_RETURN == -1) { tst_resm(TFAIL, "setgroups(%d, groups_list) Failed, " @@ -125,7 +125,7 @@ int main(int ac, char **av) * supp. gids of TESTUSER. */ groups_list[0] = '\0'; - if (GETGROUPS(gidsetsize, groups_list) < 0) { + if (GETGROUPS(cleanup, gidsetsize, groups_list) < 0) { tst_brkm(TFAIL, cleanup, "getgroups() Fails, " "error=%d", errno); } diff --git a/testcases/kernel/syscalls/setgroups/setgroups03.c b/testcases/kernel/syscalls/setgroups/setgroups03.c index 8245c2a..723050d 100644 --- a/testcases/kernel/syscalls/setgroups/setgroups03.c +++ b/testcases/kernel/syscalls/setgroups/setgroups03.c @@ -145,7 +145,7 @@ int main(int ac, char **av) * verify that it fails with -1 return value and * sets appropriate errno. */ - TEST(SETGROUPS(gidsetsize, groups_list)); + TEST(SETGROUPS(cleanup, gidsetsize, groups_list)); if (TEST_RETURN != -1) { tst_resm(TFAIL, "setgroups(%d) returned %ld, " diff --git a/testcases/kernel/syscalls/setgroups/setgroups04.c b/testcases/kernel/syscalls/setgroups/setgroups04.c index 5932b4e..953d406 100644 --- a/testcases/kernel/syscalls/setgroups/setgroups04.c +++ b/testcases/kernel/syscalls/setgroups/setgroups04.c @@ -111,7 +111,7 @@ int main(int ac, char **av) * verify that it fails with -1 return value and * sets appropriate errno. */ - TEST(SETGROUPS(gidsetsize, sbrk(0))); + TEST(SETGROUPS(cleanup, gidsetsize, sbrk(0))); if (TEST_RETURN != -1) { tst_resm(TFAIL, "setgroups() returned %ld, " diff --git a/testcases/kernel/syscalls/timer_getoverrun/timer_getoverrun01.c b/testcases/kernel/syscalls/timer_getoverrun/timer_getoverrun01.c index 21e2375..7125570 100644 --- a/testcases/kernel/syscalls/timer_getoverrun/timer_getoverrun01.c +++ b/testcases/kernel/syscalls/timer_getoverrun/timer_getoverrun01.c @@ -1,42 +1,24 @@ -/******************************************************************************/ -/* Copyright (c) Crackerjack Project., 2007 */ -/* */ -/* This program is free software; you can redistribute it and/or modify */ -/* it under the terms of the GNU General Public License as published by */ -/* the Free Software Foundation; either version 2 of the License, or */ -/* (at your option) any later version. */ -/* */ -/* This program is distributed in the hope that it will be useful, */ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ -/* the GNU General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU General Public License */ -/* along with this program; if not, write to the Free Software */ -/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -/* */ -/******************************************************************************/ -/******************************************************************************/ -/* */ -/* File: timer_getoverrun01.c */ -/* */ -/* Description: This tests the timer_getoverrun() syscall */ -/* */ -/* Usage: <for command-line> */ -/* timer_getoverrun01 [-c n] [-e][-i n] [-I x] [-p x] [-t] */ -/* where, -c n : Run n copies concurrently. */ -/* -e : Turn on errno logging. */ -/* -i n : Execute test n times. */ -/* -I x : Execute test for x seconds. */ -/* -P x : Pause for x seconds between iterations. */ -/* -t : Turn on syscall timing. */ -/* */ -/* Total Tests: 1 */ -/* */ -/* Test Name: timer_getoverrun01 */ -/* History: Porting from Crackerjack to LTP is done by */ -/* Manas Kumar Nayak mak...@in...> */ -/******************************************************************************/ +/****************************************************************************** + * Copyright (c) Crackerjack Project., 2007 * + * Porting from Crackerjack to LTP is done by: * + * Manas Kumar Nayak <mak...@in...> * + * Copyright (c) 2013 Cyril Hrubis <ch...@su...> * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * + * the GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software Foundation, * + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + * * + ******************************************************************************/ #include <stdio.h> #include <errno.h> @@ -48,164 +30,63 @@ #include "usctest.h" #include "linux_syscall_numbers.h" -/* timer_t in kernel(int) is different from Glibc definition(void*). - * Use the kernel definition. - */ -typedef int kernel_timer_t; - char *TCID = "timer_getoverrun01"; -int testno; int TST_TOTAL = 1; -/* Extern Global Functions */ -/******************************************************************************/ -/* */ -/* Function: cleanup */ -/* */ -/* Description: Performs all one time clean up for this test on successful */ -/* completion, premature exit or failure. Closes all temporary */ -/* files, removes all temporary directories exits the test with */ -/* appropriate return code by calling tst_exit() function. */ -/* */ -/* Input: None. */ -/* */ -/* Output: None. */ -/* */ -/* Return: On failure - Exits calling tst_exit(). Non '0' return code. */ -/* On success - Exits calling tst_exit(). With '0' return code. */ -/* */ -/******************************************************************************/ -extern void cleanup() +static void cleanup(void) { TEST_CLEANUP; tst_rmdir(); - - tst_exit(); } -/* Local Functions */ -/******************************************************************************/ -/* */ -/* Function: setup */ -/* */ -/* Description: Performs all one time setup for this test. This function is */ -/* typically used to capture signals, create temporary dirs */ -/* and temporary files that may be used in the course of this */ -/* test. */ -/* */ -/* Input: None. */ -/* */ -/* Output: None. */ -/* */ -/* Return: On failure - Exits by calling cleanup(). */ -/* On success - returns 0. */ -/* */ -/******************************************************************************/ -void setup() +static void setup(void) { - /* Capture signals if any */ - /* Create temporary directories */ TEST_PAUSE; tst_tmpdir(); } -char tmpname[40]; -int parent; -int block = 1; - -#define ENTER(normal) tst_resm(TINFO, "Enter block %d: test %d (%s)", \ - block, tst_count, normal?"NORMAL":"ERROR"); - int main(int ac, char **av) { int lc; char *msg; - kernel_timer_t created_timer_id; + int timer; struct sigevent ev; - if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) { + if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); - tst_exit(); - } setup(); - for (lc = 0; TEST_LOOPING(lc); ++lc) { - tst_count = 0; - for (testno = 0; testno < TST_TOTAL; ++testno) { - - ev.sigev_value = (sigval_t) 0; - ev.sigev_signo = SIGALRM; - ev.sigev_notify = SIGEV_SIGNAL; + ev.sigev_value = (sigval_t) 0; + ev.sigev_signo = SIGALRM; + ev.sigev_notify = SIGEV_SIGNAL; + TEST(ltp_syscall(__NR_timer_create, CLOCK_REALTIME, &ev, &timer)); - TEST(ltp_syscall - (__NR_timer_create, CLOCK_REALTIME, &ev, - &created_timer_id)); + if (TEST_RETURN != 0) + tst_brkm(TBROK | TERRNO, cleanup, "Failed to create timer"); - ENTER(1); - TEST(ltp_syscall(__NR_timer_getoverrun, - created_timer_id)); - if (TEST_RETURN == 0) { - tst_resm(TPASS, "Block %d: test %d PASSED", - block, tst_count); - } else { - tst_resm(TFAIL, - "Block %d: test %d FAILED... errno = %d : %s", - block, tst_count, TEST_ERRNO, - strerror(TEST_ERRNO)); - cleanup(); - tst_exit(); - } + for (lc = 0; TEST_LOOPING(lc); ++lc) { + tst_count = 0; - ENTER(0); - TEST(ltp_syscall(__NR_timer_getoverrun, -1)); - if (TEST_RETURN < 0 && TEST_ERRNO == EINVAL) { - tst_resm(TPASS, "Block %d: test %d PASSED", - block, tst_count); - } else { - tst_resm(TFAIL, - "Block %d: test %d FAILED... errno = %d : %s", - block, tst_count, TEST_ERRNO, - strerror(TEST_ERRNO)); - cleanup(); - tst_exit(); - } + TEST(ltp_syscall(__NR_timer_getoverrun, timer)); + if (TEST_RETURN == 0) { + tst_resm(TPASS, + "timer_getoverrun(CLOCK_REALTIME) Passed"); + } else { + tst_resm(TFAIL | TERRNO, + "timer_getoverrun(CLOCK_REALTIME) Failed"); + } + TEST(ltp_syscall(__NR_timer_getoverrun, -1)); + if (TEST_RETURN == -1 && TEST_ERRNO == EINVAL) { + tst_resm(TPASS, "timer_gettime(-1) Failed: EINVAL"); + } else { + tst_resm(TFAIL | TERRNO, + "timer_gettime(-1) = %li", TEST_RETURN); } } + cleanup(); tst_exit(); } - -/* - -NAME - timer_getoverrun -SYNOPSIS - #include <time.h> - - int timer_getoverrun(timer_t timerid); - - Only a single signal shall be queued to the process for a given timer - at any point in time. When a timer for which a signal is still pending - expires, no signal shall be queued, and a timer overrun shall occur. - When a timer expiration signal is delivered to or accepted by a pro- - cess, if the implementation supports the Realtime Signals Extension, - the timer_getoverrun() function shall return the timer expiration - overrun count for the specified timer. The overrun count returned con- - tains the number of extra timer expirations that occurred between the - time the signal was generated (queued) and when it was delivered or - accepted, up to but not including an implementation-defined maximum of - {DELAYTIMER_MAX}. If the number of such extra expirations is greater - than or equal to {DELAYTIMER_MAX}, then the overrun count shall be set - to {DELAYTIMER_MAX}. The value returned by timer_getoverrun() shall - apply to the most recent expiration signal delivery or acceptance for - the timer. If no expiration signal has been delivered for the timer, - or if the Realtime Signals Extension is not supported, the return - value of timer_getoverrun() is unspecified. - -RETURN VALUE - If the timer_getoverrun() function succeeds, it shall return the timer - expiration overrun count as explained above. -*/ diff --git a/testcases/kernel/syscalls/timer_gettime/timer_gettime01.c b/testcases/kernel/syscalls/timer_gettime/timer_gettime01.c index fe5eb94..e96f8b6 100644 --- a/testcases/kernel/syscalls/timer_gettime/timer_gettime01.c +++ b/testcases/kernel/syscalls/timer_gettime/timer_gettime01.c @@ -1,42 +1,25 @@ -/******************************************************************************/ -/* Copyright (c) Crackerjack Project., 2007 */ -/* */ -/* This program is free software; you can redistribute it and/or modify */ -/* it under the terms of the GNU General Public License as published by */ -/* the Free Software Foundation; either version 2 of the License, or */ -/* (at your option) any later version. */ -/* */ -/* This program is distributed in the hope that it will be useful, */ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ -/* the GNU General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU General Public License */ -/* along with this program; if not, write to the Free Software */ -/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -/* */ -/******************************************************************************/ -/******************************************************************************/ -/* */ -/* File: timer_gettime01.c */ -/* */ -/* Description: This tests the timer_gettime() syscall */ -/* */ -/* Usage: <for command-line> */ -/* timer_gettime01 [-c n] [-e][-i n] [-I x] [-p x] [-t] */ -/* where, -c n : Run n copies concurrently. */ -/* -e : Turn on errno logging. */ -/* -i n : Execute test n times. */ -/* -I x : Execute test for x seconds. */ -/* -P x : Pause for x seconds between iterations. */ -/* -t : Turn on syscall timing. */ -/* */ -/* Total Tests: 1 */ -/* */ -/* Test Name: timer_gettime01 */ -/* History: Porting from Crackerjack to LTP is done by */ -/* Manas Kumar Nayak mak...@in...> */ -/******************************************************************************/ +/****************************************************************************** + * Copyright (c) Crackerjack Project., 2007 * + * Porting from Crackerjack to LTP is done by: * + * Manas Kumar Nayak <mak...@in...> * + * Copyright (c) 2013 Cyril Hrubis <ch...@su...> * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * + * the GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Fr... [truncated message content] |
From: Mike F. <su...@li...> - 2013-06-25 16:31:28
|
The branch, master, has been updated via b88fa5b6ec5a29834a0e52df7b22b9bb47fe0379 (commit) via bcf24e6a97d2ec69249b399704053ed9b0ec2415 (commit) via a0e618c0f2acabc001a2268b4a44dcab48f4ba9a (commit) via 60c6ce29cfaf357cfcd629995d559d41030e96d2 (commit) via ed69cd589d61257be8319800b91e6eeef555d507 (commit) via 8329ed8a449efe34672eabfe6ab44bf7116cc661 (commit) via d2085cafe3c1363150c0338b5c09bc7ed7f35e07 (commit) via 208669109e427ee358285eba4073b5b07d475560 (commit) via e0cbe7aaee097cf1b5e8c53906de42e4b6d61aeb (commit) from 8a575d291217d366b6d1f04b5608d3258ebde9cf (commit) - Log ----------------------------------------------------------------- commit b88fa5b6ec5a29834a0e52df7b22b9bb47fe0379 Author: Cyril Hrubis <ch...@su...> Date: Tue Jun 25 15:50:08 2013 +0200 runltp: Fix bashism Remove several occurences of '&> /dev/null' that breaks the script execution under dash. Signed-off-by: Cyril Hrubis <ch...@su...> Signed-off-by: Sedat Dilek <sed...@gm...> commit bcf24e6a97d2ec69249b399704053ed9b0ec2415 Author: Wanlong Gao <gao...@cn...> Date: Tue Jun 25 09:33:50 2013 +0800 getrusage03: disable the test when kernel before 2.6.32 Kernel commit 1f10206c is first introduced in 2.6.32, this ru_maxrss behaviors will not be supported before kernel 2.6.32, so disable the test when kernel version is before 2.6.32. Signed-off-by: Wanlong Gao <gao...@cn...> Reviewed-by: Jan Stancek <jst...@re...> Acked-by: Cyril Hrubis <ch...@su...> commit a0e618c0f2acabc001a2268b4a44dcab48f4ba9a Author: Jan Stancek <jst...@re...> Date: Fri Jun 7 11:09:26 2013 +0200 new testcase: kmsg01 Test /dev/kmsg based on kernel doc: Documentation/ABI/testing/dev-kmsg - read() blocks - non-blocking read() fails with EAGAIN - partial read fails (buffer smaller than message) - can write to /dev/kmsg and message seqno grows - first read() after open() returns same message - if messages get overwritten, read() returns -EPIPE - device supports SEEK_SET, SEEK_END, SEEK_DATA Signed-off-by: Jan Stancek <jst...@re...> Acked-by: Mike Frysinger <va...@ge...> Acked-by: Cyril Hrubis <ch...@su...> commit 60c6ce29cfaf357cfcd629995d559d41030e96d2 Author: Eryu Guan <eg...@re...> Date: Mon Jun 24 23:49:43 2013 +0800 dup2/dup205: close all fds before tst_rmdir() Close all open fds before calling tst_rmdir() to avoid TWARN caused by NFS silly rename when removing temp dir. dup205 0 TWARN : tst_rmdir: rmobj(/mnt/nfs/dupbA5J5i) failed: unlink(/mnt/nfs/dupbA5J5i/.nfs0000000000f4805b00000005) failed; errno=16: Device or resource busy Signed-off-by: Eryu Guan <eg...@re...> Acked-by: Mike Frysinger <va...@ge...> Acked-by: Caspar Zhang <ca...@ca...> commit ed69cd589d61257be8319800b91e6eeef555d507 Author: Cyril Hrubis <ch...@su...> Date: Mon Jun 24 17:51:00 2013 +0200 lib: Add lib/ltp_priv.h header for internal API. Signed-off-by: Cyril Hrubis <ch...@su...> commit 8329ed8a449efe34672eabfe6ab44bf7116cc661 Author: DAN LI <li...@cn...> Date: Mon Jun 24 16:03:57 2013 +0800 mmap/mmap13.c: new case to test SIGBUS error of mmap Test SIGBUS error by accessing to a portion of the buffer that does not correspond to the file. Signed-off-by: DAN LI <li...@cn...> commit d2085cafe3c1363150c0338b5c09bc7ed7f35e07 Author: Cyril Hrubis <ch...@su...> Date: Tue Jun 18 14:47:19 2013 +0200 lib: safe_macros: Add SAFE_FOPEN(), SAFE_FCLOSE() Signed-off-by: Cyril Hrubis <ch...@su...> commit 208669109e427ee358285eba4073b5b07d475560 Author: Alexey Kodanev <ale...@or...> Date: Tue Jun 11 13:56:10 2013 +0400 prot_hsymlinks & cgroup_xattr: fix copyright header Signed-off-by: Alexey Kodanev <ale...@or...> commit e0cbe7aaee097cf1b5e8c53906de42e4b6d61aeb Author: Jungsoo Son <jun...@lg...> Date: Sat Jun 8 11:54:26 2013 +0900 syscalls/chown01: Fix test file creation There is a bug in the code to create the file and the code is very intricate. So replace it with SAFE_FILE_PRINTF(). Signed-off-by: jungsoo.son <jun...@lg...> Reviewed-by: Jan Stancek <jst...@re...> Signed-off-by: Wanlong Gao <gao...@cn...> ----------------------------------------------------------------------- Summary of changes: include/safe_macros.h | 11 + lib/Makefile | 2 + lib/ltp_priv.h | 28 + lib/safe_macros.c | 29 + lib/tst_resource.c | 4 +- lib/tst_tmpdir.c | 1 + runltp | 8 +- runtest/kernel_misc | 1 + runtest/syscalls | 1 + testcases/kernel/controllers/cgroup_xattr/Makefile | 3 +- .../kernel/controllers/cgroup_xattr/cgroup_xattr.c | 3 +- testcases/kernel/logging/.gitignore | 1 + testcases/kernel/logging/Makefile | 22 + testcases/kernel/logging/kmsg/Makefile | 22 + testcases/kernel/logging/kmsg/kmsg01.c | 595 ++++++++++++++++++++ testcases/kernel/security/prot_hsymlinks/Makefile | 5 +- .../security/prot_hsymlinks/prot_hsymlinks.c | 3 +- testcases/kernel/syscalls/chown/chown01.c | 24 +- testcases/kernel/syscalls/dup2/dup205.c | 4 +- testcases/kernel/syscalls/getrusage/getrusage03.c | 7 + testcases/kernel/syscalls/mmap/mmap13.c | 152 +++++ 21 files changed, 897 insertions(+), 29 deletions(-) create mode 100644 lib/ltp_priv.h create mode 100644 runtest/kernel_misc create mode 100644 testcases/kernel/logging/.gitignore create mode 100644 testcases/kernel/logging/Makefile create mode 100644 testcases/kernel/logging/kmsg/Makefile create mode 100644 testcases/kernel/logging/kmsg/kmsg01.c create mode 100644 testcases/kernel/syscalls/mmap/mmap13.c diff --git a/include/safe_macros.h b/include/safe_macros.h index 1047437..3a26df6 100644 --- a/include/safe_macros.h +++ b/include/safe_macros.h @@ -23,6 +23,7 @@ #include <libgen.h> #include <stdarg.h> #include <unistd.h> +#include <stdio.h> char* safe_basename(const char *file, const int lineno, void (*cleanup_fn)(void), char *path); @@ -173,5 +174,15 @@ long safe_sysconf(const char *file, const int lineno, #define SAFE_SYSCONF(cleanup_fn, name) \ safe_sysconf(__FILE__, __LINE__, cleanup_fn, name) +FILE *safe_fopen(const char *file, const int lineno, void (cleanup_fn)(void), + const char *path, const char *mode); +#define SAFE_FOPEN(cleanup_fn, path, mode) \ + safe_fopen(__FILE__, __LINE__, cleanup_fn, path, mode) + +int safe_fclose(const char *file, const int lineno, void (cleanup_fn)(void), + FILE *f); +#define SAFE_FCLOSE(cleanup_fn, f) \ + safe_fclose(__FILE__, __LINE__, cleanup_fn, f) + #endif /* __SAFE_MACROS_H__ */ #endif /* __TEST_H__ */ diff --git a/lib/Makefile b/lib/Makefile index 453cf95..4199520 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -28,6 +28,8 @@ ifeq ($(UCLINUX),1) CFLAGS += -D_USC_LIB_ endif +CFLAGS += -I. + #CPPFLAGS += -DGARRETT_IS_A_PEDANTIC_BASTARD FILTER_OUT_LIBSRCS := mount_utils.c diff --git a/lib/ltp_priv.h b/lib/ltp_priv.h new file mode 100644 index 0000000..6a6a8bb --- /dev/null +++ b/lib/ltp_priv.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2013 Cyril Hrubis ch...@su... + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + */ + +#ifndef __LTP_PRIV_H__ +#define __LTP_PRIV_H__ + +/* declared in tst_tmpdir.c */ +const char *tst_get_startwd(void); + +#endif /* __LTP_PRIV_H__ */ diff --git a/lib/safe_macros.c b/lib/safe_macros.c index 4da9914..fb02796 100644 --- a/lib/safe_macros.c +++ b/lib/safe_macros.c @@ -438,3 +438,32 @@ long safe_sysconf(const char *file, const int lineno, return rval; } + +FILE *safe_fopen(const char *file, const int lineno, void (cleanup_fn)(void), + const char *path, const char *mode) +{ + FILE *f = fopen(path, mode); + + if (f == NULL) { + tst_brkm(TBROK | TERRNO, cleanup_fn, + "fopen(%s) failed at %s:%d", path, file, lineno); + return NULL; + } + + return f; +} + +int safe_fclose(const char *file, const int lineno, void (cleanup_fn)(void), + FILE *f) +{ + int ret; + + ret = fclose(f); + + if (ret) { + tst_brkm(TBROK | TERRNO, cleanup_fn, + "fclose failed at %s:%d", file, lineno); + } + + return ret; +} diff --git a/lib/tst_resource.c b/lib/tst_resource.c index 61fc322..54d4795 100644 --- a/lib/tst_resource.c +++ b/lib/tst_resource.c @@ -22,6 +22,7 @@ */ #include "tst_resource.h" +#include "ltp_priv.h" static int file_copy(const char *file, const int lineno, void (*cleanup_fn)(void), const char *path, @@ -41,9 +42,6 @@ static int file_copy(const char *file, const int lineno, return 1; } -/* declared in tst_tmpdir.c */ -const char *tst_get_startwd(void); - void tst_resource_copy(const char *file, const int lineno, void (*cleanup_fn)(void), const char *filename, const char *dest) diff --git a/lib/tst_tmpdir.c b/lib/tst_tmpdir.c index cf671a0..4029276 100644 --- a/lib/tst_tmpdir.c +++ b/lib/tst_tmpdir.c @@ -74,6 +74,7 @@ #include "test.h" #include "rmobj.h" +#include "ltp_priv.h" /* * Define some useful macros. diff --git a/runltp b/runltp index a8bf404..1309d0a 100755 --- a/runltp +++ b/runltp @@ -663,7 +663,7 @@ main() fi # check for required users and groups - ${LTPROOT}/IDcheck.sh &>/dev/null || \ + ${LTPROOT}/IDcheck.sh || \ { echo "WARNING: required users and groups not present" echo "WARNING: some test cases may fail" @@ -984,7 +984,7 @@ main() create_block() { #create a block device with ext4 filesystem. - dd if=/dev/zero of=${TMP}/test.img bs=1kB count=10240 &>/dev/null + dd if=/dev/zero of=${TMP}/test.img bs=1kB count=10240 if [ $? -ne 0 ]; then echo "Failed to create loopback device image, please check disk space and re-run" return 1 @@ -996,12 +996,12 @@ create_block() return 1 else ##attach the created file to loop dev. - losetup $LOOP_DEV ${TMP}/test.img &>/dev/null + losetup $LOOP_DEV ${TMP}/test.img if [ $? -ne 0 ]; then echo "losetup failed to create block device" return 1 else - mkfs.ext4 $LOOP_DEV &>/dev/null + mkfs.ext4 $LOOP_DEV [ $? -ne 0 ] && (echo "creating a ext4 block device failed" && return 1) #set the values in alltests which require block device. DEVICE=$LOOP_DEV diff --git a/runtest/kernel_misc b/runtest/kernel_misc new file mode 100644 index 0000000..47a667e --- /dev/null +++ b/runtest/kernel_misc @@ -0,0 +1 @@ +kmsg01 kmsg01 diff --git a/runtest/syscalls b/runtest/syscalls index e6ce29c..eba0200 100644 --- a/runtest/syscalls +++ b/runtest/syscalls @@ -561,6 +561,7 @@ mmap06 mmap06 mmap07 mmap07 mmap08 mmap08 mmap09 mmap09 +mmap13 mmap13 # test is broken, mask it for now. #mmap11 mmap11 -i 30000 diff --git a/testcases/kernel/controllers/cgroup_xattr/Makefile b/testcases/kernel/controllers/cgroup_xattr/Makefile index 2d75069..effd5da 100644 --- a/testcases/kernel/controllers/cgroup_xattr/Makefile +++ b/testcases/kernel/controllers/cgroup_xattr/Makefile @@ -2,7 +2,8 @@ # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. # # This program is distributed in the hope that it would be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/testcases/kernel/controllers/cgroup_xattr/cgroup_xattr.c b/testcases/kernel/controllers/cgroup_xattr/cgroup_xattr.c index 20473d4..512d505 100644 --- a/testcases/kernel/controllers/cgroup_xattr/cgroup_xattr.c +++ b/testcases/kernel/controllers/cgroup_xattr/cgroup_xattr.c @@ -3,7 +3,8 @@ * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. * * This program is distributed in the hope that it would be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/testcases/kernel/logging/.gitignore b/testcases/kernel/logging/.gitignore new file mode 100644 index 0000000..4236df0 --- /dev/null +++ b/testcases/kernel/logging/.gitignore @@ -0,0 +1 @@ +/kmsg/kmsg01 diff --git a/testcases/kernel/logging/Makefile b/testcases/kernel/logging/Makefile new file mode 100644 index 0000000..bd32f70 --- /dev/null +++ b/testcases/kernel/logging/Makefile @@ -0,0 +1,22 @@ +# +# Copyright (C) 2013 Linux Test Project +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See +# the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +top_srcdir ?= ../../.. + +include $(top_srcdir)/include/mk/env_pre.mk +include $(top_srcdir)/include/mk/generic_trunk_target.mk diff --git a/testcases/kernel/logging/kmsg/Makefile b/testcases/kernel/logging/kmsg/Makefile new file mode 100644 index 0000000..67b29d6 --- /dev/null +++ b/testcases/kernel/logging/kmsg/Makefile @@ -0,0 +1,22 @@ +# +# Copyright (C) 2013 Linux Test Project +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See +# the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +top_srcdir ?= ../../../.. + +include $(top_srcdir)/include/mk/testcases.mk +include $(top_srcdir)/include/mk/generic_leaf_target.mk diff --git a/testcases/kernel/logging/kmsg/kmsg01.c b/testcases/kernel/logging/kmsg/kmsg01.c new file mode 100644 index 0000000..83498ee --- /dev/null +++ b/testcases/kernel/logging/kmsg/kmsg01.c @@ -0,0 +1,595 @@ +/* + * Copyright (C) 2013 Linux Test Project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Further, this software is distributed without any warranty that it + * is free of the rightful claim of any third person regarding + * infringement or the like. Any license provided herein, whether + * implied or otherwise, applies only to this software file. Patent + * licenses, if any, provided herein do not apply to combinations of + * this program with other software, or any other product whatsoever. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ +/* + * Test /dev/kmsg based on kernel doc: Documentation/ABI/testing/dev-kmsg + * - read() blocks + * - non-blocking read() fails with EAGAIN + * - partial read fails (buffer smaller than message) + * - can write to /dev/kmsg and message seqno grows + * - first read() after open() returns same message + * - if messages get overwritten, read() returns -EPIPE + * - device supports SEEK_SET, SEEK_END, SEEK_DATA + */ +#define _GNU_SOURCE +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/syscall.h> +#include <sys/wait.h> +#include <errno.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include "config.h" +#include "test.h" +#include "usctest.h" +#include "safe_macros.h" +#include "linux_syscall_numbers.h" + +#define MSG_PREFIX "LTP kmsg01 " +#define MAX_MSGSIZE 4096 +#define NUM_READ_MSGS 3 +#define NUM_READ_RETRY 10 +#define NUM_OVERWRITE_MSGS 1024 +#define READ_TIMEOUT 5 + +char *TCID = "kmsg01"; +static void setup(void); +static void cleanup(void); + +/* + * inject_msg - write message to /dev/kmsg + * @msg: null-terminated message to inject, should end with \n + * + * RETURNS: + * 0 on success + * -1 on failure, errno reflects write() errno + */ +static int inject_msg(const char *msg) +{ + int f; + f = open("/dev/kmsg", O_WRONLY); + if (f < 0) + tst_brkm(TBROK | TERRNO, cleanup, "failed to open /dev/kmsg"); + TEST(write(f, msg, strlen(msg))); + SAFE_CLOSE(cleanup, f); + errno = TEST_ERRNO; + return TEST_RETURN; +} + +/* + * find_msg - find message in kernel ring buffer + * @fd: fd to use, if < 0 function opens /dev/kmsg itself + * @text_to_find: substring to look for in messages + * @buf: buf to store found message + * @bufsize: size of 'buf' + * @first: 1 - return first matching message + * 0 - return last matching message + * RETURNS: + * 0 on success + * -1 on failure + */ +static int find_msg(int fd, const char *text_to_find, char *buf, int bufsize, + int first) +{ + int f, msg_found = 0; + char msg[MAX_MSGSIZE + 1]; + + if (fd < 0) { + f = open("/dev/kmsg", O_RDONLY | O_NONBLOCK); + if (f < 0) + tst_brkm(TBROK, cleanup, "failed to open /dev/kmsg"); + } else { + f = fd; + } + + while (1) { + TEST(read(f, msg, sizeof(msg))); + if (TEST_RETURN < 0) { + if (TEST_ERRNO == EAGAIN) + /* there are no more messages */ + break; + else if (TEST_ERRNO == EPIPE) + /* current message was overwritten */ + continue; + else + tst_brkm(TBROK|TTERRNO, cleanup, + "failed to read /dev/kmsg"); + } else if (TEST_RETURN < bufsize) { + /* lines from kmsg are not NULL terminated */ + msg[TEST_RETURN] = '\0'; + if (strstr(msg, text_to_find) != NULL) { + strncpy(buf, msg, bufsize); + msg_found = 1; + if (first) + break; + } + } + } + if (fd < 0) + SAFE_CLOSE(cleanup, f); + + if (msg_found) + return 0; + else + return -1; +} + +static int get_msg_fields(const char *msg, unsigned long *prio, + unsigned long *seqno) +{ + unsigned long s, p; + if (sscanf(msg, "%lu,%lu,", &p, &s) == 2) { + if (prio) + *prio = p; + if (seqno) + *seqno = s; + return 0; + } else { + return 1; + } +} + +/* + * timed_read - if possible reads from fd or times out + * @fd: fd to read from + * @timeout_sec: timeout in seconds + * + * RETURNS: + * read bytes on successful read + * -1 on read() error, errno reflects read() errno + * -2 on timeout + */ +static int timed_read(int fd, int timeout_sec) +{ + int ret, tmp; + struct timeval timeout; + fd_set read_fds; + + FD_ZERO(&read_fds); + FD_SET(fd, &read_fds); + timeout.tv_sec = timeout_sec; + timeout.tv_usec = 0; + + ret = select(fd + 1, &read_fds, 0, 0, &timeout); + switch (ret) { + case -1: + tst_brkm(TBROK|TERRNO, cleanup, "select failed"); + case 0: + /* select timed out */ + return -2; + } + + return read(fd, &tmp, 1); +} + +/* + * timed_read_kmsg - reads file until it reaches end of file, + * read fails or times out. This ignores any + * EPIPE errors. + * @fd: fd to read from + * @timeout_sec: timeout in seconds for every read attempt + * + * RETURNS: + * 0 on read reaching eof + * -1 on read error, errno reflects read() errno + * -2 on timeout + */ +static int timed_read_kmsg(int fd, int timeout_sec) +{ + int child, status, ret = 0; + int pipefd[2]; + char msg[MAX_MSGSIZE]; + + if (pipe(pipefd) != 0) + tst_brkm(TBROK|TERRNO, cleanup, "pipe failed"); + + child = fork(); + switch (child) { + case -1: + tst_brkm(TBROK|TERRNO, cleanup, "failed to fork"); + case 0: + /* child does all the reading and keeps writing to + * pipe to let parent know that it didn't block */ + close(pipefd[0]); + while (1) { + write(pipefd[1], "", 1); + TEST(read(fd, msg, MAX_MSGSIZE)); + if (TEST_RETURN == 0) + break; + if (TEST_RETURN == -1 && TEST_ERRNO != EPIPE) { + ret = TEST_ERRNO; + break; + } + } + + close(pipefd[1]); + exit(ret); + } + SAFE_CLOSE(cleanup, pipefd[1]); + + /* parent reads pipe until it reaches eof or until read times out */ + do { + TEST(timed_read(pipefd[0], timeout_sec)); + } while (TEST_RETURN > 0); + SAFE_CLOSE(cleanup, pipefd[0]); + + /* child is blocked, kill it */ + if (TEST_RETURN == -2) + kill(child, SIGTERM); + if (waitpid(child, &status, 0) == -1) + tst_brkm(TBROK | TERRNO, cleanup, "waitpid"); + if (WIFEXITED(status)) { + if (WEXITSTATUS(status) == 0) { + return 0; + } else { + errno = WEXITSTATUS(status); + return -1; + } + } + return -2; +} + +static void test_read_nonblock(void) +{ + int fd; + + tst_resm(TINFO, "TEST: nonblock read"); + fd = open("/dev/kmsg", O_RDONLY | O_NONBLOCK); + if (fd < 0) + tst_brkm(TBROK|TERRNO, cleanup, "failed to open /dev/kmsg"); + + TEST(timed_read_kmsg(fd, READ_TIMEOUT)); + if (TEST_RETURN == -1 && TEST_ERRNO == EAGAIN) + tst_resm(TPASS, "non-block read returned EAGAIN"); + else + tst_resm(TFAIL|TTERRNO, "non-block read returned: %ld", + TEST_RETURN); + SAFE_CLOSE(cleanup, fd); +} + +static void test_read_block(void) +{ + int fd; + + tst_resm(TINFO, "TEST: blocking read"); + fd = open("/dev/kmsg", O_RDONLY); + if (fd < 0) + tst_brkm(TBROK|TERRNO, cleanup, "failed to open /dev/kmsg"); + + TEST(timed_read_kmsg(fd, READ_TIMEOUT)); + if (TEST_RETURN == -2) + tst_resm(TPASS, "read blocked"); + else + tst_resm(TFAIL|TTERRNO, "read returned: %ld", TEST_RETURN); + SAFE_CLOSE(cleanup, fd); +} + +static void test_partial_read(void) +{ + char msg[MAX_MSGSIZE]; + int fd; + + tst_resm(TINFO, "TEST: partial read"); + fd = open("/dev/kmsg", O_RDONLY | O_NONBLOCK); + if (fd < 0) + tst_brkm(TBROK|TERRNO, cleanup, "failed to open /dev/kmsg"); + + TEST(read(fd, msg, 1)); + if (TEST_RETURN < 0) + tst_resm(TPASS|TTERRNO, "read failed as expected"); + else + tst_resm(TFAIL, "read returned: %ld", TEST_RETURN); + SAFE_CLOSE(cleanup, fd); +} + +static void test_inject(void) +{ + char imsg[MAX_MSGSIZE], imsg_prefixed[MAX_MSGSIZE]; + char tmp[MAX_MSGSIZE]; + unsigned long prefix, seqno, seqno_last = 0; + int i, facility, prio; + + tst_resm(TINFO, "TEST: injected messages appear in /dev/kmsg"); + + /* test all combinations of prio 0-7, facility 0-15 */ + for (i = 0; i < 127; i++) { + prio = (i & 7); + facility = (i >> 3); + sprintf(imsg, MSG_PREFIX"TEST MESSAGE %ld prio: %d, " + "facility: %d\n", random(), prio, facility); + sprintf(imsg_prefixed, "<%d>%s", i, imsg); + + if (inject_msg(imsg_prefixed) == -1) { + tst_resm(TFAIL|TERRNO, "inject failed"); + return; + } + + /* check that message appears in log */ + if (find_msg(-1, imsg, tmp, sizeof(tmp), 0) == -1) { + tst_resm(TFAIL, "failed to find: %s", imsg); + return; + } + + /* check that facility is not 0 (LOG_KERN). */ + if (get_msg_fields(tmp, &prefix, &seqno) != 0) { + tst_resm(TFAIL, "failed to parse seqid: %s", tmp); + return; + } + if (prefix >> 3 == 0) { + tst_resm(TFAIL, "facility 0 found: %s", tmp); + return; + } + + /* check that seq. number grows */ + if (seqno > seqno_last) { + seqno_last = seqno; + } else { + tst_resm(TFAIL, "seqno doesn't grow: %lu, " + "last: %lu", seqno, seqno_last); + return; + } + } + + tst_resm(TPASS, "injected messages found in log"); + tst_resm(TPASS, "sequence numbers grow as expected"); +} + +static void test_read_returns_first_message(void) +{ + unsigned long seqno[NUM_READ_MSGS + 1]; + char msg[MAX_MSGSIZE]; + int msgs_match = 1; + int i, fd, j = NUM_READ_RETRY; + + /* Open extra fd, which we try to read after reading NUM_READ_MSGS. + * If this read fails with EPIPE, first message was overwritten and + * we should retry the whole test. If it still fails after + * NUM_READ_RETRY attempts, report TWARN */ + tst_resm(TINFO, "TEST: mult. readers will get same first message"); + while (j) { + fd = open("/dev/kmsg", O_RDONLY | O_NONBLOCK); + if (fd < 0) + tst_brkm(TBROK|TERRNO, cleanup, + "failed to open /dev/kmsg"); + + for (i = 0; i < NUM_READ_MSGS; i++) { + if (find_msg(-1, "", msg, sizeof(msg), 1) != 0) + tst_resm(TFAIL, "failed to find any message"); + if (get_msg_fields(msg, NULL, &seqno[i]) != 0) + tst_resm(TFAIL, "failed to parse seqid: %s", + msg); + } + + TEST(read(fd, msg, sizeof(msg))); + SAFE_CLOSE(cleanup, fd); + if (TEST_RETURN != -1) + break; + + if (TEST_ERRNO == EPIPE) + tst_resm(TINFO, "msg overwritten, retrying"); + else + tst_resm(TFAIL|TTERRNO, "read failed"); + + /* give a second to whoever overwrote first message to finish */ + sleep(1); + j--; + } + + if (!j) { + tst_resm(TWARN, "exceeded: %d attempts", NUM_READ_RETRY); + return; + } + + for (i = 0; i < NUM_READ_MSGS - 1; i++) + if (seqno[i] != seqno[i + 1]) + msgs_match = 0; + if (msgs_match) { + tst_resm(TPASS, "all readers got same message on first read"); + } else { + tst_resm(TFAIL, "readers got different messages"); + for (i = 0; i < NUM_READ_MSGS; i++) + tst_resm(TINFO, "msg%d: %lu\n", i, seqno[i]); + } +} + +static void test_messages_overwritten(void) +{ + int i, fd; + char msg[MAX_MSGSIZE]; + unsigned long first_seqno, seqno; + char filler_str[] = MSG_PREFIX"FILLER MESSAGE TO OVERWRITE OTHERS\n"; + + /* Keep injecting messages until we overwrite first one. + * We know first message is overwritten when its seqno changes */ + tst_resm(TINFO, "TEST: read returns EPIPE when messages get " + "overwritten"); + fd = open("/dev/kmsg", O_RDONLY | O_NONBLOCK); + if (fd < 0) + tst_brkm(TBROK|TERRNO, cleanup, "failed to open /dev/kmsg"); + + if (find_msg(-1, "", msg, sizeof(msg), 1) == 0 + && get_msg_fields(msg, NULL, &first_seqno) == 0) { + tst_resm(TINFO, "first seqno: %lu", first_seqno); + } else { + tst_brkm(TBROK, cleanup, "failed to get first seq. number"); + } + + while (1) { + if (find_msg(-1, "", msg, sizeof(msg), 1) != 0 + || get_msg_fields(msg, NULL, &seqno) != 0) { + tst_resm(TFAIL, "failed to get first seq. number"); + break; + } + if (first_seqno != seqno) { + /* first message was overwritten */ + tst_resm(TINFO, "first seqno now: %lu", seqno); + break; + } + for (i = 0; i < NUM_OVERWRITE_MSGS; i++) { + if (inject_msg(filler_str) == -1) + tst_brkm(TBROK|TERRNO, cleanup, + "failed write to /dev/kmsg"); + } + } + + /* first message is overwritten, so this next read should fail */ + TEST(read(fd, msg, sizeof(msg))); + if (TEST_RETURN == -1 && TEST_ERRNO == EPIPE) + tst_resm(TPASS, "read failed with EPIPE as expected"); + else + tst_resm(TFAIL|TTERRNO, "read returned: %ld", TEST_RETURN); + + /* seek position is updated to the next available record */ + tst_resm(TINFO, "TEST: Subsequent reads() will return available " + "records again"); + if (find_msg(fd, "", msg, sizeof(msg), 1) != 0) + tst_resm(TFAIL|TTERRNO, "read returned: %ld", TEST_RETURN); + else + tst_resm(TPASS, "after EPIPE read returned next record"); + + SAFE_CLOSE(cleanup, fd); +} + +static void test_seek(void) +{ + int k, j = NUM_READ_RETRY, fd; + char msg[MAX_MSGSIZE]; + unsigned long seqno[2]; + + /* 1. read() after SEEK_SET 0 returns same (first) message */ + tst_resm(TINFO, "TEST: seek SEEK_SET 0"); + + fd = open("/dev/kmsg", O_RDONLY | O_NONBLOCK); + if (fd < 0) + tst_brkm(TBROK|TERRNO, cleanup, "failed to open /dev/kmsg"); + + while (j) { + for (k = 0; k < 2; k++) { + TEST(read(fd, msg, sizeof(msg))); + if (TEST_RETURN == -1) { + if (errno == EPIPE) + break; + else + tst_brkm(TBROK|TTERRNO, cleanup, + "failed to read /dev/kmsg"); + } + if (get_msg_fields(msg, NULL, &seqno[k]) != 0) + tst_resm(TFAIL, "failed to parse seqid: %s", + msg); + if (k == 0) + if (lseek(fd, 0, SEEK_SET) == -1) + tst_resm(TFAIL|TERRNO, + "SEEK_SET 0 failed"); + } + + if (TEST_RETURN != -1) + break; + + /* give a second to whoever overwrote first message to finish */ + sleep(1); + j--; + + /* read above has returned EPIPE, reopen fd and try again */ + SAFE_CLOSE(cleanup, fd); + fd = open("/dev/kmsg", O_RDONLY | O_NONBLOCK); + if (fd < 0) + tst_brkm(TBROK|TERRNO, cleanup, + "failed to open /dev/kmsg"); + } + + if (!j) { + tst_resm(TWARN, "exceeded: %d attempts", NUM_READ_RETRY); + } else { + if (seqno[0] != seqno[1]) + tst_resm(TFAIL, "SEEK_SET 0"); + else + tst_resm(TPASS, "SEEK_SET 0"); + } + + /* 2. messages after SEEK_END 0 shouldn't contain MSG_PREFIX */ + tst_resm(TINFO, "TEST: seek SEEK_END 0"); + if (lseek(fd, 0, SEEK_END) == -1) + tst_resm(TFAIL|TERRNO, "lseek SEEK_END 0 failed"); + if (find_msg(fd, MSG_PREFIX, msg, sizeof(msg), 0) != 0) + tst_resm(TPASS, "SEEK_END 0"); + else + tst_resm(TFAIL, "SEEK_END 0 found: %s", msg); + +#ifdef SEEK_DATA + /* 3. messages after SEEK_DATA 0 shouldn't contain MSG_PREFIX */ + tst_resm(TINFO, "TEST: seek SEEK_DATA 0"); + + /* clear ring buffer */ + if (ltp_syscall(__NR_syslog, 5, NULL, 0) == -1) + tst_brkm(TBROK|TERRNO, cleanup, "syslog clear failed"); + if (lseek(fd, 0, SEEK_DATA) == -1) + tst_resm(TFAIL|TERRNO, "lseek SEEK_DATA 0 failed"); + if (find_msg(fd, MSG_PREFIX, msg, sizeof(msg), 0) != 0) + tst_resm(TPASS, "SEEK_DATA 0"); + else + tst_resm(TFAIL, "SEEK_DATA 0 found: %s", msg); +#endif + SAFE_CLOSE(cleanup, fd); +} + +int main(int argc, char *argv[]) +{ + int lc; + char *msg; + + msg = parse_opts(argc, argv, NULL, NULL); + if (msg != NULL) + tst_brkm(TBROK, tst_exit, "OPTION PARSING ERROR - %s", msg); + + setup(); + for (lc = 0; TEST_LOOPING(lc); lc++) { + /* run test_inject first so log isn't empty for other tests */ + test_inject(); + test_read_nonblock(); + test_read_block(); + test_partial_read(); + test_read_returns_first_message(); + test_messages_overwritten(); + test_seek(); + } + cleanup(); + tst_exit(); +} + +static void setup(void) +{ + tst_require_root(NULL); + if (tst_kvercmp(3, 5, 0) < 0) + tst_brkm(TCONF, NULL, "This test requires kernel" + " >= 3.5.0"); + srand(getpid()); + TEST_PAUSE; +} + +static void cleanup(void) +{ + TEST_CLEANUP; +} diff --git a/testcases/kernel/security/prot_hsymlinks/Makefile b/testcases/kernel/security/prot_hsymlinks/Makefile index cd49588..effd5da 100644 --- a/testcases/kernel/security/prot_hsymlinks/Makefile +++ b/testcases/kernel/security/prot_hsymlinks/Makefile @@ -2,7 +2,8 @@ # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. # # This program is distributed in the hope that it would be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -11,7 +12,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA top_srcdir ?= ../../../.. diff --git a/testcases/kernel/security/prot_hsymlinks/prot_hsymlinks.c b/testcases/kernel/security/prot_hsymlinks/prot_hsymlinks.c index 82bc770..558681a 100644 --- a/testcases/kernel/security/prot_hsymlinks/prot_hsymlinks.c +++ b/testcases/kernel/security/prot_hsymlinks/prot_hsymlinks.c @@ -3,7 +3,8 @@ * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. * * This program is distributed in the hope that it would be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/testcases/kernel/syscalls/chown/chown01.c b/testcases/kernel/syscalls/chown/chown01.c index 50b9ea5..d95564e 100644 --- a/testcases/kernel/syscalls/chown/chown01.c +++ b/testcases/kernel/syscalls/chown/chown01.c @@ -116,9 +116,7 @@ #include <signal.h> #include "test.h" #include "usctest.h" - -void setup(); -void cleanup(); +#include "safe_macros.h" char *TCID = "chown01"; int TST_TOTAL = 1; @@ -126,8 +124,10 @@ int TST_TOTAL = 1; int exp_enos[] = { 0, 0 }; char fname[255]; -int fd, uid, gid; -char *buf = "davef"; +int uid, gid; + +static void setup(void); +static void cleanup(void); int main(int ac, char **av) { @@ -163,7 +163,7 @@ int main(int ac, char **av) } -void setup() +static void setup(void) { tst_sig(NOFORK, DEF_HANDLER, cleanup); @@ -176,17 +176,11 @@ void setup() gid = getegid(); sprintf(fname, "t_%d", getpid()); - if ((fd = open(fname, O_RDWR | O_CREAT, 0700)) == -1) - tst_brkm(TBROK | TERRNO, cleanup, - "open(%s, O_RDWR|O_CREAT,0700) failed", fname); - else if (write(fd, &buf, strlen(buf)) == -1) - tst_brkm(TBROK | TERRNO, cleanup, - "write(%s, &buf, strlen(buf)) failed", fname); - else if (close(fd) == -1) - tst_brkm(TBROK | TERRNO, cleanup, "close(%s) failed", fname); + + SAFE_FILE_PRINTF(cleanup, fname, "davef"); } -void cleanup() +static void cleanup(void) { TEST_CLEANUP; diff --git a/testcases/kernel/syscalls/dup2/dup205.c b/testcases/kernel/syscalls/dup2/dup205.c index c728fcc..0528beb 100644 --- a/testcases/kernel/syscalls/dup2/dup205.c +++ b/testcases/kernel/syscalls/dup2/dup205.c @@ -112,8 +112,8 @@ int main(int ac, char *av[]) } } unlink(pfilname); - if (ifile > 0) - close(fildes[ifile - 1]); + for (ifile = fildes[0]; ifile < min + 10; ifile++) + close(fildes[ifile]); if (local_flag == PASSED) { tst_resm(TPASS, "Test passed."); } else { diff --git a/testcases/kernel/syscalls/getrusage/getrusage03.c b/testcases/kernel/syscalls/getrusage/getrusage03.c index 202356c..5d82a94 100644 --- a/testcases/kernel/syscalls/getrusage/getrusage03.c +++ b/testcases/kernel/syscalls/getrusage/getrusage03.c @@ -346,6 +346,13 @@ static void consume(int mega) static void setup(void) { + /* Disable test if the version of the kernel is less than 2.6.32 */ + if ((tst_kvercmp(2, 6, 32)) < 0) { + tst_resm(TCONF, "This ru_maxrss field is not supported"); + tst_resm(TCONF, "before kernel 2.6.32"); + tst_exit(); + } + tst_sig(FORK, DEF_HANDLER, cleanup); TEST_PAUSE; diff --git a/testcases/kernel/syscalls/mmap/mmap13.c b/testcases/kernel/syscalls/mmap/mmap13.c new file mode 100644 index 0000000..e0e13b4 --- /dev/null +++ b/testcases/kernel/syscalls/mmap/mmap13.c @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2013 FNST, DAN LI <li...@cn...> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/* + * Test Description: + * Verify error signal SIGBUS. + * "Attempted access to a portion of the buffer that does not correspond + * to the file." + * + * Expected Result: + * mmap() should succeed returning the address of the mapped region, + * and an attempt to access the memory which does not correspond to the file + * should rise the signal SIGBUS. + */ +#include <stdio.h> +#include <stdlib.h> +#include <sys/types.h> +#include <errno.h> +#include <unistd.h> +#include <fcntl.h> +#include <string.h> +#include <signal.h> +#include <sys/stat.h> +#include <sys/mman.h> +#include <setjmp.h> + +#include "test.h" +#include "usctest.h" + +#define TEMPFILE "mmapfile" + +char *TCID = "mmap13"; +int TST_TOTAL = 1; + +static size_t page_sz; +static char *addr; +static int fildes; +static volatile sig_atomic_t pass; +static sigjmp_buf env; + +static void setup(void); +static void cleanup(void); +static void sig_handler(int sig); + +int main(int argc, char *argv[]) +{ + int lc; + char *ch; + char *msg; + + msg = parse_opts(argc, argv, NULL, NULL); + if (msg != NULL) + tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); + + setup(); + + for (lc = 0; TEST_LOOPING(lc); lc++) { + tst_count = 0; + + addr = mmap(NULL, page_sz * 2, PROT_READ | PROT_WRITE, + MAP_FILE | MAP_SHARED, fildes, 0); + + if (addr == MAP_FAILED) { + tst_resm(TFAIL | TERRNO, "mmap() failed on %s", + TEMPFILE); + continue; + } + + if (STD_FUNCTIONAL_TEST) { + + if (sigsetjmp(env, 1) == 0) { + ch = addr + page_sz + 1; + *ch = 0; + } + + if (pass) + tst_resm(TPASS, "Got SIGBUS " + "as expected"); + else + tst_resm(TFAIL, "Invalid access not " + "rise SIGBUS"); + } else { + tst_resm(TPASS, "call succeeded"); + } + + if (munmap(addr, page_sz * 2) != 0) + tst_brkm(TFAIL | TERRNO, cleanup, + "failed to unmap the mmapped pages"); + + pass = 0; + } + + cleanup(); + tst_exit(); +} + +static void setup(void) +{ + tst_sig(NOFORK, sig_handler, cleanup); + + TEST_PAUSE; + + page_sz = getpagesize(); + + tst_tmpdir(); + + fildes = open(TEMPFILE, O_RDWR | O_CREAT, 0766); + if (fildes < 0) + tst_brkm(TFAIL | TERRNO, cleanup, "opening %s failed", + TEMPFILE); + + if (ftruncate(fildes, page_sz / 2) == -1) + tst_brkm(TFAIL | TERRNO, cleanup, "ftruncate %s failed", + TEMPFILE); +} + +/* + * This function gets executed when the test process receives + * the signal SIGBUS while trying to access the memory which + * does not correspond to the file. + */ +static void sig_handler(int sig) +{ + if (sig == SIGBUS) { + pass = 1; + siglongjmp(env, 1); + } else { + tst_brkm(TBROK, cleanup, "received an unexpected signal"); + } +} + +static void cleanup(void) +{ + close(fildes); + TEST_CLEANUP; + tst_rmdir(); +} hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-06-05 15:37:57
|
The branch, master, has been updated via 8a575d291217d366b6d1f04b5608d3258ebde9cf (commit) from ec22fb23398c1d276316db4aeb184cc9464b28be (commit) - Log ----------------------------------------------------------------- commit 8a575d291217d366b6d1f04b5608d3258ebde9cf Author: Cyril Hrubis <ch...@su...> Date: Wed Jun 5 17:28:11 2013 +0200 syscalls/chmod02: Fix test file creation + cleanup 1. Cleanup the code, remove useless comments. 2. The code to create the file is broken and overly complicated, replace it with SAFE_FILE_PRINTF(). Reported-by: jungsoo.son <jun...@lg...> Signed-off-by: Cyril Hrubis <ch...@su...> ----------------------------------------------------------------------- Summary of changes: testcases/kernel/syscalls/chmod/chmod02.c | 133 +++++------------------------ 1 files changed, 22 insertions(+), 111 deletions(-) diff --git a/testcases/kernel/syscalls/chmod/chmod02.c b/testcases/kernel/syscalls/chmod/chmod02.c index 242cbd3..b324899 100644 --- a/testcases/kernel/syscalls/chmod/chmod02.c +++ b/testcases/kernel/syscalls/chmod/chmod02.c @@ -29,85 +29,14 @@ * * http://oss.sgi.com/projects/GenInfo/NoticeExplan/ */ -/* $Id: chmod02.c,v 1.5 2009/08/28 11:49:07 vapier Exp $ */ -/********************************************************** - * - * OS Test - Silicon Graphics, Inc. - * - * TEST IDENTIFIER : chmod02 - * - * EXECUTED BY : anyone - * - * TEST TITLE : Basic test for chmod(2) - * - * PARENT DOCUMENT : usctpl01 - * - * TEST CASE TOTAL : 8 - * - * WALL CLOCK TIME : 1 - * - * CPU TYPES : ALL - * - * AUTHOR : William Roske - * - * CO-PILOT : Dave Fenner - * - * DATE STARTED : 03/30/92 - * - * INITIAL RELEASE : UNICOS 7.0 - * - * TEST CASES - * - * 1.) chmod(2) returns...(See Description) - * - * INPUT SPECIFICATIONS - * The standard options for system call tests are accepted. - * (See the parse_opts(3) man page). - * - * OUTPUT SPECIFICATIONS - *$ - * DURATION - * Terminates - with frequency and infinite modes. - * - * SIGNALS - * Uses SIGUSR1 to pause before test if option set. - * (See the parse_opts(3) man page). - * - * RESOURCES - * None - * - * ENVIRONMENTAL NEEDS - * The libcuts.a and libsys.a libraries must be included in - * the compilation of this test. - * - * SPECIAL PROCEDURAL REQUIREMENTS - * None - * - * INTERCASE DEPENDENCIES - * None - * - * DETAILED DESCRIPTION - * This is a Phase I test for the chmod(2) system call. It is intended - * to provide a limited exposure of the system call, for now. It - * should/will be extended when full functional tests are written for - * chmod(2). - * - * Setup: - * Setup signal handling. - * Pause for SIGUSR1 if option specified. - * - * Test: - * Loop if the proper options are given. - * Execute system call - * Check return code, if system call failed (return=-1) - * Log the errno and Issue a FAIL message. - * Otherwise, Issue a PASS message. - * - * Cleanup: - * Print errno log and/or timing stats if options given - * + +/* + * AUTHOR : William Roske + * CO-PILOT : Dave Fenner + * DATE STARTED : 03/30/92 * - *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#**/ + * Calls chmod(2) with different modes and expects success. + */ #include <sys/types.h> #include <sys/stat.h> @@ -115,28 +44,25 @@ #include <errno.h> #include <string.h> #include <signal.h> + #include "test.h" #include "usctest.h" +#include "safe_macros.h" -void setup(); -void cleanup(); +static int modes[] = { 0, 07, 070, 0700, 0777, 02777, 04777, 06777 }; char *TCID = "chmod02"; -int TST_TOTAL = 1; +int TST_TOTAL = ARRAY_SIZE(modes); -char fname[255]; -char *buf = "file contents\n"; +#define FNAME "test_file" -int Modes[] = { 0, 07, 070, 0700, 0777, 02777, 04777, 06777 }; +static void setup(void); +static void cleanup(void); int main(int ac, char **av) { - int lc; + int lc, i; char *msg; - int ind; - int mode; - - TST_TOTAL = sizeof(Modes) / sizeof(int); if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); @@ -147,20 +73,19 @@ int main(int ac, char **av) tst_count = 0; - for (ind = 0; ind < TST_TOTAL; ind++) { - mode = Modes[ind]; + for (i = 0; i < TST_TOTAL; i++) { - TEST(chmod(fname, mode)); + TEST(chmod(FNAME, modes[i])); if (TEST_RETURN == -1) { tst_resm(TFAIL | TTERRNO, - "chmod(%s, %#o) failed", fname, mode); + "chmod(%s, %#o) failed", FNAME, modes[i]); } else { if (STD_FUNCTIONAL_TEST) { tst_resm(TPASS, "chmod(%s, %#o) returned %ld", - fname, mode, TEST_RETURN); + FNAME, modes[i], TEST_RETURN); } else tst_count++; } @@ -169,36 +94,22 @@ int main(int ac, char **av) } cleanup(); - tst_exit(); } -void setup() +static void setup(void) { - int fd; - tst_sig(NOFORK, DEF_HANDLER, cleanup); TEST_PAUSE; tst_tmpdir(); - strcat(fname, "tfile"); - if ((fd = open(fname, O_RDWR | O_CREAT, 0700)) == -1) { - tst_brkm(TBROK | TERRNO, cleanup, - "open(%s, O_RDWR|O_CREAT,0700) failed", fname); - } else if (write(fd, &buf, strlen(buf)) == -1) { - tst_brkm(TBROK | TERRNO, cleanup, - "write(%s, &buf, strlen(buf)) failed", fname); - } else if (close(fd) == -1) { - tst_brkm(TBROK | TERRNO, cleanup, "close(%s) failed", fname); - } + SAFE_FILE_PRINTF(cleanup, FNAME, "File content\n"); } -void cleanup() +static void cleanup(void) { TEST_CLEANUP; - tst_rmdir(); - } hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-06-04 18:37:41
|
The branch, master, has been updated via ec22fb23398c1d276316db4aeb184cc9464b28be (commit) via 5efee3381a919bdcd7266613093d8cdbd7ee5659 (commit) via 82ddd5fe98f283d50cd65eda1f2feb217c8dbc31 (commit) via 8dc262ac509e68ebc24f5ef83f18093e13381d71 (commit) via 1065dc47869f3819b4a41b07c9e3f859eddd6932 (commit) via 10ff5e920bda99e9976d929cdd17d65e07b698be (commit) via 1bbfae9df5df8dacb60f3f3c4d161593f6be8158 (commit) from beb0b7d667c912611d7ba32ae6ca464d486b13b2 (commit) - Log ----------------------------------------------------------------- commit ec22fb23398c1d276316db4aeb184cc9464b28be Author: Cyril Hrubis <ch...@su...> Date: Tue Jun 4 20:37:05 2013 +0200 syscalls/mmap: Remove check for getpagesize() < 0 1. The getpagesize() never fails 2. The condition is always false due to conversion to unsigned size_t Signed-off-by: Cyril Hrubis <ch...@su...> commit 5efee3381a919bdcd7266613093d8cdbd7ee5659 Author: Cyril Hrubis <ch...@su...> Date: Tue Jun 4 20:14:58 2013 +0200 syscalls/mmap: Cleanups. Signed-off-by: Cyril Hrubis <ch...@su...> commit 82ddd5fe98f283d50cd65eda1f2feb217c8dbc31 Author: Cyril Hrubis <ch...@su...> Date: Tue Jun 4 19:33:07 2013 +0200 fs/ftest{04,08}: Remove unused allocated buffer. Signed-off-by: Cyril Hrubis <ch...@su...> commit 8dc262ac509e68ebc24f5ef83f18093e13381d71 Author: Cyril Hrubis <ch...@su...> Date: Tue Jun 4 19:12:59 2013 +0200 lib/parse_opts.c: Remove a few unused assigments. Some of the ENV variables are only checked for existence so there is no need to store the return value into the ptr variable. (this change silences warnings) Signed-off-by: Cyril Hrubis <ch...@su...> commit 1065dc47869f3819b4a41b07c9e3f859eddd6932 Author: Cyril Hrubis <ch...@su...> Date: Tue Jun 4 19:09:15 2013 +0200 syscalls/stat01: Cleanup. A little cleanup + remove the second call to parse_opts(). Signed-off-by: Cyril Hrubis <ch...@su...> commit 10ff5e920bda99e9976d929cdd17d65e07b698be Author: Cyril Hrubis <ch...@su...> Date: Tue Jun 4 19:04:21 2013 +0200 openposix/.../mmap/27-1: Remove unused variable. Signed-off-by: Cyril Hrubis <ch...@su...> commit 1bbfae9df5df8dacb60f3f3c4d161593f6be8158 Author: Cyril Hrubis <ch...@su...> Date: Tue Jun 4 18:55:10 2013 +0200 syscalls/readdir02: Cleanup. Signed-off-by: Cyril Hrubis <ch...@su...> ----------------------------------------------------------------------- Summary of changes: lib/parse_opts.c | 6 +- testcases/kernel/fs/ftest/ftest04.c | 7 +- testcases/kernel/fs/ftest/ftest08.c | 7 +- testcases/kernel/syscalls/mmap/mmap001.c | 19 +-- testcases/kernel/syscalls/mmap/mmap01.c | 124 +++++--------------- testcases/kernel/syscalls/mmap/mmap02.c | 124 ++++--------------- testcases/kernel/syscalls/mmap/mmap03.c | 129 +++++--------------- testcases/kernel/syscalls/mmap/mmap04.c | 120 ++++-------------- testcases/kernel/syscalls/mmap/mmap05.c | 121 +++++-------------- testcases/kernel/syscalls/mmap/mmap06.c | 107 ++++------------- testcases/kernel/syscalls/mmap/mmap07.c | 106 ++++------------- testcases/kernel/syscalls/mmap/mmap08.c | 106 ++++------------- testcases/kernel/syscalls/mmap/mmap09.c | 80 +++++-------- testcases/kernel/syscalls/mmap/mmap10.c | 44 ++++--- testcases/kernel/syscalls/mmap/mmap11.c | 43 ++++--- testcases/kernel/syscalls/readdir/readdir02.c | 111 ++++------------- testcases/kernel/syscalls/stat/stat01.c | 86 ++++---------- .../conformance/interfaces/mmap/27-1.c | 2 - 18 files changed, 344 insertions(+), 998 deletions(-) diff --git a/lib/parse_opts.c b/lib/parse_opts.c index d07217c..15960f7 100644 --- a/lib/parse_opts.c +++ b/lib/parse_opts.c @@ -375,11 +375,11 @@ char *parse_opts(int ac, char **av, const option_t * user_optarr, /* * Turn on debug */ - if ((ptr = getenv("USC_DEBUG")) != NULL) { + if (getenv("USC_DEBUG") != NULL) { Debug = 1; printf("env USC_DEBUG is defined, turning on debug\n"); } - if ((ptr = getenv("USC_VERBOSE")) != NULL) { + if (getenv("USC_VERBOSE") != NULL) { Debug = 1; printf("env USC_VERBOSE is defined, turning on debug\n"); } @@ -413,7 +413,7 @@ char *parse_opts(int ac, char **av, const option_t * user_optarr, * unset the STD_FUNCTIONAL_TEST variable. */ if (!(options & OPT_nofunccheck) && - (ptr = getenv(USC_NO_FUNC_CHECK)) != NULL) { + getenv(USC_NO_FUNC_CHECK) != NULL) { STD_FUNCTIONAL_TEST = 0; /* Turn off functional testing */ if (Debug) printf("Using env %s, set STD_FUNCTIONAL_TEST to 0\n", diff --git a/testcases/kernel/fs/ftest/ftest04.c b/testcases/kernel/fs/ftest/ftest04.c index be3f149..616de78 100644 --- a/testcases/kernel/fs/ftest/ftest04.c +++ b/testcases/kernel/fs/ftest/ftest04.c @@ -228,7 +228,7 @@ int nchunks; static void dotest(int testers, int me, int fd) { - char *bits, *buf; + char *bits; char val, val0; int count, collide, chunk, whenmisc, xfr, i; @@ -249,11 +249,6 @@ static void dotest(int testers, int me, int fd) tst_exit(); } - if ((buf = (malloc(csize))) == NULL) { - tst_resm(TBROK, "\tmalloc failed(buf)"); - tst_exit(); - } - /*Allocate memory for the iovec buffers and init the iovec arrays */ r_ioveclen = w_ioveclen = csize / MAXIOVCNT; diff --git a/testcases/kernel/fs/ftest/ftest08.c b/testcases/kernel/fs/ftest/ftest08.c index 00c292e..adf5773 100644 --- a/testcases/kernel/fs/ftest/ftest08.c +++ b/testcases/kernel/fs/ftest/ftest08.c @@ -234,7 +234,7 @@ int nchunks; static void dotest(int testers, int me, int fd) { - char *bits, *buf; + char *bits; char val, val0; int count, collide, chunk, whenmisc, xfr, i; @@ -255,11 +255,6 @@ static void dotest(int testers, int me, int fd) tst_exit(); } - if ((buf = (malloc(csize))) == NULL) { - tst_resm(TBROK, "\tmalloc failed(buf)"); - tst_exit(); - } - /* Allocate memory for the iovec buffers and init the iovec arrays */ r_ioveclen = w_ioveclen = csize / MAXIOVCNT; diff --git a/testcases/kernel/syscalls/mmap/mmap001.c b/testcases/kernel/syscalls/mmap/mmap001.c index 6be11e3..cc857ed 100644 --- a/testcases/kernel/syscalls/mmap/mmap001.c +++ b/testcases/kernel/syscalls/mmap/mmap001.c @@ -1,6 +1,4 @@ /* - * mmap001.c - Tests mmapping a big file and writing it once - * * Copyright (C) 2000 Juan Quintela <qui...@fi...> * Aaron Laffin <al...@sg...> * @@ -17,6 +15,8 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * mmap001.c - Tests mmapping a big file and writing it once */ #include <sys/types.h> #include <sys/stat.h> @@ -37,21 +37,16 @@ static char *filename = NULL; static int m_opt = 0; static char *m_copt; -void cleanup() +static void cleanup(void) { - /* - * remove the tmp directory and exit - */ - - if (filename) - free(filename); + free(filename); TEST_CLEANUP; tst_rmdir(); } -void setup() +static void setup(void) { char buf[1024]; /* @@ -72,7 +67,7 @@ void setup() } -void help() +static void help(void) { printf(" -m x size of mmap in pages (default 1000)\n"); } @@ -141,7 +136,7 @@ int main(int argc, char *argv[]) } array = mmap(0, memsize, PROT_WRITE, MAP_SHARED, fd, 0); - if (array == (char *)MAP_FAILED) { + if (array == MAP_FAILED) { TEST_ERRNO = errno; close(fd); tst_brkm(TBROK | TTERRNO, cleanup, diff --git a/testcases/kernel/syscalls/mmap/mmap01.c b/testcases/kernel/syscalls/mmap/mmap01.c index 06a8ef6..c44860f 100644 --- a/testcases/kernel/syscalls/mmap/mmap01.c +++ b/testcases/kernel/syscalls/mmap/mmap01.c @@ -1,25 +1,22 @@ /* + * Copyright (c) International Business Machines Corp., 2001 * - * Copyright (c) International Business Machines Corp., 2001 + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* - * Test Name: mmap01 - * * Test Description: * Verify that, mmap() succeeds when used to map a file where size of the * file is not a multiple of the page size, the memory area beyond the end @@ -33,43 +30,9 @@ * filled with zero. * The changes beyond the end of file should not get written to the file. * - * Algorithm: - * Setup: - * Setup signal handling. - * Pause for SIGUSR1 if option specified. - * Create temporary directory. - * - * Test: - * Loop if the proper options are given. - * Execute system call - * Check return code, if system call failed (return=-1) - * Log the errno and Issue a FAIL message. - * Otherwise, - * Verify the Functionality of system call - * if successful, - * Issue Functionality-Pass message. - * Otherwise, - * Issue Functionality-Fail message. - * Cleanup: - * Print timing stats if options given - * Delete the temporary directory created. - * - * Usage: <for command-line> - * mmap01 [-c n] [-f] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -f : Turn off functionality Testing. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * * HISTORY * 07/2001 Ported by Wayne Boyer - * - * RESTRICTIONS: - * None. */ - #include <stdio.h> #include <stdlib.h> #include <sys/types.h> @@ -90,15 +53,16 @@ char *TCID = "mmap01"; int TST_TOTAL = 1; -char *addr; /* addr of memory mapped region */ -char *dummy; /* dummy string */ -size_t page_sz; /* system page size */ -size_t file_sz; /* mapped file size */ -int fildes; /* file descriptor for tempfile */ -char cmd_buffer[BUFSIZ]; /* command buffer to hold test command */ -void setup(); /* Main setup function of test */ -void cleanup(); /* cleanup function for the test */ +static char *addr; +static char *dummy; +static size_t page_sz; +static size_t file_sz; +static int fildes; +static char cmd_buffer[BUFSIZ]; + +static void setup(void); +static void cleanup(void); int main(int ac, char **av) { @@ -127,10 +91,7 @@ int main(int ac, char **av) tst_resm(TFAIL | TERRNO, "mmap of %s failed", TEMPFILE); continue; } - /* - * Perform functional verification if test - * executed without (-f) option. - */ + if (STD_FUNCTIONAL_TEST) { /* * Check if mapped memory area beyond EOF are @@ -187,20 +148,10 @@ int main(int ac, char **av) } -/* - * setup() - performs all ONE TIME setup for this test. - * - * Get system page size, allocate and initialize the string dummy. - * Initialize addr such that it is more than one page below the break - * address of the process, and initialize one page region from addr - * with char 'A'. - * Creat a temporary directory and a file under it. - * Write some known data into file and get the size of the file. - */ -void setup() +static void setup(void) { struct stat stat_buf; - char Path_name[PATH_MAX]; /* pathname of temporary file */ + char Path_name[PATH_MAX]; char write_buf[] = "hello world\n"; tst_sig(FORK, DEF_HANDLER, cleanup); @@ -232,14 +183,10 @@ void setup() } file_sz = stat_buf.st_size; - /* Get the system page size */ - if ((page_sz = getpagesize()) < 0) { - tst_brkm(TFAIL, cleanup, - "getpagesize() fails to get system page size"); - } + page_sz = getpagesize(); /* Allocate and initialize dummy string of system page size bytes */ - if ((dummy = (char *)calloc(page_sz, sizeof(char))) == NULL) { + if ((dummy = calloc(page_sz, sizeof(char))) == NULL) { tst_brkm(TFAIL, cleanup, "calloc failed (dummy)"); } @@ -264,25 +211,10 @@ void setup() sprintf(cmd_buffer, "grep XYZ %s/%s > /dev/null", Path_name, TEMPFILE); } -/* - * cleanup() - performs all ONE TIME cleanup for this test at - * completion or premature exit. - * Free the memory allocated to dummy variable. - * Remove the temporary directory created. - */ -void cleanup() +static void cleanup(void) { - /* - * print timing stats if that option was specified. - */ close(fildes); - TEST_CLEANUP; - - /* Free the memory allocated for dummy string */ - if (dummy) { - free(dummy); - } - + free(dummy); tst_rmdir(); } diff --git a/testcases/kernel/syscalls/mmap/mmap02.c b/testcases/kernel/syscalls/mmap/mmap02.c index 5bdb589..88488e7 100644 --- a/testcases/kernel/syscalls/mmap/mmap02.c +++ b/testcases/kernel/syscalls/mmap/mmap02.c @@ -1,25 +1,22 @@ /* + * Copyright (c) International Business Machines Corp., 2001 * - * Copyright (c) International Business Machines Corp., 2001 + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* - * Test Name: mmap02 - * * Test Description: * Call mmap() with prot parameter set to PROT_READ and with the file * descriptor being open for read, to map a file creating mapped memory @@ -32,43 +29,9 @@ * mmap() should succeed returning the address of the mapped region, * the mapped region should contain the contents of the mapped file. * - * Algorithm: - * Setup: - * Setup signal handling. - * Pause for SIGUSR1 if option specified. - * Create temporary directory. - * - * Test: - * Loop if the proper options are given. - * Execute system call - * Check return code, if system call failed (return=-1) - * Log the errno and Issue a FAIL message. - * Otherwise, - * Verify the Functionality of system call - * if successful, - * Issue Functionality-Pass message. - * Otherwise, - * Issue Functionality-Fail message. - * Cleanup: - * Print timing stats if options given - * Delete the temporary directory created. - * - * Usage: <for command-line> - * mmap02 [-c n] [-f] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -f : Turn off functionality Testing. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * * HISTORY * 07/2001 Ported by Wayne Boyer - * - * RESTRICTIONS: - * None. */ - #include <stdio.h> #include <stdlib.h> #include <sys/types.h> @@ -87,13 +50,14 @@ char *TCID = "mmap02"; int TST_TOTAL = 1; -char *addr; /* addr of memory mapped region */ -char *dummy; /* dummy string */ -size_t page_sz; /* system page size */ -int fildes; /* file descriptor for temporary file */ -void setup(); /* Main setup function of test */ -void cleanup(); /* cleanup function for the test */ +static char *addr; +static char *dummy; +static size_t page_sz; +static int fildes; + +static void setup(void); +static void cleanup(void); int main(int ac, char **av) { @@ -122,10 +86,7 @@ int main(int ac, char **av) tst_resm(TFAIL | TERRNO, "mmap of %s failed", TEMPFILE); continue; } - /* - * Perform functional verification if test - * executed without (-f) option. - */ + if (STD_FUNCTIONAL_TEST) { /* * Read the file contents into the dummy @@ -161,36 +122,20 @@ int main(int ac, char **av) cleanup(); tst_exit(); - } -/* - * setup() - performs all ONE TIME setup for this test. - * - * Get system page size, allocate and initialize the string dummy. - * Initialize addr such that it is more than one page below the break - * address of the process, and initialize one page region from addr - * with char 'A'. - * Create a temporary directory a file under it. - * Write some known data into file and close it. - * Change mode permissions on file to 0444. - */ -void setup() +static void setup(void) { - char *tst_buff; /* test buffer to hold known data */ + char *tst_buff; tst_sig(FORK, DEF_HANDLER, cleanup); TEST_PAUSE; - /* Get the system page size */ - if ((page_sz = getpagesize()) < 0) { - tst_brkm(TFAIL, NULL, - "getpagesize() fails to get system page size"); - } + page_sz = getpagesize(); /* Allocate space for the test buffer */ - if ((tst_buff = (char *)calloc(page_sz, sizeof(char))) == NULL) { + if ((tst_buff = calloc(page_sz, sizeof(char))) == NULL) { tst_brkm(TFAIL, NULL, "calloc failed (tst_buff)"); } @@ -236,31 +181,16 @@ void setup() } /* Allocate and initialize dummy string of system page size bytes */ - if ((dummy = (char *)calloc(page_sz, sizeof(char))) == NULL) { + if ((dummy = calloc(page_sz, sizeof(char))) == NULL) { tst_brkm(TFAIL, cleanup, "calloc failed (dummy)"); } } -/* - * cleanup() - performs all ONE TIME cleanup for this test at - * completion or premature exit. - * Free the memory allocated to dummy variable. - * Remove the temporary directory created. - */ -void cleanup() +static void cleanup(void) { - /* - * print timing stats if that option was specified. - */ close(fildes); - TEST_CLEANUP; - - /* Free the memory allocated for dummy string */ - if (dummy) { - free(dummy); - } - + free(dummy); tst_rmdir(); } diff --git a/testcases/kernel/syscalls/mmap/mmap03.c b/testcases/kernel/syscalls/mmap/mmap03.c index 8743142..af49599 100644 --- a/testcases/kernel/syscalls/mmap/mmap03.c +++ b/testcases/kernel/syscalls/mmap/mmap03.c @@ -1,25 +1,22 @@ /* + * Copyright (c) International Business Machines Corp., 2001 * - * Copyright (c) International Business Machines Corp., 2001 + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* - * Test Name: mmap03 - * * Test Description: * Call mmap() to map a file creating a mapped region with execute access * under the following conditions - @@ -38,43 +35,9 @@ * an attempt to access the contents of the mapped region should give * rise to the signal SIGSEGV. * - * Algorithm: - * Setup: - * Setup signal handling. - * Pause for SIGUSR1 if option specified. - * Create temporary directory. - * - * Test: - * Loop if the proper options are given. - * Execute system call - * Check return code, if system call failed (return=-1) - * Log the errno and Issue a FAIL message. - * Otherwise, - * Verify the Functionality of system call - * if successful, - * Issue Functionality-Pass message. - * Otherwise, - * Issue Functionality-Fail message. - * Cleanup: - * Print timing stats if options given - * Delete the temporary directory created. - * - * Usage: <for command-line> - * mmap03 [-c n] [-f] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -f : Turn off functionality Testing. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * * HISTORY * 07/2001 Ported by Wayne Boyer - * - * RESTRICTIONS: - * None. */ - #include <stdio.h> #include <stdlib.h> #include <sys/types.h> @@ -94,16 +57,17 @@ char *TCID = "mmap03"; int TST_TOTAL = 1; -size_t page_sz; /* system page size */ -char *addr; /* addr of memory mapped region */ -char *dummy; /* dummy variable to hold temp file contents */ -int fildes; /* file descriptor for temporary file */ -volatile int pass = 0; /* pass flag perhaps set to 1 in sig_handler */ -sigjmp_buf env; /* environment for sigsetjmp/siglongjmp */ -void setup(); /* Main setup function of test */ -void cleanup(); /* cleanup function for the test */ -void sig_handler(); /* signal handler to catch SIGSEGV */ +static size_t page_sz; +static char *addr; +static char *dummy; +static int fildes; +static volatile int pass = 0; +static sigjmp_buf env; + +static void setup(void); +static void cleanup(void); +static void sig_handler(int sig); int main(int ac, char **av) { @@ -133,10 +97,7 @@ int main(int ac, char **av) TEMPFILE); continue; } - /* - * Perform functional verification if test - * executed without (-f) option. - */ + if (STD_FUNCTIONAL_TEST) { /* * Read the file contents into the dummy @@ -195,30 +156,18 @@ int main(int ac, char **av) } -/* - * setup() - performs all ONE TIME setup for this test. - * Get the system page size. - * Create a temporary directory and a file under it. - * Write some known data into file and close it. - * Change the mode permissions on file to 0555. - * Re-open the file for reading. - */ -void setup() +static void setup(void) { - char *tst_buff; /* test buffer to hold known data */ + char *tst_buff; tst_sig(NOFORK, sig_handler, cleanup); TEST_PAUSE; - /* Get the system page size */ - if ((page_sz = getpagesize()) < 0) { - tst_brkm(TFAIL, NULL, - "getpagesize() fails to get system page size"); - } + page_sz = getpagesize(); /* Allocate space for the test buffer */ - if ((tst_buff = (char *)calloc(page_sz, sizeof(char))) == NULL) { + if ((tst_buff = calloc(page_sz, sizeof(char))) == NULL) { tst_brkm(TFAIL, NULL, "calloc failed (tst_buff)"); } @@ -256,7 +205,7 @@ void setup() } /* Allocate and initialize dummy string of system page size bytes */ - if ((dummy = (char *)calloc(page_sz, sizeof(char))) == NULL) { + if ((dummy = calloc(page_sz, sizeof(char))) == NULL) { tst_brkm(TFAIL, cleanup, "calloc failed (dummy)"); } @@ -268,12 +217,11 @@ void setup() } /* - * sig_handler() - Signal Cathing function. * This function gets executed when the test process receives * the signal SIGSEGV while trying to access the contents of memory which * is not accessible. */ -void sig_handler(sig) +static void sig_handler(int sig) { if (sig == SIGSEGV) { /* set the global variable and jump back */ @@ -283,25 +231,10 @@ void sig_handler(sig) tst_brkm(TBROK, cleanup, "received an unexpected signal"); } -/* - * cleanup() - performs all ONE TIME cleanup for this test at - * completion or premature exit. - * Free the memory allocated to dummy variable. - * Remove the temporary directory created. - */ -void cleanup() +static void cleanup(void) { - /* - * print timing stats if that option was specified. - */ close(fildes); - TEST_CLEANUP; - - /* Free the memory space allocated for dummy variable */ - if (dummy) { - free(dummy); - } - + free(dummy); tst_rmdir(); } diff --git a/testcases/kernel/syscalls/mmap/mmap04.c b/testcases/kernel/syscalls/mmap/mmap04.c index 6f5d8ee..c9b2c74 100644 --- a/testcases/kernel/syscalls/mmap/mmap04.c +++ b/testcases/kernel/syscalls/mmap/mmap04.c @@ -1,25 +1,22 @@ /* + * Copyright (c) International Business Machines Corp., 2001 * - * Copyright (c) International Business Machines Corp., 2001 + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* - * Test Name: mmap04 - * * Test Description: * Call mmap() to map a file creating a mapped region with read/exec access * under the following conditions - @@ -35,41 +32,8 @@ * mmap() should succeed returning the address of the mapped region, * and the mapped region should contain the contents of the mapped file. * - * Algorithm: - * Setup: - * Setup signal handling. - * Pause for SIGUSR1 if option specified. - * Create temporary directory. - * - * Test: - * Loop if the proper options are given. - * Execute system call - * Check return code, if system call failed (return=-1) - * Log the errno and Issue a FAIL message. - * Otherwise, - * Verify the Functionality of system call - * if successful, - * Issue Functionality-Pass message. - * Otherwise, - * Issue Functionality-Fail message. - * Cleanup: - * Print timing stats if options given - * Delete the temporary directory created. - * - * Usage: <for command-line> - * mmap04 [-c n] [-f] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -f : Turn off functionality Testing. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * * HISTORY * 07/2001 Ported by Wayne Boyer - * - * RESTRICTIONS: - * None. */ #include <stdio.h> @@ -90,13 +54,14 @@ char *TCID = "mmap04"; int TST_TOTAL = 1; -size_t page_sz; /* system page size */ -char *addr; /* addr of memory mapped region */ -char *dummy; /* dummy variable to hold temp file contents */ -int fildes; /* file descriptor for temporary file */ -void setup(); /* Main setup function of test */ -void cleanup(); /* cleanup function for the test */ +static size_t page_sz; +static char *addr; +static char *dummy; +static int fildes; + +static void setup(void); +static void cleanup(void); int main(int ac, char **av) { @@ -126,10 +91,6 @@ int main(int ac, char **av) continue; } - /* - * Perform functional verification if test - * executed without (-f) option. - */ if (STD_FUNCTIONAL_TEST) { /* * Read the file contents into the dummy @@ -164,32 +125,19 @@ int main(int ac, char **av) } cleanup(); tst_exit(); - } -/* - * setup() - performs all ONE TIME setup for this test. - * Get the system page size. - * Create a temporary directory and a file under it. - * Write some known data into file and close it. - * Change the mode permissions on file to 0555. - * Re-open the file for reading. - */ -void setup() +static void setup(void) { - char *tst_buff; /* test buffer to hold known data */ + char *tst_buff; tst_sig(NOFORK, DEF_HANDLER, cleanup); TEST_PAUSE; - /* Get the system page size */ - if ((page_sz = getpagesize()) < 0) { - tst_brkm(TFAIL, NULL, - "getpagesize() fails to get system page size"); - } + page_sz = getpagesize(); - if ((tst_buff = (char *)calloc(page_sz, sizeof(char))) == NULL) { + if ((tst_buff = calloc(page_sz, sizeof(char))) == NULL) { tst_brkm(TFAIL, NULL, "calloc failed (tst_buff)"); } @@ -224,7 +172,7 @@ void setup() } /* Allocate and initialize dummy string of system page size bytes */ - if ((dummy = (char *)calloc(page_sz, sizeof(char))) == NULL) { + if ((dummy = calloc(page_sz, sizeof(char))) == NULL) { tst_brkm(TFAIL, cleanup, "calloc failed (dummy)"); } @@ -235,26 +183,10 @@ void setup() } } -/* - * cleanup() - performs all ONE TIME cleanup for this test at - * completion or premature exit. - * Free the memeory allocated to dummy variable. - * Remove the temporary directory created. - */ -void cleanup() +static void cleanup(void) { - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ close(fildes); - TEST_CLEANUP; - - /* Free the memory space allocated for dummy variable */ - if (dummy) { - free(dummy); - } - + free(dummy); tst_rmdir(); } diff --git a/testcases/kernel/syscalls/mmap/mmap05.c b/testcases/kernel/syscalls/mmap/mmap05.c index 63d165e..1b793b3 100644 --- a/testcases/kernel/syscalls/mmap/mmap05.c +++ b/testcases/kernel/syscalls/mmap/mmap05.c @@ -1,25 +1,22 @@ /* + * Copyright (c) International Business Machines Corp., 2001 * - * Copyright (c) International Business Machines Corp., 2001 + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* - * Test Name: mmap05 - * * Test Description: * Call mmap() to map a file creating mapped memory with no access under * the following conditions - @@ -35,43 +32,9 @@ * and an attempt to access the contents of the mapped region should give * rise to the signal SIGSEGV. * - * Algorithm: - * Setup: - * Setup signal handling. - * Pause for SIGUSR1 if option specified. - * Create temporary directory. - * - * Test: - * Loop if the proper options are given. - * Execute system call - * Check return code, if system call failed (return=-1) - * Log the errno and Issue a FAIL message. - * Otherwise, - * Verify the Functionality of system call - * if successful, - * Issue Functionality-Pass message. - * Otherwise, - * Issue Functionality-Fail message. - * Cleanup: - * Print errno log and/or timing stats if options given - * Delete the temporary directory created. - * - * Usage: <for command-line> - * mmap05 [-c n] [-f] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -f : Turn off functionality Testing. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * * HISTORY * 07/2001 Ported by Wayne Boyer - * - * RESTRICTIONS: - * None. */ - #include <stdio.h> #include <stdlib.h> #include <sys/types.h> @@ -91,21 +54,22 @@ char *TCID = "mmap05"; int TST_TOTAL = 1; -size_t page_sz; /* system page size */ -volatile char *addr; /* addr of memory mapped region */ -int fildes; /* file descriptor for temporary file */ -volatile int pass = 0; -sigjmp_buf env; /* environment for sigsetjmp/siglongjmp */ -void setup(); /* Main setup function of test */ -void cleanup(); /* cleanup function for the test */ -void sig_handler(); /* signal handler to catch SIGSEGV */ +static size_t page_sz; +static volatile char *addr; +static int fildes; +static volatile int pass = 0; +static sigjmp_buf env; + +static void setup(void); +static void cleanup(void); +static void sig_handler(int sig); int main(int ac, char **av) { int lc; char *msg; - char file_content; /* tempfile content */ + char file_content; if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); @@ -132,10 +96,6 @@ int main(int ac, char **av) continue; } - /* - * Perform functional verification if test - * executed without (-f) option. - */ if (STD_FUNCTIONAL_TEST) { /* @@ -170,30 +130,17 @@ int main(int ac, char **av) } cleanup(); tst_exit(); - } -/* - * setup() - performs all ONE TIME setup for this test. - * Get the system page size. - * Create a temporary directory and a file under it. - * Write some known data into file and close it. - * Change the mode permissions on file to 0444 - * Re-open the file for reading. - */ -void setup(void) +static void setup(void) { - char *tst_buff; /* test buffer to hold known data */ + char *tst_buff; tst_sig(NOFORK, sig_handler, cleanup); TEST_PAUSE; - /* Get the system page size */ - if ((page_sz = getpagesize()) < 0) { - tst_brkm(TFAIL, NULL, - "getpagesize() fails to get system page size"); - } + page_sz = getpagesize(); /* Allocate space for the test buffer */ if ((tst_buff = calloc(page_sz, sizeof(char))) == NULL) { @@ -246,31 +193,21 @@ void setup(void) * the signal SIGSEGV while trying to access the contents of memory which * is not accessible. */ -void sig_handler(sig) +static void sig_handler(int sig) { if (sig == SIGSEGV) { /* set the global variable and jump back */ pass = 1; siglongjmp(env, 1); - } else + } else { tst_brkm(TBROK, cleanup, "received an unexpected signal: %d", sig); + } } -/* - * cleanup() - performs all ONE TIME cleanup for this test at - * completion or premature exit. - * Remove the temporary directory created. - */ -void cleanup(void) +static void cleanup(void) { - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ close(fildes); - TEST_CLEANUP; - tst_rmdir(); } diff --git a/testcases/kernel/syscalls/mmap/mmap06.c b/testcases/kernel/syscalls/mmap/mmap06.c index 8626e3b..f907255 100644 --- a/testcases/kernel/syscalls/mmap/mmap06.c +++ b/testcases/kernel/syscalls/mmap/mmap06.c @@ -1,25 +1,22 @@ /* + * Copyright (c) International Business Machines Corp., 2001 * - * Copyright (c) International Business Machines Corp., 2001 + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* - * Test Name: mmap06 - * * Test Description: * Call mmap() to map a file creating a mapped region with read access * under the following conditions - @@ -31,43 +28,9 @@ * Expected Result: * mmap() should fail returning -1 and errno should get set to EACCES. * - * Algorithm: - * Setup: - * Setup signal handling. - * Pause for SIGUSR1 if option specified. - * Create temporary directory. - * - * Test: - * Loop if the proper options are given. - * Execute system call - * Check return code, if system call failed (return=-1) - * if errno set == expected errno - * Issue sys call fails with expected return value and errno. - * Otherwise, - * Issue sys call fails with unexpected errno. - * Otherwise, - * Issue sys call returns unexpected value. - * - * Cleanup: - * Print errno log and/or timing stats if options given - * Delete the temporary directory(s)/file(s) created. - * - * Usage: <for command-line> - * mmap06 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * * HISTORY * 07/2001 Ported by Wayne Boyer - * - * RESTRICTIONS: - * None. */ - #include <stdio.h> #include <stdlib.h> #include <sys/types.h> @@ -86,14 +49,15 @@ char *TCID = "mmap06"; int TST_TOTAL = 1; -int exp_enos[] = { EACCES, 0 }; -size_t page_sz; /* system page size */ -char *addr; /* addr of memory mapped region */ -int fildes; /* file descriptor for temporary file */ +static int exp_enos[] = { EACCES, 0 }; -void setup(); /* Main setup function of test */ -void cleanup(); /* cleanup function for the test */ +static size_t page_sz; +static char *addr; +static int fildes; + +static void setup(void); +static void cleanup(void); int main(int ac, char **av) { @@ -105,7 +69,6 @@ int main(int ac, char **av) setup(); - /* set the expected errnos... */ TEST_EXP_ENOS(exp_enos); for (lc = 0; TEST_LOOPING(lc); lc++) { @@ -146,28 +109,18 @@ int main(int ac, char **av) } -/* - * setup() - performs all ONE TIME setup for this test. - * Get the system page size. - * Create a temporary directory and a file under it. - * Write some known data into file. - */ -void setup() +static void setup(void) { - char *tst_buff; /* test buffer to hold known data */ + char *tst_buff; tst_sig(NOFORK, DEF_HANDLER, cleanup); TEST_PAUSE; - /* Get the system page size */ - if ((page_sz = getpagesize()) < 0) { - tst_brkm(TFAIL, NULL, - "getpagesize() fails to get system page size"); - } + page_sz = getpagesize(); /* Allocate space for the test buffer */ - if ((tst_buff = (char *)calloc(page_sz, sizeof(char))) == NULL) { + if ((tst_buff = calloc(page_sz, sizeof(char))) == NULL) { tst_brkm(TFAIL, NULL, "calloc() failed (tst_buff)"); } @@ -188,24 +141,12 @@ void setup() tst_brkm(TFAIL, cleanup, "writing to %s failed", TEMPFILE); } - /* Free the memory allocated for test buffer */ free(tst_buff); } -/* - * cleanup() - performs all ONE TIME cleanup for this test at - * completion or premature exit. - * Remove the temporary directory created. - */ -void cleanup() +static void cleanup(void) { - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ close(fildes); - TEST_CLEANUP; - tst_rmdir(); } diff --git a/testcases/kernel/syscalls/mmap/mmap07.c b/testcases/kernel/syscalls/mmap/mmap07.c index 1c24e06..bb05cd2 100644 --- a/testcases/kernel/syscalls/mmap/mmap07.c +++ b/testcases/kernel/syscalls/mmap/mmap07.c @@ -1,25 +1,22 @@ /* + * Copyright (c) International Business Machines Corp., 2001 * - * Copyright (c) International Business Machines Corp., 2001 + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* - * Test Name: mmap07 - * * Test Description: * Call mmap() to map a file creating a mapped region with read access * under the following conditions - @@ -32,43 +29,9 @@ * Expected Result: * mmap() should fail returning -1 and errno should get set to EACCES. * - * Algorithm: - * Setup: - * Setup signal handling. - * Pause for SIGUSR1 if option specified. - * Create temporary directory. - * - * Test: - * Loop if the proper options are given. - * Execute system call - * Check return code, if system call failed (return=-1) - * if errno set == expected errno - * Issue sys call fails with expected return value and errno. - * Otherwise, - * Issue sys call fails with unexpected errno. - * Otherwise, - * Issue sys call returns unexpected value. - * - * Cleanup: - * Print errno log and/or timing stats if options given - * Delete the temporary directory(s)/file(s) created. - * - * Usage: <for command-line> - * mmap07 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * * HISTORY * 07/2001 Ported by Wayne Boyer - * - * RESTRICTIONS: - * None. */ - #include <stdio.h> #include <stdlib.h> #include <sys/types.h> @@ -87,14 +50,15 @@ char *TCID = "mmap07"; int TST_TOTAL = 1; -int exp_enos[] = { EACCES, 0 }; -size_t page_sz; /* system page size */ -char *addr; /* addr of memory mapped region */ -int fildes; /* file descriptor for temporary file */ +static int exp_enos[] = { EACCES, 0 }; + +static size_t page_sz; +static char *addr; +static int fildes; -void setup(); /* Main setup function of test */ -void cleanup(); /* cleanup function for the test */ +static void setup(void); +static void cleanup(void); int main(int ac, char **av) { @@ -106,7 +70,6 @@ int main(int ac, char **av) setup(); - /* set the expected errnos... */ TEST_EXP_ENOS(exp_enos); for (lc = 0; TEST_LOOPING(lc); lc++) { @@ -148,28 +111,18 @@ int main(int ac, char **av) } -/* - * setup() - performs all ONE TIME setup for this test. - * Get the system page size. - * Create a temporary directory and a file under it. - * Write some known data into file. - */ -void setup() +static void setup(void) { - char *tst_buff; /* test buffer to hold known data */ + char *tst_buff; tst_sig(NOFORK, DEF_HANDLER, cleanup); TEST_PAUSE; - /* Get the system page size */ - if ((page_sz = getpagesize()) < 0) { - tst_brkm(TFAIL, NULL, - "getpagesize() fails to get system page size"); - } + page_sz = getpagesize(); /* Allocate space for the test buffer */ - if ((tst_buff = (char *)calloc(page_sz, sizeof(char))) == NULL) { + if ((tst_buff = calloc(page_sz, sizeof(char))) == NULL) { tst_brkm(TFAIL, NULL, "calloc() failed to allocate space for tst_buff"); } @@ -191,23 +144,12 @@ void setup() tst_brkm(TFAIL, cleanup, "writing to %s failed", TEMPFILE); } - /* Free the memory allocated for test buffer */ free(tst_buff); } -/* - * cleanup() - performs all ONE TIME cleanup for this test at - * completion or premature exit. - * Remove the temporary directory created. - */ -void cleanup() +static void cleanup(void) { - /* - * print errno log if that option was specified. - */ close(fildes); - TEST_CLEANUP; - tst_rmdir(); } diff --git a/testcases/kernel/syscalls/mmap/mmap08.c b/testcases/kernel/syscalls/mmap/mmap08.c index 3f97c31..43b8678 100644 --- a/testcases/kernel/syscalls/mmap/mmap08.c +++ b/testcases/kernel/syscalls/mmap/mmap08.c @@ -1,25 +1,22 @@ /* + * Copyright (c) International Business Machines Corp., 2001 * - * Copyright (c) International Business Machines Corp., 2001 + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* - * Test Name: mmap08 - * * Test Description: * Verify that mmap() fails to map a file creating a mapped region * when the file specified by file descriptor is not valid. @@ -27,43 +24,9 @@ * Expected Result: * mmap() should fail returning -1 and errno should get set to EBADF. * - * Algorithm: - * Setup: - * Setup signal handling. - * Pause for SIGUSR1 if option specified. - * Create temporary directory. - * - * Test: - * Loop if the proper options are given. - * Execute system call - * Check return code, if system call failed (return=-1) - * if errno set == expected errno - * Issue sys call fails with expected return value and errno. - * Otherwise, - * Issue sys call fails with unexpected errno. - * Otherwise, - * Issue sys call returns unexpected value. - * - * Cleanup: - * Print errno log and/or timing stats if options given - * Delete the temporary directory(s)/file(s) created. - * - * Usage: <for command-line> - * mmap08 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * * HISTORY * 07/2001 Ported by Wayne Boyer - * - * RESTRICTIONS: - * None. */ - #include <stdio.h> #include <stdlib.h> #include <sys/types.h> @@ -82,14 +45,15 @@ char *TCID = "mmap08"; int TST_TOTAL = 1; -int exp_enos[] = { EBADF, 0 }; -size_t page_sz; /* system page size */ -char *addr; /* addr of memory mapped region */ -int fildes; /* file descriptor for temporary file */ +static int exp_enos[] = { EBADF, 0 }; + +static size_t page_sz; +static char *addr; +static int fildes; -void setup(); /* Main setup function of test */ -void cleanup(); /* cleanup function for the test */ +static void setup(void); +static void cleanup(void); int main(int ac, char **av) { @@ -101,7 +65,6 @@ int main(int ac, char **av) setup(); - /* set the expected errnos... */ TEST_EXP_ENOS(exp_enos); for (lc = 0; TEST_LOOPING(lc); lc++) { @@ -138,30 +101,19 @@ int main(int ac, char **av) cleanup(); tst_exit(); - } -/* - * setup() - performs all ONE TIME setup for this test. - * Get the system page size. - * Create a temporary directory and a file under it. - * Write some known data into file and close it. - */ -void setup() +static void setup(void) { - char *tst_buff; /* test buffer to hold known data */ + char *tst_buff; tst_sig(NOFORK, DEF_HANDLER, cleanup); TEST_PAUSE; - /* Get the system page size */ - if ((page_sz = getpagesize()) < 0) { - tst_brkm(TFAIL, NULL, - "getpagesize() fails to get system page size"); - } + page_sz = getpagesize(); - if ((tst_buff = (char *)calloc(page_sz, sizeof(char))) == NULL) { + if ((tst_buff = calloc(page_sz, sizeof(char))) == NULL) { tst_brkm(TFAIL, NULL, "calloc() failed to allocate space for tst_buff"); } @@ -192,18 +144,8 @@ void setup() } } -/* - * cleanup() - performs all ONE TIME cleanup for this test at - * completion or premature exit. - * Remove the temporary directory created. - */ -void cleanup() +static void cleanup(void) { - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ TEST_CLEANUP; - tst_rmdir(); } diff --git a/testcases/kernel/syscalls/mmap/mmap09.c b/testcases/kernel/syscalls/mmap/mmap09.c index 03e3141..b5b2f38 100644 --- a/testcases/kernel/syscalls/mmap/mmap09.c +++ b/testcases/kernel/syscalls/mmap/mmap09.c @@ -1,25 +1,22 @@ /* + * Copyright (c) International Business Machines Corp., 2003 * - * Copyright (c) International Business Machines Corp., 2003 + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* - * Test Name: mmap09 - * * Test Description: * Verify that truncating a mmaped file works correctly. * @@ -27,31 +24,13 @@ * ftruncate should be allowed to increase, decrease, or zero the * size of a file that has been mmaped * - * Algorithm: - * Setup: - * Create file - * mmap the file - * fill it with data - * * Test: * Use ftruncate to shrink the file while it is mapped * Use ftruncate to grow the file while it is mapped * Use ftruncate to zero the size of the file while it is mapped * - * Usage: <for command-line> - * mmap09 [-c n] [-f] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -f : Turn off functionality Testing. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * * HISTORY * 04/2003 Written by Paul Larson - * - * RESTRICTIONS: - * None. */ #include <stdio.h> #include <unistd.h> @@ -62,30 +41,31 @@ #include "test.h" #include "usctest.h" -void setup(); -void cleanup(); - #define mapsize (1 << 14) char *TCID = "mmap09"; int TST_TOTAL = 3; -int fd; -char *maddr; -struct test_case_t { +static int fd; +static char *maddr; + +static struct test_case_t { off_t newsize; char *desc; } TC[] = { - { - mapsize - 8192, "ftruncate mmaped file to a smaller size"}, { - mapsize + 1024, "ftruncate mmaped file to a larger size"}, { -0, "ftruncate mmaped file to 0 size"},}; + {mapsize - 8192, "ftruncate mmaped file to a smaller size"}, + {mapsize + 1024, "ftruncate mmaped file to a larger size"}, + {0, "ftruncate mmaped file to 0 size"}, +}; + +static void setup(void); +static void cleanup(void); int main(int argc, char **argv) { int lc; int i; - char *msg; /* for parse_opts */ + char *msg; if ((msg = parse_opts(argc, argv, NULL, NULL)) != NULL) tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); @@ -111,11 +91,10 @@ int main(int argc, char **argv) tst_exit(); } -void setup() +static void setup(void) { tst_sig(NOFORK, DEF_HANDLER, cleanup); - /* Pause if option was specified */ TEST_PAUSE; tst_tmpdir(); @@ -127,20 +106,19 @@ void setup() if (ftruncate(fd, mapsize) < 0) tst_brkm(TFAIL | TERRNO, cleanup, "ftruncate file failed"); - maddr = mmap(0, (size_t) mapsize, PROT_READ | PROT_WRITE, - MAP_FILE | MAP_SHARED, fd, (off_t) 0); + maddr = mmap(0, mapsize, PROT_READ | PROT_WRITE, + MAP_FILE | MAP_SHARED, fd, 0); if (maddr == MAP_FAILED) tst_brkm(TFAIL | TERRNO, cleanup, "mmapping mmaptest failed"); /* fill up the file with A's */ memset(maddr, 'A', mapsize); - } -void cleanup() +static void cleanup(void) { TEST_CLEANUP; - munmap(maddr, (size_t) mapsize); + munmap(maddr, mapsize); close(fd); tst_rmdir(); } diff --git a/testcases/kernel/syscalls/mmap/mmap10.c b/testcases/kernel/syscalls/mmap/mmap10.c index 16ad299..4be367d 100644 --- a/testcases/kernel/syscalls/mmap/mmap10.c +++ b/testcases/kernel/syscalls/mmap/mmap10.c @@ -1,4 +1,27 @@ /* + * Copyright (C) 2010 Red Hat, Inc. + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Further, this software is distributed without any warranty that it + * is free of the rightful claim of any third person regarding + * infringement or the like. Any license provided herein, whether + * implied or otherwise, applies only to this software file. Pa... [truncated message content] |
From: Cyril H. <su...@li...> - 2013-06-04 16:37:59
|
The branch, master, has been updated via beb0b7d667c912611d7ba32ae6ca464d486b13b2 (commit) via b9f92622f9ac492e6bcf32f875712c8435d593d7 (commit) via 7ff5ebfc44300e915b0a4623d19837a5dc0bb662 (commit) via 7e40c4e9d1d83816259d8558488f60f28e69479d (commit) via 197c1c348366c69ad0090e0054507b7594283636 (commit) from 0546c995eb9e5e8ba76a9781dd54a940d22b6865 (commit) - Log ----------------------------------------------------------------- commit beb0b7d667c912611d7ba32ae6ca464d486b13b2 Author: Cyril Hrubis <ch...@su...> Date: Tue Jun 4 17:47:40 2013 +0200 syscalls/mprotect03: Make use of SAFE_WRITE(). Signed-off-by: Cyril Hrubis <ch...@su...> commit b9f92622f9ac492e6bcf32f875712c8435d593d7 Author: Cyril Hrubis <ch...@su...> Date: Tue Jun 4 17:20:04 2013 +0200 syscalls/mprotect01: Straighten up the logic. Pass the pointer to the current testcase to the setup function instead of passing the values via global variables + various small fixes. Signed-off-by: Cyril Hrubis <ch...@su...> commit 7ff5ebfc44300e915b0a4623d19837a5dc0bb662 Author: Cyril Hrubis <ch...@su...> Date: Tue Jun 4 16:32:39 2013 +0200 syscalls/mprotect: Fix mmap() error checks. The addr < 0 is always true. Make use of proper MAP_FAILED constant instead. Signed-off-by: Cyril Hrubis <ch...@su...> commit 7e40c4e9d1d83816259d8558488f60f28e69479d Author: Cyril Hrubis <ch...@su...> Date: Tue Jun 4 16:12:37 2013 +0200 syscalls/mprotect: Cleanup. Signed-off-by: Cyril Hrubis <ch...@su...> commit 197c1c348366c69ad0090e0054507b7594283636 Author: Cyril Hrubis <ch...@su...> Date: Tue Jun 4 14:41:46 2013 +0200 syscalls/mprotect: Cleanup UCLINUX ifdefs. Add mprotect directory to FILTER_OUT_DIRS on UCLINUX. Remove the UCLINUX ifdefs from the code. Signed-off-by: Cyril Hrubis <ch...@su...> ----------------------------------------------------------------------- Summary of changes: testcases/kernel/syscalls/Makefile | 2 +- testcases/kernel/syscalls/mprotect/mprotect01.c | 193 ++++++++--------------- testcases/kernel/syscalls/mprotect/mprotect02.c | 67 +++------ testcases/kernel/syscalls/mprotect/mprotect03.c | 103 ++++--------- 4 files changed, 114 insertions(+), 251 deletions(-) diff --git a/testcases/kernel/syscalls/Makefile b/testcases/kernel/syscalls/Makefile index da7c7fa..e70758d 100644 --- a/testcases/kernel/syscalls/Makefile +++ b/testcases/kernel/syscalls/Makefile @@ -26,7 +26,7 @@ include $(top_srcdir)/include/mk/env_pre.mk ifeq ($(UCLINUX),1) FILTER_OUT_DIRS += capget capset chmod chown clone fork getcontext llseek \ - nftw profil remap_file_pages mincore + nftw profil remap_file_pages mincore mprotect endif include $(top_srcdir)/include/mk/generic_trunk_target.mk diff --git a/testcases/kernel/syscalls/mprotect/mprotect01.c b/testcases/kernel/syscalls/mprotect/mprotect01.c index ccf4cab..411b335 100644 --- a/testcases/kernel/syscalls/mprotect/mprotect01.c +++ b/testcases/kernel/syscalls/mprotect/mprotect01.c @@ -1,26 +1,22 @@ /* + * Copyright (c) International Business Machines Corp., 2001 * - * Copyright (c) International Business Machines Corp., 2001 + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* - * NAME - * mprotect01.c - * * DESCRIPTION * Testcase to check the error conditions for mprotect(2) * @@ -36,81 +32,55 @@ * Try to set write permission (PROT_WRITE) using mprotect(2). * Check that error is set to EACCES. * - * USAGE: <for command-line> - * mprotect01 [-c n] [-e] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * * HISTORY * 07/2001 Ported by Wayne Boyer * 03/2002 Paul Larson: case 1 should expect ENOMEM not EFAULT - * - * RESTRICTIONS - * None */ #include <fcntl.h> #include <errno.h> #include <sys/mman.h> #include <stdlib.h> -#include <limits.h> /* for PAGESIZE */ #include <unistd.h> #include "test.h" #include "usctest.h" -#ifndef PAGESIZE -#define PAGESIZE 4096 -#endif - -void cleanup(void); -void setup(void); -void setup1(void); -void setup2(void); -void setup3(void); - char *TCID = "mprotect01"; int TST_TOTAL = 3; -void *addr1, *addr2, *addr3; -int fd; - -int exp_enos[] = { ENOMEM, EINVAL, EACCES, 0 }; - -struct test_case_t { - void **addr; +struct test_case { + void *addr; int len; int prot; int error; - void (*setupfunc) (); -} TC[] = { -#ifdef __ia64__ - /* Check for ENOMEM passing memory that cannot be accessed. */ - { - &addr1, 1024, PROT_READ, ENOMEM, setup1}, -#else - /* Check for ENOMEM passing memory that cannot be accessed. */ - { - &addr1, 1024, PROT_READ, ENOMEM, NULL}, -#endif - /* - * Check for EINVAL by passing a pointer which is not a - * multiple of PAGESIZE. - */ - { - &addr2, 1024, PROT_READ, EINVAL, setup2}, - /* - * Check for EACCES by trying to mark a section of memory - * which has been mmap'ed as read-only, as PROT_WRITE - */ - { - &addr3, PAGESIZE, PROT_WRITE, EACCES, setup3} + void (*setupfunc) (struct test_case *self); }; -#ifndef UCLINUX +static void cleanup(void); +static void setup(void); +static void setup1(struct test_case *self); +static void setup2(struct test_case *self); +static void setup3(struct test_case *self); + +static int exp_enos[] = { ENOMEM, EINVAL, EACCES, 0 }; + +static int fd; + +struct test_case TC[] = { + /* Check for ENOMEM passing memory that cannot be accessed. */ + {NULL, 0, PROT_READ, ENOMEM, setup1}, + + /* + * Check for EINVAL by passing a pointer which is not a + * multiple of PAGESIZE. + */ + {NULL, 1024, PROT_READ, EINVAL, setup2}, + /* + * Check for EACCES by trying to mark a section of memory + * which has been mmap'ed as read-only, as PROT_WRITE + */ + {NULL, 0, PROT_WRITE, EACCES, setup3} +}; int main(int ac, char **av) { @@ -118,30 +88,23 @@ int main(int ac, char **av) int i; char *msg; - if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) { + if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); - } - setup(); /* global setup */ + setup(); /* set up the expected errnos */ TEST_EXP_ENOS(exp_enos); - /* The following loop checks looping state if -i option given */ for (lc = 0; TEST_LOOPING(lc); lc++) { - - /* reset tst_count in case we are looping */ tst_count = 0; - /* loop through the test cases */ for (i = 0; i < TST_TOTAL; i++) { - /* perform test specific setup */ - if (TC[i].setupfunc != NULL) { - TC[i].setupfunc(); - } + if (TC[i].setupfunc != NULL) + TC[i].setupfunc(&TC[i]); - TEST(mprotect(*(TC[i].addr), TC[i].len, TC[i].prot)); + TEST(mprotect(TC[i].addr, TC[i].len, TC[i].prot)); if (TEST_RETURN != -1) { tst_resm(TFAIL, "call succeeded unexpectedly"); @@ -160,83 +123,53 @@ int main(int ac, char **av) strerror(TEST_ERRNO), TC[i].error); } } - close(fd); } cleanup(); tst_exit(); } -#else - -int main() -{ - tst_resm(TINFO, "Ignore this test on uClinux"); - tst_exit(); -} - -#endif /* UCLINUX */ - -/* - * setup1() - sets up conditions for the first test - */ -void setup1() +static void setup1(struct test_case *self) { - TC[0].len = getpagesize() + 1; + self->len = getpagesize() + 1; } -/* - * setup2() - sets up conditions for the second test - */ -void setup2() +static void setup2(struct test_case *self) { + self->addr = malloc(getpagesize()); - addr2 = (char *)malloc(PAGESIZE); - if (addr2 == NULL) { + if (self->addr == NULL) tst_brkm(TINFO, cleanup, "malloc failed"); - } - addr2++; /* Ensure addr2 is not page aligned */ + + /* Ensure addr2 is not page aligned */ + self->addr++; } -/* - * setup3() - sets up conditions for the third test - */ -void setup3() +static void setup3(struct test_case *self) { fd = open("/etc/passwd", O_RDONLY); - if (fd < 0) { + if (fd < 0) tst_brkm(TBROK, cleanup, "open failed"); - } + + self->len = getpagesize(); /* * mmap the PAGESIZE bytes as read only. */ - addr3 = mmap(0, PAGESIZE, PROT_READ, MAP_SHARED, fd, 0); - if (addr3 < 0) { + self->addr = mmap(0, self->len, PROT_READ, MAP_SHARED, fd, 0); + if (self->addr == MAP_FAILED) tst_brkm(TBROK, cleanup, "mmap failed"); - } + } -/* - * setup() - performs all ONE TIME setup for this test - */ -void setup() +static void setup(void) { - tst_sig(FORK, DEF_HANDLER, cleanup); TEST_PAUSE; } -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ -void cleanup() +static void cleanup(void) { - /* - * print timing status if that option was specified. - * print errno log if that option was specified - */ + close(fd); TEST_CLEANUP; - } diff --git a/testcases/kernel/syscalls/mprotect/mprotect02.c b/testcases/kernel/syscalls/mprotect/mprotect02.c index 0a9492f..afaa5b8 100644 --- a/testcases/kernel/syscalls/mprotect/mprotect02.c +++ b/testcases/kernel/syscalls/mprotect/mprotect02.c @@ -1,26 +1,22 @@ /* + * Copyright (c) International Business Machines Corp., 2001 * - * Copyright (c) International Business Machines Corp., 2001 + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* - * NAME - * mprotect02.c - * * DESCRIPTION * Testcase to check the mprotect(2) system call. * @@ -32,21 +28,9 @@ * Again try to write into the mapped region. * Verify that no SIGSEGV is generated. * - * USAGE: <for command-line> - * mprotect02 [-c n] [-f] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -f : Turn off functionality Testing. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * * HISTORY * 07/2001 Ported by Wayne Boyer * 05/2002 changed over to use tst_sig instead of sigaction - * - * RESTRICTIONS - * None */ #include <sys/mman.h> @@ -66,13 +50,11 @@ static void setup(void); char *TCID = "mprotect02"; int TST_TOTAL = 1; -int fd, status; -char file1[BUFSIZ]; - -char *addr = MAP_FAILED; -char buf[] = "abcdefghijklmnopqrstuvwxyz"; +static int fd, status; +static char file1[BUFSIZ]; -#ifndef UCLINUX +static char *addr = MAP_FAILED; +static char buf[] = "abcdefghijklmnopqrstuvwxyz"; int main(int ac, char **av) { @@ -115,7 +97,7 @@ int main(int ac, char **av) tst_brkm(TBROK | TERRNO, cleanup, "fork #1 failed"); if (pid == 0) { - (void)memcpy(addr, buf, strlen(buf)); + memcpy(addr, buf, strlen(buf)); exit(255); } @@ -149,7 +131,7 @@ int main(int ac, char **av) "fork #2 failed"); if (pid == 0) { - (void)memcpy(addr, buf, strlen(buf)); + memcpy(addr, buf, strlen(buf)); exit(0); } @@ -185,21 +167,12 @@ int main(int ac, char **av) tst_exit(); } -#else - -int main() -{ - tst_brkm(TCONF, NULL, "test not runnable on uClinux"); -} - -#endif /* UCLINUX */ - static void sighandler(int sig) { _exit((sig == SIGSEGV) ? 0 : sig); } -static void setup() +static void setup(void) { tst_sig(FORK, sighandler, cleanup); @@ -210,7 +183,7 @@ static void setup() sprintf(file1, "mprotect02.tmp.%d", getpid()); } -static void cleanup() +static void cleanup(void) { TEST_CLEANUP; diff --git a/testcases/kernel/syscalls/mprotect/mprotect03.c b/testcases/kernel/syscalls/mprotect/mprotect03.c index 0174418..c5898d5 100644 --- a/testcases/kernel/syscalls/mprotect/mprotect03.c +++ b/testcases/kernel/syscalls/mprotect/mprotect03.c @@ -1,20 +1,19 @@ /* + * Copyright (c) International Business Machines Corp., 2001 * - * Copyright (c) International Business Machines Corp., 2001 + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* @@ -34,47 +33,35 @@ * succeeds only when this sigsegv is generated while attempting to * memcpy() on a shared region with only read permission. * - * USAGE: <for command-line> - * mprotect03 [-c n] [-f] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -f : Turn off functionality Testing. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * * HISTORY * 07/2001 Ported by Wayne Boyer * 05/2002 changed over to use tst_sig instead of sigaction - * - * RESTRICTIONS - * None */ #include <errno.h> #include <fcntl.h> #include <sys/mman.h> -#include <limits.h> /* for PAGESIZE */ +#include <limits.h> #include <signal.h> #include <wait.h> #include "test.h" #include "usctest.h" +#include "safe_macros.h" + #ifndef PAGESIZE #define PAGESIZE 4096 #endif #define FAILED 1 -void cleanup(void); -void setup(void); +static void cleanup(void); +static void setup(void); char *TCID = "mprotect03"; int TST_TOTAL = 1; int status; char file1[BUFSIZ]; -#ifndef UCLINUX - int main(int ac, char **av) { int lc; @@ -84,32 +71,26 @@ int main(int ac, char **av) int fd, pid; char *buf = "abcdefghijklmnopqrstuvwxyz"; - if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) { + if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); - } - setup(); /* global setup */ + setup(); - /* The following loop checks looping state if -i option given */ for (lc = 0; TEST_LOOPING(lc); lc++) { - - /* reset tst_count in case we are looping */ tst_count = 0; - if ((fd = open(file1, O_RDWR | O_CREAT, 0777)) < 0) { //mode must be specified when O_CREAT is in the flag + if ((fd = open(file1, O_RDWR | O_CREAT, 0777)) < 0) tst_brkm(TBROK, cleanup, "open failed"); - } - (void)write(fd, buf, strlen(buf)); + SAFE_WRITE(cleanup, 1, fd, buf, strlen(buf)); /* * mmap the PAGESIZE bytes as read only. */ addr = mmap(0, strlen(buf), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (addr < 0) { + if (addr == MAP_FAILED) tst_brkm(TBROK, cleanup, "mmap failed"); - } /* * Try to change the protection to WRITE. @@ -122,16 +103,14 @@ int main(int ac, char **av) tst_brkm(TBROK, cleanup, "fork failed"); } - if (pid == 0) { /* child */ - (void)memcpy((void *)addr, (void *)buf, - strlen(buf)); + if (pid == 0) { + memcpy(addr, buf, strlen(buf)); tst_resm(TINFO, "memcpy() did " "not generate SIGSEGV"); exit(1); } - /* parent */ - (void)waitpid(pid, &status, 0); + waitpid(pid, &status, 0); if (WEXITSTATUS(status) != 0) { tst_resm(TFAIL, "child returned " "unexpected status"); @@ -158,22 +137,12 @@ int main(int ac, char **av) tst_brkm(TBROK, cleanup, "unlink failed"); } } + cleanup(); tst_exit(); - } -#else - -int main() -{ - tst_resm(TINFO, "Ignore this test on uClinux"); - tst_exit(); -} - -#endif /* UCLINUX */ - -void sighandler(int sig) +static void sighandler(int sig) { if (sig == SIGSEGV) { tst_resm(TINFO, "received signal: SIGSEGV"); @@ -182,32 +151,20 @@ void sighandler(int sig) tst_brkm(TBROK, 0, "Unexpected signal %d received.", sig); } -/* - * setup() - performs all ONE TIME setup for this test - */ -void setup() +static void setup(void) { tst_sig(FORK, sighandler, NULL); TEST_PAUSE; - tst_tmpdir(); /* create a temporary directory, cd to it */ + tst_tmpdir(); sprintf(file1, "mprotect03.tmp.%d", getpid()); } -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ -void cleanup() +static void cleanup(void) { - /* - * print timing status if that option was specified. - * print errno log if that option was specified - */ TEST_CLEANUP; tst_rmdir(); - } hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-31 08:37:57
|
The branch, master, has been updated via 0546c995eb9e5e8ba76a9781dd54a940d22b6865 (commit) from 0e335dbed65afb79eab5b30e8d49d8066f165316 (commit) - Log ----------------------------------------------------------------- commit 0546c995eb9e5e8ba76a9781dd54a940d22b6865 Author: DAN LI <li...@cn...> Date: Wed May 29 14:06:31 2013 +0800 su/su01_s1: fix mismatched double quotation marks Expect code * spawn su -c "/bin/su root -c \"echo \"\\\$TEST_LINE > $TEST_ENV_FILE\"\"" will be translated to * spawn su -c /bin/su root -c "echo "\$TEST_LINE > /tmp/TEST_ENV_FILE_ROOT"" which actually should be * spawn su -c /bin/su root -c "echo \$TEST_LINE > /tmp/TEST_ENV_FILE_ROOT" Signed-off-by: DAN LI <li...@cn...> Signed-off-by: Wanlong Gao <gao...@cn...> ----------------------------------------------------------------------- Summary of changes: testcases/commands/su/su01_s1 | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/testcases/commands/su/su01_s1 b/testcases/commands/su/su01_s1 index b50ebdf..fd2e485 100755 --- a/testcases/commands/su/su01_s1 +++ b/testcases/commands/su/su01_s1 @@ -145,7 +145,7 @@ set exit_code [lindex $codes 3] set i_have_env 0 set test_env_var " " if { $i_am_root==1 } { - spawn su -c "/bin/su root -c \"echo \"\\\$TEST_LINE > $TEST_ENV_FILE\"\"" + spawn su -c "/bin/su root -c \"echo \\\$TEST_LINE > $TEST_ENV_FILE\"" expect { "Password:" { send "$PASSWD\r" hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-30 19:38:28
|
The branch, master, has been updated via 0e335dbed65afb79eab5b30e8d49d8066f165316 (commit) from 29d35aee162665c7ac1c4126dbe72bec635b2aa7 (commit) - Log ----------------------------------------------------------------- commit 0e335dbed65afb79eab5b30e8d49d8066f165316 Author: Alexey Kodanev <ale...@or...> Date: Wed May 29 14:28:29 2013 +0400 New core test of cgroups and extended attributes Support of extended attributes in cgroups was added in Linux 3.7. Signed-off-by: Alexey Kodanev <ale...@or...> ----------------------------------------------------------------------- Summary of changes: runtest/controllers | 1 + .../kernel/controllers/cgroup_xattr/.gitignore | 1 + .../cgroup_xattr}/Makefile | 2 +- testcases/kernel/controllers/cgroup_xattr/README | 25 ++ .../kernel/controllers/cgroup_xattr/cgroup_xattr.c | 435 ++++++++++++++++++++ 5 files changed, 463 insertions(+), 1 deletions(-) create mode 100644 testcases/kernel/controllers/cgroup_xattr/.gitignore copy testcases/kernel/{security/prot_hsymlinks => controllers/cgroup_xattr}/Makefile (99%) create mode 100644 testcases/kernel/controllers/cgroup_xattr/README create mode 100644 testcases/kernel/controllers/cgroup_xattr/cgroup_xattr.c diff --git a/runtest/controllers b/runtest/controllers index b78d828..94fc185 100644 --- a/runtest/controllers +++ b/runtest/controllers @@ -12,3 +12,4 @@ memcg_stress memcg_stress_test.sh memcg_control PAGESIZE=$(mem_process -p);memcg_control_test.sh $PAGESIZE $PAGESIZE $((PAGESIZE * 2)) cgroup_fj run_cgroup_test_fj.sh controllers test_controllers.sh +cgroup_xattr cgroup_xattr diff --git a/testcases/kernel/controllers/cgroup_xattr/.gitignore b/testcases/kernel/controllers/cgroup_xattr/.gitignore new file mode 100644 index 0000000..3664cc9 --- /dev/null +++ b/testcases/kernel/controllers/cgroup_xattr/.gitignore @@ -0,0 +1 @@ +/cgroup_xattr diff --git a/testcases/kernel/security/prot_hsymlinks/Makefile b/testcases/kernel/controllers/cgroup_xattr/Makefile similarity index 99% copy from testcases/kernel/security/prot_hsymlinks/Makefile copy to testcases/kernel/controllers/cgroup_xattr/Makefile index cd49588..2d75069 100644 --- a/testcases/kernel/security/prot_hsymlinks/Makefile +++ b/testcases/kernel/controllers/cgroup_xattr/Makefile @@ -11,7 +11,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA top_srcdir ?= ../../../.. diff --git a/testcases/kernel/controllers/cgroup_xattr/README b/testcases/kernel/controllers/cgroup_xattr/README new file mode 100644 index 0000000..5aff0a8 --- /dev/null +++ b/testcases/kernel/controllers/cgroup_xattr/README @@ -0,0 +1,25 @@ +TEST SUITE: + +The directory cgroup_xattr contains the tests related to extended +attributes in cgroup filesystem. + +WARNING: + +This test can cause a kernel panic due to a bug in kernels prior to 3.8. +It was fixed by kernel upstream commit +712317ad97f41e738e1a19aa0a6392a78a84094e: + +"We should store file xattrs in struct cfent instead of struct cftype, +because cftype is a type while cfent is object instance of cftype." + +TESTS AIM: + +The aim of the tests is to check the extended attributes in cgroup +filesystem. This feature was added in Linux 3.7 to allow attaching runtime +meta information to cgroups and everything they model (services, apps, vms) +and can easily be shared among applications. + +Test mounts as many subsystems as possible (cpu, cpuset, ...) in the +cgroup tmp directory and creates one more hierarchy. Then sets extended +attributes to all files in cgroup fs and subsequently reads the file's +extended attributes back, checking values during the process. diff --git a/testcases/kernel/controllers/cgroup_xattr/cgroup_xattr.c b/testcases/kernel/controllers/cgroup_xattr/cgroup_xattr.c new file mode 100644 index 0000000..20473d4 --- /dev/null +++ b/testcases/kernel/controllers/cgroup_xattr/cgroup_xattr.c @@ -0,0 +1,435 @@ +/* + * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: + * Alexey Kodanev <ale...@or...> + * + * Test checks following preconditions: + * since Linux kernel 3.7 it is possible to set extended attributes + * to cgroup files. + */ + +#include <sys/stat.h> +#include <sys/mount.h> +#include <sys/types.h> +#include <sys/xattr.h> +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <dirent.h> +#include <unistd.h> +#include <string.h> +#include <errno.h> + +#include "test.h" +#include "usctest.h" +#include "safe_macros.h" + +char *TCID = "cgroup_xattr"; + +static const char subdir_name[] = "test"; + +#define MAX_SUBSYS 16 +#define MAX_OPTIONS_LEN 256 +#define MAX_DIR_NAME 64 + +/* struct to store available mount options */ +struct cgrp_option { + char str[MAX_OPTIONS_LEN]; + char dir[MAX_DIR_NAME]; + int hier; + int mounted; + int subdir; +}; +static struct cgrp_option cgrp_opt[MAX_SUBSYS]; +static int cgrp_opt_num; + +struct tst_key { + const char *name; + int good; +}; + +/* only security.* & trusted.* are valid key names */ +static const struct tst_key tkeys[] = { + { .name = "trusted.test", .good = 1, }, + { .name = "security.", .good = 1, }, + { .name = "user.", .good = 0, }, + { .name = "system.", .good = 0, }, +}; + +#define DEFAULT_VALUE_SIZE 8 + +/* struct to store key's value */ +struct tst_val { + char *buf; + size_t size; +}; +static struct tst_val val; + +/* it fills value's buffer */ +static char id; + +/* + * When test breaks, all open dirs should be closed + * otherwise umount won't succeed + */ +#define MAX_OPEN_DIR 32 +static DIR *odir[MAX_OPEN_DIR]; +static int odir_num; + +/* test options */ +static char *narg; +static int nflag; +static int skip_cleanup; +static int verbose; +static const option_t options[] = { + {"n:", &nflag, &narg}, + {"s", &skip_cleanup, NULL}, + {"v", &verbose, NULL}, + {NULL, NULL, NULL} +}; + +static void help(void); +static void setup(int argc, char *argv[]); +static void test_run(void); +static void cleanup(void); + +static int mount_cgroup(void); +static int set_xattrs(const char *file); +static int get_xattrs(const char *file); +/* + * set or get xattr recursively + * + * @path: start directory + * @xattr_operation: can be set_xattrs() or get_xattrs() + */ +static int cgrp_files_walking(const char *path, + int (*xattr_operation)(const char *)); + +int main(int argc, char *argv[]) +{ + setup(argc, argv); + + test_run(); + + cleanup(); + + tst_exit(); +} + +static void help(void) +{ + printf(" -n x Write x bytes to xattr value, default is %d\n", + DEFAULT_VALUE_SIZE); + printf(" -s Skip cleanup\n"); + printf(" -v Verbose\n"); +} + +void setup(int argc, char *argv[]) +{ + char *msg; + msg = parse_opts(argc, argv, options, help); + if (msg != NULL) + tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); + + tst_require_root(NULL); + + if (access("/proc/cgroups", F_OK) == -1) + tst_brkm(TCONF, NULL, "Kernel doesn't support cgroups"); + + if (tst_kvercmp(3, 7, 0) < 0) { + tst_brkm(TCONF, NULL, + "Test must be run with kernel 3.7 or newer"); + } + + int value_size = DEFAULT_VALUE_SIZE; + if (nflag) { + if (sscanf(narg, "%i", &value_size) != 1) + tst_brkm(TBROK, NULL, "-n option arg is not a number"); + if (value_size <= 0) + tst_brkm(TBROK, NULL, "-n option arg is less than 1"); + } + + /* initialize test value */ + val.size = value_size; + val.buf = SAFE_MALLOC(NULL, value_size); + + tst_sig(FORK, DEF_HANDLER, cleanup); + + tst_tmpdir(); + + if (!mount_cgroup()) + tst_brkm(TCONF, cleanup, "Nothing mounted"); +} + +static void test_run(void) +{ + int i, set_res = 0, get_res = 0; + + for (i = 0; i < cgrp_opt_num; ++i) { + if (!cgrp_opt[i].mounted) + continue; + + SAFE_CHDIR(cleanup, cgrp_opt[i].dir); + /* reset value */ + id = 0; + /* set xattr to each file in cgroup fs */ + set_res |= cgrp_files_walking(".", set_xattrs); + + id = 0; + /* get & check xattr */ + get_res |= cgrp_files_walking(".", get_xattrs); + SAFE_CHDIR(cleanup, ".."); + } + + /* final results */ + tst_resm(TINFO, "All test-cases have been completed, summary:"); + tst_resm(TINFO, "Set tests result: %s", (set_res) ? "FAIL" : "PASS"); + tst_resm(TINFO, "Get tests result: %s", (get_res) ? "FAIL" : "PASS"); +} + +static void cleanup(void) +{ + if (val.buf != NULL) + free(val.buf); + + if (skip_cleanup) + return; + + /* + * Kernels 3.7 can crash while unmounting cgroups with xattr, + * call tst_flush() to make sure all buffered data written + * before it happens + */ + tst_flush(); + + int i; + for (i = 0; i < odir_num; ++i) { + if (closedir(odir[i]) == -1) + tst_brkm(TBROK, NULL, "Failed to close dir\n"); + } + + char *cwd = get_tst_tmpdir(); + SAFE_CHDIR(NULL, cwd); + free(cwd); + + for (i = 0; i < cgrp_opt_num; ++i) { + if (cgrp_opt[i].subdir) { + SAFE_CHDIR(NULL, cgrp_opt[i].dir); + if (rmdir(subdir_name) == -1) { + tst_brkm(TBROK | TERRNO, NULL, + "Can't remove dir"); + } + SAFE_CHDIR(NULL, ".."); + } + if (cgrp_opt[i].mounted) { + if (umount(cgrp_opt[i].dir) == -1) { + tst_brkm(TBROK | TERRNO, NULL, + "Can't unmount: %s", cgrp_opt[i].dir); + } + } + } + + tst_rmdir(); + TEST_CLEANUP; +} + +int mount_cgroup(void) +{ + FILE *fd = fopen("/proc/cgroups", "r"); + if (fd == NULL) + tst_brkm(TBROK, cleanup, "Failed to read /proc/cgroups"); + char str[MAX_DIR_NAME], name[MAX_DIR_NAME]; + int hier = 0, num = 0, enabled = 0, first = 1; + /* make mount options */ + while ((fgets(str, MAX_DIR_NAME, fd)) != NULL) { + /* skip first line */ + if (first) { + first = 0; + continue; + } + if (sscanf(str, "%s\t%d\t%d\t%d", + name, &hier, &num, &enabled) != 4) + tst_brkm(TBROK, cleanup, "Can't parse /proc/cgroups"); + if (!enabled) + continue; + + /* BUG WORKAROUND + * Only mount those subsystems, which are not mounted yet. + * It's a workaround to a bug when mount doesn't return any err + * code while mounting already mounted subsystems, but with + * additional "xattr" option. In that case, mount will succeed, + * but xattr won't be supported in the new mount anyway. + * Should be removed as soon as a fix committed to upstream. + */ + if (hier != 0) + continue; + + int i, found = 0; + for (i = 0; i < cgrp_opt_num; ++i) { + if (cgrp_opt[i].hier == hier) { + found = 1; + break; + } + } + if (!found) { + i = cgrp_opt_num++; + cgrp_opt[i].hier = hier; + } + char *str = cgrp_opt[i].str; + if (str[0] == '\0') + strcpy(str, "xattr"); + snprintf(str + strlen(str), MAX_OPTIONS_LEN - strlen(str), + ",%s", name); + } + fclose(fd); + + int i, any_mounted = 0; + for (i = 0; i < cgrp_opt_num; ++i) { + char dir[MAX_DIR_NAME]; + struct cgrp_option *opt = &cgrp_opt[i]; + tst_resm(TINFO, "mount options %d: %s (hier = %d)", + i, opt->str, opt->hier); + snprintf(opt->dir, MAX_DIR_NAME, "cgx_%d", opt->hier); + SAFE_MKDIR(cleanup, opt->dir, 0755); + + if (mount(opt->dir, opt->dir, "cgroup", 0, opt->str) == -1) { + tst_resm(TINFO, "Can't mount: %s", dir); + continue; + } + + any_mounted = 1; + opt->mounted = 1; + + /* create new hierarchy */ + SAFE_CHDIR(cleanup, opt->dir); + SAFE_MKDIR(cleanup, subdir_name, 0755); + opt->subdir = 1; + SAFE_CHDIR(cleanup, ".."); + } + return any_mounted; +} + +static int set_xattrs(const char *file) +{ + int i, err, fail, res = 0; + + for (i = 0; i < ARRAY_SIZE(tkeys); ++i) { + err = setxattr(file, tkeys[i].name, + (const void *)val.buf, val.size, 0) == -1; + + fail = err && tkeys[i].good; + res |= fail; + + tst_resm((fail) ? TFAIL : TPASS, + "Expect: %s set xattr key '%s' to file '%s'", + (tkeys[i].good) ? "can" : "can't", + tkeys[i].name, file); + + if (verbose && tkeys[i].good) + tst_resm_hexd(TINFO, val.buf, val.size, "value:"); + } + return res; +} + +static int get_xattrs(const char *file) +{ + int i, fail, res = 0; + + for (i = 0; i < ARRAY_SIZE(tkeys); ++i) { + /* get value size */ + ssize_t size = getxattr(file, tkeys[i].name, NULL, 0); + fail = (size == -1 && tkeys[i].good); + res |= fail; + + tst_resm((fail) ? TFAIL : TPASS, + "Expect: %s read xattr %s of file '%s'", + (tkeys[i].good) ? "can" : "can't", + tkeys[i].name, file); + + if (fail || size == -1) + continue; + + /* get xattr value */ + char xval[size]; + if (getxattr(file, tkeys[i].name, xval, size) == -1) { + tst_brkm(TBROK, cleanup, + "Can't get buffer of key %s", + tkeys[i].name); + } + fail = val.size != size || + strncmp(val.buf, xval, val.size) != 0; + res |= fail; + + tst_resm((fail) ? TFAIL : TPASS, "Expect: values equal"); + + if (verbose && fail) { + tst_resm_hexd(TINFO, xval, size, + "Read xattr value:"); + tst_resm_hexd(TINFO, val.buf, val.size, + "Expect xattr value:"); + } + } + return res; +} + +static int cgrp_files_walking(const char *path, + int (*xattr_operation)(const char *)) +{ + int res = 0; + struct dirent *entry; + DIR *dir = opendir(path); + + odir[odir_num] = dir; + if (++odir_num >= MAX_OPEN_DIR) { + tst_brkm(TBROK, cleanup, + "Unexpected num of open dirs, max: %d", MAX_OPEN_DIR); + } + + SAFE_CHDIR(cleanup, path); + + tst_resm(TINFO, "In dir %s", path); + + errno = 0; + while ((entry = readdir(dir)) != NULL) { + const char *file = entry->d_name; + /* skip current and up directories */ + if (!strcmp(file, "..") || !strcmp(file, ".")) + continue; + struct stat stat_buf; + TEST(lstat(file, &stat_buf)); + if (TEST_RETURN != -1 && S_ISDIR(stat_buf.st_mode)) { + /* proceed to subdir */ + res |= cgrp_files_walking(file, xattr_operation); + tst_resm(TINFO, "In dir %s", path); + } + memset(val.buf, id++, val.size); + res |= xattr_operation(file); + errno = 0; + } + if (errno && !entry) { + tst_brkm(TWARN | TERRNO, cleanup, + "Error while reading dir '%s'", path); + } + if (closedir(dir) == -1) + tst_brkm(TWARN, cleanup, "Failed to close dir '%s'", path); + else + odir[--odir_num] = NULL; + + if (strcmp(path, ".")) + SAFE_CHDIR(cleanup, ".."); + return res; +} hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-28 08:37:46
|
The branch, master, has been updated via 29d35aee162665c7ac1c4126dbe72bec635b2aa7 (commit) from 9187c0a00bcb76574dde453beddc6f62ddfcc9ce (commit) - Log ----------------------------------------------------------------- commit 29d35aee162665c7ac1c4126dbe72bec635b2aa7 Author: Shuang Qiu <shu...@or...> Date: Tue May 28 11:42:08 2013 +0800 mmapstress10:Close the file descriptor It does not close the file descriptor before return 1 in fileokey() function which may cause the following warning with nfs as TMPDIR: 0 TWARN : tst_rmdir: rmobj(/mnt/nfsv3/ltp-SDrfq17456/mmaq7TOqt) failed: unlink(/mnt/nfsv3/ltp-SDrfq17456/mmaq7TOqt/.nfs000000000110cb3600000004) failed; errno=16: Device or resource busy Signed-off-by: Shuang Qiu <shu...@or...> Reviewed-by: Jan Stancek <jst...@re...> Signed-off-by: Wanlong Gao <gao...@cn...> ----------------------------------------------------------------------- Summary of changes: testcases/kernel/mem/mmapstress/mmapstress10.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/testcases/kernel/mem/mmapstress/mmapstress10.c b/testcases/kernel/mem/mmapstress/mmapstress10.c index baddaff..8ee7c87 100644 --- a/testcases/kernel/mem/mmapstress/mmapstress10.c +++ b/testcases/kernel/mem/mmapstress/mmapstress10.c @@ -876,6 +876,7 @@ int fileokay(char *file, uchar_t * expbuf) } } + close(fd); return 1; } hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-28 07:37:55
|
The branch, master, has been updated via 9187c0a00bcb76574dde453beddc6f62ddfcc9ce (commit) via 2990b7c091f8f9b7db1df6b391049f961b08156c (commit) from c520500225018c545bb23c9a4e2f514f26cf47f0 (commit) - Log ----------------------------------------------------------------- commit 9187c0a00bcb76574dde453beddc6f62ddfcc9ce Author: Jan Stancek <jst...@re...> Date: Thu May 16 12:09:34 2013 +0200 waitid02: split code into separate testcases Previous code in main was: - using sleep for synchronization The sleep make take longer if run in overcommitted z/VM environment with considerably high steal time, which causes testcase to hang. - missing wait for last child This patch splits code from main() into separate testcases, each with its own setup/cleanup and expected outcome. Signed-off-by: Jan Stancek <jst...@re...> Acked-by: Wanlong Gao <gao...@cn...> Acked-By: Cyril Hrubis <ch...@su...> commit 2990b7c091f8f9b7db1df6b391049f961b08156c Author: Jan Stancek <jst...@re...> Date: Thu May 16 12:07:56 2013 +0200 waitid02: cleanup Remove useless comments, convert spaces to tabs and fix long lines. Signed-off-by: Jan Stancek <jst...@re...> ----------------------------------------------------------------------- Summary of changes: testcases/kernel/syscalls/waitid/waitid02.c | 389 +++++++++++++++------------ 1 files changed, 218 insertions(+), 171 deletions(-) diff --git a/testcases/kernel/syscalls/waitid/waitid02.c b/testcases/kernel/syscalls/waitid/waitid02.c index 98bf3ea..d4806b4 100644 --- a/testcases/kernel/syscalls/waitid/waitid02.c +++ b/testcases/kernel/syscalls/waitid/waitid02.c @@ -11,9 +11,9 @@ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ /* the GNU General Public License for more details. */ /* */ -/* You should have received a copy of the GNU General Public License */ -/* along with this program; if not, write to the Free Software */ -/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +/* You should have received a copy of the GNU General Public License along */ +/* with this program; if not, write to the Free Software Foundation, Inc., */ +/* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* */ /******************************************************************************/ /******************************************************************************/ @@ -50,71 +50,234 @@ #include "usctest.h" #include "linux_syscall_numbers.h" +struct testcase_t { + const char *msg; + idtype_t idtype; + id_t id; + pid_t child; + int options; + int exp_ret; + int exp_errno; + void (*setup) (struct testcase_t *); + void (*cleanup) (struct testcase_t *); +}; + +static void setup(void); +static void cleanup(void); + +static void setup2(struct testcase_t *); +static void setup3(struct testcase_t *); +static void setup4(struct testcase_t *); +static void setup5(struct testcase_t *); +static void setup6(struct testcase_t *); +static void cleanup2(struct testcase_t *); +static void cleanup5(struct testcase_t *); +static void cleanup6(struct testcase_t *); + +struct testcase_t tdat[] = { + { + .msg = "WNOHANG", + .idtype = P_ALL, + .id = 0, + .options = WNOHANG, + .exp_ret = -1, + .exp_errno = EINVAL, + }, + { + .msg = "WNOHANG | WEXITED no child", + .idtype = P_ALL, + .id = 0, + .options = WNOHANG | WEXITED, + .exp_ret = -1, + .exp_errno = ECHILD, + }, + { + .msg = "WNOHANG | WEXITED with child", + .idtype = P_ALL, + .id = 0, + .options = WNOHANG | WEXITED, + .exp_ret = 0, + .setup = setup2, + .cleanup = cleanup2 + }, + { + .msg = "P_PGID, WEXITED wait for child", + .idtype = P_PGID, + .options = WEXITED, + .exp_ret = 0, + .setup = setup3, + }, + { + .msg = "P_PID, WEXITED wait for child", + .idtype = P_PID, + .options = WEXITED, + .exp_ret = 0, + .setup = setup4, + }, + { + .msg = "P_PID, WSTOPPED | WNOWAIT", + .idtype = P_PID, + .options = WSTOPPED | WNOWAIT, + .exp_ret = 0, + .setup = setup5, + .cleanup = cleanup5 + }, + { + .msg = "P_PID, WCONTINUED", + .idtype = P_PID, + .options = WCONTINUED, + .exp_ret = 0, + .setup = setup6, + .cleanup = cleanup6 + }, + +}; + char *TCID = "waitid02"; -int testno; -int TST_TOTAL = 4; +static int TST_TOTAL = ARRAY_SIZE(tdat); +static struct tst_checkpoint checkpoint; -/* Extern Global Functions */ -/******************************************************************************/ -/* */ -/* Function: cleanup */ -/* */ -/* Description: Performs all one time clean up for this test on successful */ -/* completion, premature exit or failure. Closes all temporary */ -/* files, removes all temporary directories exits the test with */ -/* appropriate return code by calling tst_exit() function. */ -/* */ -/* Input: None. */ -/* */ -/* Output: None. */ -/* */ -/* Return: On failure - Exits calling tst_exit(). Non '0' return code. */ -/* On success - Exits calling tst_exit(). With '0' return code. */ -/* */ -/******************************************************************************/ -extern void cleanup() +static void makechild(struct testcase_t *t, void (*childfn)(void)) { + t->child = fork(); + switch (t->child) { + case -1: + tst_brkm(TBROK | TERRNO, cleanup, "fork"); + break; + case 0: + childfn(); + exit(0); + } +} - TEST_CLEANUP; - tst_rmdir(); +static void wait4child(pid_t pid) +{ + int status; + if (waitpid(pid, &status, 0) == -1) + tst_brkm(TBROK | TERRNO, cleanup, "waitpid"); + if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) + tst_resm(TFAIL, "child returns %d", status); +} - tst_exit(); +static void dummy_child(void) +{ } -/* Local Functions */ -/******************************************************************************/ -/* */ -/* Function: setup */ -/* */ -/* Description: Performs all one time setup for this test. This function is */ -/* typically used to capture signals, create temporary dirs */ -/* and temporary files that may be used in the course of this */ -/* test. */ -/* */ -/* Input: None. */ -/* */ -/* Output: None. */ -/* */ -/* Return: On failure - Exits by calling cleanup(). */ -/* On success - returns 0. */ -/* */ -/******************************************************************************/ -void setup() +static void waiting_child(void) +{ + TST_CHECKPOINT_CHILD_WAIT(&checkpoint); +} + +static void stopped_child(void) +{ + kill(getpid(), SIGSTOP); + TST_CHECKPOINT_CHILD_WAIT(&checkpoint); +} + +static void setup2(struct testcase_t *t) +{ + makechild(t, waiting_child); +} + +static void cleanup2(struct testcase_t *t) +{ + TST_CHECKPOINT_SIGNAL_CHILD(cleanup, &checkpoint); + wait4child(t->child); +} + +static void setup3(struct testcase_t *t) +{ + t->id = getpgid(0); + makechild(t, dummy_child); +} + +static void setup4(struct testcase_t *t) +{ + makechild(t, dummy_child); + t->id = t->child; +} + +static void setup5(struct testcase_t *t) +{ + makechild(t, stopped_child); + t->id = t->child; +} + +static void cleanup5(struct testcase_t *t) +{ + kill(t->child, SIGCONT); + TST_CHECKPOINT_SIGNAL_CHILD(cleanup, &checkpoint); + wait4child(t->child); +} + +static void setup6(struct testcase_t *t) +{ + siginfo_t infop; + makechild(t, stopped_child); + t->id = t->child; + if (waitid(P_PID, t->child, &infop, WSTOPPED) != 0) + tst_brkm(TBROK | TERRNO, cleanup, "waitpid setup6"); + kill(t->child, SIGCONT); +} + +static void cleanup6(struct testcase_t *t) +{ + TST_CHECKPOINT_SIGNAL_CHILD(cleanup, &checkpoint); + wait4child(t->child); +} + +static void setup(void) { - /* Capture signals if any */ - /* Create temporary directories */ TEST_PAUSE; tst_tmpdir(); + TST_CHECKPOINT_INIT(&checkpoint); } -int main(int ac, char **av) +static void cleanup(void) +{ + TEST_CLEANUP; + tst_rmdir(); + tst_exit(); +} + +static void test_waitid(struct testcase_t *t) { - id_t pgid; - id_t id1, id2, id3; siginfo_t infop; - int i = 0; - int lc; + if (t->setup) + t->setup(t); + + tst_resm(TINFO, "%s", t->msg); + tst_resm(TINFO, "(%d) waitid(%d, %d, %p, %d)", getpid(), t->idtype, + t->id, &infop, t->options); + memset(&infop, 0, sizeof(infop)); + + TEST(waitid(t->idtype, t->id, &infop, t->options)); + if (TEST_RETURN == t->exp_ret) { + if (TEST_RETURN == -1) { + if (TEST_ERRNO == t->exp_errno) + tst_resm(TPASS, "exp_errno=%d", t->exp_errno); + else + tst_resm(TFAIL|TTERRNO, "exp_errno=%d", + t->exp_errno); + } else { + tst_resm(TPASS, "ret: %d", t->exp_ret); + } + } else { + tst_resm(TFAIL|TTERRNO, "ret=%ld expected=%d", + TEST_RETURN, t->exp_ret); + } + tst_resm(TINFO, "si_pid = %d ; si_code = %d ; si_status = %d", + infop.si_pid, infop.si_code, + infop.si_status); + + if (t->cleanup) + t->cleanup(t); +} + +int main(int ac, char **av) +{ + int lc, testno; char *msg; msg = parse_opts(ac, av, NULL, NULL); @@ -124,125 +287,9 @@ int main(int ac, char **av) } setup(); - for (lc = 0; TEST_LOOPING(lc); ++lc) { - tst_count = 0; - for (testno = 0; testno < TST_TOTAL; ++testno) { - - TEST(waitid(P_ALL, 0, &infop, WNOHANG)); - if (TEST_RETURN == -1) - tst_resm(TPASS, - "Success1 ... -1 is returned. error is %d.", - TEST_ERRNO); - else { - tst_resm(TFAIL, "%s Failed1 ...", TCID); - } - - /* option == WEXITED | WCONTINUED | WSTOPPED | WNOHANG | WNOWAIT */ - - TEST(id1 = fork()); - if (TEST_RETURN == 0) { - tst_resm(TINFO, - "I'm a child 1,my id is %d,gpid is %d", - id1 = getpid(), __getpgid(0)); - sleep(1); - exit(5); - } - - TEST(id2 = fork()); - if (TEST_RETURN == 0) { - sleep(3); - tst_resm(TINFO, - "I'm a child 2,my id is %d,gpid is %d", - id2 = getpid(), __getpgid(0)); - exit(7); - } - - TEST(id3 = fork()); - if (TEST_RETURN == 0) { - sleep(2); - TEST(kill(id2, SIGCONT)); - tst_resm(TINFO, - "I'm a child 3,my id is %d,gpid is %d", - id3 = getpid(), __getpgid(0)); - exit(6); - } - - TEST(waitid(P_ALL, 0, &infop, WNOHANG | WEXITED)); - if (TEST_RETURN == 0) - tst_resm(TPASS, - "Success 2 ...0 is returned.. error is %d.", - TEST_ERRNO); - else { - tst_resm(TFAIL | TTERRNO, "%s Failed 2", TCID); - tst_exit(); - } - - tst_resm(TINFO, "I'm a Parent,my id is %d,gpid is %d", - getpid(), pgid = __getpgid(0)); - - TEST(waitid(P_PGID, pgid, &infop, WEXITED)); - if (TEST_RETURN == 0) { - tst_resm(TPASS, "Success3 ... 0 is returned."); - tst_resm(TINFO, - "si_pid = %d ; si_code = %d ; si_status = %d", - infop.si_pid, infop.si_code, - infop.si_status); - } else { - tst_resm(TFAIL | TTERRNO, - "Fail3 ... %ld is returned", - TEST_RETURN); - tst_exit(); - } - - TEST(kill(id2, SIGSTOP)); - - TEST(i = - waitid(P_PID, id2, &infop, WSTOPPED | WNOWAIT)); - if (TEST_RETURN == 0) { - /*EINVAL*/ - tst_resm(TINFO, - "si_pid = %d, si_code = %d, si_status = %d", - infop.si_pid, infop.si_code, - infop.si_status); - tst_resm(TPASS, "Success4 ... 0 is returned"); - } else { - tst_resm(TFAIL | TTERRNO, - "Fail4 ... %d is returned", i); - tst_exit(); - } - - TEST(waitid(P_PID, id3, &infop, WEXITED)); - if (TEST_RETURN == 0) { - /*NOCHILD*/ - tst_resm(TINFO, - "si_pid = %d, si_code = %d, si_status = %d", - infop.si_pid, infop.si_code, - infop.si_status); - tst_resm(TPASS, "Success5 ... 0 is returned"); - } else { - tst_resm(TFAIL | TTERRNO, - "Fail5 ... %ld is returned", - TEST_RETURN); - tst_exit(); - } - - TEST(i = waitid(P_PID, id2, &infop, WCONTINUED)); - if (TEST_RETURN == 0) { - /*EINVAL*/ - tst_resm(TINFO, - "si_pid = %d, si_code = %d, si_status = %d", - infop.si_pid, infop.si_code, - infop.si_status); - tst_resm(TPASS, "Success6 ... 0 is returned"); - } else { - tst_resm(TFAIL | TTERRNO, - "Fail6 ... %d is returned", i); - tst_exit(); - } - - sleep(3); - } + for (testno = 0; testno < TST_TOTAL; testno++) + test_waitid(&tdat[testno]); } cleanup(); tst_exit(); hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-27 12:21:08
|
The branch, master, has been updated via c520500225018c545bb23c9a4e2f514f26cf47f0 (commit) from c055410d2cc0cb94a017da82f6db3d726870432d (commit) - Log ----------------------------------------------------------------- commit c520500225018c545bb23c9a4e2f514f26cf47f0 Author: Cyril Hrubis <ch...@su...> Date: Mon May 27 14:00:27 2013 +0200 openposix: generate-makefiles.sh: Fix buildonly tests. The buildonly tests were not compiled due to mistake in the generate-makefiles script. Sorry. Signed-off-by: Cyril Hrubis <ch...@su...> ----------------------------------------------------------------------- Summary of changes: .../scripts/generate-makefiles.sh | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-) diff --git a/testcases/open_posix_testsuite/scripts/generate-makefiles.sh b/testcases/open_posix_testsuite/scripts/generate-makefiles.sh index 9c758d2..b933033 100755 --- a/testcases/open_posix_testsuite/scripts/generate-makefiles.sh +++ b/testcases/open_posix_testsuite/scripts/generate-makefiles.sh @@ -36,6 +36,7 @@ generate_makefile() { local make_copy_prereq_cache= local prereq_cache= local tests= + local targets= local makefile=$1 local prereq_dir=$2 @@ -64,6 +65,15 @@ generate_makefile() { fi # Stuff that needs to be compiled. + if echo "$prereq" | grep -Eq '\.(run-test|sh|test)'; then + if [ "$targets" != "" ]; then + targets="$targets " + fi + + targets="$targets${test_prefix}_$prereq" + fi + + # Cache for generating compile rules. case "$prereq" in *.sh) # Note that the sh scripts are copied later in order to @@ -138,7 +148,7 @@ EOF cat >> "$makefile.2" <<EOF INSTALL_TARGETS+= ${tests} -MAKE_TARGETS+= ${tests} +MAKE_TARGETS+= ${targets} EOF hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-27 08:25:04
|
The branch, master, has been updated via c055410d2cc0cb94a017da82f6db3d726870432d (commit) from ee47b99be3086043f981ca82343dede3c19c8c67 (commit) - Log ----------------------------------------------------------------- commit c055410d2cc0cb94a017da82f6db3d726870432d Author: Shuang Qiu <shu...@or...> Date: Mon May 27 14:29:42 2013 +0800 Unmap the mapped address region It does not unmap the mapped address region,so we sometimes still get such warning when cleanup with nfs as TMPDIR although the file descriptor is closed: 0 TWARN : tst_rmdir: rmobj(/mnt/nfsv3/ltp-MOeIFH7102/vma4FwRqb) failed: unlink(/mnt/nfsv3/ltp-MOeIFH7102/vma4FwRqb/.nfs000000000110cb3600000001) failed; errno=16: Device or resource busy Signed-off-by: Shuang Qiu <shu...@or...> Reviewed-by: Jan Stancek <jst...@re...> Signed-off-by: Wanlong Gao <gao...@cn...> ----------------------------------------------------------------------- Summary of changes: hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-24 13:21:24
|
The branch, master, has been updated via ee47b99be3086043f981ca82343dede3c19c8c67 (commit) via 7ea4978ee0499761f9a7438fd0f924cff7f29f98 (commit) from 7053c3bf279750da4e9e4bb14006fc0edafccd3e (commit) - Log ----------------------------------------------------------------- commit ee47b99be3086043f981ca82343dede3c19c8c67 Author: DAN LI <li...@cn...> Date: Fri May 24 17:50:07 2013 +0800 shmctl/shmctl01.c: Test features IPC_INFO, SHM_STAT, SHM_LOCK and SHM_UNLOCK. Additional tests for features IPC_INFO, SHM_STAT, SHM_LOCK and SHM_UNLOCK. Signed-off-by: DAN LI <li...@cn...> Reviewed-by: Jan Stancek <jst...@re...> Signed-off-by: Wanlong Gao <gao...@cn...> commit 7ea4978ee0499761f9a7438fd0f924cff7f29f98 Author: DAN LI <li...@cn...> Date: Thu May 23 16:35:57 2013 +0800 shmctl/shmctl01.c: cleanup 1. Remove useless comments 2. Revise code to follow ltp-code-style Signed-off-by: DAN LI <li...@cn...> Reviewed-by: Jan Stancek <jst...@re...> Signed-off-by: Wanlong Gao <gao...@cn...> ----------------------------------------------------------------------- Summary of changes: testcases/kernel/syscalls/ipc/shmctl/shmctl01.c | 298 ++++++++++++----------- 1 files changed, 150 insertions(+), 148 deletions(-) diff --git a/testcases/kernel/syscalls/ipc/shmctl/shmctl01.c b/testcases/kernel/syscalls/ipc/shmctl/shmctl01.c index 4a1b064..cba1a1d 100644 --- a/testcases/kernel/syscalls/ipc/shmctl/shmctl01.c +++ b/testcases/kernel/syscalls/ipc/shmctl/shmctl01.c @@ -1,20 +1,19 @@ /* + * Copyright (c) International Business Machines Corp., 2001 * - * Copyright (c) International Business Machines Corp., 2001 + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* @@ -35,91 +34,90 @@ * otherwise, * if doing functionality testing * call the correct test function - * if the conditions are correct, + * if the conditions are correct, * issue a PASS message * otherwise * issue a FAIL message * otherwise * issue a PASS message * call cleanup - * - * USAGE: <for command-line> - * shmctl01 [-c n] [-f] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -f : Turn off functionality Testing. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * 02/04/2008 Renaud Lottiaux (Ren...@ke...) - * - Fix concurrency issue. Replace the sleep used for synchronization - * with the new pipe based synchronization functions. - * - * RESTRICTIONS - * none */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif #include "ipcshm.h" #include "libtestsuite.h" char *TCID = "shmctl01"; -int shm_id_1 = -1; -struct shmid_ds buf; -long save_time; +static int shm_id_1 = -1; +static int shm_index; +static struct shmid_ds buf; +static struct shminfo info; +static long save_time; #define FIRST 0 #define SECOND 1 -int stat_time; /* set to either FIRST or SECOND for IPC_STAT tests */ +static int stat_time; -void *set_shared; +static void *set_shared; #define N_ATTACH 4 -pid_t pid_arr[N_ATTACH]; -int sync_pipes[2]; - -/* - * These are the various setup and check functions for the commands - * that we are checking. - */ +static pid_t pid_arr[N_ATTACH]; +static int sync_pipes[2]; /* Setup, cleanup and check routines for IPC_STAT */ -void stat_setup(void), func_stat(void); -void stat_cleanup(void); +static void stat_setup(void), func_istat(int ret); +static void stat_cleanup(void); /* Setup and check routines for IPC_SET */ -void set_setup(void), func_set(void); +static void set_setup(void), func_set(int ret); + +/* Check routine for IPC_INFO */ +static void func_info(int ret); + +/* Check routine for SHM_STAT */ +static void func_sstat(int ret); + +/* Check routine for SHM_LOCK */ +static void func_lock(int ret); + +/* Check routine for SHM_UNLOCK */ +static void func_unlock(int ret); /* Check routine for IPC_RMID */ -void func_rmid(void); +static void func_rmid(int ret); /* Child function */ -void do_child(void); - -struct test_case_t { - int cmd; /* the command to test */ - void (*func_test) (); /* the test function */ - void (*func_setup) (); /* the setup function if necessary */ +static void do_child(void); + +static struct test_case_t { + int *shmid; + int cmd; + struct shmid_ds *arg; + void (*func_test) (int); + void (*func_setup) (void); } TC[] = { - - { - IPC_STAT, func_stat, stat_setup}, + {&shm_id_1, IPC_STAT, &buf, func_istat, stat_setup}, #ifndef UCLINUX - /* The second test is not applicable to uClinux; shared memory segments - are detached on exec(), so cannot be passed to uClinux children. */ - { - IPC_STAT, func_stat, stat_setup}, + /* + * The second test is not applicable to uClinux; + * shared memory segments are detached on exec(), + * so cannot be passed to uClinux children. + */ + {&shm_id_1, IPC_STAT, &buf, func_istat, stat_setup}, #endif - { - IPC_SET, func_set, set_setup}, { - IPC_RMID, func_rmid, NULL} + {&shm_id_1, IPC_SET, &buf, func_set, set_setup}, + {&shm_id_1, IPC_INFO, (struct shmid_ds *) &info, func_info, NULL}, + {&shm_index, SHM_STAT, &buf, func_sstat, NULL}, + {&shm_id_1, SHM_LOCK, NULL, func_lock, NULL}, + {&shm_id_1, SHM_UNLOCK, NULL, func_unlock, NULL}, + {&shm_id_1, IPC_RMID, NULL, func_rmid, NULL}, }; -int TST_TOTAL = (sizeof(TC) / sizeof(*TC)); +static int TST_TOTAL = ARRAY_SIZE(TC); #define NEWMODE 0066 @@ -128,31 +126,27 @@ int TST_TOTAL = (sizeof(TC) / sizeof(*TC)); static char *argv0; #endif -static int stat_i; /* Shared between do_child and stat_setup */ +static int stat_i; -int main(int ac, char **av) +int main(int argc, char *argv[]) { int lc; char *msg; int i; - void check_functionality(void); - if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) + msg = parse_opts(argc, argv, NULL, NULL); + if (msg != NULL) tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); #ifdef UCLINUX - argv0 = av[0]; + argv0 = argv[0]; maybe_run_child(do_child, "ddd", &stat_i, &stat_time, &shm_id_1); #endif - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ + setup(); for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset tst_count in case we are looping */ tst_count = 0; - /* initialize stat_time */ stat_time = FIRST; /* @@ -160,28 +154,22 @@ int main(int ac, char **av) * permissions. Do this here instead of in setup() * so that looping (-i) will work correctly. */ - if ((shm_id_1 = shmget(shmkey, SHM_SIZE, IPC_CREAT | IPC_EXCL | - SHM_RW)) == -1) { + shm_id_1 = shmget(shmkey, SHM_SIZE, + IPC_CREAT | IPC_EXCL | SHM_RW); + if (shm_id_1 == -1) tst_brkm(TBROK, cleanup, "couldn't create the shared" " memory segment"); - } - /* loop through the test cases */ for (i = 0; i < TST_TOTAL; i++) { /* * if needed, set up any required conditions by * calling the appropriate setup function */ - if (TC[i].func_setup != NULL) { + if (TC[i].func_setup != NULL) (*TC[i].func_setup) (); - } - - /* - * Use TEST macro to make the call - */ - TEST(shmctl(shm_id_1, TC[i].cmd, &buf)); + TEST(shmctl(*(TC[i].shmid), TC[i].cmd, TC[i].arg)); if (TEST_RETURN == -1) { tst_resm(TFAIL, "%s call failed - errno " @@ -190,7 +178,7 @@ int main(int ac, char **av) continue; } if (STD_FUNCTIONAL_TEST) { - (*TC[i].func_test) (); + (*TC[i].func_test) (TEST_RETURN); } else { tst_resm(TPASS, "call succeeded"); @@ -217,7 +205,7 @@ int main(int ac, char **av) * this seperate routine to avoid code duplication in * stat_setup() below. */ -void *set_shmat() +void *set_shmat(void) { void *rval; @@ -241,7 +229,7 @@ void *set_shmat() * Make things interesting by forking some children * that will either attach or inherit the shared memory. */ -void stat_setup() +void stat_setup(void) { void *set_shmat(); pid_t pid; @@ -252,34 +240,32 @@ void stat_setup() * the children inherit the memory. */ - if (stat_time == SECOND) { + if (stat_time == SECOND) /* * use the global "set_shared" variable here so that * it can be removed in the stat_func() routine. */ set_shared = set_shmat(); - } tst_flush(); for (stat_i = 0; stat_i < N_ATTACH; stat_i++) { if (sync_pipe_create(sync_pipes, PIPE_NAME) == -1) tst_brkm(TBROK, cleanup, "sync_pipe_create failed"); - if ((pid = FORK_OR_VFORK()) == -1) { + pid = FORK_OR_VFORK(); + if (pid == -1) tst_brkm(TBROK, cleanup, "could not fork"); - } - if (pid == 0) { /* child */ + if (pid == 0) { #ifdef UCLINUX if (self_exec(argv0, "ddd", stat_i, stat_time, - shm_id_1) < 0) { + shm_id_1) < 0) tst_brkm(TBROK, cleanup, "could not self_exec"); - } #else do_child(); #endif - } else { /* parent */ + } else { /* save the child's pid for cleanup later */ pid_arr[stat_i] = pid; if (sync_pipe_wait(sync_pipes) == -1) @@ -295,12 +281,8 @@ void stat_setup() sleep(1); } -/* - * do_child - */ -void do_child() +void do_child(void) { - int rval; void *test; #ifdef UCLINUX @@ -308,11 +290,10 @@ void do_child() tst_brkm(TBROK, cleanup, "sync_pipe_create failed"); #endif - if (stat_time == FIRST) { + if (stat_time == FIRST) test = set_shmat(); - } else { + else test = set_shared; - } if (sync_pipe_notify(sync_pipes) == -1) tst_brkm(TBROK, cleanup, "sync_pipe_notify failed"); @@ -323,25 +304,24 @@ void do_child() #endif tst_brkm(TBROK, cleanup, "sync_pipe_close failed"); - /* do an assignement for fun */ memcpy(test, &stat_i, sizeof(stat_i)); /* pause until we get a signal from stat_cleanup() */ - rval = pause(); + pause(); /* now we're back - detach the memory and exit */ - if (shmdt(test) == -1) { + if (shmdt(test) == -1) tst_resm(TBROK, "shmdt() failed - %d", errno); - } + tst_exit(); } /* - * func_stat() - check the functionality of the IPC_STAT command with shmctl() + * func_istat() - check the functionality of the IPC_STAT command with shmctl() * by looking at the pid of the creator, the segement size, * the number of attaches and the mode. */ -void func_stat() +void func_istat(int ret) { int fail = 0; pid_t pid; @@ -373,7 +353,8 @@ void func_stat() } /* use MODE_MASK to make sure we are comparing the last 9 bits */ - if (!fail && (buf.shm_perm.mode & MODE_MASK) != ((SHM_RW) & MODE_MASK)) { + if (!fail && (buf.shm_perm.mode & MODE_MASK) != + ((SHM_RW) & MODE_MASK)) { tst_resm(TFAIL, "segment mode is incorrect"); fail = 1; } @@ -383,9 +364,8 @@ void func_stat() /* save the change time for use in the next test */ save_time = buf.shm_ctime; - if (fail) { + if (fail) return; - } tst_resm(TPASS, "pid, size, # of attaches and mode are correct " "- pass #%d", stat_time); @@ -396,22 +376,20 @@ void func_stat() * have the parent make dessert, er, um, make that remove * the shared memory that is no longer needed. */ -void stat_cleanup() +void stat_cleanup(void) { int i; /* wake up the childern so they can detach the memory and exit */ for (i = 0; i < N_ATTACH; i++) { - if (kill(pid_arr[i], SIGUSR1) == -1) { + if (kill(pid_arr[i], SIGUSR1) == -1) tst_brkm(TBROK, cleanup, "kill failed"); - } } /* remove the parent's shared memory the second time through */ if (stat_time == SECOND) { - if (shmdt(set_shared) == -1) { + if (shmdt(set_shared) == -1) tst_resm(TINFO, "shmdt() failed"); - } } for (i = 0; i < N_ATTACH; i++) { @@ -425,7 +403,7 @@ void stat_cleanup() /* * set_setup() - set up for the IPC_SET command with shmctl() */ -void set_setup() +void set_setup(void) { /* set up a new mode for the shared memory segment */ buf.shm_perm.mode = SHM_RW | NEWMODE; @@ -437,7 +415,7 @@ void set_setup() /* * func_set() - check the functionality of the IPC_SET command with shmctl() */ -void func_set() +void func_set(int ret) { int fail = 0; @@ -447,7 +425,8 @@ void func_set() return; } - if ((buf.shm_perm.mode & MODE_MASK) != ((SHM_RW | NEWMODE) & MODE_MASK)) { + if ((buf.shm_perm.mode & MODE_MASK) != + ((SHM_RW | NEWMODE) & MODE_MASK)) { tst_resm(TFAIL, "new mode is incorrect"); fail = 1; } @@ -457,28 +436,68 @@ void func_set() fail = 1; } - if (fail) { + if (fail) return; - } tst_resm(TPASS, "new mode and change time are correct"); } +static void func_info(int ret) +{ + if (info.shmmin != 1) + tst_resm(TFAIL, "value of shmmin is incorrect"); + else + tst_resm(TPASS, "get correct shared memory limits"); +} + +static void func_sstat(int ret) +{ + if (ret >= 0) + tst_resm(TPASS, "get correct shared memory id"); + else + tst_resm(TFAIL, "shared memory id is incorrect"); +} + +static void func_lock(int ret) +{ + if (shmctl(shm_id_1, IPC_STAT, &buf) == -1) { + tst_resm(TBROK, "stat failed in func_lock()"); + return; + } + + if (buf.shm_perm.mode & SHM_LOCKED) + tst_resm(TPASS, "SHM_LOCK is set"); + else + tst_resm(TFAIL, "SHM_LOCK is cleared"); +} + +static void func_unlock(int ret) +{ + if (shmctl(shm_id_1, IPC_STAT, &buf) == -1) { + tst_resm(TBROK, "stat failed in func_unlock()"); + return; + } + + if (buf.shm_perm.mode & SHM_LOCKED) + tst_resm(TFAIL, "SHM_LOCK is set"); + else + tst_resm(TPASS, "SHM_LOCK is cleared"); +} + + /* * func_rmid() - check the functionality of the IPC_RMID command with shmctl() */ -void func_rmid() +void func_rmid(int ret) { /* Do another shmctl() - we should get EINVAL */ - if (shmctl(shm_id_1, IPC_STAT, &buf) != -1) { + if (shmctl(shm_id_1, IPC_STAT, &buf) != -1) tst_brkm(TBROK, cleanup, "shmctl succeeded on expected fail"); - } - if (errno != EINVAL) { + if (errno != EINVAL) tst_resm(TFAIL, "returned unexpected errno %d", errno); - } else { + else tst_resm(TPASS, "shared memory appears to be removed"); - } shm_id_1 = -1; } @@ -486,7 +505,7 @@ void func_rmid() /* * sighandler() - handle signals, in this case SIGUSR1 is the only one expected */ -void sighandler(sig) +void sighandler(int sig) { if (sig != SIGUSR1) tst_resm(TBROK, "received unexpected signal %d", sig); @@ -494,37 +513,20 @@ void sighandler(sig) void setup(void) { - tst_sig(FORK, sighandler, cleanup); TEST_PAUSE; - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ tst_tmpdir(); - /* get an IPC resource key */ shmkey = getipckey(); } -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ void cleanup(void) { - /* if it exists, remove the shared memory segment */ rm_shm(shm_id_1); tst_rmdir(); - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ TEST_CLEANUP; - } hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-24 07:23:39
|
The branch, master, has been updated via 7053c3bf279750da4e9e4bb14006fc0edafccd3e (commit) from 04a34ba7fc9bbb6145917f549ff7a6e284e26fcc (commit) - Log ----------------------------------------------------------------- commit 7053c3bf279750da4e9e4bb14006fc0edafccd3e Author: Shuang Qiu <shu...@or...> Date: Fri May 24 11:03:39 2013 +0800 dup07:Close the file before unlink it. When unlink() a file in nfs environment,it will rename the file to a .nfs<xxxxx> file if any process still has that file open.And this file could not be deleted until it is closed.So we always get the following warning which makes testcase "dup07" failed: 0 TWARN : tst_rmdir: rmobj(/mnt/nfsv3/ltp-ZtzSE27611/dupKuEr3H) failed: unlink(/mnt/nfsv3/ltp-ZtzSE27611/dupKuEr3H/.nfs000000000110cb3800000066) failed; errno=16: Device or resource busy Close the created/dup file before unlink() it to fix this issue. Signed-off-by: Shuang Qiu <shu...@or...> Reviewed-by: Jan Stancek <jst...@re...> Signed-off-by: Wanlong Gao <gao...@cn...> ----------------------------------------------------------------------- Summary of changes: testcases/kernel/syscalls/dup/dup07.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/testcases/kernel/syscalls/dup/dup07.c b/testcases/kernel/syscalls/dup/dup07.c index 03b0ba4..025881f 100644 --- a/testcases/kernel/syscalls/dup/dup07.c +++ b/testcases/kernel/syscalls/dup/dup07.c @@ -77,7 +77,9 @@ int main(int ac, char **av) tst_resm(TPASS, "Passed in read mode."); } + close(duprdo); } + close(rdoret); } unlink(testfile); @@ -97,7 +99,10 @@ int main(int ac, char **av) tst_resm(TPASS, "Passed in write mode."); } + close(dupwro); } + close(wroret); + } unlink(testfile); @@ -117,7 +122,9 @@ int main(int ac, char **av) tst_resm(TPASS, "Passed in read/write mode."); } + close(duprdwr); } + close(rdwret); } unlink(testfile); hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-23 13:22:02
|
The branch, master, has been updated via 04a34ba7fc9bbb6145917f549ff7a6e284e26fcc (commit) from f74f0a9789894dd4bdd5144593a90cd48ec9a8c1 (commit) - Log ----------------------------------------------------------------- commit 04a34ba7fc9bbb6145917f549ff7a6e284e26fcc Author: Alexey Kodanev <ale...@or...> Date: Thu May 23 11:03:18 2013 +0400 Create a function tst_resm_hexd() to print a buffer in hex This new function behaves like the tst_resm() function. The difference is, it in addition takes a buffer, its size and prints the buffer in hexadecimal format in the end of the message. Signed-off-by: Alexey Kodanev <ale...@or...> ----------------------------------------------------------------------- Summary of changes: doc/man3/tst_res.3 | 17 ++++++++++++++--- include/test.h | 2 ++ lib/tst_res.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/doc/man3/tst_res.3 b/doc/man3/tst_res.3 index 0c1fe6c..0754daf 100644 --- a/doc/man3/tst_res.3 +++ b/doc/man3/tst_res.3 @@ -37,6 +37,8 @@ tst_res \- Print result message, including file contents .sp tst_resm \- Print result message .sp +tst_resm_hexd \- Print result message, including specified buffer in hexadecimal format +.sp tst_brk \- Print result message, including file contents, and break remaining test cases .sp tst_brkm \- Print result message and break remaining test cases @@ -54,6 +56,9 @@ tst_environ \- Keep results coming to original stdout .P \fBvoid tst_resm(int \fIttype\fB, char *\fItmesg, [arg ...]\fR) .P +\fBvoid tst_resm_hexd(int \fIttype\fB, const void *\fIbuf\fB, size_t \fIsize\fB, +char *\fItmesg, [arg ...]\fR) +.P \fBvoid tst_brk(int \fIttype\fB, char *\fIfname\fB, void (*\fIfunc\fB)(), char *\fItmesg, [arg ...]\fR) .P @@ -121,6 +126,12 @@ expanded message. The maximum size allowed for an expanded message is pointer to a function which performs either the cleanup necessary prior to exiting the test or some function executed at the end of each iteration of a loop. +.TP 10 +.I buf +pointer to a buffer whose contents will be printed in hexadecimal format. +.TP 10 +.I size +size of the buffer. .RE .SS Result Types The possible test result types defined in \fBtest.h\fR are as follows: @@ -153,9 +164,9 @@ An informative message about the execution of the test that does not correspond to a test case result and does not indicate a problem. .RE .SS Function Descriptions -\fBtst_res()\fR and \fBtst_resm()\fR are the basic result reporting -functions. They report 1 or more test case results of the specified -\fIttype\fR. All result types are valid for these functions. The +\fBtst_res()\fR, \fBtst_resm()\fR and \fBtst_resm_hexd()\fR are the basic +result reporting functions. They report 1 or more test case results of the +specified \fIttype\fR. All result types are valid for these functions. The \fBtst_range\fR global variable indicates the number of results that will be reported for each call to one of these functions. It is initialized by the library to 1, but may be set to a value > 1 by the test. Each call to one of diff --git a/include/test.h b/include/test.h index e36ca38..c922230 100644 --- a/include/test.h +++ b/include/test.h @@ -191,6 +191,8 @@ void tst_res(int ttype, char *fname, char *arg_fmt, ...) __attribute__ ((format (printf, 3, 4))); void tst_resm(int ttype, char *arg_fmt, ...) __attribute__ ((format (printf, 2, 3))); +void tst_resm_hexd(int ttype, const void *buf, size_t size, char *arg_fmt, ...) + __attribute__ ((format (printf, 4, 5))); void tst_brk(int ttype, char *fname, void (*func)(void), char *arg_fmt, ...) __attribute__ ((format (printf, 4, 5))); void tst_brkm(int ttype, void (*func)(void), char *arg_fmt, ...) diff --git a/lib/tst_res.c b/lib/tst_res.c index ffac6d7..16f54f0 100644 --- a/lib/tst_res.c +++ b/lib/tst_res.c @@ -40,6 +40,7 @@ * FUNCTION NAME : * tst_res() - Print result message (include file contents) * tst_resm() - Print result message + * tst_resm_hexd() - Print result message (add buffer contents in hex) * tst_brk() - Print result message (include file contents) * and break remaining test cases * tst_brkm() - Print result message and break remaining test @@ -675,6 +676,47 @@ void tst_resm(int ttype, char *arg_fmt, ...) } /* + * tst_resm_hexd() - Interface to tst_res(), with no filename. + * Also, dump specified buffer in hex. + */ +void tst_resm_hexd(int ttype, const void *buf, size_t size, char *arg_fmt, ...) +{ + char tmesg[USERMESG]; + +#if DEBUG + printf("IN tst_resm_hexd\n"); + fflush(stdout); +#endif + + EXPAND_VAR_ARGS(tmesg, arg_fmt, USERMESG); + + static const size_t symb_num = 2; /* xx */ + static const size_t size_max = 16; + size_t offset = strlen(tmesg); + char *pmesg = tmesg; + + if (size > size_max || size == 0 || + (offset + size * (symb_num + 1)) >= USERMESG) + tst_res(ttype, NULL, "%s", tmesg); + else + pmesg += offset; + + size_t i; + for (i = 0; i < size; ++i) { + /* add space before byte except first one */ + if (pmesg != tmesg) + *(pmesg++) = ' '; + + sprintf(pmesg, "%02x", ((unsigned char *)buf)[i]); + pmesg += symb_num; + if ((i + 1) % size_max == 0 || i + 1 == size) { + tst_res(ttype, NULL, "%s", tmesg); + pmesg = tmesg; + } + } +} + +/* * tst_brkm() - Interface to tst_brk(), with no filename. */ void tst_brkm(int ttype, void (*func) (void), char *arg_fmt, ...) hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-22 09:22:13
|
The branch, master, has been updated via f74f0a9789894dd4bdd5144593a90cd48ec9a8c1 (commit) from 4140aa4db2866fc0a1cc9451f1284338fe971dba (commit) - Log ----------------------------------------------------------------- commit f74f0a9789894dd4bdd5144593a90cd48ec9a8c1 Author: DAN LI <li...@cn...> Date: Wed May 22 09:52:09 2013 +0800 semctl01.c: Pass the correct parameter For SEM_STAT, the semid argument is not a semaphore identifier, but instead an index into the kernelâs internal array that maintains information about all semaphore sets on the system. Pass a correct index of the kernel' internal array intead of a semaphores id when testing feature SEM_STAT. Signed-off-by: DAN LI <li...@cn...> Reviewed-by: Jan Stancek <jst...@re...> Signed-off-by: Wanlong Gao <gao...@cn...> ----------------------------------------------------------------------- Summary of changes: testcases/kernel/syscalls/ipc/semctl/semctl01.c | 37 +++++++++++++---------- 1 files changed, 21 insertions(+), 16 deletions(-) diff --git a/testcases/kernel/syscalls/ipc/semctl/semctl01.c b/testcases/kernel/syscalls/ipc/semctl/semctl01.c index 687d909..0399842 100644 --- a/testcases/kernel/syscalls/ipc/semctl/semctl01.c +++ b/testcases/kernel/syscalls/ipc/semctl/semctl01.c @@ -52,6 +52,7 @@ char *TCID = "semctl01"; int TST_TOTAL = 13; static int sem_id_1 = -1; +static int sem_index; static int sync_pipes[2]; @@ -100,25 +101,26 @@ static int sem_op; #endif static struct test_case_t { + int *semid; int semnum; int cmd; void (*func_test) (); union semun arg; void (*func_setup) (); } TC[] = { - {0, IPC_STAT, func_stat, SEMUN_CAST & buf, NULL}, - {0, IPC_SET, func_set, SEMUN_CAST & buf, set_setup}, - {0, GETALL, func_gall, SEMUN_CAST array, NULL}, - {SEM4, GETNCNT, func_cnt, SEMUN_CAST & buf, cnt_setup}, - {SEM2, GETPID, func_pid, SEMUN_CAST & buf, pid_setup}, - {SEM2, GETVAL, func_gval, SEMUN_CAST & buf, NULL}, - {SEM4, GETZCNT, func_cnt, SEMUN_CAST & buf, cnt_setup}, - {0, SETALL, func_sall, SEMUN_CAST array, sall_setup}, - {SEM4, SETVAL, func_sval, SEMUN_CAST INCVAL, NULL}, - {0, IPC_INFO, func_iinfo, SEMUN_CAST & ipc_buf, NULL}, - {0, SEM_INFO, func_sinfo, SEMUN_CAST & ipc_buf, NULL}, - {0, SEM_STAT, func_sstat, SEMUN_CAST & buf, NULL}, - {0, IPC_RMID, func_rmid, SEMUN_CAST & buf, NULL}, + {&sem_id_1, 0, IPC_STAT, func_stat, SEMUN_CAST & buf, NULL}, + {&sem_id_1, 0, IPC_SET, func_set, SEMUN_CAST & buf, set_setup}, + {&sem_id_1, 0, GETALL, func_gall, SEMUN_CAST array, NULL}, + {&sem_id_1, SEM4, GETNCNT, func_cnt, SEMUN_CAST & buf, cnt_setup}, + {&sem_id_1, SEM2, GETPID, func_pid, SEMUN_CAST & buf, pid_setup}, + {&sem_id_1, SEM2, GETVAL, func_gval, SEMUN_CAST & buf, NULL}, + {&sem_id_1, SEM4, GETZCNT, func_cnt, SEMUN_CAST & buf, cnt_setup}, + {&sem_id_1, 0, SETALL, func_sall, SEMUN_CAST array, sall_setup}, + {&sem_id_1, SEM4, SETVAL, func_sval, SEMUN_CAST INCVAL, NULL}, + {&sem_id_1, 0, IPC_INFO, func_iinfo, SEMUN_CAST & ipc_buf, NULL}, + {&sem_id_1, 0, SEM_INFO, func_sinfo, SEMUN_CAST & ipc_buf, NULL}, + {&sem_index, 0, SEM_STAT, func_sstat, SEMUN_CAST & buf, NULL}, + {&sem_id_1, 0, IPC_RMID, func_rmid, SEMUN_CAST & buf, NULL}, }; int main(int argc, char *argv[]) @@ -162,7 +164,7 @@ int main(int argc, char *argv[]) } } - TEST(semctl(sem_id_1, TC[i].semnum, TC[i].cmd, + TEST(semctl(*(TC[i].semid), TC[i].semnum, TC[i].cmd, TC[i].arg)); if (TEST_RETURN == -1) { @@ -560,10 +562,13 @@ static void func_rmid(void) static void func_iinfo(int hidx) { - if (hidx >= 0) + if (hidx >= 0) { + sem_index = hidx; tst_resm(TPASS, "the highest index is correct"); - else + } else { + sem_index = 0; tst_resm(TFAIL, "the highest index is incorrect"); + } } static void func_sinfo(void) hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-21 03:21:08
|
The branch, master, has been updated via 4140aa4db2866fc0a1cc9451f1284338fe971dba (commit) from 775572079317a1349daa4f044b93d6459e19df8d (commit) - Log ----------------------------------------------------------------- commit 4140aa4db2866fc0a1cc9451f1284338fe971dba Author: DAN LI <li...@cn...> Date: Thu May 16 14:08:37 2013 +0800 prot_hsymlinks.c: remove the unnecessary calling of cleanup Should not call cleanup here since nothing was setted by setup. Signed-off-by: DAN LI <li...@cn...> Signed-off-by: Wanlong Gao <gao...@cn...> ----------------------------------------------------------------------- Summary of changes: .../security/prot_hsymlinks/prot_hsymlinks.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) diff --git a/testcases/kernel/security/prot_hsymlinks/prot_hsymlinks.c b/testcases/kernel/security/prot_hsymlinks/prot_hsymlinks.c index 1eec0f9..82bc770 100644 --- a/testcases/kernel/security/prot_hsymlinks/prot_hsymlinks.c +++ b/testcases/kernel/security/prot_hsymlinks/prot_hsymlinks.c @@ -196,10 +196,9 @@ static void setup(int argc, char *argv[]) tst_require_root(NULL); - if (tst_kvercmp(3, 7, 0) < 0) { - tst_brkm(TCONF, cleanup, + if (tst_kvercmp(3, 7, 0) < 0) + tst_brkm(TCONF, NULL, "Test must be run with kernel 3.7 or newer"); - } /* initialize user names */ strcpy(users[ROOT].name, "root"); hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-18 01:21:20
|
The branch, master, has been updated via 775572079317a1349daa4f044b93d6459e19df8d (commit) from 8cda96ce75618b99fc6bf75ca0dbb2948dbabf43 (commit) - Log ----------------------------------------------------------------- commit 775572079317a1349daa4f044b93d6459e19df8d Author: Vinson Lee <vl...@tw...> Date: Fri May 17 11:56:46 2013 -0700 mount/mount03.c: Add mode argument to open call. This patch fixes this build error on Ubuntu introduced with commit 24324ad5dae71172125060b82580486b0f3d37da. In file included from /usr/include/fcntl.h:252:0, from mount03.c:73: In function âopenâ, inlined from âsetupâ at mount03.c:447:5: /usr/include/x86_64-linux-gnu/bits/fcntl2.h:51:24: error: call to â__open_missing_modeâ declared with attribute error: open with O_CREAT in second argument needs 3 arguments Signed-off-by: Vinson Lee <vl...@tw...> Signed-off-by: Wanlong Gao <gao...@cn...> ----------------------------------------------------------------------- Summary of changes: testcases/kernel/syscalls/mount/mount03.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/testcases/kernel/syscalls/mount/mount03.c b/testcases/kernel/syscalls/mount/mount03.c index 295b6da..b1aa71f 100644 --- a/testcases/kernel/syscalls/mount/mount03.c +++ b/testcases/kernel/syscalls/mount/mount03.c @@ -444,7 +444,7 @@ void setup() path_name, DIR_MODE); snprintf(file, PATH_MAX, "%s/setuid_test", path_name); - fd = open(file, O_CREAT | O_TRUNC); + fd = open(file, O_CREAT | O_TRUNC, S_IRWXU); if (fd == -1) tst_brkm(TBROK, cleanup, "open file failed"); close(fd); hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-17 08:21:28
|
The branch, master, has been updated via 8cda96ce75618b99fc6bf75ca0dbb2948dbabf43 (commit) via a85442988b9d07bb090299709a7f8c331d6b9ef7 (commit) via 77eafca7d86bcf647904b9f56a9dd70856b1a1f5 (commit) from a06f021fc76e147e9cf412dbd235e155420bb060 (commit) - Log ----------------------------------------------------------------- commit 8cda96ce75618b99fc6bf75ca0dbb2948dbabf43 Author: DAN LI <li...@cn...> Date: Fri May 17 10:32:16 2013 +0800 mem.c: check whether MADV_MERGEABLE is available Before using MADV_MERGEABLE, check whether it's available by macro HAVE_MADV_MERGEABLE. Signed-off-by: DAN LI <li...@cn...> Reviewed-by: Jan Stancek <jst...@re...> Signed-off-by: Wanlong Gao <gao...@cn...> commit a85442988b9d07bb090299709a7f8c331d6b9ef7 Author: DAN LI <li...@cn...> Date: Fri May 17 13:39:32 2013 +0800 shmat/shmat01.c: Test for specifying NULL to shmaddr Test for statement: "If shmaddr is NULL, the system chooses a suitable (unused) address at which to attach the segment." Signed-off-by: DAN LI <li...@cn...> Reviewed-by: Jan Stancek <jst...@re...> Signed-off-by: Wanlong Gao <gao...@cn...> commit 77eafca7d86bcf647904b9f56a9dd70856b1a1f5 Author: DAN LI <li...@cn...> Date: Thu May 16 11:01:42 2013 +0800 shmat/shmat01.c: cleanup 1. Remove useless comments 2. Revise code to follow ltp-code-style Signed-off-by: DAN LI <li...@cn...> Signed-off-by: Wanlong Gao <gao...@cn...> ----------------------------------------------------------------------- Summary of changes: testcases/kernel/mem/lib/mem.c | 2 + testcases/kernel/syscalls/ipc/shmat/shmat01.c | 174 ++++++++++--------------- 2 files changed, 71 insertions(+), 105 deletions(-) diff --git a/testcases/kernel/mem/lib/mem.c b/testcases/kernel/mem/lib/mem.c index 7cda3c5..9bc926e 100644 --- a/testcases/kernel/mem/lib/mem.c +++ b/testcases/kernel/mem/lib/mem.c @@ -494,8 +494,10 @@ void test_ksm_merge_across_nodes(unsigned long nr_pages) MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); if (memory[i] == MAP_FAILED) tst_brkm(TBROK|TERRNO, tst_exit, "mmap"); +#ifdef HAVE_MADV_MERGEABLE if (madvise(memory[i], length, MADV_MERGEABLE) == -1) tst_brkm(TBROK|TERRNO, tst_exit, "madvise"); +#endif #if HAVE_NUMA_H && HAVE_LINUX_MEMPOLICY_H && HAVE_NUMAIF_H \ && HAVE_MPOL_CONSTANTS diff --git a/testcases/kernel/syscalls/ipc/shmat/shmat01.c b/testcases/kernel/syscalls/ipc/shmat/shmat01.c index 51e25c5..3c09817 100644 --- a/testcases/kernel/syscalls/ipc/shmat/shmat01.c +++ b/testcases/kernel/syscalls/ipc/shmat/shmat01.c @@ -1,20 +1,19 @@ /* + * Copyright (c) International Business Machines Corp., 2001 * - * Copyright (c) International Business Machines Corp., 2001 + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* @@ -38,83 +37,64 @@ * otherwise * issue a FAIL message * call cleanup - * - * USAGE: <for command-line> - * shmat01 [-c n] [-f] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -f : Turn off functionality Testing. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * RESTRICTIONS - * none */ #include "ipcshm.h" #include "shmat_common.h" -char *TCID = "shmat01"; - -static void check_functionality(int); +#define CASE0 10 +#define CASE1 20 -#define CASE0 10 /* values to write into the shared */ -#define CASE1 20 /* memory location. */ +char *TCID = "shmat01"; +int TST_TOTAL = 4; int shm_id_1 = -1; -void *base_addr; /* By probing this address first, we can make - * non-aligned addresses from it for different - * architectures without explicitly code it. - */ - -void *addr; /* for result of shmat-call */ +/* + * By probing this address first, we can make + * non-aligned addresses from it for different + * architectures without explicitly code it. + */ +void *base_addr; +void *addr; -struct test_case_t { +static struct test_case_t { int *shmid; int offset; int flags; -}; - -int TST_TOTAL = 3; + int getbase; +} *TC; -struct test_case_t *TC; +static void check_functionality(int); -int main(int ac, char **av) +int main(int argc, char *argv[]) { - int lc; + int lc, i; char *msg; - int i; + void *attchaddr; - msg = parse_opts(ac, av, NULL, NULL); + msg = parse_opts(argc, argv, NULL, NULL); if (msg != NULL) tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ + setup(); for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset tst_count in case we are looping */ tst_count = 0; - /* loop through the test cases */ for (i = 0; i < TST_TOTAL; i++) { - /* - * Use TEST macro to make the call - */ - base_addr = probe_free_addr(); - errno = 0; - addr = shmat(*(TC[i].shmid), base_addr + TC[i].offset, - TC[i].flags); - TEST_ERRNO = errno; + if (TC[i].getbase) { + base_addr = probe_free_addr(); + attchaddr = base_addr + TC[i].offset; + } else { + attchaddr = NULL; + } + addr = shmat(*(TC[i].shmid), attchaddr, TC[i].flags); + + TEST_ERRNO = errno; if (addr == (void *)-1) { tst_brkm(TFAIL | TTERRNO, cleanup, "shmat call failed"); @@ -125,10 +105,6 @@ int main(int ac, char **av) tst_resm(TPASS, "call succeeded"); } - /* - * clean up things in case we are looping - in - * this case, detach the shared memory - */ if (shmdt(addr) == -1) tst_brkm(TBROK, cleanup, "Couldn't detach shared memory"); @@ -172,35 +148,36 @@ static void check_functionality(int i) /* check for specific conditions depending on the type of attach */ switch (i) { case 0: + case 1: /* - * Check the functionality of the first call by simply - * "writing" a value to the shared memory space. + * Check the functionality of shmat by simply "writing" + * a value to the shared memory space. * If this fails the program will get a SIGSEGV, dump * core and exit. */ *shared = CASE0; break; - case 1: + case 2: /* - * Check the functionality of the second call by writing - * a value to the shared memory space and then checking - * that the original address given was rounded down as + * Check the functionality of shmat by writing a value + * to the shared memory space and then checking that + * the original address given was rounded down as * specified in the man page. */ *shared = CASE1; - orig_add = addr + ((unsigned long)TC[1].offset % SHMLBA); - if (orig_add != base_addr + TC[1].offset) { + orig_add = addr + ((unsigned long)TC[2].offset % SHMLBA); + if (orig_add != base_addr + TC[2].offset) { tst_resm(TFAIL, "shared memory address is not " "correct"); fail = 1; } break; - case 2: + case 3: /* * This time the shared memory is read only. Read the value - * and check that it is equal to the value set in case #2, + * and check that it is equal to the value set in last case, * because shared memory is persistent. */ @@ -215,12 +192,8 @@ static void check_functionality(int i) tst_resm(TPASS, "conditions and functionality are correct"); } -/* - * setup() - performs all the ONE TIME setup for this test. - */ void setup(void) { - tst_sig(NOFORK, DEF_HANDLER, cleanup); TEST_PAUSE; @@ -229,46 +202,42 @@ void setup(void) if (TC == NULL) tst_brkm(TFAIL | TERRNO, cleanup, "failed to allocate memory"); - /* a straight forward read/write attach */ + /* set NULL as attaching address*/ TC[0].shmid = &shm_id_1; TC[0].offset = 0; TC[0].flags = 0; + TC[0].getbase = 0; - /* an attach using unaligned memory */ + /* a straight forward read/write attach */ TC[1].shmid = &shm_id_1; - TC[1].offset = SHMLBA - 1; - TC[1].flags = SHM_RND; + TC[1].offset = 0; + TC[1].flags = 0; + TC[1].getbase = 1; - /* a read only attach */ + /* an attach using unaligned memory */ TC[2].shmid = &shm_id_1; - TC[2].offset = 0; - TC[2].flags = SHM_RDONLY; - - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ + TC[2].offset = SHMLBA - 1; + TC[2].flags = SHM_RND; + TC[2].getbase = 1; + + /* a read only attach */ + TC[3].shmid = &shm_id_1; + TC[3].offset = 0; + TC[3].flags = SHM_RDONLY; + TC[3].getbase = 1; + tst_tmpdir(); - /* Get an IPC resouce key */ shmkey = getipckey(); - /* create a shared memory resource with read and write permissions */ shm_id_1 = shmget(shmkey++, INT_SIZE, SHM_RW | IPC_CREAT | IPC_EXCL); if (shm_id_1 == -1) tst_brkm(TBROK, cleanup, "Failed to create shared memory " "resource 1 in setup()"); } -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ void cleanup(void) { - - /* if it exists, remove the shared memory resource */ rm_shm(shm_id_1); if (TC != NULL) @@ -276,10 +245,5 @@ void cleanup(void) tst_rmdir(); - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ TEST_CLEANUP; - } hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-16 01:21:26
|
The branch, master, has been updated via a06f021fc76e147e9cf412dbd235e155420bb060 (commit) from 2067f15ae38911fc6a003d76a3a3cd8637cc579a (commit) - Log ----------------------------------------------------------------- commit a06f021fc76e147e9cf412dbd235e155420bb060 Author: Wanlong Gao <gao...@cn...> Date: Thu May 16 08:32:25 2013 +0800 gitignore: add ksm06 Signed-off-by: Wanlong Gao <gao...@cn...> ----------------------------------------------------------------------- Summary of changes: testcases/kernel/mem/.gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/testcases/kernel/mem/.gitignore b/testcases/kernel/mem/.gitignore index 532c87a..bdd0223 100644 --- a/testcases/kernel/mem/.gitignore +++ b/testcases/kernel/mem/.gitignore @@ -20,6 +20,7 @@ /ksm/ksm03 /ksm/ksm04 /ksm/ksm05 +/ksm/ksm06 /mem/mem01 /mem/mem02 /mmapstress/mmap-corruption01 hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-15 17:21:27
|
The branch, master, has been updated via 2067f15ae38911fc6a003d76a3a3cd8637cc579a (commit) from 2d2b94348a482ca608886ffab9f83148244bccfc (commit) - Log ----------------------------------------------------------------- commit 2067f15ae38911fc6a003d76a3a3cd8637cc579a Author: Markos Chandras <mar...@im...> Date: Wed May 15 15:17:44 2013 +0100 prot_hsymlinks.c: Define _GNU_SOURCE which is required for O_DIRECTORY O_DIRECTORY is only available if _GNU_SOURCE is defined in uClibc toolchains. This is similar to 0d0c695c8c6657710d1a8ecb4f1264dcd405276b "open11.c: Define _GNU_SOURCE which is required for O_DIRECTORY" Signed-off-by: Markos Chandras <mar...@im...> ----------------------------------------------------------------------- Summary of changes: .../security/prot_hsymlinks/prot_hsymlinks.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/testcases/kernel/security/prot_hsymlinks/prot_hsymlinks.c b/testcases/kernel/security/prot_hsymlinks/prot_hsymlinks.c index 8feef99..1eec0f9 100644 --- a/testcases/kernel/security/prot_hsymlinks/prot_hsymlinks.c +++ b/testcases/kernel/security/prot_hsymlinks/prot_hsymlinks.c @@ -31,6 +31,7 @@ * of the file or he doesn't have write access to the file. */ +#define _GNU_SOURCE #include <sys/types.h> #include <sys/stat.h> #include <pwd.h> hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-15 12:21:15
|
The branch, master, has been updated via 2d2b94348a482ca608886ffab9f83148244bccfc (commit) via 371a69bc9968853d072dd1feb384dc679d8370bb (commit) from a63f9336c2750ca4ada6e7987b90c38b12ea21ad (commit) - Log ----------------------------------------------------------------- commit 2d2b94348a482ca608886ffab9f83148244bccfc Author: Cyril Hrubis <ch...@su...> Date: Wed May 15 13:33:14 2013 +0200 openposix/.../sigaction/{18,19,28}: Regenerate. Signed-off-by: Cyril Hrubis <ch...@su...> commit 371a69bc9968853d072dd1feb384dc679d8370bb Author: Cyril Hrubis <ch...@su...> Date: Wed May 15 13:28:35 2013 +0200 openposix/.../sigaction/templates/{18,19,28} The sig_atomic_t does not imply volatile. This fixes the testcases when compiled with -O2. Signed-off-by: Cyril Hrubis <ch...@su...> ----------------------------------------------------------------------- Summary of changes: .../conformance/interfaces/sigaction/18-1.c | 2 +- .../conformance/interfaces/sigaction/18-10.c | 2 +- .../conformance/interfaces/sigaction/18-11.c | 2 +- .../conformance/interfaces/sigaction/18-12.c | 2 +- .../conformance/interfaces/sigaction/18-13.c | 2 +- .../conformance/interfaces/sigaction/18-14.c | 2 +- .../conformance/interfaces/sigaction/18-15.c | 2 +- .../conformance/interfaces/sigaction/18-16.c | 2 +- .../conformance/interfaces/sigaction/18-17.c | 2 +- .../conformance/interfaces/sigaction/18-18.c | 2 +- .../conformance/interfaces/sigaction/18-19.c | 2 +- .../conformance/interfaces/sigaction/18-2.c | 2 +- .../conformance/interfaces/sigaction/18-20.c | 2 +- .../conformance/interfaces/sigaction/18-21.c | 2 +- .../conformance/interfaces/sigaction/18-22.c | 2 +- .../conformance/interfaces/sigaction/18-23.c | 2 +- .../conformance/interfaces/sigaction/18-24.c | 2 +- .../conformance/interfaces/sigaction/18-25.c | 2 +- .../conformance/interfaces/sigaction/18-26.c | 2 +- .../conformance/interfaces/sigaction/18-3.c | 2 +- .../conformance/interfaces/sigaction/18-4.c | 2 +- .../conformance/interfaces/sigaction/18-5.c | 2 +- .../conformance/interfaces/sigaction/18-6.c | 2 +- .../conformance/interfaces/sigaction/18-7.c | 2 +- .../conformance/interfaces/sigaction/18-8.c | 2 +- .../conformance/interfaces/sigaction/18-9.c | 2 +- .../conformance/interfaces/sigaction/19-1.c | 2 +- .../conformance/interfaces/sigaction/19-10.c | 2 +- .../conformance/interfaces/sigaction/19-11.c | 2 +- .../conformance/interfaces/sigaction/19-12.c | 2 +- .../conformance/interfaces/sigaction/19-13.c | 2 +- .../conformance/interfaces/sigaction/19-14.c | 2 +- .../conformance/interfaces/sigaction/19-15.c | 2 +- .../conformance/interfaces/sigaction/19-16.c | 2 +- .../conformance/interfaces/sigaction/19-17.c | 2 +- .../conformance/interfaces/sigaction/19-18.c | 2 +- .../conformance/interfaces/sigaction/19-19.c | 2 +- .../conformance/interfaces/sigaction/19-2.c | 2 +- .../conformance/interfaces/sigaction/19-20.c | 2 +- .../conformance/interfaces/sigaction/19-21.c | 2 +- .../conformance/interfaces/sigaction/19-22.c | 2 +- .../conformance/interfaces/sigaction/19-23.c | 2 +- .../conformance/interfaces/sigaction/19-24.c | 2 +- .../conformance/interfaces/sigaction/19-25.c | 2 +- .../conformance/interfaces/sigaction/19-26.c | 2 +- .../conformance/interfaces/sigaction/19-3.c | 2 +- .../conformance/interfaces/sigaction/19-4.c | 2 +- .../conformance/interfaces/sigaction/19-5.c | 2 +- .../conformance/interfaces/sigaction/19-6.c | 2 +- .../conformance/interfaces/sigaction/19-7.c | 2 +- .../conformance/interfaces/sigaction/19-8.c | 2 +- .../conformance/interfaces/sigaction/19-9.c | 2 +- .../conformance/interfaces/sigaction/28-1.c | 2 +- .../conformance/interfaces/sigaction/28-10.c | 2 +- .../conformance/interfaces/sigaction/28-11.c | 2 +- .../conformance/interfaces/sigaction/28-12.c | 2 +- .../conformance/interfaces/sigaction/28-13.c | 2 +- .../conformance/interfaces/sigaction/28-14.c | 2 +- .../conformance/interfaces/sigaction/28-15.c | 2 +- .../conformance/interfaces/sigaction/28-16.c | 2 +- .../conformance/interfaces/sigaction/28-17.c | 2 +- .../conformance/interfaces/sigaction/28-18.c | 2 +- .../conformance/interfaces/sigaction/28-19.c | 2 +- .../conformance/interfaces/sigaction/28-2.c | 2 +- .../conformance/interfaces/sigaction/28-20.c | 2 +- .../conformance/interfaces/sigaction/28-21.c | 2 +- .../conformance/interfaces/sigaction/28-22.c | 2 +- .../conformance/interfaces/sigaction/28-23.c | 2 +- .../conformance/interfaces/sigaction/28-24.c | 2 +- .../conformance/interfaces/sigaction/28-25.c | 2 +- .../conformance/interfaces/sigaction/28-26.c | 2 +- .../conformance/interfaces/sigaction/28-3.c | 2 +- .../conformance/interfaces/sigaction/28-4.c | 2 +- .../conformance/interfaces/sigaction/28-5.c | 2 +- .../conformance/interfaces/sigaction/28-6.c | 2 +- .../conformance/interfaces/sigaction/28-7.c | 2 +- .../conformance/interfaces/sigaction/28-8.c | 2 +- .../conformance/interfaces/sigaction/28-9.c | 2 +- .../sigaction/templates/template_18-1.in | 2 +- .../sigaction/templates/template_19-1.in | 2 +- .../sigaction/templates/template_28-1.in | 2 +- 81 files changed, 81 insertions(+), 81 deletions(-) diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-1.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-1.c index 41bd3d0..a8efa04 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-1.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-1.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-10.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-10.c index e595b6d..ba06ee4 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-10.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-10.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-11.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-11.c index 7906c98..8ad7492 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-11.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-11.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-12.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-12.c index 751b841..cec3f2c 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-12.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-12.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-13.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-13.c index fbd8ef9..11b6b50 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-13.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-13.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-14.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-14.c index 743c1cf..0681f56 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-14.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-14.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-15.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-15.c index 9d64d0b..d322e1d 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-15.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-15.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-16.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-16.c index 2208fb1..3bd3f85 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-16.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-16.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-17.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-17.c index b4bc97f..36a0979 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-17.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-17.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-18.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-18.c index dee2b31..5105009 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-18.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-18.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-19.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-19.c index 7cbd4bf..11f5c83 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-19.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-19.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-2.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-2.c index b9253c6..64202ab 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-2.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-2.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-20.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-20.c index c66af5d..87ed4e0 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-20.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-20.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-21.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-21.c index 47d7d74..b72bd65 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-21.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-21.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-22.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-22.c index bc70cc6..e3e2ac8 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-22.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-22.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-23.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-23.c index c1f6bf1..b4c5f5e 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-23.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-23.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-24.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-24.c index 2f8a6ad..6f2d00e 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-24.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-24.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-25.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-25.c index f1f2b3d..ab94d91 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-25.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-25.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-26.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-26.c index c6b9ba6..48f1af5 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-26.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-26.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-3.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-3.c index c92d4e1..9aeb05c 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-3.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-3.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-4.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-4.c index 7a596cb..abeb431 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-4.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-4.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-5.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-5.c index 5b01518..e6cbaef 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-5.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-5.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-6.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-6.c index fd65c22..ca1fc26 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-6.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-6.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-7.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-7.c index 9fb701f..0e2b3e3 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-7.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-7.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-8.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-8.c index 61b6886..0e66c9c 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-8.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-8.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-9.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-9.c index 40ad6e5..a60a440 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-9.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/18-9.c @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-1.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-1.c index 307a602..5c33b56 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-1.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-1.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-10.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-10.c index 9ed3166..0b731f7 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-10.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-10.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-11.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-11.c index 990b39d..e02824d 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-11.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-11.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-12.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-12.c index 1c2ca55..16dca4a 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-12.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-12.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-13.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-13.c index 968a747..e319619 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-13.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-13.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-14.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-14.c index 46c1012..e94ade3 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-14.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-14.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-15.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-15.c index 7018c43..1b926ec 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-15.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-15.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-16.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-16.c index 52c37ea..59263bb 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-16.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-16.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-17.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-17.c index a097997..b3ff90d 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-17.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-17.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-18.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-18.c index 5137cf1..7056061 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-18.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-18.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-19.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-19.c index b92ea6e..20a99db 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-19.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-19.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-2.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-2.c index 947206e..10aa19e 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-2.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-2.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-20.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-20.c index 3c569b2..ea2bb7b 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-20.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-20.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-21.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-21.c index 7790ff6..c91edfe 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-21.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-21.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-22.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-22.c index 2bab8c7..d83a386 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-22.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-22.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-23.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-23.c index cbe1d61..34dd74c 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-23.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-23.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-24.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-24.c index f5f54d6..a178728 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-24.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-24.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-25.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-25.c index 825d9f4..02f8bed 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-25.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-25.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-26.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-26.c index 6ebe625..3aaef9d 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-26.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-26.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-3.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-3.c index ab56bca..df04d83 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-3.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-3.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-4.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-4.c index c5f196c..004fd51 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-4.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-4.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-5.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-5.c index 21aae17..432cf88 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-5.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-5.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-6.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-6.c index 9862ca2..9085be9 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-6.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-6.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-7.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-7.c index 9994308..892c7e6 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-7.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-7.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-8.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-8.c index 1e5b8cd..a56b6b0 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-8.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-8.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-9.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-9.c index e02460e..b9c4456 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-9.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/19-9.c @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-1.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-1.c index 183cbde..19f804a 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-1.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-1.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-10.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-10.c index 030433d..b0105c1 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-10.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-10.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-11.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-11.c index 55206a0..08ca874 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-11.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-11.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-12.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-12.c index d493eda..49f3e6e 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-12.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-12.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-13.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-13.c index fd96707..803e99d 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-13.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-13.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-14.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-14.c index 2aa491c..0f08ca2 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-14.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-14.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-15.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-15.c index 55cd2b6..3f0e3d0 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-15.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-15.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-16.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-16.c index c4130e9..46a3250 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-16.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-16.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-17.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-17.c index 6f2ad96..2154fc9 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-17.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-17.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-18.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-18.c index e73efb6..0dc759d 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-18.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-18.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-19.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-19.c index 1dbc428..59af105 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-19.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-19.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-2.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-2.c index 6f7dae9..44b1e36 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-2.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-2.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-20.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-20.c index 31a7bfd..2bc3cf4 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-20.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-20.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-21.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-21.c index 4681da0..2ca1977 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-21.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-21.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-22.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-22.c index 336be4d..94a3424 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-22.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-22.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-23.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-23.c index 1176c16..8f46f4b 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-23.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-23.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-24.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-24.c index 22c63b9..43cd1c7 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-24.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-24.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-25.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-25.c index 998868e..f89bb09 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-25.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-25.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-26.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-26.c index 86b1d7a..49b0cde 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-26.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-26.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-3.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-3.c index 191d9ff..56551b3 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-3.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-3.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-4.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-4.c index 5734fe2..3eb2c9f 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-4.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-4.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-5.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-5.c index d99cc25..2d16940 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-5.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-5.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-6.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-6.c index 1e8975f..8ad7380 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-6.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-6.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-7.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-7.c index 0780db7..7e38627 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-7.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-7.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-8.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-8.c index 1868bd2..bd0a969 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-8.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-8.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-9.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-9.c index 1d7624d..6bffc8d 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-9.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/28-9.c @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/templates/template_18-1.in b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/templates/template_18-1.in index a96d97b..4bccbe5 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/templates/template_18-1.in +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/templates/template_18-1.in @@ -43,7 +43,7 @@ #include "posixtest.h" -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler() { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/templates/template_19-1.in b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/templates/template_19-1.in index 329b5ae..580a11b 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/templates/template_19-1.in +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/templates/template_19-1.in @@ -44,7 +44,7 @@ #define WRITE(str) write(STDOUT_FILENO, str, sizeof(str) - 1) -static sig_atomic_t called = 0; +static volatile sig_atomic_t called = 0; static void handler(int sig, siginfo_t *info, void *context) { diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/templates/template_28-1.in b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/templates/template_28-1.in index 720afe0..eed8055 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaction/templates/template_28-1.in +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaction/templates/template_28-1.in @@ -44,7 +44,7 @@ #include "posixtest.h" -static sig_atomic_t called = 1; +static volatile sig_atomic_t called = 1; static void handler_1() { hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-15 07:25:43
|
The branch, master, has been updated via a63f9336c2750ca4ada6e7987b90c38b12ea21ad (commit) via bffa8865e3ec438fe437163f95f0686f8c17c5f3 (commit) via 24324ad5dae71172125060b82580486b0f3d37da (commit) via 6dcafa708bf6c2c3f20a5c9b695ddcf138a8efa5 (commit) via 65ca1bd14a3209e4d04d3bd15957389af5eaca4d (commit) via 6b699d0c4de80c2f211320192173e7a039a6ef07 (commit) via fbcafd3d565750f69d31c21cba33ab77b801f5a7 (commit) from 17e8f1fc67b05740b97ab0d6b3adc7f607892709 (commit) - Log ----------------------------------------------------------------- commit a63f9336c2750ca4ada6e7987b90c38b12ea21ad Author: DAN LI <li...@cn...> Date: Mon May 13 10:24:33 2013 +0800 semctl/semctl01.c: Test features IPC_INFO, SEM_INFO and SEM_STAT Additional tests for features IPC_INFO, SEM_INFO and SEM_STAT. Signed-off-by: DAN LI <li...@cn...> Signed-off-by: Wanlong Gao <gao...@cn...> commit bffa8865e3ec438fe437163f95f0686f8c17c5f3 Author: DAN LI <li...@cn...> Date: Mon May 13 10:21:43 2013 +0800 semctl/semctl01.c: cleanup 1. Remove useless comments 2. Revise code to follow ltp-code-style Signed-off-by: DAN LI <li...@cn...> Signed-off-by: Wanlong Gao <gao...@cn...> commit 24324ad5dae71172125060b82580486b0f3d37da Author: DAN LI <li...@cn...> Date: Tue May 14 10:40:28 2013 +0800 mount/mount03.c: fix several issues Make following fixes: * Create the file before calling stat(file). Call get_current_dir_name() after tst_tmpdir(). Fix incorrect using of snprintf(). * For MS_NOEXEC test, change judgement method to If errno is set to EACCES after execlp(exec-file), this case passes. Signed-off-by: DAN LI <li...@cn...> Reviewed-by: Eryu Guan <eg...@re...> Signed-off-by: Wanlong Gao <gao...@cn...> commit 6dcafa708bf6c2c3f20a5c9b695ddcf138a8efa5 Author: DAN LI <li...@cn...> Date: Tue May 14 10:31:15 2013 +0800 mount/mount03.c: cleanup 1. Remove useless comments 2. Revise code to follow ltp-code-style Signed-off-by: DAN LI <li...@cn...> Reviewed-by: Eryu Guan <eg...@re...> Signed-off-by: Wanlong Gao <gao...@cn...> commit 65ca1bd14a3209e4d04d3bd15957389af5eaca4d Author: Zhouping Liu <zl...@re...> Date: Mon May 13 16:43:28 2013 +0800 mem/ksm06: add a new case to test merge_across_nodes sysfs knob Kernel commit 90bd6fd31c8097(ksm: allow trees per NUMA node) introduced a new ksm sysfs knob /sys/kernel/mm/ksm/merge_across_nodes, which makes NUMA awareness KSM. The case is designed to check whether KSM can merge the same shared pages distributed on different numa nodes when enabling or disabling merge_across_nodes. Signed-off-by: Zhouping Liu <zl...@re...> Signed-off-by: Wanlong Gao <gao...@cn...> commit 6b699d0c4de80c2f211320192173e7a039a6ef07 Author: Zhouping Liu <zl...@re...> Date: Mon May 13 16:43:27 2013 +0800 mem: introduce clean_node() func There's set_node func introduced in commit cb2967b27a65, but we don't have a func to clean the node mask yet. Signed-off-by: Zhouping Liu <zl...@re...> Signed-off-by: Wanlong Gao <gao...@cn...> commit fbcafd3d565750f69d31c21cba33ab77b801f5a7 Author: Zhouping Liu <zl...@re...> Date: Mon May 13 16:43:26 2013 +0800 mm/ksm: enable merge_across_nodes knob before testing This kernel commit 90bd6fd31c809(ksm: allow trees per NUMA node) introduced a new KSM sysfs knob /sys/kernel/mm/ksm/merge_across_nodes, when it is set to zero, only pages from the same node are merged, which is different with the previous behavior, and ksm test cases sometimes will fail in NUMA system. Signed-off-by: Zhouping Liu <zl...@re...> Signed-off-by: Wanlong Gao <gao...@cn...> ----------------------------------------------------------------------- Summary of changes: runtest/mm | 3 + testcases/kernel/mem/include/mem.h | 10 + testcases/kernel/mem/ksm/ksm01.c | 19 ++ testcases/kernel/mem/ksm/ksm02.c | 12 + testcases/kernel/mem/ksm/ksm03.c | 12 + testcases/kernel/mem/ksm/ksm04.c | 12 + testcases/kernel/mem/{oom/oom02.c => ksm/ksm06.c} | 91 ++++-- testcases/kernel/mem/lib/mem.c | 77 +++++- testcases/kernel/syscalls/ipc/semctl/semctl01.c | 345 ++++++++++----------- testcases/kernel/syscalls/mount/mount03.c | 232 ++++++-------- 10 files changed, 466 insertions(+), 347 deletions(-) copy testcases/kernel/mem/{oom/oom02.c => ksm/ksm06.c} (52%) diff --git a/runtest/mm b/runtest/mm index 7c7abf1..a39becd 100644 --- a/runtest/mm +++ b/runtest/mm @@ -70,6 +70,9 @@ ksm03_1 ksm03 -u 128 ksm04 ksm04 ksm04_1 ksm04 -u 128 ksm05 ksm05 -I 10 +ksm06 ksm06 +ksm06_1 ksm06 -n 10 +ksn06_2 ksm06 -n 10000 cpuset01 cpuset01 -I 3600 diff --git a/testcases/kernel/mem/include/mem.h b/testcases/kernel/mem/include/mem.h index 551c73e..342166e 100644 --- a/testcases/kernel/mem/include/mem.h +++ b/testcases/kernel/mem/include/mem.h @@ -21,6 +21,14 @@ static inline void set_node(unsigned long *array, unsigned int node) array[node / BITS_PER_LONG] |= 1UL << (node % BITS_PER_LONG); } +static inline void clean_node(unsigned long *array) +{ + int i; + + for (i = 0; i < MAXNODES / BITS_PER_LONG; i++) + array[i] &= 0UL; +} + /* OOM */ #define LENGTH (3UL<<30) @@ -38,6 +46,8 @@ void testoom(int mempolicy, int lite); #define PATH_KSM "/sys/kernel/mm/ksm/" +void test_ksm_merge_across_nodes(unsigned long nr_pages); + /* THP */ #define PATH_THP "/sys/kernel/mm/transparent_hugepage/" diff --git a/testcases/kernel/mem/ksm/ksm01.c b/testcases/kernel/mem/ksm/ksm01.c index 514d702..47a7753 100644 --- a/testcases/kernel/mem/ksm/ksm01.c +++ b/testcases/kernel/mem/ksm/ksm01.c @@ -73,6 +73,8 @@ char *TCID = "ksm01"; int TST_TOTAL = 1; +static int merge_across_nodes; + option_t ksm_options[] = { {"n:", &opt_num, &opt_numstr}, {"s:", &opt_size, &opt_sizestr}, @@ -108,11 +110,28 @@ void setup(void) if (access(PATH_KSM, F_OK) == -1) tst_brkm(TCONF, NULL, "KSM configuration is not enabled"); + /* + * kernel commit 90bd6fd introduced a new KSM sysfs knob + * /sys/kernel/mm/ksm/merge_across_nodes, setting it to '0' + * will prevent KSM pages being merged across numa nodes, + * which will cause the case fail, so we need to make sure + * it is enabled before testing. + */ + if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) { + SAFE_FILE_SCANF(NULL, PATH_KSM "merge_across_nodes", + "%d", &merge_across_nodes); + SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", "1"); + } + tst_sig(FORK, DEF_HANDLER, NULL); TEST_PAUSE; } void cleanup(void) { + if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) + SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", + "%d", merge_across_nodes); + TEST_CLEANUP; } diff --git a/testcases/kernel/mem/ksm/ksm02.c b/testcases/kernel/mem/ksm/ksm02.c index 6c96c74..e22a7a6 100644 --- a/testcases/kernel/mem/ksm/ksm02.c +++ b/testcases/kernel/mem/ksm/ksm02.c @@ -73,6 +73,8 @@ char *TCID = "ksm02"; int TST_TOTAL = 1; +static int merge_across_nodes; + #if HAVE_NUMA_H && HAVE_LINUX_MEMPOLICY_H && HAVE_NUMAIF_H \ && HAVE_MPOL_CONSTANTS option_t ksm_options[] = { @@ -123,6 +125,10 @@ int main(int argc, char *argv[]) void cleanup(void) { + if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) + SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", + "%d", merge_across_nodes); + umount_mem(CPATH, CPATH_NEW); TEST_CLEANUP; } @@ -136,6 +142,12 @@ void setup(void) if (access(PATH_KSM, F_OK) == -1) tst_brkm(TCONF, NULL, "KSM configuration is not enabled"); + if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) { + SAFE_FILE_SCANF(NULL, PATH_KSM "merge_across_nodes", + "%d", &merge_across_nodes); + SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", "1"); + } + tst_sig(FORK, DEF_HANDLER, cleanup); TEST_PAUSE; mount_mem("cpuset", "cpuset", NULL, CPATH, CPATH_NEW); diff --git a/testcases/kernel/mem/ksm/ksm03.c b/testcases/kernel/mem/ksm/ksm03.c index 4480399..a254b75 100644 --- a/testcases/kernel/mem/ksm/ksm03.c +++ b/testcases/kernel/mem/ksm/ksm03.c @@ -73,6 +73,8 @@ char *TCID = "ksm03"; int TST_TOTAL = 1; +static int merge_across_nodes; + option_t ksm_options[] = { {"n:", &opt_num, &opt_numstr}, {"s:", &opt_size, &opt_sizestr}, @@ -109,6 +111,12 @@ void setup(void) if (access(PATH_KSM, F_OK) == -1) tst_brkm(TCONF, NULL, "KSM configuration is not enabled"); + if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) { + SAFE_FILE_SCANF(NULL, PATH_KSM "merge_across_nodes", + "%d", &merge_across_nodes); + SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", "1"); + } + mount_mem("memcg", "cgroup", "memory", MEMCG_PATH, MEMCG_PATH_NEW); tst_sig(FORK, DEF_HANDLER, NULL); TEST_PAUSE; @@ -116,6 +124,10 @@ void setup(void) void cleanup(void) { + if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) + SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", + "%d", merge_across_nodes); + umount_mem(MEMCG_PATH, MEMCG_PATH_NEW); TEST_CLEANUP; } diff --git a/testcases/kernel/mem/ksm/ksm04.c b/testcases/kernel/mem/ksm/ksm04.c index ed5e0b3..6b3c71b 100644 --- a/testcases/kernel/mem/ksm/ksm04.c +++ b/testcases/kernel/mem/ksm/ksm04.c @@ -73,6 +73,8 @@ char *TCID = "ksm04"; int TST_TOTAL = 1; +static int merge_across_nodes; + #if HAVE_NUMA_H && HAVE_LINUX_MEMPOLICY_H && HAVE_NUMAIF_H \ && HAVE_MPOL_CONSTANTS option_t ksm_options[] = { @@ -125,6 +127,10 @@ int main(int argc, char *argv[]) void cleanup(void) { + if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) + SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", + "%d", merge_across_nodes); + umount_mem(CPATH, CPATH_NEW); umount_mem(MEMCG_PATH, MEMCG_PATH_NEW); TEST_CLEANUP; @@ -139,6 +145,12 @@ void setup(void) if (access(PATH_KSM, F_OK) == -1) tst_brkm(TCONF, NULL, "KSM configuration is not enabled"); + if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) { + SAFE_FILE_SCANF(NULL, PATH_KSM "merge_across_nodes", + "%d", &merge_across_nodes); + SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", "1"); + } + tst_sig(FORK, DEF_HANDLER, cleanup); TEST_PAUSE; mount_mem("cpuset", "cpuset", NULL, CPATH, CPATH_NEW); diff --git a/testcases/kernel/mem/oom/oom02.c b/testcases/kernel/mem/ksm/ksm06.c similarity index 52% copy from testcases/kernel/mem/oom/oom02.c copy to testcases/kernel/mem/ksm/ksm06.c index 1fd199b..346a9b4 100644 --- a/testcases/kernel/mem/oom/oom02.c +++ b/testcases/kernel/mem/ksm/ksm06.c @@ -1,13 +1,6 @@ /* - * Out Of Memory (OOM) for mempolicy - need NUMA system support + * Copyright (C) 2013 Linux Test Project * - * The program is designed to cope with unpredictable like amount and - * system physical memory, swap size and other VMM technology like KSM, - * memcg, memory hotplug and so on which may affect the OOM - * behaviours. It simply increase the memory consumption 3G each time - * until all the available memory is consumed and OOM is triggered. - * - * Copyright (C) 2010 Red Hat, Inc. * This program is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public * License as published by the Free Software Foundation. @@ -29,74 +22,112 @@ * 02110-1301, USA. */ +/* + * The case is designed to test new sysfs boolean knob + * /sys/kernel/mm/ksm/merge_across_nodes, which was introduced by + * commit 90bd6fd31c8097ee (ksm: allow trees per NUMA node). + * when merge_across_nodes is set to zero only pages from the same + * node are merged, otherwise pages from all nodes can be merged + * together. + */ + #include "config.h" #include <sys/types.h> #include <sys/stat.h> +#include <sys/mman.h> #include <errno.h> #include <fcntl.h> +#if HAVE_NUMAIF_H +#include <numaif.h> +#endif +#include <signal.h> #include <stdio.h> +#include <unistd.h> #include "numa_helper.h" #include "test.h" +#include "safe_macros.h" #include "usctest.h" #include "mem.h" -char *TCID = "oom02"; +char *TCID = "ksm06"; int TST_TOTAL = 1; #if HAVE_NUMA_H && HAVE_LINUX_MEMPOLICY_H && HAVE_NUMAIF_H \ && HAVE_MPOL_CONSTANTS +static int run; +static int sleep_millisecs; +static int merge_across_nodes; +static int n_flag; +static unsigned long nr_pages; + +static char *n_opt; +option_t options[] = { + { "n:", &n_flag, &n_opt }, + { NULL, NULL, NULL } +}; +static void usage(void); + int main(int argc, char *argv[]) { - char *msg; int lc; + char *msg; - msg = parse_opts(argc, argv, NULL, NULL); + msg = parse_opts(argc, argv, options, &usage); if (msg != NULL) - tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); - -#if __WORDSIZE == 32 - tst_brkm(TCONF, NULL, "test is not designed for 32-bit system."); -#endif + tst_brkm(TBROK, NULL, "OPTION PASING ERROR - %s", msg); + if (n_flag) + nr_pages = SAFE_STRTOUL(NULL, n_opt, 0, ULONG_MAX); + else + nr_pages = 100; setup(); for (lc = 0; TEST_LOOPING(lc); lc++) { tst_count = 0; - tst_resm(TINFO, "OOM on MPOL_BIND mempolicy..."); - testoom(MPOL_BIND, 0); - - tst_resm(TINFO, "OOM on MPOL_INTERLEAVE mempolicy..."); - testoom(MPOL_INTERLEAVE, 0); - - tst_resm(TINFO, "OOM on MPOL_PREFERRED mempolicy..."); - testoom(MPOL_PREFERRED, 0); + test_ksm_merge_across_nodes(nr_pages); } + cleanup(); tst_exit(); } void setup(void) { - tst_require_root(NULL); - tst_sig(FORK, DEF_HANDLER, cleanup); - TEST_PAUSE; + if (access(PATH_KSM "merge_across_nodes", F_OK) == -1) + tst_brkm(TCONF, NULL, "no merge_across_nodes sysfs knob"); if (!is_numa(NULL)) tst_brkm(TCONF, NULL, "The case need a NUMA system."); - overcommit = get_sys_tune("overcommit_memory"); - set_sys_tune("overcommit_memory", 1, 1); + /* save the current value */ + SAFE_FILE_SCANF(NULL, PATH_KSM "run", "%d", &run); + SAFE_FILE_SCANF(NULL, PATH_KSM "merge_across_nodes", + "%d", &merge_across_nodes); + SAFE_FILE_SCANF(NULL, PATH_KSM "sleep_millisecs", + "%d", &sleep_millisecs); + + tst_sig(FORK, DEF_HANDLER, cleanup); + TEST_PAUSE; } void cleanup(void) { - set_sys_tune("overcommit_memory", overcommit, 0); + SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", + "%d", merge_across_nodes); + SAFE_FILE_PRINTF(NULL, PATH_KSM "sleep_millisecs", + "%d", sleep_millisecs); + SAFE_FILE_PRINTF(NULL, PATH_KSM "run", "%d", run); TEST_CLEANUP; } +static void usage(void) +{ + printf(" -n x Allocate x pages memory per node\n"); +} + #else /* no NUMA */ int main(void) { diff --git a/testcases/kernel/mem/lib/mem.c b/testcases/kernel/mem/lib/mem.c index 1232b4f..7cda3c5 100644 --- a/testcases/kernel/mem/lib/mem.c +++ b/testcases/kernel/mem/lib/mem.c @@ -96,7 +96,7 @@ static void set_global_mempolicy(int mempolicy) #if HAVE_NUMA_H && HAVE_LINUX_MEMPOLICY_H && HAVE_NUMAIF_H \ && HAVE_MPOL_CONSTANTS unsigned long nmask[MAXNODES / BITS_PER_LONG] = { 0 }; - unsigned int num_nodes, *nodes; + int num_nodes, *nodes; int ret; if (mempolicy) { @@ -467,6 +467,81 @@ void create_same_memory(int size, int num, int unit) WEXITSTATUS(status)); } +void test_ksm_merge_across_nodes(unsigned long nr_pages) +{ + char **memory; + int i, ret; + int num_nodes, *nodes; + unsigned long length; + unsigned long pagesize; + unsigned long nmask[MAXNODES / BITS_PER_LONG] = { 0 }; + + ret = get_allowed_nodes_arr(NH_MEMS|NH_CPUS, &num_nodes, &nodes); + if (ret != 0) + tst_brkm(TBROK|TERRNO, cleanup, "get_allowed_nodes_arr"); + if (num_nodes < 2) { + tst_resm(TINFO, "need NUMA system support"); + free(nodes); + return; + } + + pagesize = sysconf(_SC_PAGE_SIZE); + length = nr_pages * pagesize; + + memory = (char **)malloc(num_nodes * sizeof(char *)); + for (i = 0; i < num_nodes; i++) { + memory[i] = mmap(NULL, length, PROT_READ|PROT_WRITE, + MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); + if (memory[i] == MAP_FAILED) + tst_brkm(TBROK|TERRNO, tst_exit, "mmap"); + if (madvise(memory[i], length, MADV_MERGEABLE) == -1) + tst_brkm(TBROK|TERRNO, tst_exit, "madvise"); + +#if HAVE_NUMA_H && HAVE_LINUX_MEMPOLICY_H && HAVE_NUMAIF_H \ + && HAVE_MPOL_CONSTANTS + clean_node(nmask); + set_node(nmask, nodes[i]); + /* + * Use mbind() to make sure each node contains + * length size memory. + */ + ret = mbind(memory[i], length, MPOL_BIND, nmask, MAXNODES, 0); + if (ret == -1) + tst_brkm(TBROK|TERRNO, tst_exit, "mbind"); +#endif + + memset(memory[i], 10, length); + } + + SAFE_FILE_PRINTF(cleanup, PATH_KSM "sleep_millisecs", "0"); + SAFE_FILE_PRINTF(cleanup, PATH_KSM "pages_to_scan", "%ld", + nr_pages * num_nodes); + /* + * merge_across_nodes setting can be changed only when there + * are no ksm shared pages in system, so set run 2 to unmerge + * pages first, then to 1 after changing merge_across_nodes, + * to remerge according to the new setting. + */ + SAFE_FILE_PRINTF(cleanup, PATH_KSM "run", "2"); + wait_ksmd_done(); + tst_resm(TINFO, "Start to test KSM with merge_across_nodes=1"); + SAFE_FILE_PRINTF(cleanup, PATH_KSM "merge_across_nodes", "1"); + SAFE_FILE_PRINTF(cleanup, PATH_KSM "run", "1"); + group_check(1, 1, nr_pages * num_nodes - 1, 0, 0, 0, + nr_pages * num_nodes); + + SAFE_FILE_PRINTF(cleanup, PATH_KSM "run", "2"); + wait_ksmd_done(); + tst_resm(TINFO, "Start to test KSM with merge_across_nodes=0"); + SAFE_FILE_PRINTF(cleanup, PATH_KSM "merge_across_nodes", "0"); + SAFE_FILE_PRINTF(cleanup, PATH_KSM "run", "1"); + group_check(1, num_nodes, nr_pages * num_nodes - num_nodes, + 0, 0, 0, nr_pages * num_nodes); + + SAFE_FILE_PRINTF(cleanup, PATH_KSM "run", "2"); + wait_ksmd_done(); +} + void check_ksm_options(int *size, int *num, int *unit) { if (opt_size) { diff --git a/testcases/kernel/syscalls/ipc/semctl/semctl01.c b/testcases/kernel/syscalls/ipc/semctl/semctl01.c index c8957c8..687d909 100644 --- a/testcases/kernel/syscalls/ipc/semctl/semctl01.c +++ b/testcases/kernel/syscalls/ipc/semctl/semctl01.c @@ -1,20 +1,19 @@ /* + * Copyright (c) International Business Machines Corp., 2001 * - * Copyright (c) International Business Machines Corp., 2001 + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* @@ -22,7 +21,7 @@ * semctl01.c * * DESCRIPTION - * semctl01 - test the 10 possible semctl() commands + * semctl01 - test the 13 possible semctl() commands * * ALGORITHM * create a semaphore set with read and alter permissions @@ -35,68 +34,56 @@ * otherwise, * if doing functionality testing * call the appropriate test function - * if correct, + * if correct, * issue a PASS message * otherwise * issue a FAIL message * call cleanup - * - * USAGE: <for command-line> - * semctl01 [-c n] [-f] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -f : Turn off functionality Testing. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 03/2001 - Written by Wayne Boyer - * - * 11/03/2008 Renaud Lottiaux (Ren...@ke...) - * - Fix concurrency issue. Due to the use of usleep function to - * synchronize processes, synchronization issues can occur on a loaded - * system. Fix this by using pipes to synchronize processes. - * - * RESTRICTIONS - * none */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif #include "ipcsem.h" #include "libtestsuite.h" char *TCID = "semctl01"; -int TST_TOTAL = 10; +int TST_TOTAL = 13; -int sem_id_1 = -1; /* a semaphore set with read and alter permissions */ +static int sem_id_1 = -1; -int sync_pipes[2]; +static int sync_pipes[2]; /* * These are the various setup and check functions for the 10 different * commands that are available for the semctl() call. */ -void func_stat(void); -void set_setup(void), func_set(void); -void func_gall(void); -void cnt_setup(int), func_cnt(int); -void pid_setup(void), func_pid(int); -void gval_setup(void), func_gval(int); -void sall_setup(void), func_sall(void); -void func_sval(void); -void func_rmid(void); -void child_cnt(void); -void child_pid(void); - -struct semid_ds buf; -unsigned short array[PSEMS]; -struct sembuf sops; - -#define INCVAL 2 /* a semaphore increment value */ +static void func_stat(void); +static void set_setup(void), func_set(void); +static void func_gall(void); +static void cnt_setup(int), func_cnt(int); +static void pid_setup(void), func_pid(int); +static void func_gval(int); +static void sall_setup(void), func_sall(void); +static void func_sval(void); +static void func_rmid(void); +static void child_cnt(void); +static void child_pid(void); +static void func_iinfo(int); +static void func_sinfo(void); +static void func_sstat(int); + +static struct semid_ds buf; +static struct seminfo ipc_buf; +static unsigned short array[PSEMS]; +static struct sembuf sops; + +#define INCVAL 2 #define NEWMODE 066 #define NCHILD 5 -#define SEM2 2 /* semaphore to use for GETPID and GETVAL */ -#define SEM4 4 /* semaphore to use for GETNCNT and GETZCNT */ +#define SEM2 2 +#define SEM4 4 #define ONE 1 #ifdef _XLC_COMPILER #define SEMUN_CAST @@ -104,64 +91,57 @@ struct sembuf sops; #define SEMUN_CAST (union semun) #endif -#ifdef _XLC_COMPILER -#define SEMUN_CAST -#else -#define SEMUN_CAST (union semun) -#endif - -int pid_arr[NCHILD]; +static int pid_arr[NCHILD]; #ifdef UCLINUX #define PIPE_NAME "semctl01" static char *argv0; -int sem_op; +static int sem_op; #endif -struct test_case_t { - int semnum; /* the primitive semaphore to use */ - int cmd; /* the command to test */ - void (*func_test) (); /* the test function */ +static struct test_case_t { + int semnum; + int cmd; + void (*func_test) (); union semun arg; - void (*func_setup) (); /* the setup function if necessary */ + void (*func_setup) (); } TC[] = { - { - 0, IPC_STAT, func_stat, SEMUN_CAST & buf, NULL}, { - 0, IPC_SET, func_set, SEMUN_CAST & buf, set_setup}, { - 0, GETALL, func_gall, SEMUN_CAST array, NULL}, { - SEM4, GETNCNT, func_cnt, SEMUN_CAST & buf, cnt_setup}, { - SEM2, GETPID, func_pid, SEMUN_CAST & buf, pid_setup}, { - SEM2, GETVAL, func_gval, SEMUN_CAST & buf, NULL}, { - SEM4, GETZCNT, func_cnt, SEMUN_CAST & buf, cnt_setup}, { - 0, SETALL, func_sall, SEMUN_CAST array, sall_setup}, { - SEM4, SETVAL, func_sval, SEMUN_CAST INCVAL, NULL}, { - 0, IPC_RMID, func_rmid, SEMUN_CAST & buf, NULL} + {0, IPC_STAT, func_stat, SEMUN_CAST & buf, NULL}, + {0, IPC_SET, func_set, SEMUN_CAST & buf, set_setup}, + {0, GETALL, func_gall, SEMUN_CAST array, NULL}, + {SEM4, GETNCNT, func_cnt, SEMUN_CAST & buf, cnt_setup}, + {SEM2, GETPID, func_pid, SEMUN_CAST & buf, pid_setup}, + {SEM2, GETVAL, func_gval, SEMUN_CAST & buf, NULL}, + {SEM4, GETZCNT, func_cnt, SEMUN_CAST & buf, cnt_setup}, + {0, SETALL, func_sall, SEMUN_CAST array, sall_setup}, + {SEM4, SETVAL, func_sval, SEMUN_CAST INCVAL, NULL}, + {0, IPC_INFO, func_iinfo, SEMUN_CAST & ipc_buf, NULL}, + {0, SEM_INFO, func_sinfo, SEMUN_CAST & ipc_buf, NULL}, + {0, SEM_STAT, func_sstat, SEMUN_CAST & buf, NULL}, + {0, IPC_RMID, func_rmid, SEMUN_CAST & buf, NULL}, }; -int main(int ac, char **av) +int main(int argc, char *argv[]) { int lc; char *msg; int i, j; - if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) { + msg = parse_opts(argc, argv, NULL, NULL); + if (msg != NULL) tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); - } + #ifdef UCLINUX - argv0 = av[0]; + argv0 = argv[0]; maybe_run_child(&child_pid, "nd", 1, &sem_id_1); maybe_run_child(&child_cnt, "ndd", 2, &sem_id_1, &sem_op); #endif - setup(); /* global setup */ - - /* The following loop checks looping state if -i option given */ + setup(); for (lc = 0; TEST_LOOPING(lc); lc++) { - /* reset tst_count in case we are looping */ tst_count = 0; - /* loop through the test cases */ for (i = 0; i < TST_TOTAL; i++) { /* @@ -182,10 +162,6 @@ int main(int ac, char **av) } } - /* - * Use TEST macro to make the call - */ - TEST(semctl(sem_id_1, TC[i].semnum, TC[i].cmd, TC[i].arg)); @@ -202,9 +178,11 @@ int main(int ac, char **av) */ switch (TC[i].cmd) { case GETNCNT: - /*FALLTHROUGH*/ case GETZCNT: - /*FALLTHROUGH*/ case GETPID: - /*FALLTHROUGH*/ case GETVAL: + case GETZCNT: + case GETPID: + case GETVAL: + case IPC_INFO: + case SEM_STAT: (*TC[i].func_test) (TEST_RETURN); break; @@ -222,12 +200,11 @@ int main(int ac, char **av) */ switch (TC[i].cmd) { case GETNCNT: - /*FALLTHROUGH*/ case GETZCNT: + case GETZCNT: for (j = 0; j < NCHILD; j++) { - if (kill(pid_arr[j], SIGKILL) == -1) { + if (kill(pid_arr[j], SIGKILL) == -1) tst_brkm(TBROK, cleanup, "child kill failed"); - } } break; } @@ -236,39 +213,36 @@ int main(int ac, char **av) * recreate the semaphore resource if looping */ if (TEST_LOOPING(lc)) { - if ((sem_id_1 = semget(semkey, PSEMS, - IPC_CREAT | IPC_EXCL | SEM_RA)) - == -1) { + sem_id_1 = semget(semkey, PSEMS, + IPC_CREAT | IPC_EXCL | SEM_RA); + if (sem_id_1 == -1) tst_brkm(TBROK, cleanup, "couldn't recreate " "semaphore"); - } } } cleanup(); tst_exit(); - } /* * func_stat() - check the functionality of the IPC_STAT command with semctl() */ -void func_stat() +static void func_stat(void) { /* check the number of semaphores and the ipc_perm.mode value */ - if (buf.sem_nsems == PSEMS && buf.sem_perm.mode == (SEM_RA)) { + if (buf.sem_nsems == PSEMS && buf.sem_perm.mode == (SEM_RA)) tst_resm(TPASS, "buf.sem_nsems and buf.sem_perm.mode" " are correct"); - } else { + else tst_resm(TFAIL, "semaphore STAT info is incorrect"); - } } /* * set_setup() - set up for the IPC_SET command with semctl() */ -void set_setup() +static void set_setup(void) { /* set up a new mode for the semaphore set */ buf.sem_perm.mode = SEM_RA | NEWMODE; @@ -277,7 +251,7 @@ void set_setup() /* * func_set() - check the functionality of the IPC_SET command with semctl() */ -void func_set() +static void func_set(void) { /* first stat the semaphore to get the new data */ if (semctl(sem_id_1, 0, IPC_STAT, (union semun)&buf) == -1) { @@ -286,17 +260,16 @@ void func_set() } /* check that the new mode is what we set */ - if (buf.sem_perm.mode == (SEM_RA | NEWMODE)) { + if (buf.sem_perm.mode == (SEM_RA | NEWMODE)) tst_resm(TPASS, "buf.sem_perm.mode is correct"); - } else { + else tst_resm(TFAIL, "semaphore mode info is incorrect"); - } } /* * func_gall() - check the functionality of the GETALL command with semctl() */ -void func_gall() +static void func_gall(void) { int i; @@ -313,7 +286,7 @@ void func_gall() /* * cnt_setup() - set up for the GETNCNT and GETZCNT commands with semctl() */ -void cnt_setup(int opval) +static void cnt_setup(int opval) { int pid, i; @@ -326,31 +299,31 @@ void cnt_setup(int opval) if (opval == 0) { /* initialize the semaphore value to ONE */ sops.sem_op = ONE; - if (semop(sem_id_1, &sops, 1) == -1) { + if (semop(sem_id_1, &sops, 1) == -1) tst_brkm(TBROK, cleanup, "semop #1 failed - cnt_setup"); - } } - sops.sem_op = opval; /* set the correct operation */ + /* set the correct operation */ + sops.sem_op = opval; for (i = 0; i < NCHILD; i++) { if (sync_pipe_create(sync_pipes, PIPE_NAME) == -1) tst_brkm(TBROK, cleanup, "sync_pipe_create failed"); /* fork five children to wait */ - if ((pid = FORK_OR_VFORK()) == -1) + pid = FORK_OR_VFORK(); + if (pid == -1) tst_brkm(TBROK, cleanup, "fork failed in cnt_setup"); - if (pid == 0) { /* child */ + if (pid == 0) { #ifdef UCLINUX sem_op = sops.sem_op; - if (self_exec(argv0, "ndd", 2, sem_id_1, sem_op) < 0) { + if (self_exec(argv0, "ndd", 2, sem_id_1, sem_op) < 0) tst_brkm(TBROK, cleanup, "self_exec failed " "in cnt_setup"); - } #else child_cnt(); #endif - } else { /* parent */ + } else { if (sync_pipe_wait(sync_pipes) == -1) tst_brkm(TBROK, cleanup, "sync_pipe_wait failed"); @@ -370,7 +343,7 @@ void cnt_setup(int opval) sleep(1); } -void child_cnt() +static void child_cnt(void) { #ifdef UCLINUX sops.sem_op = (short int)sem_op; @@ -397,9 +370,9 @@ void child_cnt() * routine which should cause an error to be return * by the semop() call. */ - if (semop(sem_id_1, &sops, 1) != -1) { + if (semop(sem_id_1, &sops, 1) != -1) tst_resm(TBROK, "semop succeeded - cnt_setup"); - } + exit(0); } @@ -407,40 +380,37 @@ void child_cnt() * func_cnt() - check the functionality of the GETNCNT and GETZCNT commands * with semctl() */ -void func_cnt(int rval) +static void func_cnt(int rval) { - if (rval == NCHILD) { + if (rval == NCHILD) tst_resm(TPASS, "number of sleeping processes is correct"); - } else { + else tst_resm(TFAIL, "number of sleeping processes is not correct"); - } } /* * pid_setup() - set up for the GETPID command with semctl() */ -void pid_setup() +static void pid_setup(void) { int pid; - if (sync_pipe_create(sync_pipes, PIPE_NAME) == -1) { + if (sync_pipe_create(sync_pipes, PIPE_NAME) == -1) tst_brkm(TBROK, cleanup, "sync_pipe_create failed"); - } /* * Fork a child to do a semop that will pass. */ - if ((pid = FORK_OR_VFORK()) == -1) { + pid = FORK_OR_VFORK(); + if (pid == -1) tst_brkm(TBROK, cleanup, "fork failed in pid_setup()"); - } if (pid == 0) { /* child */ #ifdef UCLINUX - if (self_exec(argv0, "nd", 1, sem_id_1) < 0) { + if (self_exec(argv0, "nd", 1, sem_id_1) < 0) tst_brkm(TBROK, cleanup, "self_exec failed " "in pid_setup()"); - } #else child_pid(); #endif @@ -455,7 +425,7 @@ void pid_setup() } } -void child_pid() +static void child_pid(void) { #ifdef UCLINUX if (sync_pipe_create(sync_pipes, PIPE_NAME) == -1) @@ -468,53 +438,50 @@ void child_pid() if (sync_pipe_close(sync_pipes, PIPE_NAME) == -1) tst_brkm(TBROK, cleanup, "sync_pipe_close failed"); - sops.sem_num = SEM2; /* semaphore to change */ - sops.sem_op = ONE; /* operation is to increment semaphore */ + sops.sem_num = SEM2; + sops.sem_op = ONE; sops.sem_flg = 0; /* * Do a semop that will increment the semaphore. */ - if (semop(sem_id_1, &sops, 1) == -1) { + if (semop(sem_id_1, &sops, 1) == -1) tst_resm(TBROK, "semop failed - pid_setup"); - } + exit(0); } /* * func_pid() - check the functionality of the GETPID command with semctl() */ -void func_pid(int rval) +static void func_pid(int rval) { /* compare the rval (pid) to the saved pid from the setup */ - if (rval == pid_arr[SEM2]) { + if (rval == pid_arr[SEM2]) tst_resm(TPASS, "last pid value is correct"); - } else { + else tst_resm(TFAIL, "last pid value is not correct"); - } } /* * func_gval() - check the functionality of the GETVAL command with semctl() */ -void func_gval(int rval) +static void func_gval(int rval) { /* * This is a simple test. The semaphore value should be equal * to ONE as it was set in the last test (GETPID). */ - if (rval == 1) { + if (rval == 1) tst_resm(TPASS, "semaphore value is correct"); - } else { + else tst_resm(TFAIL, "semaphore value is not correct"); - } - } /* * all_setup() - set up for the SETALL command with semctl() */ -void sall_setup() +static void sall_setup(void) { int i; @@ -527,7 +494,7 @@ void sall_setup() /* * func_sall() - check the functionality of the SETALL command with semctl() */ -void func_sall() +static void func_sall(void) { int i; unsigned short rarray[PSEMS]; @@ -536,9 +503,8 @@ void func_sall() * do a GETALL and compare the values to those set above */ - if (semctl(sem_id_1, 0, GETALL, (union semun)rarray) == -1) { + if (semctl(sem_id_1, 0, GETALL, (union semun)rarray) == -1) tst_brkm(TBROK, cleanup, "semctl failed in func_sall"); - } for (i = 0; i < PSEMS; i++) { if (array[i] != rarray[i]) { @@ -553,7 +519,7 @@ void func_sall() /* * func_sval() - check the functionality of the SETVAL command with semctl() */ -void func_sval() +static void func_sval(void) { int semv; union semun arr; @@ -562,42 +528,60 @@ void func_sval() * do a GETVAL and compare it to the value set above */ - if ((semv = semctl(sem_id_1, SEM4, GETVAL, arr)) == -1) { + semv = semctl(sem_id_1, SEM4, GETVAL, arr); + if (semv == -1) tst_brkm(TBROK, cleanup, "semctl failed in func_sval"); - } - if (semv != INCVAL) { + if (semv != INCVAL) tst_resm(TFAIL, "semaphore value is not what was set"); - } else { + else tst_resm(TPASS, "semaphore value is correct"); - } } /* * func_rmid() - check the functionality of the IPC_RMID command with semctl() */ -void func_rmid() +static void func_rmid(void) { /* * do a semop() - we should get EINVAL */ - if (semop(sem_id_1, &sops, 1) != -1) { + if (semop(sem_id_1, &sops, 1) != -1) tst_resm(TFAIL, "semop succeeded on expected fail"); - } - if (errno != EINVAL) { + if (errno != EINVAL) tst_resm(TFAIL, "returned errno - %d - is not expected", errno); - } else { + else tst_resm(TPASS, "semaphore appears to be removed"); - } sem_id_1 = -1; } -/* - * setup() - performs all the ONE TIME setup for this test. - */ +static void func_iinfo(int hidx) +{ + if (hidx >= 0) + tst_resm(TPASS, "the highest index is correct"); + else + tst_resm(TFAIL, "the highest index is incorrect"); +} + +static void func_sinfo(void) +{ + if (ipc_buf.semusz < 1) + tst_resm(TFAIL, "number of semaphore sets is incorrect"); + else + tst_resm(TPASS, "number of semaphore sets is correct"); +} + +static void func_sstat(int semidx) +{ + if (semidx >= 0) + tst_resm(TPASS, "id of the semaphore set is correct"); + else + tst_resm(TFAIL, "id of the semaphore set is incorrect"); +} + void setup(void) { @@ -605,27 +589,17 @@ void setup(void) TEST_PAUSE; - /* - * Create a temporary directory and cd into it. - * This helps to ensure that a unique msgkey is created. - * See ../lib/libipc.c for more information. - */ tst_tmpdir(); /* get an IPC resource key */ semkey = getipckey(); /* create a semaphore set with read and alter permissions */ - if ((sem_id_1 = - semget(semkey, PSEMS, IPC_CREAT | IPC_EXCL | SEM_RA)) == -1) { + sem_id_1 = semget(semkey, PSEMS, IPC_CREAT | IPC_EXCL | SEM_RA); + if (sem_id_1 == -1) tst_brkm(TBROK, cleanup, "couldn't create semaphore in setup"); - } } -/* - * cleanup() - performs all the ONE TIME cleanup for this test at completion - * or premature exit. - */ void cleanup(void) { /* if it exists, remove the semaphore resource */ @@ -633,10 +607,5 @@ void cleanup(void) tst_rmdir(); - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ TEST_CLEANUP; - } diff --git a/testcases/kernel/syscalls/mount/mount03.c b/testcases/kernel/syscalls/mount/mount03.c index 04570b9..295b6da 100644 --- a/testcases/kernel/syscalls/mount/mount03.c +++ b/testcases/kernel/syscalls/mount/mount03.c @@ -14,10 +14,8 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * */ -/************************************************************************** - * - * TEST IDENTIFIER : mount03 - * + +/* * EXECUTED BY : root / superuser * * TEST TITLE : Test for checking mount(2) flags @@ -26,10 +24,6 @@ * * AUTHOR : Nirmala Devi Dhanasekar <nir...@wi...> * - * SIGNALS - * Uses SIGUSR1 to pause before test if option set. - * (See the parse_opts(3) man page). - * * DESCRIPTION * Check for basic mount(2) system call flags. * @@ -42,13 +36,13 @@ * 5) MS_REMOUNT - alter flags of a mounted FS. * 6) MS_NOSUID - ignore suid and sgid bits. * - * Setup: + * Setup: * Setup signal handling. * Create a mount point. * Pause for SIGUSR1 if option specified. * - * Test: - * Loop if the proper options are given. + * Test: + * Loop if the proper options are given. * Execute mount system call for each flag * Validate each flag setting. if validation fails * Delete the mount point. @@ -56,22 +50,10 @@ * Delete the mount point. * Otherwise, Issue a PASS message. * - * Cleanup: - * Print errno log and/or timing stats if options given + * Cleanup: + * Print errno log and/or timing stats if options given * Delete the temporary directory(s)/file(s) created. * - * USAGE: <for command-line> - * mount03 [-T type] -D device [-e] [-i n] [-I x] [-p x] [-t] - * where, -T type : specifies the type of filesystem to - * be mounted. Default ext2. - * -D device : device to be mounted. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -p : Pause for SIGUSR1 before starting - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * * RESTRICTIONS * test must run with the -D option * test doesn't support -c option to run it in parallel, as mount @@ -102,30 +84,29 @@ static int setup_uid(void); char *TCID = "mount03"; int TST_TOTAL = 6; -extern char **environ; /* pointer to this processes env */ #define DEFAULT_FSTYPE "ext2" #define TEMP_FILE "temp_file" #define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) -#define DIR_MODE (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) +#define DIR_MODE (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP| \ + S_IXGRP|S_IROTH|S_IXOTH) #define SUID_MODE (S_ISUID|S_IRUSR|S_IXUSR|S_IXGRP|S_IXOTH) -static char *Fstype; +static char *fs_type; static char mntpoint[20]; static char *fstype; static char *device; -static int Tflag = 0; -static int Dflag = 0; - -static char write_buffer[BUFSIZ]; /* buffer used to write data to file */ -static char read_buffer[BUFSIZ]; /* buffer used to read data from file */ -static int fildes; /* file descriptor for temporary file */ -static char *Cmd_buffer[3]; /* Buffer to hold command string */ -static char Path_name[PATH_MAX]; /* Buffer to hold command string */ -static char testhome_path[PATH_MAX]; /* Test home Path */ -static char file[PATH_MAX]; /* Temporary file */ -static char cmd[] = "cp"; +static int tflag; +static int dflag; +static int fildes; + +static char write_buffer[BUFSIZ]; +static char read_buffer[BUFSIZ]; +static char path_name[PATH_MAX]; +static char testhome_path[PATH_MAX]; +static char file[PATH_MAX]; +static char *cmd = "cp"; long rwflags[] = { MS_RDONLY, @@ -136,41 +117,41 @@ long rwflags[] = { MS_NOSUID, }; -static option_t options[] = { /* options supported by mount03 test */ - {"T:", &Tflag, &fstype}, /* -T type of filesystem */ - {"D:", &Dflag, &device}, /* -D device used for mounting */ +static option_t options[] = { + {"T:", &tflag, &fstype}, + {"D:", &dflag, &device}, {NULL, NULL, NULL} }; -int main(int ac, char **av) +int main(int argc, char *argv[]) { int lc, i; char *msg; - if ((msg = parse_opts(ac, av, options, &help)) != NULL) + msg = parse_opts(argc, argv, options, &help); + if (msg != NULL) tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); /* Check for mandatory option of the testcase */ - if (!Dflag) { + if (!dflag) tst_brkm(TBROK, NULL, "you must specify the device used for mounting with -D " "option"); - } - if (Tflag) { - Fstype = (char *)malloc(strlen(fstype) + 1); - if (Fstype == NULL) { + if (tflag) { + fs_type = malloc(strlen(fstype) + 1); + if (fs_type == NULL) tst_brkm(TBROK | TERRNO, NULL, "malloc failed"); - } - Fstype[strlen(fstype)] = '\0'; - strncpy(Fstype, fstype, strlen(fstype)); + + fs_type[strlen(fstype)] = '\0'; + strncpy(fs_type, fstype, strlen(fstype)); } else { - Fstype = (char *)malloc(strlen(DEFAULT_FSTYPE) + 1); - if (Fstype == NULL) { + fs_type = malloc(strlen(DEFAULT_FSTYPE) + 1); + if (fs_type == NULL) tst_brkm(TBROK | TERRNO, NULL, "malloc failed"); - } - strncpy(Fstype, DEFAULT_FSTYPE, strlen(DEFAULT_FSTYPE)); - Fstype[strlen(DEFAULT_FSTYPE)] = '\0'; + + strncpy(fs_type, DEFAULT_FSTYPE, strlen(DEFAULT_FSTYPE)); + fs_type[strlen(DEFAULT_FSTYPE)] = '\0'; } if (STD_COPIES != 1) { @@ -189,7 +170,8 @@ int main(int ac, char **av) for (i = 0; i < TST_TOTAL; ++i) { /* Call mount(2) */ - TEST(mount(device, mntpoint, Fstype, rwflags[i], NULL)); + TEST(mount(device, mntpoint, fs_type, rwflags[i], + NULL)); /* check return code */ if (TEST_RETURN != 0) { @@ -198,22 +180,20 @@ int main(int ac, char **av) } /* Validate the rwflag */ - if (test_rwflag(i, lc) == 1) { + if (test_rwflag(i, lc) == 1) tst_resm(TFAIL, "mount(2) failed while" " validating %ld", rwflags[i]); - } else { + else tst_resm(TPASS, "mount(2) passed with " "rwflag = %ld", rwflags[i]); - } + TEST(umount(mntpoint)); - if (TEST_RETURN != 0) { + if (TEST_RETURN != 0) tst_brkm(TBROK | TTERRNO, cleanup, "umount(2) failed for %s", mntpoint); - } } } - /* cleanup and exit */ cleanup(); tst_exit(); @@ -226,7 +206,7 @@ int main(int ac, char **av) int test_rwflag(int i, int cnt) { - int fd, pid, status; + int ret, fd, pid, status; char nobody_uid[] = "nobody"; struct passwd *ltpuser; @@ -234,8 +214,9 @@ int test_rwflag(int i, int cnt) case 0: /* Validate MS_RDONLY flag of mount call */ - snprintf(file, PATH_MAX, "%stmp", Path_name); - if ((fd = open(file, O_CREAT | O_RDWR, S_IRWXU)) == -1) { + snprintf(file, PATH_MAX, "%stmp", path_name); + fd = open(file, O_CREAT | O_RDWR, S_IRWXU); + if (fd == -1) { if (errno == EROFS) { return 0; } else { @@ -249,10 +230,11 @@ int test_rwflag(int i, int cnt) case 1: /* Validate MS_NODEV flag of mount call */ - snprintf(file, PATH_MAX, "%smynod_%d_%d", Path_name, getpid(), + snprintf(file, PATH_MAX, "%smynod_%d_%d", path_name, getpid(), cnt); if (mknod(file, S_IFBLK | 0777, 0) == 0) { - if ((fd = open(file, O_RDWR, S_IRWXU)) == -1) { + fd = open(file, O_RDWR, S_IRWXU); + if (fd == -1) { if (errno == EACCES) { return 0; } else { @@ -271,12 +253,15 @@ int test_rwflag(int i, int cnt) case 2: /* Validate MS_NOEXEC flag of mount call */ - snprintf(file, PATH_MAX, "%stmp1", Path_name); - if ((fd = open(file, O_CREAT | O_RDWR, S_IRWXU)) == -1) { + snprintf(file, PATH_MAX, "%stmp1", path_name); + fd = open(file, O_CREAT | O_RDWR, S_IRWXU); + if (fd == -1) { tst_resm(TWARN | TERRNO, "opening %s failed", file); } else { close(fd); - execlp(file, basename(file), NULL); + ret = execlp(file, basename(file), NULL); + if ((ret == -1) && (errno == EACCES)) + return 0; } return 1; case 3: @@ -288,9 +273,9 @@ int test_rwflag(int i, int cnt) strcpy(write_buffer, "abcdefghijklmnopqrstuvwxyz"); /* Creat a temporary file under above directory */ - snprintf(file, PATH_MAX, "%s%s", Path_name, TEMP_FILE); - if ((fildes = open(file, O_RDWR | O_CREAT, FILE_MODE)) - == -1) { + snprintf(file, PATH_MAX, "%s%s", path_name, TEMP_FILE); + fildes = open(file, O_RDWR | O_CREAT, FILE_MODE); + if (fildes == -1) { tst_resm(TWARN | TERRNO, "open(%s, O_RDWR|O_CREAT, %#o) failed", file, FILE_MODE); @@ -333,14 +318,14 @@ int test_rwflag(int i, int cnt) case 4: /* Validate MS_REMOUNT flag of mount call */ - TEST(mount(device, mntpoint, Fstype, MS_REMOUNT, NULL)); + TEST(mount(device, mntpoint, fs_type, MS_REMOUNT, NULL)); if (TEST_RETURN != 0) { tst_resm(TWARN | TTERRNO, "mount(2) failed to remount"); return 1; } else { - snprintf(file, PATH_MAX, "%stmp2", Path_name); - if ((fd = open(file, O_CREAT | O_RDWR, S_IRWXU)) - == -1) { + snprintf(file, PATH_MAX, "%stmp2", path_name); + fd = open(file, O_CREAT | O_RDWR, S_IRWXU); + if (fd == -1) { tst_resm(TWARN, "open(%s) on readonly " "filesystem passed", file); return 1; @@ -356,23 +341,23 @@ int test_rwflag(int i, int cnt) tst_resm(TBROK | TERRNO, "setup_uid failed"); return 1; } - switch (pid = fork()) { + pid = fork(); + switch (pid) { case -1: tst_resm(TBROK | TERRNO, "fork failed"); return 1; case 0: - snprintf(file, PATH_MAX, "%ssetuid_test", Path_name); - if (chmod(file, SUID_MODE) != 0) { + snprintf(file, PATH_MAX, "%ssetuid_test", path_name); + if (chmod(file, SUID_MODE) != 0) tst_resm(TWARN, "chmod(%s, %#o) failed", file, SUID_MODE); - } ltpuser = getpwnam(nobody_uid); - if (setreuid(ltpuser->pw_uid, ltpuser->pw_uid) == -1) { + if (setreuid(ltpuser->pw_uid, ltpuser->pw_uid) == -1) tst_resm(TWARN | TERRNO, "seteuid() failed to change euid to %d", ltpuser->pw_uid); - } + execlp(file, basename(file), NULL); exit(1); default: @@ -395,24 +380,21 @@ int setup_uid() int pid, status; char command[PATH_MAX]; - switch (pid = fork()) { + pid = fork(); + switch (pid) { case -1: tst_resm(TWARN | TERRNO, "fork failed"); return 1; case 0: - Cmd_buffer[0] = cmd; - Cmd_buffer[1] = testhome_path; - Cmd_buffer[2] = Path_name; - /* Put command into string */ - sprintf(command, "%s %s %s", cmd, testhome_path, Path_name); + sprintf(command, "%s %s %s", cmd, testhome_path, path_name); /* Run command to cp file to right spot */ - if (system(command) == 0) { + if (system(command) == 0) execlp(file, basename(file), NULL); - } else { + else printf("call to %s failed\n", command); - } + exit(1); default: waitpid(pid, &status, 0); @@ -428,62 +410,64 @@ int setup_uid() } } -/* setup() - performs all ONE TIME setup for this test */ void setup() { - char *test_home; /* variable to hold TESTHOME env */ + int fd; + char path[PATH_MAX]; + char *test_home; struct stat setuid_test_stat; tst_sig(FORK, DEF_HANDLER, cleanup); /* Check whether we are root */ if (geteuid() != 0) { - free(Fstype); + free(fs_type); tst_brkm(TBROK, NULL, "Test must be run as root"); } - /* Test home directory */ - test_home = get_current_dir_name(); - - /* make a temp directory */ tst_tmpdir(); - /* Unique mount point */ - (void)sprintf(mntpoint, "mnt_%d", getpid()); + test_home = get_current_dir_name(); - if (mkdir(mntpoint, DIR_MODE)) { + sprintf(mntpoint, "mnt_%d", getpid()); + + if (mkdir(mntpoint, DIR_MODE)) tst_brkm(TBROK | TERRNO, cleanup, "mkdir(%s, %#o) failed", mntpoint, DIR_MODE); - } + /* Get the current working directory of the process */ - if (getcwd(Path_name, sizeof(Path_name)) == NULL) { + if (getcwd(path_name, sizeof(path_name)) == NULL) tst_brkm(TBROK, cleanup, "getcwd failed"); - } - if (chmod(Path_name, DIR_MODE) != 0) { + + if (chmod(path_name, DIR_MODE) != 0) tst_brkm(TBROK, cleanup, "chmod(%s, %#o) failed", - Path_name, DIR_MODE); - } - snprintf(file, PATH_MAX, "%ssetuid_test", Path_name); + path_name, DIR_MODE); + + snprintf(file, PATH_MAX, "%s/setuid_test", path_name); + fd = open(file, O_CREAT | O_TRUNC); + if (fd == -1) + tst_brkm(TBROK, cleanup, "open file failed"); + close(fd); + if (stat(file, &setuid_test_stat) < 0) { tst_brkm(TBROK, cleanup, "stat for setuid_test failed"); } else { if ((setuid_test_stat.st_uid || setuid_test_stat.st_gid) && - chown(file, 0, 0) < 0) { + chown(file, 0, 0) < 0) tst_brkm(TBROK, cleanup, "chown for setuid_test failed"); - } + if (setuid_test_stat.st_mode != SUID_MODE && - chmod(file, SUID_MODE) < 0) { + chmod(file, SUID_MODE) < 0) tst_brkm(TBROK, cleanup, "setuid for setuid_test failed"); - } } /* * under temporary directory */ - snprintf(Path_name, PATH_MAX, "%s/%s/", Path_name, mntpoint); - + strncpy(path, path_name, PATH_MAX); + snprintf(path_name, PATH_MAX, "%s/%s/", path, mntpoint); strcpy(testhome_path, test_home); strcat(testhome_path, "/setuid_test"); @@ -491,18 +475,10 @@ void setup() } -/* - *cleanup() - performs all ONE TIME cleanup for this test at - * completion or premature exit. - */ void cleanup() { - free(Fstype); + free(fs_type); - /* - * print timing stats if that option was specified. - * print errno log if that option was specified. - */ TEST_CLEANUP; tst_rmdir(); @@ -514,6 +490,6 @@ void cleanup() void help() { printf("-T type : specifies the type of filesystem to be mounted." - " Default ext2. \n"); - printf("-D device : device used for mounting \n"); + " Default ext2.\n"); + printf("-D device : device used for mounting.\n"); } hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-14 13:21:11
|
The branch, master, has been updated via 17e8f1fc67b05740b97ab0d6b3adc7f607892709 (commit) from e68ce79f8fef5617b1190be5ce88ee588135d5f0 (commit) - Log ----------------------------------------------------------------- commit 17e8f1fc67b05740b97ab0d6b3adc7f607892709 Author: Cyril Hrubis <ch...@su...> Date: Tue May 14 15:14:03 2013 +0200 openposix/.../sigaddset/1-3: Fix uninitialized variable. My last fix in this testcase introduced uninitialized variable, sorry. Signed-off-by: Cyril Hrubis <ch...@su...> ----------------------------------------------------------------------- Summary of changes: .../conformance/interfaces/sigaddset/1-3.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigaddset/1-3.c b/testcases/open_posix_testsuite/conformance/interfaces/sigaddset/1-3.c index 144d2ac..bb80da7 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigaddset/1-3.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigaddset/1-3.c @@ -31,7 +31,8 @@ static const int sigs[] = { int main(void) { sigset_t signalset; - int i, err; + unsigned int i; + int err = 0; if (sigemptyset(&signalset) == -1) { perror("sigemptyset failed -- test aborting\n"); hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-14 11:21:18
|
The branch, master, has been updated via e68ce79f8fef5617b1190be5ce88ee588135d5f0 (commit) via c5532e498eadde47b4a41186c63937953a035648 (commit) from 023f90b37de31039c5059283e16920b3e42cb0e3 (commit) - Log ----------------------------------------------------------------- commit e68ce79f8fef5617b1190be5ce88ee588135d5f0 Author: Jan Stancek <jst...@re...> Date: Tue May 14 13:11:45 2013 +0200 syscalls/cacheflush01: remove define of __NR_cacheflush After including linux_syscall_numbers.h __NR_cacheflush is guaranteed to be defined, redefining it to 0 collides with __NR_read and testcase fails. Signed-off-by: Jan Stancek <jst...@re...> commit c5532e498eadde47b4a41186c63937953a035648 Author: Jan Stancek <jst...@re...> Date: Tue May 14 11:59:33 2013 +0200 testcases/kernel: initialize fields of sigaction struct Uninitialized fields of sigaction struct like sa_flags or sa_mask can cause sporadic issues. Signed-off-by: Jan Stancek <jst...@re...> ----------------------------------------------------------------------- Summary of changes: include/ltp_signal.h | 1 + testcases/kernel/io/direct_io/diotest4.c | 2 ++ .../kernel/syscalls/cacheflush/cacheflush01.c | 4 +--- testcases/kernel/syscalls/fcntl/fcntl16.c | 1 + testcases/kernel/syscalls/ioctl/ioctl02.c | 2 ++ testcases/kernel/syscalls/llseek/llseek01.c | 2 ++ testcases/kernel/syscalls/ptrace/ptrace01.c | 2 ++ testcases/kernel/syscalls/ptrace/ptrace02.c | 2 ++ testcases/kernel/syscalls/readdir/readdir02.c | 2 ++ 9 files changed, 15 insertions(+), 3 deletions(-) diff --git a/include/ltp_signal.h b/include/ltp_signal.h index a1beaf0..95134e9 100644 --- a/include/ltp_signal.h +++ b/include/ltp_signal.h @@ -81,6 +81,7 @@ static inline int sig_initial(int sig) struct sigaction act, oact; act.sa_handler = handler_h; + act.sa_flags = 0; /* Clear out the signal set. */ if (sigemptyset(&act.sa_mask) < 0) { /* Add the signal to the mask set. */ diff --git a/testcases/kernel/io/direct_io/diotest4.c b/testcases/kernel/io/direct_io/diotest4.c index 50ec535..10281bf 100644 --- a/testcases/kernel/io/direct_io/diotest4.c +++ b/testcases/kernel/io/direct_io/diotest4.c @@ -591,6 +591,8 @@ static void setup(void) tst_tmpdir(); act.sa_handler = SIG_IGN; + act.sa_flags = 0; + sigemptyset(&act.sa_mask); (void)sigaction(SIGXFSZ, &act, NULL); sprintf(filename, "testdata-4.%ld", syscall(__NR_gettid)); diff --git a/testcases/kernel/syscalls/cacheflush/cacheflush01.c b/testcases/kernel/syscalls/cacheflush/cacheflush01.c index d4d353f..9c02f0a 100644 --- a/testcases/kernel/syscalls/cacheflush/cacheflush01.c +++ b/testcases/kernel/syscalls/cacheflush/cacheflush01.c @@ -48,11 +48,9 @@ #include "usctest.h" #include "linux_syscall_numbers.h" -#if defined __NR_cacheflush && __NR_cacheflush > 0 +#if __NR_cacheflush != __LTP__NR_INVALID_SYSCALL #include <asm/cachectl.h> #else -/* Fake linux_syscall_numbers.h */ -#define __NR_cacheflush 0 #ifndef ICACHE #define ICACHE (1<<0) /* flush instruction cache */ #endif diff --git a/testcases/kernel/syscalls/fcntl/fcntl16.c b/testcases/kernel/syscalls/fcntl/fcntl16.c index d985ae1..8bdb6b5 100644 --- a/testcases/kernel/syscalls/fcntl/fcntl16.c +++ b/testcases/kernel/syscalls/fcntl/fcntl16.c @@ -310,6 +310,7 @@ void dochild(int kid) struct sigaction sact; sact.sa_flags = 0; sact.sa_handler = catch_int; + sigemptyset(&sact.sa_mask); (void)sigaction(SIGUSR1, &sact, NULL); /* Lock should succeed after blocking and parent releases lock */ diff --git a/testcases/kernel/syscalls/ioctl/ioctl02.c b/testcases/kernel/syscalls/ioctl/ioctl02.c index d9cdc8a..794a9b0 100644 --- a/testcases/kernel/syscalls/ioctl/ioctl02.c +++ b/testcases/kernel/syscalls/ioctl/ioctl02.c @@ -213,6 +213,7 @@ void do_child_uclinux(void) /* Set up the signal handlers again */ act.sa_handler = (void *)sigterm_handler; act.sa_flags = 0; + sigemptyset(&act.sa_mask); (void)sigaction(SIGTERM, &act, 0); /* Run the normal child */ @@ -457,6 +458,7 @@ static void setup(void) /* Set up the signal handlers */ act.sa_handler = (void *)sigterm_handler; act.sa_flags = 0; + sigemptyset(&act.sa_mask); (void)sigaction(SIGTERM, &act, 0); act.sa_handler = (void *)sigusr1_handler; diff --git a/testcases/kernel/syscalls/llseek/llseek01.c b/testcases/kernel/syscalls/llseek/llseek01.c index 94f61ad..151e200 100644 --- a/testcases/kernel/syscalls/llseek/llseek01.c +++ b/testcases/kernel/syscalls/llseek/llseek01.c @@ -189,6 +189,8 @@ void setup() TEST_PAUSE; act.sa_handler = SIG_IGN; + act.sa_flags = 0; + sigemptyset(&act.sa_mask); if (sigaction(SIGXFSZ, &act, NULL) == -1) { tst_brkm(TFAIL, NULL, "sigaction() Failed to ignore SIGXFSZ"); tst_exit(); diff --git a/testcases/kernel/syscalls/ptrace/ptrace01.c b/testcases/kernel/syscalls/ptrace/ptrace01.c index 2961fd2..cbdd9ca 100644 --- a/testcases/kernel/syscalls/ptrace/ptrace01.c +++ b/testcases/kernel/syscalls/ptrace/ptrace01.c @@ -138,6 +138,7 @@ int main(int ac, char **av) if (i == 1) { parent_act.sa_handler = parent_handler; parent_act.sa_flags = SA_RESTART; + sigemptyset(&parent_act.sa_mask); if ((sigaction(SIGUSR2, &parent_act, NULL)) == -1) { @@ -228,6 +229,7 @@ void do_child() child_act.sa_handler = child_handler; } child_act.sa_flags = SA_RESTART; + sigemptyset(&child_act.sa_mask); if ((sigaction(SIGUSR2, &child_act, NULL)) == -1) { tst_resm(TWARN, "sigaction() failed in child"); diff --git a/testcases/kernel/syscalls/ptrace/ptrace02.c b/testcases/kernel/syscalls/ptrace/ptrace02.c index 3991ecf..2075204 100644 --- a/testcases/kernel/syscalls/ptrace/ptrace02.c +++ b/testcases/kernel/syscalls/ptrace/ptrace02.c @@ -138,6 +138,7 @@ int main(int ac, char **av) if (i == 1) { parent_act.sa_handler = parent_handler; parent_act.sa_flags = SA_RESTART; + sigemptyset(&parent_act.sa_mask); if ((sigaction(SIGUSR2, &parent_act, NULL)) == -1) { @@ -229,6 +230,7 @@ void do_child() child_act.sa_handler = child_handler; } child_act.sa_flags = SA_RESTART; + sigemptyset(&child_act.sa_mask); if ((sigaction(SIGUSR2, &child_act, NULL)) == -1) { tst_resm(TWARN, "sigaction() failed in child"); diff --git a/testcases/kernel/syscalls/readdir/readdir02.c b/testcases/kernel/syscalls/readdir/readdir02.c index 85fe510..e44c722 100644 --- a/testcases/kernel/syscalls/readdir/readdir02.c +++ b/testcases/kernel/syscalls/readdir/readdir02.c @@ -181,6 +181,8 @@ void setup() tst_sig(NOFORK, DEF_HANDLER, cleanup); act.sa_handler = sigsegv_handler; + act.sa_flags = 0; + sigemptyset(&act.sa_mask); (void)sigaction(SIGSEGV, &act, NULL); TEST_PAUSE; hooks/post-receive -- ltp |
From: Cyril H. <su...@li...> - 2013-05-14 09:21:15
|
The branch, master, has been updated via 023f90b37de31039c5059283e16920b3e42cb0e3 (commit) from 381456d98abb05b4354de20d9a056d444dce6834 (commit) - Log ----------------------------------------------------------------- commit 023f90b37de31039c5059283e16920b3e42cb0e3 Author: Jan Stancek <jst...@re...> Date: Tue May 14 10:53:33 2013 +0200 openposix/../pthread_cond_timedwait/2-7: alternativ goes out of scope "alternativ" goes out of scope, "td", which points to it is used later in pthread_mutex_init(). Signed-off-by: Jan Stancek <jst...@re...> ----------------------------------------------------------------------- Summary of changes: .../interfaces/pthread_cond_timedwait/2-7.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/testcases/open_posix_testsuite/conformance/interfaces/pthread_cond_timedwait/2-7.c b/testcases/open_posix_testsuite/conformance/interfaces/pthread_cond_timedwait/2-7.c index 83e18ae..28c977e 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/pthread_cond_timedwait/2-7.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/pthread_cond_timedwait/2-7.c @@ -258,6 +258,7 @@ int main(void) pthread_condattr_t ca; testdata_t *td; + testdata_t alternativ; int do_fork; @@ -300,7 +301,6 @@ int main(void) */ if (mf < 0) { /* Cannot mmap a file, we use an alternative method */ - testdata_t alternativ; td = &alternativ; pshared = -1; /* We won't do this testing anyway */ #if VERBOSE > 0 hooks/post-receive -- ltp |