From patchwork Wed Sep 28 00:15:01 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 77078 Delivered-To: patch@linaro.org Received: by 10.140.106.72 with SMTP id d66csp152781qgf; Tue, 27 Sep 2016 17:24:10 -0700 (PDT) X-Received: by 10.98.201.215 with SMTP id l84mr516107pfk.10.1475021765109; Tue, 27 Sep 2016 17:16:05 -0700 (PDT) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id f22si5107792pfk.93.2016.09.27.17.16.04 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 27 Sep 2016 17:16:05 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-alpha-return-73577-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org; spf=pass (google.com: domain of libc-alpha-return-73577-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-73577-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=Pd/6++VHFjNiI1LVDpYW3qvBwfLf3Hw R1C53AdkhHsdSdV8Kw71fZlHe00R3dI7Hd77vD2WKzQrpi7mS6+Y/m9XiWh8BKTU G8AwButXdF2wwQtJtwCbNGBhwxXgqnLpv7wLlPGBqK3Z3bfuTGxhVGqTUA8mVoVP fFZXZsv9YNmI= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references; s=default; bh=tuqqvuM28QJY/dwWT+wpY2gYSAE=; b=EAudt 5xPv809exdX8CXl00Bf2U6glayi31GlcTaumolSml8CdUhOPAYVQJNRCsWM3x0Tq eZf64vMARr2XfOKAb1Lsdk81mPt9UeSyBXiA0SVP4Z8rxFBKW5hsTKT3nS0p4VbE ByLI7HGEXqDR/2UIDJtbp8K0WvavldY8vYvU2g= Received: (qmail 12683 invoked by alias); 28 Sep 2016 00:15:33 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 11988 invoked by uid 89); 28 Sep 2016 00:15:30 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=stat.h, UD:stat.h, stath, 2007-2016 X-HELO: mail-pa0-f53.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=2KbVQB5LxCj+AvLNtLKCZZcBRRX0HDNDhRrCe9fYcUg=; b=gmuWdDUwXAw13JWbpUPbIUOrEYMcnBjQbnUGliraZnWvAHb/ghORfwc1dTkDtBAmnJ lopo6vlbjDT3W2rFXneSd7I9kvekqzGK5sPAICU3uYLVQkVLnJYS6J5amQN8XQv4yApG 98lVnMEuf+75EBGWaXC7XXJIncgQMC9l5lvo+Byvt0AItX4wbWCQHqkf0CKeVzvLYnYD ap3ndYUBNjSw59CHx2CrLvsj8k1qLqU6ueF9cTLRuQHpWjRQ1I1QplRrp2bfsG9A5EmY b9p/TLWX0SxCAxujDAnsi52eHviUAG/HMReEEUfr8Xp9mwuGTU0cYK9bRdcmyQUG3Coj 9roQ== X-Gm-Message-State: AE9vXwNePBCm6nwQDSpIsF26CA7t0cRf2NlrEqRRF0F6DL1/kbkOiOOoYGvFrN4qUYlr0kmv X-Received: by 10.66.156.129 with SMTP id we1mr51874277pab.149.1475021715862; Tue, 27 Sep 2016 17:15:15 -0700 (PDT) From: Adhemerval Zanella X-Google-Original-From: Adhemerval Zanella To: libc-alpha@sourceware.org Cc: Adhemerval Zanella Subject: [PATCH v2 3/3] Consolidate posix_fadvise implementations Date: Tue, 27 Sep 2016 17:15:01 -0700 Message-Id: <1475021701-22246-3-git-send-email-adhemerval.zanella@linaro.com> In-Reply-To: <1475021701-22246-1-git-send-email-adhemerval.zanella@linaro.com> References: <1475021701-22246-1-git-send-email-adhemerval.zanella@linaro.com> From: Adhemerval Zanella This patch consolidates mostly of the Linux posix_fallocate{64} implementations on sysdeps/unix/sysv/linux/posix_fallocate{64}.c. It still keeps arch-specific files for: * S390-32: it uses a packed structure to pass all the arguments on syscall. It is the only supported port that implements __NR_fadvise64_64 in this way. * ARM: it does not implement __NR_fadvise64 (as other 32-bits ports), so posix_fadvise calls internal posix_fadvise64 symbol. * MIPS64 n64: it requires a different version number that other ports. The new macro SYSCALL_LL{64} is used to handle the offset argument and INTERNAL_SYSCALL_CALL to handle passing the correct number of expect arguments. The default Linux adds two new defines a port can use to control how __NR_fadvise64_64 passes the kernel arguments: * __ASSUME_FADVISE64_64_6ARG: the 'advise' argument is moved on second position. This is the case of powerpc32 and arm to avoid implement 7 argument syscall. * __ASSUME_FADVISE64_64_NO_ALIGN: for ABIs that defines __ASSUME_ALIGNED_REGISTER_PAIRS packs the offset without the leading '0'. This is the case of tile 32 bits. ARM also defines __NR_fadvise64_64 as __NR_arm_fadvise64_64 (which is also handled on arch kernel-feature.h). Tested on x86_64, x32, i686, armhf, and aarch64. * posix/Makefile (tests): Add tst-posix_fadvise and tst-posix_fadvise64. * posix/tst-posix_fadvise.c: New file. * posix/tst-posix_fadvise64.c: Likewise. * posix/tst-posix_fadvise-common.c: Likewise. * sysdeps/unix/sysv/linux/arm/kernel-features.h (__ASSUME_FADVISE64_64_6ARG): Define. * sysdeps/unix/sysv/linux/powerpc/kernel-features.h [!__powerpc64__] (__ASSUME_FADVISE64_64_6ARG): Add define. * sysdeps/unix/sysv/linux/arm/posix_fadvise64.c: Remove file. * sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c: Likewise. * sysdeps/unix/sysv/linux/i386/posix_fadvise64.S: Likewise. * sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c: Likewise. * sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c: Likewise. * sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c (SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l64]: Alias to __posix_fadvise64_l32. (SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l32]: Add compat definition to posix_fadvise64. (SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l64]: Add versioned definition to posix_fadvise64. * sysdeps/unix/sysv/linux/posix_fadvise.c (posix_fadvise): Build iff __OFF_T_MATCHES_OFF64_T is defined, use INTERNAL_SYSCALL_CALL, add __ASSUME_FADVISE64_64_6ARG/__ASSUME_FADVISE64_64_NO_ALIGN support. * sysdeps/unix/sysv/linux/posix_fadvise64.c (posix_fadvise64): Add __ASSUME_FADVISE64_64_NO_ALIGN support and use INTERNAL_SYSCALL_CALL. --- ChangeLog | 36 +++++++ posix/Makefile | 3 +- posix/tst-posix_fadvise-common.c | 116 +++++++++++++++++++++ posix/tst-posix_fadvise.c | 25 +++++ posix/tst-posix_fadvise64.c | 44 ++++++++ sysdeps/unix/sysv/linux/arm/kernel-features.h | 7 ++ sysdeps/unix/sysv/linux/arm/posix_fadvise64.c | 38 ------- .../sysv/linux/generic/wordsize-32/posix_fadvise.c | 37 ------- sysdeps/unix/sysv/linux/i386/posix_fadvise64.S | 92 ---------------- .../unix/sysv/linux/mips/mips32/posix_fadvise.c | 41 -------- .../unix/sysv/linux/mips/mips32/posix_fadvise64.c | 60 ----------- .../sysv/linux/mips/mips64/n32/posix_fadvise.c | 37 ------- .../sysv/linux/mips/mips64/n32/posix_fadvise64.c | 55 ---------- .../sysv/linux/mips/mips64/n64/posix_fadvise.c | 50 --------- .../sysv/linux/mips/mips64/n64/posix_fadvise64.c | 29 +++++- sysdeps/unix/sysv/linux/posix_fadvise.c | 45 +++++--- sysdeps/unix/sysv/linux/posix_fadvise64.c | 51 ++++++--- sysdeps/unix/sysv/linux/powerpc/kernel-features.h | 5 + .../sysv/linux/powerpc/powerpc32/posix_fadvise.c | 39 ------- .../sysv/linux/powerpc/powerpc32/posix_fadvise64.c | 55 ---------- sysdeps/unix/sysv/linux/tile/kernel-features.h | 1 + .../unix/sysv/linux/wordsize-64/posix_fadvise.c | 40 ------- .../unix/sysv/linux/wordsize-64/posix_fadvise64.c | 1 - 23 files changed, 335 insertions(+), 572 deletions(-) create mode 100644 posix/tst-posix_fadvise-common.c create mode 100644 posix/tst-posix_fadvise.c create mode 100644 posix/tst-posix_fadvise64.c delete mode 100644 sysdeps/unix/sysv/linux/arm/posix_fadvise64.c delete mode 100644 sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c delete mode 100644 sysdeps/unix/sysv/linux/i386/posix_fadvise64.S delete mode 100644 sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c delete mode 100644 sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c -- 2.7.4 diff --git a/ChangeLog b/ChangeLog index c75ae77..3a9785c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,41 @@ 2016-09-26 Adhemerval Zanella + * posix/Makefile (tests): Add tst-posix_fadvise and tst-posix_fadvise64. + * posix/tst-posix_fadvise.c: New file. + * posix/tst-posix_fadvise64.c: Likewise. + * posix/tst-posix_fadvise-common.c: Likewise. + * sysdeps/unix/sysv/linux/arm/kernel-features.h + (__ASSUME_FADVISE64_64_6ARG): Define. + * sysdeps/unix/sysv/linux/powerpc/kernel-features.h + [!__powerpc64__] (__ASSUME_FADVISE64_64_6ARG): Define. + * sysdeps/unix/sysv/linux/tile/kernel-features.h + [!LP64] (__ASSUME_FADVISE64_64_NO_ALIGN): Define. + * sysdeps/unix/sysv/linux/arm/posix_fadvise64.c: Remove file. + * sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c: Likewise. + * sysdeps/unix/sysv/linux/i386/posix_fadvise64.S: Likewise. + * sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c: Likewise. + * sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c: Likewise. + * sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c: Likewise. + * sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c: Likewise. + * sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c: + Likewise. + * sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c: Likewise. + * sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c: Likewise. + * sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c + (SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l64]: + Alias to __posix_fadvise64_l32. + (SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l32]: + Add compat definition to posix_fadvise64. + (SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l64]: + Add versioned definition to posix_fadvise64. + * sysdeps/unix/sysv/linux/posix_fadvise.c (posix_fadvise): Build iff + __OFF_T_MATCHES_OFF64_T is defined, use INTERNAL_SYSCALL_CALL, add + __ASSUME_FADVISE64_64_6ARG/__ASSUME_FADVISE64_64_NO_ALIGN support. + * sysdeps/unix/sysv/linux/posix_fadvise64.c (posix_fadvise64): Add + __ASSUME_FADVISE64_64_NO_ALIGN support and use INTERNAL_SYSCALL_CALL. + * io/Makefile (tests): Add tst-posix_fallocate and tst-posix_fallocate64. * io/tst-posix_fallocate-common.c: New file. diff --git a/posix/Makefile b/posix/Makefile index 3a7719e..97867ca 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -90,7 +90,8 @@ tests := tstgetopt testfnm runtests runptests \ bug-getopt5 tst-getopt_long1 bug-regex34 bug-regex35 \ tst-pathconf tst-getaddrinfo4 tst-rxspencer-no-utf8 \ tst-fnmatch3 bug-regex36 tst-getaddrinfo5 \ - tst-posix_spawn-fd + tst-posix_spawn-fd \ + tst-posix_fadvise tst-posix_fadvise64 xtests := bug-ga2 ifeq (yes,$(build-shared)) test-srcs := globtest diff --git a/posix/tst-posix_fadvise-common.c b/posix/tst-posix_fadvise-common.c new file mode 100644 index 0000000..7bbf9d9 --- /dev/null +++ b/posix/tst-posix_fadvise-common.c @@ -0,0 +1,116 @@ +/* Common posix_fadvise tests definitions. + Copyright (C) 2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include + +static void do_prepare (void); +#define PREPARE(argc, argv) do_prepare () +static int do_test (void); +#define TEST_FUNCTION do_test () + +#include + +static char *temp_filename; +static int temp_fd; +static char fifoname[] = "/tmp/tst-posix_fadvise-fifo-XXXXXX"; +static int fifofd; + +static void +do_prepare (void) +{ + temp_fd = create_temp_file ("tst-posix_fadvise.", &temp_filename); + if (temp_fd == -1) + { + printf ("cannot create temporary file: %m\n"); + exit (1); + } + + if (mktemp (fifoname) == NULL) + { + printf ("%s: cannot generate temp file name: %m\n", __func__); + exit (1); + } + add_temp_file (fifoname); + + if (mkfifo (fifoname, S_IWUSR | S_IRUSR) != 0) + { + printf ("%s: cannot create fifo: %m\n", __func__); + exit (1); + } + + fifofd = open (fifoname, O_RDONLY | O_NONBLOCK); + if (fifofd == -1) + { + printf ("%s: cannot open fifo: %m\n", __func__); + exit (1); + } +} + +#define FAIL(str) \ + do { \ + printf ("error: %s (line %d)\n", str, __LINE__); \ + return 1; \ + } while (0) + +/* Effectivelly testing posix_fadvise is hard because side effects are not + observed without checking either performance or any kernel specific + supplied information. Also, the syscall is meant to be an advisory, + so kernel is free to use these information in which way it seems as + fit (even ignoring it). + + This test check for some invalid returned operation to check argument + passing and if implementation follows POSIX error definition. */ +static int +do_test_common (void) +{ + /* Add some data to file and ensure it is written down on disk. */ + char buffer[2048] = { 0xcd }; + + if (write (temp_fd, buffer, 2048) != 2048) + FAIL ("write returned a value different than expected 2048"); + + if (fsync (temp_fd) != 0) + FAIL ("fsync failed"); + + /* Test passing an invalid fd. */ + if (posix_fadvise (-1, 0, 0, POSIX_FADV_NORMAL) != EBADF) + FAIL ("posix_fadvise with invalid fd did not return EBADF"); + + /* Test passing an invalid operation. */ + if (posix_fadvise (temp_fd, 0, 0, -1) != EINVAL) + FAIL ("posix_fadvise with invalid advise did not return EINVAL"); + + /* Test passing a FIFO fd. */ + if (posix_fadvise (fifofd, 0, 0, POSIX_FADV_NORMAL) != ESPIPE) + FAIL ("posix_advise with PIPE fd did not return ESPIPE"); + + /* Default fadvise on all file starting at initial position. */ + if (posix_fadvise (temp_fd, 0, 0, POSIX_FADV_NORMAL) != 0) + FAIL ("default posix_fadvise failed"); + + if (posix_fadvise (temp_fd, 0, 4096, POSIX_FADV_NORMAL) != 0) + FAIL ("posix_fadvise failed (offset = 0, len = 4096) failed"); + + if (posix_fadvise (temp_fd, 4096, 0, POSIX_FADV_NORMAL) != 0) + FAIL ("posix_fadvise failed (offset = 4096, len = 0) failed"); + + return 0; +} diff --git a/posix/tst-posix_fadvise.c b/posix/tst-posix_fadvise.c new file mode 100644 index 0000000..6ee0936 --- /dev/null +++ b/posix/tst-posix_fadvise.c @@ -0,0 +1,25 @@ +/* Basic posix_fadvise tests. + Copyright (C) 2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include "tst-posix_fadvise-common.c" + +static int +do_test (void) +{ + return do_test_common (); +} diff --git a/posix/tst-posix_fadvise64.c b/posix/tst-posix_fadvise64.c new file mode 100644 index 0000000..91d1860 --- /dev/null +++ b/posix/tst-posix_fadvise64.c @@ -0,0 +1,44 @@ +/* Basic posix_fadvise64 tests. + Copyright (C) 2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#define _FILE_OFFSET_BITS 64 +#include "tst-posix_fadvise-common.c" + +static int +do_test (void) +{ + int ret = do_test_common (); + if (ret == -1) + return -1; + + /* Test passing a negative length. The compat fadvise64 might use + off64_t for size argument passing, so using -1 for len without + _FILE_OFFSET_BITS might not trigger the length issue. */ + if (posix_fadvise (temp_fd, 0, -1, POSIX_FADV_NORMAL) != EINVAL) + FAIL ("posix_fadvise with negative length did not return EINVAL"); + + /* Check with some offset values larger than 32-bits. */ + off_t offset = UINT32_MAX + 2048LL; + if (posix_fadvise (temp_fd, 0, offset, POSIX_FADV_NORMAL) != 0) + FAIL ("posix_fadvise failed (offset = 0, len = 4096) failed"); + + if (posix_fadvise (temp_fd, offset, 0, POSIX_FADV_NORMAL) != 0) + FAIL ("posix_fadvise failed (offset = 4096, len = 0) failed"); + + return 0; +} diff --git a/sysdeps/unix/sysv/linux/arm/kernel-features.h b/sysdeps/unix/sysv/linux/arm/kernel-features.h index 6ca607e..628d27f 100644 --- a/sysdeps/unix/sysv/linux/arm/kernel-features.h +++ b/sysdeps/unix/sysv/linux/arm/kernel-features.h @@ -27,6 +27,13 @@ # undef __ASSUME_SET_ROBUST_LIST #endif +/* ARM fadvise64_64 reorganize the syscall arguments. */ +#define __ASSUME_FADVISE64_64_6ARG 1 + /* Define this if your 32-bit syscall API requires 64-bit register pairs to start with an even-number register. */ #define __ASSUME_ALIGNED_REGISTER_PAIRS 1 + +/* ARM only has a syscall for fadvise64{_64} and it defined with a + non-standard name. */ +#define __NR_fadvise64_64 __NR_arm_fadvise64_64 diff --git a/sysdeps/unix/sysv/linux/arm/posix_fadvise64.c b/sysdeps/unix/sysv/linux/arm/posix_fadvise64.c deleted file mode 100644 index ffb3ecd..0000000 --- a/sysdeps/unix/sysv/linux/arm/posix_fadvise64.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (C) 2003-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#include -#include -#include - -int __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise); - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -__posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) -{ - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (arm_fadvise64_64, err, 6, fd, advise, - __LONG_LONG_PAIR ((long)(offset >> 32), (long)offset), - __LONG_LONG_PAIR ((long)(len >> 32), (long)len)); - if (!INTERNAL_SYSCALL_ERROR_P (ret, err)) - return 0; - return INTERNAL_SYSCALL_ERRNO (ret, err); -} -weak_alias (__posix_fadvise64_l64, posix_fadvise64); diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c deleted file mode 100644 index 7c93a8f..0000000 --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 2011-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf , 2011. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#include -#include -#include - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -posix_fadvise (int fd, off_t offset, off_t len, int advise) -{ - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64_64, err, 6, fd, - __LONG_LONG_PAIR (offset >> 31, offset), - __LONG_LONG_PAIR (len >> 31, len), - advise); - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) - return INTERNAL_SYSCALL_ERRNO (ret, err); - return 0; -} diff --git a/sysdeps/unix/sysv/linux/i386/posix_fadvise64.S b/sysdeps/unix/sysv/linux/i386/posix_fadvise64.S deleted file mode 100644 index 4b5d65c..0000000 --- a/sysdeps/unix/sysv/linux/i386/posix_fadvise64.S +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (C) 1995-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include - -#define EINVAL 22 -#define ENOSYS 38 -#define EOVERFLOW 75 - -#define SVRSP 16 /* saved register space */ -#define PARMS 4+SVRSP /* space for 4 saved regs */ -#define FD PARMS -#define OFFLO FD+4 -#define OFFHI OFFLO+4 -#define LENLO OFFHI+4 -#define LENHI LENLO+4 -#define FLAGS LENHI+4 - - .text -ENTRY (__posix_fadvise64_l64) - - /* Save registers. */ - pushl %ebp - cfi_adjust_cfa_offset (4) - pushl %ebx - cfi_adjust_cfa_offset (4) - pushl %esi - cfi_adjust_cfa_offset (4) - pushl %edi - cfi_adjust_cfa_offset (4) - - movl FD(%esp), %ebx - cfi_rel_offset (ebx, 8) - movl OFFLO(%esp), %ecx - movl OFFHI(%esp), %edx - movl LENLO(%esp), %esi - cfi_rel_offset (esi, 4) - movl LENHI(%esp), %edi - cfi_rel_offset (edi, 0) - movl FLAGS(%esp), %ebp - cfi_rel_offset (ebp, 12) - - movl $SYS_ify(fadvise64_64), %eax - ENTER_KERNEL - - /* Restore registers. */ - popl %edi - cfi_adjust_cfa_offset (-4) - cfi_restore (edi) - popl %esi - cfi_adjust_cfa_offset (-4) - cfi_restore (esi) - popl %ebx - cfi_adjust_cfa_offset (-4) - cfi_restore (ebx) - popl %ebp - cfi_adjust_cfa_offset (-4) - cfi_restore (ebp) - - /* The function returns zero, or the error number. So all we - have to do is negate the value passed back from the kernel. */ - /* If 0 > %eax > -4096 there was an error. */ - negl %eax - - /* Successful; return the syscall's value. */ - ret - -END (__posix_fadvise64_l64) - - .section .text.compat, "ax" -ENTRY (__posix_fadvise64_l32) - DO_CALL (fadvise64, 5) - negl %eax - ret -PSEUDO_END_ERRVAL (__posix_fadvise64_l32) - -default_symbol_version (__posix_fadvise64_l64, posix_fadvise64, GLIBC_2.3.3) -symbol_version (__posix_fadvise64_l32, posix_fadvise64, GLIBC_2.2) diff --git a/sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c b/sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c deleted file mode 100644 index 705c0c7..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 2007-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#include -#include -#include - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -posix_fadvise (int fd, off_t offset, off_t len, int advise) -{ -/* MIPS kernel only has NR_fadvise64 which acts as NR_fadvise64_64 */ -#ifdef __NR_fadvise64 - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64, err, 7, fd, 0, - __LONG_LONG_PAIR (offset >> 31, offset), - __LONG_LONG_PAIR (len >> 31, len), - advise); - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) - return INTERNAL_SYSCALL_ERRNO (ret, err); - return 0; -#else - return ENOSYS; -#endif -} diff --git a/sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c b/sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c deleted file mode 100644 index 0ded3c3..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c +++ /dev/null @@ -1,60 +0,0 @@ -/* Copyright (C) 2007-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#include -#include -#include - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -__posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) -{ -/* MIPS kernel only has NR_fadvise64 which acts as NR_fadvise64_64 */ -#ifdef __NR_fadvise64 - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64, err, 7, fd, 0, - __LONG_LONG_PAIR ((long) (offset >> 32), - (long) offset), - __LONG_LONG_PAIR ((long) (len >> 32), - (long) len), - advise); - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) - return INTERNAL_SYSCALL_ERRNO (ret, err); - return 0; -#else - return ENOSYS; -#endif -} - -#include - -#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) - -int -attribute_compat_text_section -__posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise) -{ - return __posix_fadvise64_l64 (fd, offset, len, advise); -} - -versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); -compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); -#else -strong_alias (__posix_fadvise64_l64, posix_fadvise64); -#endif diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c deleted file mode 100644 index 3b1ef7e..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 2003-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#include -#include -#include - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -posix_fadvise (int fd, off_t offset, off_t len, int advise) -{ -#ifdef __NR_fadvise64 - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64, err, 4, fd, offset, len, advise); - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) - return INTERNAL_SYSCALL_ERRNO (ret, err); - return 0; -#else - return ENOSYS; -#endif -} diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c deleted file mode 100644 index e7ddc87..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (C) 2007-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#include -#include -#include - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -__posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) -{ -/* MIPS kernel only has NR_fadvise64 which acts as NR_fadvise64_64 */ -#ifdef __NR_fadvise64 - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64, err, 4, fd, offset, len, advise); - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) - return INTERNAL_SYSCALL_ERRNO (ret, err); - return 0; -#else - return ENOSYS; -#endif -} - -#include - -#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) - -int -attribute_compat_text_section -__posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise) -{ - return __posix_fadvise64_l64 (fd, offset, len, advise); -} - -versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); -compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); -#else -strong_alias (__posix_fadvise64_l64, posix_fadvise64); -#endif diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c deleted file mode 100644 index 86ff6ef..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (C) 2003-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#define posix_fadvise64 __no_posix_fadvise64 -#include -#include -#include -#undef posix_fadvise64 - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -posix_fadvise (int fd, off_t offset, off_t len, int advise) -{ -#ifdef __NR_fadvise64 - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64, err, 4, fd, offset, len, advise); - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) - return INTERNAL_SYSCALL_ERRNO (ret, err); - return 0; -#else - return ENOSYS; -#endif -} - -#include - -#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) -strong_alias (posix_fadvise, __posix_fadvise64_l32); -compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); -strong_alias (posix_fadvise, __posix_fadvise64_l64); -versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); -#else -weak_alias (posix_fadvise, posix_fadvise64); -#endif diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c index c9f72c4..d7aab25 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c @@ -1 +1,28 @@ -/* posix_fadvise64 is in posix_fadvise.c */ +/* Copyright (C) 2003-2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#undef strong_alias +#define strong_alias(a, b) + +#include + +#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) +_strong_alias (__posix_fadvise64_l64, __posix_fadvise64_l32); +compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); +versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); +#endif +_strong_alias (__posix_fadvise64_l64, posix_fadvise); diff --git a/sysdeps/unix/sysv/linux/posix_fadvise.c b/sysdeps/unix/sysv/linux/posix_fadvise.c index 093d707..869a642 100644 --- a/sysdeps/unix/sysv/linux/posix_fadvise.c +++ b/sysdeps/unix/sysv/linux/posix_fadvise.c @@ -22,27 +22,46 @@ /* Advice the system about the expected behaviour of the application with respect to the file associated with FD. */ +#ifndef __OFF_T_MATCHES_OFF64_T + +/* Both arm and powerpc implements fadvise64_64 with last 'advise' argument + just after 'fd' to avoid the requirement of implementing 7-arg syscalls. + ARM also defines __NR_fadvise64_64 as __NR_arm_fadvise64_64. + + tile requires __ASSUME_ALIGNED_REGISTER_PAIRS but implements the 32-bit + fadvise64_64 without the padding 0 after fd. + + s390 implements fadvice64_64 using a specific struct with arguments + packed inside. This is the only implementation handled in arch-specific + code. */ + int posix_fadvise (int fd, off_t offset, off_t len, int advise) { -#if defined(__NR_fadvise64) || defined(__NR_fadvise64_64) INTERNAL_SYSCALL_DECL (err); # ifdef __NR_fadvise64 - int ret = INTERNAL_SYSCALL (fadvise64, err, 5, fd, - __LONG_LONG_PAIR (offset >> 31, offset), len, - advise); + int ret = INTERNAL_SYSCALL_CALL (fadvise64, err, fd, + __ALIGNMENT_ARG SYSCALL_LL (offset), + len, advise); # else - int ret = INTERNAL_SYSCALL (fadvise64_64, err, 6, fd, - __LONG_LONG_PAIR ((long) (offset >> 31), - (long) offset), - __LONG_LONG_PAIR ((long) (len >> 31), - (long) len), - advise); +# ifdef __ASSUME_FADVISE64_64_6ARG + int ret = INTERNAL_SYSCALL_CALL (fadvise64_64, err, fd, advise, + __ALIGNMENT_ARG SYSCALL_LL (offset), + SYSCALL_LL (len)); +# else + +# ifdef __ASSUME_FADVISE64_64_NO_ALIGN +# undef __ALIGNMENT_ARG +# define __ALIGNMENT_ARG +# endif + + int ret = INTERNAL_SYSCALL_CALL (fadvise64_64, err, fd, + __ALIGNMENT_ARG SYSCALL_LL (offset), + SYSCALL_LL (len), advise); +# endif # endif if (INTERNAL_SYSCALL_ERROR_P (ret, err)) return INTERNAL_SYSCALL_ERRNO (ret, err); return 0; -#else - return ENOSYS; -#endif } +#endif /* __OFF_T_MATCHES_OFF64_T */ diff --git a/sysdeps/unix/sysv/linux/posix_fadvise64.c b/sysdeps/unix/sysv/linux/posix_fadvise64.c index 6d10558..b4adb5f 100644 --- a/sysdeps/unix/sysv/linux/posix_fadvise64.c +++ b/sysdeps/unix/sysv/linux/posix_fadvise64.c @@ -17,10 +17,29 @@ #include #include -#include +#include int __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise); -int __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise); + +/* Both arm and powerpc implements fadvise64_64 with last 'advise' argument + just after 'fd' to avoid the requirement of implementing 7-arg syscalls. + ARM also defines __NR_fadvise64_64 as __NR_arm_fadvise64_64. + + tile requires __ASSUME_ALIGNED_REGISTER_PAIRS but implements the 32-bit + fadvise64_64 without the padding 0 after fd. + + s390 implements fadvice64_64 using a specific struct with arguments + packed inside. This is the only implementation handled in arch-specific + code. */ + +#ifdef __ASSUME_FADVISE64_64_NO_ALIGN +# undef __ALIGNMENT_ARG +# define __ALIGNMENT_ARG +#endif + +#ifndef __NR_fadvise64_64 +# define __NR_fadvise64_64 __NR_fadvise64 +#endif /* Advice the system about the expected behaviour of the application with respect to the file associated with FD. */ @@ -29,20 +48,24 @@ int __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) { INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64_64, err, 6, fd, - __LONG_LONG_PAIR ((long) (offset >> 32), - (long) offset), - __LONG_LONG_PAIR ((long) (len >> 32), - (long) len), - advise); +#ifdef __ASSUME_FADVISE64_64_6ARG + int ret = INTERNAL_SYSCALL_CALL (fadvise64_64, err, fd, advise, + SYSCALL_LL64 (offset), SYSCALL_LL64 (len)); +#else + int ret = INTERNAL_SYSCALL_CALL (fadvise64_64, err, fd, + __ALIGNMENT_ARG SYSCALL_LL64 (offset), + SYSCALL_LL64 (len), advise); +#endif if (!INTERNAL_SYSCALL_ERROR_P (ret, err)) return 0; return INTERNAL_SYSCALL_ERRNO (ret, err); } -#include - -#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) +/* The type of the len argument was changed from size_t to off_t in + POSIX.1-2003 TC1. */ +#ifndef __OFF_T_MATCHES_OFF64_T +# if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) +int __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise); int attribute_compat_text_section @@ -53,6 +76,10 @@ __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise) versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); +# else +weak_alias (__posix_fadvise64_l64, posix_fadvise64); +# endif #else -strong_alias (__posix_fadvise64_l64, posix_fadvise64); +weak_alias (__posix_fadvise64_l64, posix_fadvise64); +strong_alias (__posix_fadvise64_l64, posix_fadvise); #endif diff --git a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h index 996535f..42a53f2 100644 --- a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h +++ b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h @@ -46,4 +46,9 @@ # define __ASSUME_ALIGNED_REGISTER_PAIRS 1 #endif +/* powerpc compat fadvise64_64 reorganize the syscall argument. */ +#ifndef __powerpc64__ +# define __ASSUME_FADVISE64_64_6ARG 1 +#endif + #include_next diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c deleted file mode 100644 index e846bf5..0000000 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright (C) 2003-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include -#include - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -posix_fadvise (int fd, off_t offset, off_t len, int advise) -{ -#ifdef __NR_fadvise64 - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64, err, 6, fd, 0, - __LONG_LONG_PAIR (offset >> 31, offset), len, - advise); - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) - return INTERNAL_SYSCALL_ERRNO (ret, err); - return 0; -#else - return ENOSYS; -#endif -} diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c deleted file mode 100644 index c26206f..0000000 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (C) 2003-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include -#include - -int __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise); -int __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise); - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -__posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) -{ - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64_64, err, 6, fd, advise, - __LONG_LONG_PAIR ((long)(offset >> 32), (long)offset), - __LONG_LONG_PAIR ((long)(len >> 32), (long)len)); - if (!INTERNAL_SYSCALL_ERROR_P (ret, err)) - return 0; - return INTERNAL_SYSCALL_ERRNO (ret, err); -} - -#include - -#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) - -int -attribute_compat_text_section -__posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise) -{ - return __posix_fadvise64_l64 (fd, offset, len, advise); -} - -versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); -compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); -#else -strong_alias (__posix_fadvise64_l64, posix_fadvise64); -#endif diff --git a/sysdeps/unix/sysv/linux/tile/kernel-features.h b/sysdeps/unix/sysv/linux/tile/kernel-features.h index 9425e1c..ded0e43 100644 --- a/sysdeps/unix/sysv/linux/tile/kernel-features.h +++ b/sysdeps/unix/sysv/linux/tile/kernel-features.h @@ -23,4 +23,5 @@ pairs to start with an even-number register. */ #ifndef _LP64 # define __ASSUME_ALIGNED_REGISTER_PAIRS 1 +# define __ASSUME_FADVISE64_64_NO_ALIGN 1 #endif diff --git a/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c b/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c deleted file mode 100644 index 137b591..0000000 --- a/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 2003-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#define posix_fadvise64 __no_posix_fadvise64 -#include -#include -#include -#undef posix_fadvise64 - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -posix_fadvise (int fd, off_t offset, off_t len, int advise) -{ -#ifdef __NR_fadvise64 - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64, err, 4, fd, offset, len, advise); - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) - return INTERNAL_SYSCALL_ERRNO (ret, err); - return 0; -#else - return ENOSYS; -#endif -} -weak_alias (posix_fadvise, posix_fadvise64) diff --git a/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c b/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c deleted file mode 100644 index c9f72c4..0000000 --- a/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c +++ /dev/null @@ -1 +0,0 @@ -/* posix_fadvise64 is in posix_fadvise.c */