[LTP] [PATCH v3 1/3] syscalls/pipe2_01: convert into new API
Li Wang
liwang@redhat.com
Tue Apr 21 10:19:08 CEST 2020
Hi Xu,
On Thu, Apr 16, 2020 at 3:29 PM Yang Xu <xuyang2018.jy@cn.fujitsu.com>
wrote:
> Also, add O_DIRECT flag test. This flag was introduced since
> commit 9883035ae7ed ("pipes: add a "packetized pipe" mode for writing").
>
> Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
> ---
> include/lapi/fcntl.h | 4 +
> runtest/syscalls | 1 -
> testcases/kernel/syscalls/pipe2/.gitignore | 1 -
> testcases/kernel/syscalls/pipe2/pipe2_01.c | 234 ++++++---------------
> testcases/kernel/syscalls/pipe2/pipe2_02.c | 175 ---------------
> 5 files changed, 65 insertions(+), 350 deletions(-)
> delete mode 100644 testcases/kernel/syscalls/pipe2/pipe2_02.c
>
> diff --git a/include/lapi/fcntl.h b/include/lapi/fcntl.h
> index 24aa46e1f..576a18daf 100644
> --- a/include/lapi/fcntl.h
> +++ b/include/lapi/fcntl.h
> @@ -9,6 +9,10 @@
> #include <fcntl.h>
> #include <sys/socket.h>
>
> +#ifndef O_DIRECT
> +# define O_DIRECT 040000
> +#endif
> +
> #ifndef O_CLOEXEC
> # define O_CLOEXEC 02000000
> #endif
> diff --git a/runtest/syscalls b/runtest/syscalls
> index 44254d7da..79b671d50 100644
> --- a/runtest/syscalls
> +++ b/runtest/syscalls
> @@ -911,7 +911,6 @@ pipe12 pipe12
> pipe13 pipe13
>
> pipe2_01 pipe2_01
> -pipe2_02 pipe2_02
>
> pivot_root01 pivot_root01
>
> diff --git a/testcases/kernel/syscalls/pipe2/.gitignore
> b/testcases/kernel/syscalls/pipe2/.gitignore
> index cd38bb309..42350bbdc 100644
> --- a/testcases/kernel/syscalls/pipe2/.gitignore
> +++ b/testcases/kernel/syscalls/pipe2/.gitignore
> @@ -1,2 +1 @@
> /pipe2_01
> -/pipe2_02
> diff --git a/testcases/kernel/syscalls/pipe2/pipe2_01.c
> b/testcases/kernel/syscalls/pipe2/pipe2_01.c
> index 5f3ad8f0f..86f3f18d6 100644
> --- a/testcases/kernel/syscalls/pipe2/pipe2_01.c
> +++ b/testcases/kernel/syscalls/pipe2/pipe2_01.c
> @@ -1,186 +1,74 @@
>
> -/******************************************************************************/
> -/*
> */
> -/* Copyright (c) Ulrich Drepper <drepper@redhat.com>
> */
> -/* Copyright (c) International Business Machines Corp., 2009
> */
> -/*
> */
> -/* 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: pipe2_01.c
> */
> -/*
> */
> -/* Description: This Program tests the new system call introduced in
> 2.6.27. */
> -/* Ulrich´s comment as in:
> */
> -/*
> http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=ed8cae8ba01348bfd83333f4648dd807b04d7f08
> */
> -/* says:
> */
> -/* This patch introduces the new syscall pipe2 which is like pipe but it
> also */
> -/* takes an additional parameter which takes a flag value. This patch
> */
> -/* implements the handling of O_CLOEXEC for the flag. I did not add
> support */
> -/* for the new syscall for the architectures which have a special
> sys_pipe */
> -/* implementation. I think the maintainers of those archs have the
> chance to */
> -/* go with the unified implementation but that's up to them.
> */
> -/*
> */
> -/* The implementation introduces do_pipe_flags. I did that instead of
> */
> -/* changing all callers of do_pipe because some of the callers are
> written in */
> -/* assembler. I would probably screw up changing the assembly code. To
> avoid */
> -/* breaking code do_pipe is now a small wrapper around do_pipe_flags.
> Once */
> -/* all callers are changed over to do_pipe_flags the old do_pipe function
> can */
> -/* be removed.
> */
> -/* The following test must be adjusted for architectures other than x86
> and */
> -/* x86-64 and in case the syscall numbers changed.
> */
> -/*
> */
> -/* Usage: <for command-line>
> */
> -/* pipe2_01 [-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: pipe2_01
> */
> -/*
> */
> -/* Author: Ulrich Drepper <drepper@redhat.com>
> */
> -/*
> */
> -/* History: Created - Jan 13 2009 - Ulrich Drepper <
> drepper@redhat.com> */
> -/* Ported to LTP
> */
> -/* - Jan 13 2009 - Subrata <
> subrata@linux.vnet.ibm.com> */
>
> -/******************************************************************************/
> -#include <fcntl.h>
> +// SPDX-License-Identifier: GPL-2.0-or-late
> +/*
> + * Copyright (c) Ulrich Drepper <drepper@redhat.com>
> + * Copyright (c) International Business Machines Corp., 2009
> + * Copyright (c) 2020 FUJITSU LIMITED. All rights reserved.
> + *
> + * Author: Ulrich Drepper <drepper@redhat.com>
> + *
> + * History:
> + * Created - Jan 13 2009 - Ulrich Drepper <drepper@redhat.com>
> + * Ported to LTP - Jan 13 2009 - Subrata <subrata@linux.vnet.ibm.com>
> + * Converted into new api - Apri 15 2020 - Yang Xu <
> xuyang2018.jy@cn.fujitsu.com>
> + */
> +#define _GNU_SOURCE
> #include <stdio.h>
> #include <unistd.h>
> -#include <sys/syscall.h>
> -#include <errno.h>
> -
> -#include "test.h"
> #include "lapi/fcntl.h"
> -#include "lapi/syscalls.h"
> -
> -char *TCID = "pipe2_01";
> -int testno;
> -int TST_TOTAL = 1;
> +#include "tst_test.h"
>
> -/* 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. */
> -/*
> */
>
> -/******************************************************************************/
> -void cleanup(void)
> -{
> +static int fds[2];
>
> - tst_rmdir();
> -
> -}
> +static struct tcase {
> + int flags;
> + int check_cmd;
>
The 'check_cmd' sounds strange here since we don't do any check for the
cmd, can we use 'cmd' directly?
> + int check_read_side;
>
A pipe has a read-end and a write-end. So I prefer to call this
'check_read_end', do you agree?
> + char *message;
> +} tcases[] = {
> + {0, F_GETFD, 1, "Test pipe2 with 0 flag"},
> + {O_CLOEXEC, F_GETFD, 1, "Test pipe2 using O_CLOEXEC flag"},
> + /*
> + * It may get EINVAL error on older kernel because this flag was
> + * introduced since kernel 3.4. We only test flag in write side
> + * because this flag was used to make pipe buffer marked with the
> + * PIPE_BUF_FLAG_PACKET flag. In read side, kernel also check
> buffer
> + * flag instead of O_DIRECT. So it make no sense to check this flag
> + * in fds[0].
> + */
> + {O_DIRECT, F_GETFL, 0, "Test pipe2 using O_DIRECT flag"},
> + {O_NONBLOCK, F_GETFL, 1, "Test pipe2 using O_NONBLOCK flag"},
> +};
>
> -/* 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(void)
> +static void cleanup(void)
> {
> - /* Capture signals if any */
> - /* Create temporary directories */
> - TEST_PAUSE;
> - tst_tmpdir();
> + if (fds[0] > 0)
> + SAFE_CLOSE(fds[0]);
> + if (fds[1] > 1)
> + SAFE_CLOSE(fds[1]);
> }
>
> -int main(int argc, char *argv[])
> +static void verify_pipe2(unsigned int n)
> {
> - int fd[2], i, coe;
> - int lc;
> + struct tcase *tc = &tcases[n];
> + int get_flag = 0, i = 0;
>
> - tst_parse_opts(argc, argv, NULL, NULL);
> - if ((tst_kvercmp(2, 6, 27)) < 0) {
> - tst_brkm(TCONF,
> - NULL,
> - "This test can only run on kernels that are
> 2.6.27 and higher");
> + tst_res(TINFO, "%s ", tc->message);
> + SAFE_PIPE2(fds, tc->flags);
> + for (i = 0; i < 2; i++) {
> + if (i == 0 && !tc->check_read_side)
> + continue;
> + get_flag = SAFE_FCNTL(fds[i], tc->check_cmd);
> + if ((get_flag && tc->flags) || (tc->flags == get_flag))
> + tst_res(TPASS, "pipe2 fds[%d] gets expected
> flag(%d)", i, tc->flags);
> + else
> + tst_res(TFAIL, "pipe2 fds[%d] doesn't get expected
> flag(%d), get flag(%d)",
> + i, tc->flags, get_flag);
> }
> - setup();
> -
> - for (lc = 0; TEST_LOOPING(lc); ++lc) {
> - tst_count = 0;
> - for (testno = 0; testno < TST_TOTAL; ++testno) {
> - if (ltp_syscall(__NR_pipe2, fd, 0) != 0) {
> - tst_brkm(TFAIL, cleanup, "pipe2(0)
> failed");
> - }
> - for (i = 0; i < 2; ++i) {
> - coe = fcntl(fd[i], F_GETFD);
> - if (coe == -1) {
> - tst_brkm(TBROK, cleanup,
> - "fcntl failed");
> - }
> - if (coe & FD_CLOEXEC) {
> - tst_brkm(TFAIL,
> - cleanup, "pipe2(0) set
> close-on-exit for fd[%d]",
> - i);
> - }
> - }
> - close(fd[0]);
> - close(fd[1]);
> -
> - if (ltp_syscall(__NR_pipe2, fd, O_CLOEXEC) != 0) {
> - tst_brkm(TFAIL, cleanup,
> - "pipe2(O_CLOEXEC) failed");
> - }
> - for (i = 0; i < 2; ++i) {
> - coe = fcntl(fd[i], F_GETFD);
> - if (coe == -1) {
> - tst_brkm(TBROK, cleanup,
> - "fcntl failed");
> - }
> - if ((coe & FD_CLOEXEC) == 0) {
> - tst_brkm(TFAIL,
> - cleanup,
> "pipe2(O_CLOEXEC) does not set close-on-exit for fd[%d]",
> - i);
> - }
> - }
> - close(fd[0]);
> - close(fd[1]);
> - tst_resm(TPASS, "pipe2(O_CLOEXEC) PASSED");
> - cleanup();
> - }
> - }
> - tst_exit();
> + cleanup();
> }
> +
> +static struct tst_test test = {
> + .tcnt = ARRAY_SIZE(tcases),
> + .test = verify_pipe2,
> + .cleanup = cleanup,
> +};
> diff --git a/testcases/kernel/syscalls/pipe2/pipe2_02.c
> b/testcases/kernel/syscalls/pipe2/pipe2_02.c
> deleted file mode 100644
> index 39f02ff8c..000000000
> --- a/testcases/kernel/syscalls/pipe2/pipe2_02.c
> +++ /dev/null
> @@ -1,175 +0,0 @@
>
> -/******************************************************************************/
> -/*
> */
> -/* Copyright (c) Ulrich Drepper <drepper@redhat.com>
> */
> -/* Copyright (c) International Business Machines Corp., 2009
> */
> -/*
> */
> -/* 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: pipe2_02.c
> */
> -/*
> */
> -/* Description: This Program tests the new system call introduced in
> 2.6.27. */
> -/* Ulrich´s comment as in:
> */
> -/*
> http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=be61a86d7237dd80510615f38ae21d6e1e98660c
> */
> -/* which says:
> */
> -/* This patch adds O_NONBLOCK support to pipe2. It is minimally more
> involved*/
> -/* than the patches for eventfd et.al but still trivial. The interfaces
> of */
> -/* the create_write_pipe and create_read_pipe helper functions were
> changed */
> -/* and the one other caller as well.
> */
> -/* The following test must be adjusted for architectures other than x86
> and */
> -/* x86-64 and in case the syscall numbers changed.
> */
> -/*
> */
> -/* Usage: <for command-line>
> */
> -/* pipe2_02 [-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: pipe2_02
> */
> -/*
> */
> -/* Author: Ulrich Drepper <drepper@redhat.com>
> */
> -/*
> */
> -/* History: Created - Jan 13 2009 - Ulrich Drepper <
> drepper@redhat.com> */
> -/* Ported to LTP
> */
> -/* - Jan 13 2009 - Subrata <
> subrata@linux.vnet.ibm.com> */
>
> -/******************************************************************************/
> -#include <fcntl.h>
> -#include <stdio.h>
> -#include <unistd.h>
> -#include <sys/syscall.h>
> -#include <errno.h>
> -
> -#include "test.h"
> -#include "lapi/fcntl.h"
> -#include "lapi/syscalls.h"
> -
> -char *TCID = "pipe2_02";
> -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. */
> -/*
> */
>
> -/******************************************************************************/
> -void cleanup(void)
> -{
> -
> - tst_rmdir();
> -
> -}
> -
> -/* 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(void)
> -{
> - /* Capture signals if any */
> - /* Create temporary directories */
> - TEST_PAUSE;
> - tst_tmpdir();
> -}
> -
> -int main(int argc, char *argv[])
> -{
> - int fds[2], fl, i;
> - int lc;
> -
> - tst_parse_opts(argc, argv, NULL, NULL);
> - if ((tst_kvercmp(2, 6, 27)) < 0) {
> - tst_brkm(TCONF,
> - NULL,
> - "This test can only run on kernels that are
> 2.6.27 and higher");
> - }
> - setup();
> -
> - for (lc = 0; TEST_LOOPING(lc); ++lc) {
> - tst_count = 0;
> - for (testno = 0; testno < TST_TOTAL; ++testno) {
> - if (ltp_syscall(__NR_pipe2, fds, 0) == -1) {
> - tst_brkm(TFAIL, cleanup, "pipe2(0)
> failed");
> - }
> - for (i = 0; i < 2; ++i) {
> - fl = fcntl(fds[i], F_GETFL);
> - if (fl == -1) {
> - tst_brkm(TBROK, cleanup,
> - "fcntl failed");
> - }
> - if (fl & O_NONBLOCK) {
> - tst_brkm(TFAIL,
> - cleanup, "pipe2(0) set
> non-blocking mode for fds[%d]",
> - i);
> - }
> - close(fds[i]);
> - }
> -
> - if (ltp_syscall(__NR_pipe2, fds, O_NONBLOCK) ==
> -1) {
> - tst_brkm(TFAIL, cleanup,
> - "pipe2(O_NONBLOCK) failed");
> - }
> - for (i = 0; i < 2; ++i) {
> - fl = fcntl(fds[i], F_GETFL);
> - if (fl == -1) {
> - tst_brkm(TBROK, cleanup,
> - "fcntl failed");
> - }
> - if ((fl & O_NONBLOCK) == 0) {
> - tst_brkm(TFAIL,
> - cleanup,
> "pipe2(O_NONBLOCK) does not set non-blocking mode for fds[%d]\n",
> - i);
> - }
> - close(fds[i]);
> - }
> - tst_resm(TPASS, "pipe2(O_NONBLOCK) PASSED");
> - cleanup();
> - }
> - }
> - tst_exit();
> -}
> --
> 2.23.0
>
>
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
>
--
Regards,
Li Wang
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.linux.it/pipermail/ltp/attachments/20200421/407bef04/attachment-0001.htm>
More information about the ltp
mailing list