2017-08-21 16:07:18 +02:00
|
|
|
From 82efa1ffd43bed1494d20a4b86f6b15ac6bb5545 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
|
|
|
Date: Mon, 17 Jul 2017 10:59:59 -0300
|
|
|
|
Subject: [PATCH 05] posix: Set p{read,write}v2 to return ENOTSUP (BZ#21780)
|
|
|
|
|
|
|
|
Different than other architectures hppa-linux-gnu define different values
|
|
|
|
for ENOTSUP and EOPNOTSUPP, where the later is a Linux specific one.
|
|
|
|
This leads to tst-preadwritev{64}v2 tests failures:
|
|
|
|
|
|
|
|
$ ./testrun.sh misc/tst-preadvwritev2
|
|
|
|
error: tst-preadvwritev2-common.c:35: preadv2 failure did not set errno to ENOTSUP (223)
|
|
|
|
error: 1 test failures
|
|
|
|
|
|
|
|
The straightforward fix is to return the POSIX defined ENOTSUP on all
|
|
|
|
p{read,write}v{64}v2 implementations instead of Linux specific one.
|
|
|
|
|
|
|
|
Checked on x86_64-linux-gnu and the tst-preadwritev{64}v2 on
|
|
|
|
hppa-linux-gnu (although due the installed kernel on my testing system
|
|
|
|
the pwritev{64}v2 with an invalid flag still fails due a known kernel
|
|
|
|
issue [1]).
|
|
|
|
|
|
|
|
[BZ #21780]
|
|
|
|
* sysdeps/posix/preadv2.c (preadv2): Use ENOTSUP instead of
|
|
|
|
EOPNOTSUPP.
|
|
|
|
* sysdeps/posix/preadv64v2.c (preadv64v2): Likewise.
|
|
|
|
* sysdeps/posix/pwritev2.c (pwritev2): Likewise.
|
|
|
|
* sysdeps/posix/pwritev64v2.c (pwritev64v2): Likewise.
|
|
|
|
* sysdeps/unix/sysv/linux/preadv2.c (preadv2): Likewise.
|
|
|
|
* sysdeps/unix/sysv/linux/preadv64v2.c (preadv64v2): Likewise.
|
|
|
|
* sysdeps/unix/sysv/linux/pwritev2.c (pwritev2): Likewise.
|
|
|
|
* sysdeps/unix/sysv/linux/pwritev64v2.c (pwritev64v2): Likewise.
|
|
|
|
|
|
|
|
[1] https://sourceware.org/ml/libc-alpha/2017-06/msg00726.html
|
|
|
|
|
|
|
|
Cherry-pick of 852d63120783fae5bf85a067320dc4ba1ed59f11
|
|
|
|
---
|
|
|
|
ChangeLog | 13 +++++++++++++
|
|
|
|
sysdeps/posix/preadv2.c | 2 +-
|
|
|
|
sysdeps/posix/preadv64v2.c | 2 +-
|
|
|
|
sysdeps/posix/pwritev2.c | 2 +-
|
|
|
|
sysdeps/posix/pwritev64v2.c | 2 +-
|
|
|
|
sysdeps/unix/sysv/linux/preadv2.c | 4 ++--
|
|
|
|
sysdeps/unix/sysv/linux/preadv64v2.c | 4 ++--
|
|
|
|
sysdeps/unix/sysv/linux/pwritev2.c | 4 ++--
|
|
|
|
sysdeps/unix/sysv/linux/pwritev64v2.c | 4 ++--
|
|
|
|
9 files changed, 25 insertions(+), 12 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/ChangeLog b/ChangeLog
|
2017-10-10 16:38:13 +02:00
|
|
|
index 764c827161..459062cc20 100644
|
2017-08-21 16:07:18 +02:00
|
|
|
--- a/ChangeLog
|
|
|
|
+++ b/ChangeLog
|
|
|
|
@@ -1,3 +1,16 @@
|
|
|
|
+2017-08-09 Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
|
|
|
+
|
|
|
|
+ [BZ #21780]
|
|
|
|
+ * sysdeps/posix/preadv2.c (preadv2): Use ENOTSUP instead of
|
|
|
|
+ EOPNOTSUPP.
|
|
|
|
+ * sysdeps/posix/preadv64v2.c (preadv64v2): Likewise.
|
|
|
|
+ * sysdeps/posix/pwritev2.c (pwritev2): Likewise.
|
|
|
|
+ * sysdeps/posix/pwritev64v2.c (pwritev64v2): Likewise.
|
|
|
|
+ * sysdeps/unix/sysv/linux/preadv2.c (preadv2): Likewise.
|
|
|
|
+ * sysdeps/unix/sysv/linux/preadv64v2.c (preadv64v2): Likewise.
|
|
|
|
+ * sysdeps/unix/sysv/linux/pwritev2.c (pwritev2): Likewise.
|
|
|
|
+ * sysdeps/unix/sysv/linux/pwritev64v2.c (pwritev64v2): Likewise.
|
|
|
|
+
|
|
|
|
2017-08-06 H.J. Lu <hongjiu.lu@intel.com>
|
|
|
|
|
|
|
|
[BZ #21871]
|
|
|
|
diff --git a/sysdeps/posix/preadv2.c b/sysdeps/posix/preadv2.c
|
2017-10-10 16:38:13 +02:00
|
|
|
index 2a7cf11e27..d27f7028ed 100644
|
2017-08-21 16:07:18 +02:00
|
|
|
--- a/sysdeps/posix/preadv2.c
|
|
|
|
+++ b/sysdeps/posix/preadv2.c
|
|
|
|
@@ -28,7 +28,7 @@ preadv2 (int fd, const struct iovec *vector, int count, OFF_T offset,
|
|
|
|
{
|
|
|
|
if (flags != 0)
|
|
|
|
{
|
|
|
|
- __set_errno (EOPNOTSUPP);
|
|
|
|
+ __set_errno (ENOTSUP);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
diff --git a/sysdeps/posix/preadv64v2.c b/sysdeps/posix/preadv64v2.c
|
2017-10-10 16:38:13 +02:00
|
|
|
index e084f3f9e1..ce7cb40bf2 100644
|
2017-08-21 16:07:18 +02:00
|
|
|
--- a/sysdeps/posix/preadv64v2.c
|
|
|
|
+++ b/sysdeps/posix/preadv64v2.c
|
|
|
|
@@ -25,7 +25,7 @@ preadv64v2 (int fd, const struct iovec *vector, int count, OFF_T offset,
|
|
|
|
{
|
|
|
|
if (flags != 0)
|
|
|
|
{
|
|
|
|
- __set_errno (EOPNOTSUPP);
|
|
|
|
+ __set_errno (ENOTSUP);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
diff --git a/sysdeps/posix/pwritev2.c b/sysdeps/posix/pwritev2.c
|
2017-10-10 16:38:13 +02:00
|
|
|
index 5b7650c4fc..7ec8cbc407 100644
|
2017-08-21 16:07:18 +02:00
|
|
|
--- a/sysdeps/posix/pwritev2.c
|
|
|
|
+++ b/sysdeps/posix/pwritev2.c
|
|
|
|
@@ -28,7 +28,7 @@ pwritev2 (int fd, const struct iovec *vector, int count, OFF_T offset,
|
|
|
|
{
|
|
|
|
if (flags != 0)
|
|
|
|
{
|
|
|
|
- __set_errno (EOPNOTSUPP);
|
|
|
|
+ __set_errno (ENOTSUP);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
diff --git a/sysdeps/posix/pwritev64v2.c b/sysdeps/posix/pwritev64v2.c
|
2017-10-10 16:38:13 +02:00
|
|
|
index 0f2f9ef863..be98aeed9d 100644
|
2017-08-21 16:07:18 +02:00
|
|
|
--- a/sysdeps/posix/pwritev64v2.c
|
|
|
|
+++ b/sysdeps/posix/pwritev64v2.c
|
|
|
|
@@ -26,7 +26,7 @@ pwritev64v2 (int fd, const struct iovec *vector, int count, OFF_T offset,
|
|
|
|
{
|
|
|
|
if (flags != 0)
|
|
|
|
{
|
|
|
|
- __set_errno (EOPNOTSUPP);
|
|
|
|
+ __set_errno (ENOTSUP);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
diff --git a/sysdeps/unix/sysv/linux/preadv2.c b/sysdeps/unix/sysv/linux/preadv2.c
|
2017-10-10 16:38:13 +02:00
|
|
|
index 11fe85eaa8..137e2dd791 100644
|
2017-08-21 16:07:18 +02:00
|
|
|
--- a/sysdeps/unix/sysv/linux/preadv2.c
|
|
|
|
+++ b/sysdeps/unix/sysv/linux/preadv2.c
|
|
|
|
@@ -32,7 +32,7 @@ preadv2 (int fd, const struct iovec *vector, int count, off_t offset,
|
|
|
|
# ifdef __NR_preadv2
|
|
|
|
ssize_t result = SYSCALL_CANCEL (preadv2, fd, vector, count,
|
|
|
|
LO_HI_LONG (offset), flags);
|
|
|
|
- if (result >= 0 || errno != ENOSYS)
|
|
|
|
+ if (result >= 0)
|
|
|
|
return result;
|
|
|
|
# endif
|
|
|
|
/* Trying to emulate the preadv2 syscall flags is troublesome:
|
|
|
|
@@ -46,7 +46,7 @@ preadv2 (int fd, const struct iovec *vector, int count, off_t offset,
|
|
|
|
|
|
|
|
if (flags != 0)
|
|
|
|
{
|
|
|
|
- __set_errno (EOPNOTSUPP);
|
|
|
|
+ __set_errno (ENOTSUP);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return preadv (fd, vector, count, offset);
|
|
|
|
diff --git a/sysdeps/unix/sysv/linux/preadv64v2.c b/sysdeps/unix/sysv/linux/preadv64v2.c
|
2017-10-10 16:38:13 +02:00
|
|
|
index 9d7f8c9893..8f413253f4 100644
|
2017-08-21 16:07:18 +02:00
|
|
|
--- a/sysdeps/unix/sysv/linux/preadv64v2.c
|
|
|
|
+++ b/sysdeps/unix/sysv/linux/preadv64v2.c
|
|
|
|
@@ -30,7 +30,7 @@ preadv64v2 (int fd, const struct iovec *vector, int count, off64_t offset,
|
|
|
|
#ifdef __NR_preadv64v2
|
|
|
|
ssize_t result = SYSCALL_CANCEL (preadv64v2, fd, vector, count,
|
|
|
|
LO_HI_LONG (offset), flags);
|
|
|
|
- if (result >= 0 || errno != ENOSYS)
|
|
|
|
+ if (result >= 0)
|
|
|
|
return result;
|
|
|
|
#endif
|
|
|
|
/* Trying to emulate the preadv2 syscall flags is troublesome:
|
|
|
|
@@ -44,7 +44,7 @@ preadv64v2 (int fd, const struct iovec *vector, int count, off64_t offset,
|
|
|
|
|
|
|
|
if (flags != 0)
|
|
|
|
{
|
|
|
|
- __set_errno (EOPNOTSUPP);
|
|
|
|
+ __set_errno (ENOTSUP);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return preadv64 (fd, vector, count, offset);
|
|
|
|
diff --git a/sysdeps/unix/sysv/linux/pwritev2.c b/sysdeps/unix/sysv/linux/pwritev2.c
|
2017-10-10 16:38:13 +02:00
|
|
|
index 72f0471f96..8e5032fe2f 100644
|
2017-08-21 16:07:18 +02:00
|
|
|
--- a/sysdeps/unix/sysv/linux/pwritev2.c
|
|
|
|
+++ b/sysdeps/unix/sysv/linux/pwritev2.c
|
|
|
|
@@ -28,7 +28,7 @@ pwritev2 (int fd, const struct iovec *vector, int count, off_t offset,
|
|
|
|
# ifdef __NR_pwritev2
|
|
|
|
ssize_t result = SYSCALL_CANCEL (pwritev2, fd, vector, count,
|
|
|
|
LO_HI_LONG (offset), flags);
|
|
|
|
- if (result >= 0 || errno != ENOSYS)
|
|
|
|
+ if (result >= 0)
|
|
|
|
return result;
|
|
|
|
# endif
|
|
|
|
/* Trying to emulate the pwritev2 syscall flags is troublesome:
|
|
|
|
@@ -42,7 +42,7 @@ pwritev2 (int fd, const struct iovec *vector, int count, off_t offset,
|
|
|
|
|
|
|
|
if (flags != 0)
|
|
|
|
{
|
|
|
|
- __set_errno (EOPNOTSUPP);
|
|
|
|
+ __set_errno (ENOTSUP);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return pwritev (fd, vector, count, offset);
|
|
|
|
diff --git a/sysdeps/unix/sysv/linux/pwritev64v2.c b/sysdeps/unix/sysv/linux/pwritev64v2.c
|
2017-10-10 16:38:13 +02:00
|
|
|
index def9a0bc57..d2800c6657 100644
|
2017-08-21 16:07:18 +02:00
|
|
|
--- a/sysdeps/unix/sysv/linux/pwritev64v2.c
|
|
|
|
+++ b/sysdeps/unix/sysv/linux/pwritev64v2.c
|
|
|
|
@@ -30,7 +30,7 @@ pwritev64v2 (int fd, const struct iovec *vector, int count, off64_t offset,
|
|
|
|
#ifdef __NR_pwritev64v2
|
|
|
|
ssize_t result = SYSCALL_CANCEL (pwritev64v2, fd, vector, count,
|
|
|
|
LO_HI_LONG (offset), flags);
|
|
|
|
- if (result >= 0 || errno != ENOSYS)
|
|
|
|
+ if (result >= 0)
|
|
|
|
return result;
|
|
|
|
#endif
|
|
|
|
/* Trying to emulate the pwritev2 syscall flags is troublesome:
|
|
|
|
@@ -44,7 +44,7 @@ pwritev64v2 (int fd, const struct iovec *vector, int count, off64_t offset,
|
|
|
|
|
|
|
|
if (flags != 0)
|
|
|
|
{
|
|
|
|
- __set_errno (EOPNOTSUPP);
|
|
|
|
+ __set_errno (ENOTSUP);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return pwritev64 (fd, vector, count, offset);
|
|
|
|
|