* [LTP] [PATCH 1/3] lapi/syscalls: Add syscall numbers for pwritev2()
@ 2019-02-15 8:11 Jinhui huang
2019-02-15 8:11 ` [LTP] [PATCH 2/3] syscalls/pwritev201: Add new testcase Jinhui huang
2019-02-15 8:11 ` [LTP] [PATCH 3/3] syscalls/pwitev202: " Jinhui huang
0 siblings, 2 replies; 6+ messages in thread
From: Jinhui huang @ 2019-02-15 8:11 UTC (permalink / raw)
To: ltp
Signed-off-by: Jinhui huang <huangjh.jy@cn.fujitsu.com>
---
include/lapi/syscalls/aarch64.in | 1 +
include/lapi/syscalls/arm.in | 1 +
include/lapi/syscalls/hppa.in | 1 +
include/lapi/syscalls/i386.in | 1 +
include/lapi/syscalls/ia64.in | 1 +
include/lapi/syscalls/powerpc.in | 1 +
include/lapi/syscalls/powerpc64.in | 1 +
include/lapi/syscalls/s390.in | 1 +
include/lapi/syscalls/s390x.in | 1 +
include/lapi/syscalls/sh.in | 1 +
include/lapi/syscalls/sparc.in | 1 +
include/lapi/syscalls/sparc64.in | 1 +
include/lapi/syscalls/x86_64.in | 1 +
13 files changed, 13 insertions(+)
diff --git a/include/lapi/syscalls/aarch64.in b/include/lapi/syscalls/aarch64.in
index bf04895..7ce1485 100644
--- a/include/lapi/syscalls/aarch64.in
+++ b/include/lapi/syscalls/aarch64.in
@@ -263,4 +263,5 @@ execveat 281
mlock2 284
copy_file_range 285
preadv2 286
+pwritev2 287
_sysctl 1078
diff --git a/include/lapi/syscalls/arm.in b/include/lapi/syscalls/arm.in
index e720b08..22c76d4 100644
--- a/include/lapi/syscalls/arm.in
+++ b/include/lapi/syscalls/arm.in
@@ -347,4 +347,5 @@ membarrier (__NR_SYSCALL_BASE+389)
mlock2 (__NR_SYSCALL_BASE+390)
copy_file_range (__NR_SYSCALL_BASE+391)
preadv2 (__NR_SYSCALL_BASE+392)
+pwritev2 (__NR_SYSCALL_BASE+393)
statx (__NR_SYSCALL_BASE+397)
diff --git a/include/lapi/syscalls/hppa.in b/include/lapi/syscalls/hppa.in
index 182d393..a0dd230 100644
--- a/include/lapi/syscalls/hppa.in
+++ b/include/lapi/syscalls/hppa.in
@@ -24,3 +24,4 @@ execveat 342
mlock2 345
copy_file_range 346
preadv2 347
+pwritev2 348
diff --git a/include/lapi/syscalls/i386.in b/include/lapi/syscalls/i386.in
index 2fb0188..7e485ae 100644
--- a/include/lapi/syscalls/i386.in
+++ b/include/lapi/syscalls/i386.in
@@ -345,4 +345,5 @@ membarrier 375
mlock2 376
copy_file_range 377
preadv2 378
+pwritev2 379
statx 383
diff --git a/include/lapi/syscalls/ia64.in b/include/lapi/syscalls/ia64.in
index 081c9ed..7c9a0ea 100644
--- a/include/lapi/syscalls/ia64.in
+++ b/include/lapi/syscalls/ia64.in
@@ -303,3 +303,4 @@ execveat 1342
mlock2 1346
copy_file_range 1347
preadv2 1348
+pwritev2 1349
diff --git a/include/lapi/syscalls/powerpc.in b/include/lapi/syscalls/powerpc.in
index d16f9f9..fc1f899 100644
--- a/include/lapi/syscalls/powerpc.in
+++ b/include/lapi/syscalls/powerpc.in
@@ -352,4 +352,5 @@ execveat 362
mlock2 378
copy_file_range 379
preadv2 380
+pwritev2 381
statx 383
diff --git a/include/lapi/syscalls/powerpc64.in b/include/lapi/syscalls/powerpc64.in
index d16f9f9..fc1f899 100644
--- a/include/lapi/syscalls/powerpc64.in
+++ b/include/lapi/syscalls/powerpc64.in
@@ -352,4 +352,5 @@ execveat 362
mlock2 378
copy_file_range 379
preadv2 380
+pwritev2 381
statx 383
diff --git a/include/lapi/syscalls/s390.in b/include/lapi/syscalls/s390.in
index 4019438..6d0c895 100644
--- a/include/lapi/syscalls/s390.in
+++ b/include/lapi/syscalls/s390.in
@@ -336,3 +336,4 @@ execveat 354
mlock2 374
copy_file_range 375
preadv2 376
+pwritev2 377
diff --git a/include/lapi/syscalls/s390x.in b/include/lapi/syscalls/s390x.in
index e156b09..8105b55 100644
--- a/include/lapi/syscalls/s390x.in
+++ b/include/lapi/syscalls/s390x.in
@@ -335,3 +335,4 @@ execveat 354
mlock2 374
copy_file_range 375
preadv2 376
+pwritev2 377
diff --git a/include/lapi/syscalls/sh.in b/include/lapi/syscalls/sh.in
index 8520bb1..a942fb5 100644
--- a/include/lapi/syscalls/sh.in
+++ b/include/lapi/syscalls/sh.in
@@ -368,3 +368,4 @@ execveat 387
mlock2 390
copy_file_range 391
preadv2 392
+pwritev2 393
diff --git a/include/lapi/syscalls/sparc.in b/include/lapi/syscalls/sparc.in
index b7bb135..20a21a9 100644
--- a/include/lapi/syscalls/sparc.in
+++ b/include/lapi/syscalls/sparc.in
@@ -341,3 +341,4 @@ execveat 350
mlock2 356
copy_file_range 357
preadv2 358
+pwritev2 359
diff --git a/include/lapi/syscalls/sparc64.in b/include/lapi/syscalls/sparc64.in
index a211df8..36ab394 100644
--- a/include/lapi/syscalls/sparc64.in
+++ b/include/lapi/syscalls/sparc64.in
@@ -317,3 +317,4 @@ execveat 350
mlock2 356
copy_file_range 357
preadv2 358
+pwritev2 359
diff --git a/include/lapi/syscalls/x86_64.in b/include/lapi/syscalls/x86_64.in
index dae5769..6aa9d12 100644
--- a/include/lapi/syscalls/x86_64.in
+++ b/include/lapi/syscalls/x86_64.in
@@ -312,4 +312,5 @@ membarrier 324
mlock2 325
copy_file_range 326
preadv2 327
+pwritev2 328
statx 332
--
1.8.3.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [LTP] [PATCH 2/3] syscalls/pwritev201: Add new testcase
2019-02-15 8:11 [LTP] [PATCH 1/3] lapi/syscalls: Add syscall numbers for pwritev2() Jinhui huang
@ 2019-02-15 8:11 ` Jinhui huang
2019-02-28 7:22 ` Xiao Yang
2019-02-15 8:11 ` [LTP] [PATCH 3/3] syscalls/pwitev202: " Jinhui huang
1 sibling, 1 reply; 6+ messages in thread
From: Jinhui huang @ 2019-02-15 8:11 UTC (permalink / raw)
To: ltp
Check the basic functionality of the pwritev2().
Signed-off-by: Jinhui huang <huangjh.jy@cn.fujitsu.com>
---
configure.ac | 1 +
include/lapi/pwritev2.h | 26 +++++
m4/ltp-pwritev2.m4 | 9 ++
runtest/syscalls | 3 +
testcases/kernel/syscalls/pwritev2/.gitignore | 2 +
testcases/kernel/syscalls/pwritev2/Makefile | 13 +++
testcases/kernel/syscalls/pwritev2/pwritev201.c | 120 ++++++++++++++++++++++++
7 files changed, 174 insertions(+)
create mode 100644 include/lapi/pwritev2.h
create mode 100644 m4/ltp-pwritev2.m4
create mode 100644 testcases/kernel/syscalls/pwritev2/.gitignore
create mode 100644 testcases/kernel/syscalls/pwritev2/Makefile
create mode 100644 testcases/kernel/syscalls/pwritev2/pwritev201.c
diff --git a/configure.ac b/configure.ac
index caea344..c5f3d4e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -219,6 +219,7 @@ LTP_CHECK_KCMP_TYPE
LTP_CHECK_PREADV
LTP_CHECK_PWRITEV
LTP_CHECK_PREADV2
+LTP_CHECK_PWRITEV2
LTP_CHECK_EPOLL_PWAIT
LTP_CHECK_KEYUTILS_SUPPORT
LTP_CHECK_SYNC_ADD_AND_FETCH
diff --git a/include/lapi/pwritev2.h b/include/lapi/pwritev2.h
new file mode 100644
index 0000000..305e48e
--- /dev/null
+++ b/include/lapi/pwritev2.h
@@ -0,0 +1,26 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2019 FUJITSU LIMITED. All rights reserved.
+ * Author: Jinhui Huang <huangjh.jy@cn.fujitsu.com>
+ */
+
+#ifndef PWRITEV2_H
+#define PWRITEV2_H
+
+#include "config.h"
+#include "lapi/syscalls.h"
+
+#if !defined(HAVE_PWRITEV2)
+
+/* LO_HI_LONG taken from glibc */
+# define LO_HI_LONG(val) (long) (val), (long) (((uint64_t) (val)) >> 32)
+
+ssize_t pwritev2(int fd, const struct iovec *iov, int iovcnt, off_t offset,
+ int flags)
+{
+ return tst_syscall(__NR_pwritev2, fd, iov, iovcnt,
+ LO_HI_LONG(offset), flags);
+}
+#endif
+
+#endif /* PWRITEV2_H */
diff --git a/m4/ltp-pwritev2.m4 b/m4/ltp-pwritev2.m4
new file mode 100644
index 0000000..38148ac
--- /dev/null
+++ b/m4/ltp-pwritev2.m4
@@ -0,0 +1,9 @@
+dnl SPDX-License-Identifier: GPL-2.0-or-later
+dnl Copyright (c) 2019 FUJITSU LIMITED. All rights reserved.
+dnl Author: Jinhui Huang <huangjh.jy@cn.fujitsu.com>
+
+dnl LTP_CHECK_PWRITEV2
+dnl ----------------------------
+AC_DEFUN([LTP_CHECK_PWRITEV2],[
+AC_CHECK_FUNCS(pwritev2,,)
+])
diff --git a/runtest/syscalls b/runtest/syscalls
index 668c87c..04f5269 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -907,6 +907,9 @@ pwritev02_64 pwritev02_64
pwritev03 pwritev03
pwritev03_64 pwritev03_64
+pwritev201 pwritev201
+pwritev201_64 pwritev201_64
+
quotactl01 quotactl01
quotactl02 quotactl02
quotactl03 quotactl03
diff --git a/testcases/kernel/syscalls/pwritev2/.gitignore b/testcases/kernel/syscalls/pwritev2/.gitignore
new file mode 100644
index 0000000..46270c3
--- /dev/null
+++ b/testcases/kernel/syscalls/pwritev2/.gitignore
@@ -0,0 +1,2 @@
+/pwritev201
+/pwritev201_64
diff --git a/testcases/kernel/syscalls/pwritev2/Makefile b/testcases/kernel/syscalls/pwritev2/Makefile
new file mode 100644
index 0000000..89756d0
--- /dev/null
+++ b/testcases/kernel/syscalls/pwritev2/Makefile
@@ -0,0 +1,13 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (c) 2019 FUJITSU LIMITED. All rights reserved.
+# Author: Jinhui Huang <huangjh.jy@cn.fujitsu.com>
+
+top_srcdir ?= ../../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+
+include $(abs_srcdir)/../utils/newer_64.mk
+
+%_64: CPPFLAGS += -D_FILE_OFFSET_BITS=64
+
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/syscalls/pwritev2/pwritev201.c b/testcases/kernel/syscalls/pwritev2/pwritev201.c
new file mode 100644
index 0000000..34067c1
--- /dev/null
+++ b/testcases/kernel/syscalls/pwritev2/pwritev201.c
@@ -0,0 +1,120 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2019 FUJITSU LIMITED. All rights reserved.
+ * Author: Jinhui Huang <huangjh.jy@cn.fujitsu.com>
+ */
+/*
+ * Description:
+ * Testcase to check the basic functionality of the pwritev2(2).
+ * 1) If the file offset argument is not -1, pwritev2() should succeed
+ * in writing the expected content of data and the file offset is
+ * not changed after writing.
+ * 2) If the file offset argument is -1, pwritev2() should succeed in
+ * writing the expected content of data and the current file offset
+ * is used and changed after writing.
+ */
+
+#define _GNU_SOURCE
+#include <string.h>
+#include <sys/uio.h>
+
+#include "tst_test.h"
+#include "lapi/pwritev2.h"
+#include "tst_safe_prw.h"
+
+#define CHUNK 64
+
+static int fd;
+static char initbuf[CHUNK * 2];
+static char preadbuf[CHUNK];
+static char buf[CHUNK];
+
+static struct iovec wr_iovec[] = {
+ {buf, CHUNK},
+ {NULL, 0},
+};
+
+static struct tcase {
+ off_t seek_off;
+ int count;
+ off_t write_off;
+ ssize_t size;
+ off_t exp_off;
+} tcases[] = {
+ {0, 1, 0, CHUNK, 0},
+ {CHUNK, 2, 0, CHUNK, CHUNK},
+ {0, 1, CHUNK*3 / 2, CHUNK, 0},
+ {0, 1, -1, CHUNK, CHUNK},
+ {0, 2, -1, CHUNK, CHUNK},
+ {CHUNK, 1, -1, CHUNK, CHUNK * 2},
+};
+
+static void verify_pwritev2(unsigned int n)
+{
+ int i;
+ struct tcase *tc = &tcases[n];
+ off_t read_off = 0;
+
+ SAFE_PWRITE(1, fd, initbuf, sizeof(initbuf), 0);
+
+ SAFE_LSEEK(fd, tc->seek_off, SEEK_SET);
+
+ TEST(pwritev2(fd, wr_iovec, tc->count, tc->write_off, 0));
+ if (TST_RET < 0) {
+ tst_res(TFAIL | TTERRNO, "pwritev() failed");
+ return;
+ }
+
+ if (TST_RET != tc->size) {
+ tst_res(TFAIL, "pwritev2() wrote %li bytes, expected %zi",
+ TST_RET, tc->size);
+ return;
+ }
+
+ if (SAFE_LSEEK(fd, 0, SEEK_CUR) != tc->exp_off) {
+ tst_res(TFAIL, "pwritev2() had changed file offset");
+ return;
+ }
+ if (tc->write_off != -1)
+ read_off = tc->write_off;
+ else
+ read_off = tc->seek_off;
+
+ SAFE_PREAD(1, fd, preadbuf, tc->size, read_off);
+
+ for (i = 0; i < tc->size; i++) {
+ if (preadbuf[i] != 0x61)
+ break;
+ }
+
+ if (i != tc->size) {
+ tst_res(TFAIL, "buffer wrong at %i have %02x expected 61",
+ i, preadbuf[i]);
+ return;
+ }
+
+ tst_res(TPASS, "pwritev2() wrote %zi bytes successfully "
+ "with content 'a' expectedly ", tc->size);
+}
+
+static void setup(void)
+{
+ memset(buf, 0x61, CHUNK);
+ memset(initbuf, 0, CHUNK * 2);
+
+ fd = SAFE_OPEN("file", O_RDWR | O_CREAT, 0644);
+}
+
+static void cleanup(void)
+{
+ if (fd > 0)
+ SAFE_CLOSE(fd);
+}
+
+static struct tst_test test = {
+ .tcnt = ARRAY_SIZE(tcases),
+ .setup = setup,
+ .cleanup = cleanup,
+ .test = verify_pwritev2,
+ .needs_tmpdir = 1,
+};
--
1.8.3.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [LTP] [PATCH 3/3] syscalls/pwitev202: Add new testcase
2019-02-15 8:11 [LTP] [PATCH 1/3] lapi/syscalls: Add syscall numbers for pwritev2() Jinhui huang
2019-02-15 8:11 ` [LTP] [PATCH 2/3] syscalls/pwritev201: Add new testcase Jinhui huang
@ 2019-02-15 8:11 ` Jinhui huang
2019-02-28 7:22 ` Xiao Yang
1 sibling, 1 reply; 6+ messages in thread
From: Jinhui huang @ 2019-02-15 8:11 UTC (permalink / raw)
To: ltp
Check various errnos for the pwitev202().
Signed-off-by: Jinhui huang <huangjh.jy@cn.fujitsu.com>
---
runtest/syscalls | 2 +
testcases/kernel/syscalls/pwritev2/.gitignore | 2 +
testcases/kernel/syscalls/pwritev2/pwritev202.c | 117 ++++++++++++++++++++++++
3 files changed, 121 insertions(+)
create mode 100644 testcases/kernel/syscalls/pwritev2/pwritev202.c
diff --git a/runtest/syscalls b/runtest/syscalls
index 04f5269..27cc1dc 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -909,6 +909,8 @@ pwritev03_64 pwritev03_64
pwritev201 pwritev201
pwritev201_64 pwritev201_64
+pwritev202 pwritev202
+pwritev202_64 pwritev202_64
quotactl01 quotactl01
quotactl02 quotactl02
diff --git a/testcases/kernel/syscalls/pwritev2/.gitignore b/testcases/kernel/syscalls/pwritev2/.gitignore
index 46270c3..40030d9 100644
--- a/testcases/kernel/syscalls/pwritev2/.gitignore
+++ b/testcases/kernel/syscalls/pwritev2/.gitignore
@@ -1,2 +1,4 @@
/pwritev201
/pwritev201_64
+/pwritev202
+/pwritev202_64
diff --git a/testcases/kernel/syscalls/pwritev2/pwritev202.c b/testcases/kernel/syscalls/pwritev2/pwritev202.c
new file mode 100644
index 0000000..d0f8868
--- /dev/null
+++ b/testcases/kernel/syscalls/pwritev2/pwritev202.c
@@ -0,0 +1,117 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2019 FUJITSU LIMITED. All rights reserved.
+ * Author: Jinhui Huang <huangjh.jy@cn.fujitsu.com>
+ */
+/*
+ * Description:
+ * Check various errnos for pwritev2(2).
+ * 1) pwritev2() fails and sets errno to EINVAL if iov_len is invalid.
+ * 2) pwritev2() fails and sets errno to EINVAL if the vector count iovcnt is
+ * less than zero.
+ * 3) pwritev2() fails and sets errno to EOPNOTSUPP if flag is invalid.
+ * 4) pwritev2() fails and sets errno to EFAULT when attempts to read into a
+ * invalid address.
+ * 5) pwritev2() fails and sets errno to EBADF if file descriptor is invalid.
+ * 6) pwritev2() fails and sets errno to EBADF if file descriptor is not open
+ * for reading.
+ * 7) pwritev2() fails and sets errno to ESPIPE if fd is associated with a pipe.
+ */
+
+#define _GNU_SOURCE
+#include <sys/uio.h>
+#include <unistd.h>
+
+#include "tst_test.h"
+#include "lapi/pwritev2.h"
+
+#define CHUNK 64
+
+static int fd1;
+static int fd2;
+static int fd3 = -1;
+static int fd4[2];
+
+static char buf[CHUNK];
+
+static struct iovec wr_iovec1[] = {
+ {buf, -1},
+};
+
+static struct iovec wr_iovec2[] = {
+ {buf, CHUNK},
+};
+
+static struct iovec wr_iovec3[] = {
+ {NULL, CHUNK},
+};
+
+static struct tcase {
+ int *fd;
+ struct iovec *name;
+ int count;
+ off_t offset;
+ int flag;
+ int exp_err;
+} tcases[] = {
+ {&fd1, wr_iovec1, 1, 0, 0, EINVAL},
+ {&fd1, wr_iovec2, -1, 0, 0, EINVAL},
+ {&fd1, wr_iovec2, 1, 1, -1, EOPNOTSUPP},
+ {&fd1, wr_iovec3, 1, 0, 0, EFAULT},
+ {&fd3, wr_iovec2, 1, 0, 0, EBADF},
+ {&fd2, wr_iovec2, 1, 0, 0, EBADF},
+ {&fd4[0], wr_iovec2, 1, 0, 0, ESPIPE},
+};
+
+static void verify_pwritev2(unsigned int n)
+{
+ struct tcase *tc = &tcases[n];
+
+ TEST(pwritev2(*tc->fd, tc->name, tc->count, tc->offset, tc->flag));
+
+ if (TST_RET == 0) {
+ tst_res(TFAIL, "pwritev2() succeeded unexpectedly");
+ return;
+ }
+
+ if (TST_ERR == tc->exp_err) {
+ tst_res(TPASS | TTERRNO, "pwritev2() failed as expected");
+ return;
+ }
+
+ tst_res(TFAIL | TTERRNO, "pwritev2() failed unexpectedly, expected %s",
+ tst_strerrno(tc->exp_err));
+}
+
+static void setup(void)
+{
+ fd1 = SAFE_OPEN("file1", O_RDWR | O_CREAT, 0644);
+ SAFE_FTRUNCATE(fd1, getpagesize());
+ fd2 = SAFE_OPEN("file2", O_RDONLY | O_CREAT, 0644);
+ SAFE_PIPE(fd4);
+
+ wr_iovec3[0].iov_base = tst_get_bad_addr(NULL);
+}
+
+static void cleanup(void)
+{
+ if (fd1 > 0)
+ SAFE_CLOSE(fd1);
+
+ if (fd2 > 0)
+ SAFE_CLOSE(fd2);
+
+ if (fd4[0] > 0)
+ SAFE_CLOSE(fd4[0]);
+
+ if (fd4[1] > 0)
+ SAFE_CLOSE(fd4[1]);
+}
+
+static struct tst_test test = {
+ .tcnt = ARRAY_SIZE(tcases),
+ .setup = setup,
+ .cleanup = cleanup,
+ .test = verify_pwritev2,
+ .needs_tmpdir = 1,
+};
--
1.8.3.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [LTP] [PATCH 2/3] syscalls/pwritev201: Add new testcase
2019-02-15 8:11 ` [LTP] [PATCH 2/3] syscalls/pwritev201: Add new testcase Jinhui huang
@ 2019-02-28 7:22 ` Xiao Yang
0 siblings, 0 replies; 6+ messages in thread
From: Xiao Yang @ 2019-02-28 7:22 UTC (permalink / raw)
To: ltp
Hi Jinhui,
On 2019/02/15 16:11, Jinhui huang wrote:
> Check the basic functionality of the pwritev2().
>
> Signed-off-by: Jinhui huang <huangjh.jy@cn.fujitsu.com>
> ---
> configure.ac | 1 +
> include/lapi/pwritev2.h | 26 +++++
> m4/ltp-pwritev2.m4 | 9 ++
> runtest/syscalls | 3 +
> testcases/kernel/syscalls/pwritev2/.gitignore | 2 +
> testcases/kernel/syscalls/pwritev2/Makefile | 13 +++
> testcases/kernel/syscalls/pwritev2/pwritev201.c | 120 ++++++++++++++++++++++++
> 7 files changed, 174 insertions(+)
> create mode 100644 include/lapi/pwritev2.h
> create mode 100644 m4/ltp-pwritev2.m4
> create mode 100644 testcases/kernel/syscalls/pwritev2/.gitignore
> create mode 100644 testcases/kernel/syscalls/pwritev2/Makefile
> create mode 100644 testcases/kernel/syscalls/pwritev2/pwritev201.c
>
> diff --git a/configure.ac b/configure.ac
> index caea344..c5f3d4e 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -219,6 +219,7 @@ LTP_CHECK_KCMP_TYPE
> LTP_CHECK_PREADV
> LTP_CHECK_PWRITEV
> LTP_CHECK_PREADV2
> +LTP_CHECK_PWRITEV2
> LTP_CHECK_EPOLL_PWAIT
> LTP_CHECK_KEYUTILS_SUPPORT
> LTP_CHECK_SYNC_ADD_AND_FETCH
> diff --git a/include/lapi/pwritev2.h b/include/lapi/pwritev2.h
> new file mode 100644
> index 0000000..305e48e
> --- /dev/null
> +++ b/include/lapi/pwritev2.h
> @@ -0,0 +1,26 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2019 FUJITSU LIMITED. All rights reserved.
> + * Author: Jinhui Huang <huangjh.jy@cn.fujitsu.com>
> + */
> +
> +#ifndef PWRITEV2_H
> +#define PWRITEV2_H
> +
> +#include "config.h"
> +#include "lapi/syscalls.h"
> +
> +#if !defined(HAVE_PWRITEV2)
> +
> +/* LO_HI_LONG taken from glibc */
> +# define LO_HI_LONG(val) (long) (val), (long) (((uint64_t) (val)) >> 32)
> +
> +ssize_t pwritev2(int fd, const struct iovec *iov, int iovcnt, off_t offset,
> + int flags)
> +{
> + return tst_syscall(__NR_pwritev2, fd, iov, iovcnt,
> + LO_HI_LONG(offset), flags);
> +}
> +#endif
> +
> +#endif /* PWRITEV2_H */
> diff --git a/m4/ltp-pwritev2.m4 b/m4/ltp-pwritev2.m4
> new file mode 100644
> index 0000000..38148ac
> --- /dev/null
> +++ b/m4/ltp-pwritev2.m4
> @@ -0,0 +1,9 @@
> +dnl SPDX-License-Identifier: GPL-2.0-or-later
> +dnl Copyright (c) 2019 FUJITSU LIMITED. All rights reserved.
> +dnl Author: Jinhui Huang <huangjh.jy@cn.fujitsu.com>
> +
> +dnl LTP_CHECK_PWRITEV2
> +dnl ----------------------------
> +AC_DEFUN([LTP_CHECK_PWRITEV2],[
> +AC_CHECK_FUNCS(pwritev2,,)
> +])
> diff --git a/runtest/syscalls b/runtest/syscalls
> index 668c87c..04f5269 100644
> --- a/runtest/syscalls
> +++ b/runtest/syscalls
> @@ -907,6 +907,9 @@ pwritev02_64 pwritev02_64
> pwritev03 pwritev03
> pwritev03_64 pwritev03_64
>
> +pwritev201 pwritev201
> +pwritev201_64 pwritev201_64
> +
> quotactl01 quotactl01
> quotactl02 quotactl02
> quotactl03 quotactl03
> diff --git a/testcases/kernel/syscalls/pwritev2/.gitignore b/testcases/kernel/syscalls/pwritev2/.gitignore
> new file mode 100644
> index 0000000..46270c3
> --- /dev/null
> +++ b/testcases/kernel/syscalls/pwritev2/.gitignore
> @@ -0,0 +1,2 @@
> +/pwritev201
> +/pwritev201_64
> diff --git a/testcases/kernel/syscalls/pwritev2/Makefile b/testcases/kernel/syscalls/pwritev2/Makefile
> new file mode 100644
> index 0000000..89756d0
> --- /dev/null
> +++ b/testcases/kernel/syscalls/pwritev2/Makefile
> @@ -0,0 +1,13 @@
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# Copyright (c) 2019 FUJITSU LIMITED. All rights reserved.
> +# Author: Jinhui Huang <huangjh.jy@cn.fujitsu.com>
> +
> +top_srcdir ?= ../../../..
> +
> +include $(top_srcdir)/include/mk/testcases.mk
> +
> +include $(abs_srcdir)/../utils/newer_64.mk
> +
> +%_64: CPPFLAGS += -D_FILE_OFFSET_BITS=64
> +
> +include $(top_srcdir)/include/mk/generic_leaf_target.mk
> diff --git a/testcases/kernel/syscalls/pwritev2/pwritev201.c b/testcases/kernel/syscalls/pwritev2/pwritev201.c
> new file mode 100644
> index 0000000..34067c1
> --- /dev/null
> +++ b/testcases/kernel/syscalls/pwritev2/pwritev201.c
> @@ -0,0 +1,120 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2019 FUJITSU LIMITED. All rights reserved.
> + * Author: Jinhui Huang <huangjh.jy@cn.fujitsu.com>
> + */
> +/*
> + * Description:
> + * Testcase to check the basic functionality of the pwritev2(2).
> + * 1) If the file offset argument is not -1, pwritev2() should succeed
> + * in writing the expected content of data and the file offset is
> + * not changed after writing.
> + * 2) If the file offset argument is -1, pwritev2() should succeed in
> + * writing the expected content of data and the current file offset
> + * is used and changed after writing.
> + */
> +
> +#define _GNU_SOURCE
> +#include <string.h>
> +#include <sys/uio.h>
> +
> +#include "tst_test.h"
> +#include "lapi/pwritev2.h"
> +#include "tst_safe_prw.h"
> +
> +#define CHUNK 64
> +
> +static int fd;
> +static char initbuf[CHUNK * 2];
> +static char preadbuf[CHUNK];
It is enough to declare preadbuf[CHUNK] as local variable.
> +static char buf[CHUNK];
> +
> +static struct iovec wr_iovec[] = {
> + {buf, CHUNK},
> + {NULL, 0},
> +};
> +
> +static struct tcase {
> + off_t seek_off;
> + int count;
> + off_t write_off;
> + ssize_t size;
> + off_t exp_off;
> +} tcases[] = {
> + {0, 1, 0, CHUNK, 0},
> + {CHUNK, 2, 0, CHUNK, CHUNK},
> + {0, 1, CHUNK*3 / 2, CHUNK, 0},
> + {0, 1, -1, CHUNK, CHUNK},
> + {0, 2, -1, CHUNK, CHUNK},
> + {CHUNK, 1, -1, CHUNK, CHUNK * 2},
> +};
> +
> +static void verify_pwritev2(unsigned int n)
> +{
> + int i;
> + struct tcase *tc = &tcases[n];
> + off_t read_off = 0;
Perhaps, we should initialize preadbuf before running each test.
> +
> + SAFE_PWRITE(1, fd, initbuf, sizeof(initbuf), 0);
> +
> + SAFE_LSEEK(fd, tc->seek_off, SEEK_SET);
> +
> + TEST(pwritev2(fd, wr_iovec, tc->count, tc->write_off, 0));
> + if (TST_RET < 0) {
> + tst_res(TFAIL | TTERRNO, "pwritev() failed");
> + return;
> + }
Typo? pwritev2() is correct.
> +
> + if (TST_RET != tc->size) {
> + tst_res(TFAIL, "pwritev2() wrote %li bytes, expected %zi",
> + TST_RET, tc->size);
> + return;
> + }
> +
> + if (SAFE_LSEEK(fd, 0, SEEK_CUR) != tc->exp_off) {
> + tst_res(TFAIL, "pwritev2() had changed file offset");
> + return;
> + }
> + if (tc->write_off != -1)
> + read_off = tc->write_off;
> + else
> + read_off = tc->seek_off;
> +
> + SAFE_PREAD(1, fd, preadbuf, tc->size, read_off);
How about calling SAFE_PREAD() directly? as below:
-------------------------------------------------------
if (tc->write_off != -1)
SAFE_PREAD(1, fd, preadbuf, tc->size, write_off);
else
SAFE_PREAD(1, fd, preadbuf, tc->size, seek_off);
-------------------------------------------------------
Best Regards,
Xiao Yang
> +
> + for (i = 0; i < tc->size; i++) {
> + if (preadbuf[i] != 0x61)
> + break;
> + }
> +
> + if (i != tc->size) {
> + tst_res(TFAIL, "buffer wrong at %i have %02x expected 61",
> + i, preadbuf[i]);
> + return;
> + }
> +
> + tst_res(TPASS, "pwritev2() wrote %zi bytes successfully "
> + "with content 'a' expectedly ", tc->size);
> +}
> +
> +static void setup(void)
> +{
> + memset(buf, 0x61, CHUNK);
> + memset(initbuf, 0, CHUNK * 2);
> +
> + fd = SAFE_OPEN("file", O_RDWR | O_CREAT, 0644);
> +}
> +
> +static void cleanup(void)
> +{
> + if (fd > 0)
> + SAFE_CLOSE(fd);
> +}
> +
> +static struct tst_test test = {
> + .tcnt = ARRAY_SIZE(tcases),
> + .setup = setup,
> + .cleanup = cleanup,
> + .test = verify_pwritev2,
> + .needs_tmpdir = 1,
> +};
^ permalink raw reply [flat|nested] 6+ messages in thread
* [LTP] [PATCH 3/3] syscalls/pwitev202: Add new testcase
2019-02-15 8:11 ` [LTP] [PATCH 3/3] syscalls/pwitev202: " Jinhui huang
@ 2019-02-28 7:22 ` Xiao Yang
2019-03-01 7:13 ` jinhui huang
0 siblings, 1 reply; 6+ messages in thread
From: Xiao Yang @ 2019-02-28 7:22 UTC (permalink / raw)
To: ltp
Hi Jinhui,
On 2019/02/15 16:11, Jinhui huang wrote:
> Check various errnos for the pwitev202().
Typo? pwitev2() seems proper.
> Signed-off-by: Jinhui huang <huangjh.jy@cn.fujitsu.com>
> ---
> runtest/syscalls | 2 +
> testcases/kernel/syscalls/pwritev2/.gitignore | 2 +
> testcases/kernel/syscalls/pwritev2/pwritev202.c | 117 ++++++++++++++++++++++++
> 3 files changed, 121 insertions(+)
> create mode 100644 testcases/kernel/syscalls/pwritev2/pwritev202.c
>
> diff --git a/runtest/syscalls b/runtest/syscalls
> index 04f5269..27cc1dc 100644
> --- a/runtest/syscalls
> +++ b/runtest/syscalls
> @@ -909,6 +909,8 @@ pwritev03_64 pwritev03_64
>
> pwritev201 pwritev201
> pwritev201_64 pwritev201_64
> +pwritev202 pwritev202
> +pwritev202_64 pwritev202_64
>
> quotactl01 quotactl01
> quotactl02 quotactl02
> diff --git a/testcases/kernel/syscalls/pwritev2/.gitignore b/testcases/kernel/syscalls/pwritev2/.gitignore
> index 46270c3..40030d9 100644
> --- a/testcases/kernel/syscalls/pwritev2/.gitignore
> +++ b/testcases/kernel/syscalls/pwritev2/.gitignore
> @@ -1,2 +1,4 @@
> /pwritev201
> /pwritev201_64
> +/pwritev202
> +/pwritev202_64
> diff --git a/testcases/kernel/syscalls/pwritev2/pwritev202.c b/testcases/kernel/syscalls/pwritev2/pwritev202.c
> new file mode 100644
> index 0000000..d0f8868
> --- /dev/null
> +++ b/testcases/kernel/syscalls/pwritev2/pwritev202.c
> @@ -0,0 +1,117 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2019 FUJITSU LIMITED. All rights reserved.
> + * Author: Jinhui Huang <huangjh.jy@cn.fujitsu.com>
> + */
> +/*
> + * Description:
> + * Check various errnos for pwritev2(2).
> + * 1) pwritev2() fails and sets errno to EINVAL if iov_len is invalid.
> + * 2) pwritev2() fails and sets errno to EINVAL if the vector count iovcnt is
> + * less than zero.
> + * 3) pwritev2() fails and sets errno to EOPNOTSUPP if flag is invalid.
> + * 4) pwritev2() fails and sets errno to EFAULT when attempts to read into a
> + * invalid address.
Typo? Invalid address is actually used to test write instead of read.
> + * 5) pwritev2() fails and sets errno to EBADF if file descriptor is invalid.
> + * 6) pwritev2() fails and sets errno to EBADF if file descriptor is not open
> + * for reading.
Typo? fd2 is actually opened with O_RDONLY.
Best Regards,
Xiao Yang
> + * 7) pwritev2() fails and sets errno to ESPIPE if fd is associated with a pipe.
> + */
> +
> +#define _GNU_SOURCE
> +#include <sys/uio.h>
> +#include <unistd.h>
> +
> +#include "tst_test.h"
> +#include "lapi/pwritev2.h"
> +
> +#define CHUNK 64
> +
> +static int fd1;
> +static int fd2;
> +static int fd3 = -1;
> +static int fd4[2];
> +
> +static char buf[CHUNK];
> +
> +static struct iovec wr_iovec1[] = {
> + {buf, -1},
> +};
> +
> +static struct iovec wr_iovec2[] = {
> + {buf, CHUNK},
> +};
> +
> +static struct iovec wr_iovec3[] = {
> + {NULL, CHUNK},
> +};
> +
> +static struct tcase {
> + int *fd;
> + struct iovec *name;
> + int count;
> + off_t offset;
> + int flag;
> + int exp_err;
> +} tcases[] = {
> + {&fd1, wr_iovec1, 1, 0, 0, EINVAL},
> + {&fd1, wr_iovec2, -1, 0, 0, EINVAL},
> + {&fd1, wr_iovec2, 1, 1, -1, EOPNOTSUPP},
> + {&fd1, wr_iovec3, 1, 0, 0, EFAULT},
> + {&fd3, wr_iovec2, 1, 0, 0, EBADF},
> + {&fd2, wr_iovec2, 1, 0, 0, EBADF},
> + {&fd4[0], wr_iovec2, 1, 0, 0, ESPIPE},
> +};
> +
> +static void verify_pwritev2(unsigned int n)
> +{
> + struct tcase *tc = &tcases[n];
> +
> + TEST(pwritev2(*tc->fd, tc->name, tc->count, tc->offset, tc->flag));
> +
> + if (TST_RET == 0) {
> + tst_res(TFAIL, "pwritev2() succeeded unexpectedly");
> + return;
> + }
> +
> + if (TST_ERR == tc->exp_err) {
> + tst_res(TPASS | TTERRNO, "pwritev2() failed as expected");
> + return;
> + }
> +
> + tst_res(TFAIL | TTERRNO, "pwritev2() failed unexpectedly, expected %s",
> + tst_strerrno(tc->exp_err));
> +}
> +
> +static void setup(void)
> +{
> + fd1 = SAFE_OPEN("file1", O_RDWR | O_CREAT, 0644);
> + SAFE_FTRUNCATE(fd1, getpagesize());
> + fd2 = SAFE_OPEN("file2", O_RDONLY | O_CREAT, 0644);
> + SAFE_PIPE(fd4);
> +
> + wr_iovec3[0].iov_base = tst_get_bad_addr(NULL);
> +}
> +
> +static void cleanup(void)
> +{
> + if (fd1 > 0)
> + SAFE_CLOSE(fd1);
> +
> + if (fd2 > 0)
> + SAFE_CLOSE(fd2);
> +
> + if (fd4[0] > 0)
> + SAFE_CLOSE(fd4[0]);
> +
> + if (fd4[1] > 0)
> + SAFE_CLOSE(fd4[1]);
> +}
> +
> +static struct tst_test test = {
> + .tcnt = ARRAY_SIZE(tcases),
> + .setup = setup,
> + .cleanup = cleanup,
> + .test = verify_pwritev2,
> + .needs_tmpdir = 1,
> +};
^ permalink raw reply [flat|nested] 6+ messages in thread
* [LTP] [PATCH 3/3] syscalls/pwitev202: Add new testcase
2019-02-28 7:22 ` Xiao Yang
@ 2019-03-01 7:13 ` jinhui huang
0 siblings, 0 replies; 6+ messages in thread
From: jinhui huang @ 2019-03-01 7:13 UTC (permalink / raw)
To: ltp
Hi Xiao,
Thanks for your suggestion, I will update the patchset.
Thanks,
Jinhui Huang
On 2019/02/28 15:22, Xiao Yang wrote:
> Hi Jinhui,
>
> On 2019/02/15 16:11, Jinhui huang wrote:
>> Check various errnos for the pwitev202().
> Typo? pwitev2() seems proper.
>
>> Signed-off-by: Jinhui huang <huangjh.jy@cn.fujitsu.com>
>> ---
>> runtest/syscalls | 2 +
>> testcases/kernel/syscalls/pwritev2/.gitignore | 2 +
>> testcases/kernel/syscalls/pwritev2/pwritev202.c | 117 ++++++++++++++++++++++++
>> 3 files changed, 121 insertions(+)
>> create mode 100644 testcases/kernel/syscalls/pwritev2/pwritev202.c
>>
>> diff --git a/runtest/syscalls b/runtest/syscalls
>> index 04f5269..27cc1dc 100644
>> --- a/runtest/syscalls
>> +++ b/runtest/syscalls
>> @@ -909,6 +909,8 @@ pwritev03_64 pwritev03_64
>>
>> pwritev201 pwritev201
>> pwritev201_64 pwritev201_64
>> +pwritev202 pwritev202
>> +pwritev202_64 pwritev202_64
>>
>> quotactl01 quotactl01
>> quotactl02 quotactl02
>> diff --git a/testcases/kernel/syscalls/pwritev2/.gitignore b/testcases/kernel/syscalls/pwritev2/.gitignore
>> index 46270c3..40030d9 100644
>> --- a/testcases/kernel/syscalls/pwritev2/.gitignore
>> +++ b/testcases/kernel/syscalls/pwritev2/.gitignore
>> @@ -1,2 +1,4 @@
>> /pwritev201
>> /pwritev201_64
>> +/pwritev202
>> +/pwritev202_64
>> diff --git a/testcases/kernel/syscalls/pwritev2/pwritev202.c b/testcases/kernel/syscalls/pwritev2/pwritev202.c
>> new file mode 100644
>> index 0000000..d0f8868
>> --- /dev/null
>> +++ b/testcases/kernel/syscalls/pwritev2/pwritev202.c
>> @@ -0,0 +1,117 @@
>> +// SPDX-License-Identifier: GPL-2.0-or-later
>> +/*
>> + * Copyright (c) 2019 FUJITSU LIMITED. All rights reserved.
>> + * Author: Jinhui Huang <huangjh.jy@cn.fujitsu.com>
>> + */
>> +/*
>> + * Description:
>> + * Check various errnos for pwritev2(2).
>> + * 1) pwritev2() fails and sets errno to EINVAL if iov_len is invalid.
>> + * 2) pwritev2() fails and sets errno to EINVAL if the vector count iovcnt is
>> + * less than zero.
>> + * 3) pwritev2() fails and sets errno to EOPNOTSUPP if flag is invalid.
>> + * 4) pwritev2() fails and sets errno to EFAULT when attempts to read into a
>> + * invalid address.
> Typo? Invalid address is actually used to test write instead of read.
>
>> + * 5) pwritev2() fails and sets errno to EBADF if file descriptor is invalid.
>> + * 6) pwritev2() fails and sets errno to EBADF if file descriptor is not open
>> + * for reading.
> Typo? fd2 is actually opened with O_RDONLY.
>
> Best Regards,
> Xiao Yang
>> + * 7) pwritev2() fails and sets errno to ESPIPE if fd is associated with a pipe.
>> + */
>> +
>> +#define _GNU_SOURCE
>> +#include <sys/uio.h>
>> +#include <unistd.h>
>> +
>> +#include "tst_test.h"
>> +#include "lapi/pwritev2.h"
>> +
>> +#define CHUNK 64
>> +
>> +static int fd1;
>> +static int fd2;
>> +static int fd3 = -1;
>> +static int fd4[2];
>> +
>> +static char buf[CHUNK];
>> +
>> +static struct iovec wr_iovec1[] = {
>> + {buf, -1},
>> +};
>> +
>> +static struct iovec wr_iovec2[] = {
>> + {buf, CHUNK},
>> +};
>> +
>> +static struct iovec wr_iovec3[] = {
>> + {NULL, CHUNK},
>> +};
>> +
>> +static struct tcase {
>> + int *fd;
>> + struct iovec *name;
>> + int count;
>> + off_t offset;
>> + int flag;
>> + int exp_err;
>> +} tcases[] = {
>> + {&fd1, wr_iovec1, 1, 0, 0, EINVAL},
>> + {&fd1, wr_iovec2, -1, 0, 0, EINVAL},
>> + {&fd1, wr_iovec2, 1, 1, -1, EOPNOTSUPP},
>> + {&fd1, wr_iovec3, 1, 0, 0, EFAULT},
>> + {&fd3, wr_iovec2, 1, 0, 0, EBADF},
>> + {&fd2, wr_iovec2, 1, 0, 0, EBADF},
>> + {&fd4[0], wr_iovec2, 1, 0, 0, ESPIPE},
>> +};
>> +
>> +static void verify_pwritev2(unsigned int n)
>> +{
>> + struct tcase *tc = &tcases[n];
>> +
>> + TEST(pwritev2(*tc->fd, tc->name, tc->count, tc->offset, tc->flag));
>> +
>> + if (TST_RET == 0) {
>> + tst_res(TFAIL, "pwritev2() succeeded unexpectedly");
>> + return;
>> + }
>> +
>> + if (TST_ERR == tc->exp_err) {
>> + tst_res(TPASS | TTERRNO, "pwritev2() failed as expected");
>> + return;
>> + }
>> +
>> + tst_res(TFAIL | TTERRNO, "pwritev2() failed unexpectedly, expected %s",
>> + tst_strerrno(tc->exp_err));
>> +}
>> +
>> +static void setup(void)
>> +{
>> + fd1 = SAFE_OPEN("file1", O_RDWR | O_CREAT, 0644);
>> + SAFE_FTRUNCATE(fd1, getpagesize());
>> + fd2 = SAFE_OPEN("file2", O_RDONLY | O_CREAT, 0644);
>> + SAFE_PIPE(fd4);
>> +
>> + wr_iovec3[0].iov_base = tst_get_bad_addr(NULL);
>> +}
>> +
>> +static void cleanup(void)
>> +{
>> + if (fd1 > 0)
>> + SAFE_CLOSE(fd1);
>> +
>> + if (fd2 > 0)
>> + SAFE_CLOSE(fd2);
>> +
>> + if (fd4[0] > 0)
>> + SAFE_CLOSE(fd4[0]);
>> +
>> + if (fd4[1] > 0)
>> + SAFE_CLOSE(fd4[1]);
>> +}
>> +
>> +static struct tst_test test = {
>> + .tcnt = ARRAY_SIZE(tcases),
>> + .setup = setup,
>> + .cleanup = cleanup,
>> + .test = verify_pwritev2,
>> + .needs_tmpdir = 1,
>> +};
> .
>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2019-03-01 7:13 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-15 8:11 [LTP] [PATCH 1/3] lapi/syscalls: Add syscall numbers for pwritev2() Jinhui huang
2019-02-15 8:11 ` [LTP] [PATCH 2/3] syscalls/pwritev201: Add new testcase Jinhui huang
2019-02-28 7:22 ` Xiao Yang
2019-02-15 8:11 ` [LTP] [PATCH 3/3] syscalls/pwitev202: " Jinhui huang
2019-02-28 7:22 ` Xiao Yang
2019-03-01 7:13 ` jinhui huang
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.