From patchwork Fri Aug 19 14:41:48 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: 14784 Received: (qmail 12887 invoked by alias); 19 Aug 2016 14:42:12 -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 12763 invoked by uid 89); 19 Aug 2016 14:42:11 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=2007-2016, 20072016, 1, 44, 1, 37 X-HELO: mail-yb0-f169.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:subject:date:message-id:in-reply-to :references; bh=udziRXEBsuv9cRcPREdgcaTU6DTPrxyZnCGEAfz8WXo=; b=C31kjohrMQcZlghozazkGj2AEH+YxuFQ/7ZLAPSnYrcuDU45hpalDlx6/ZkRN1ivV3 dIbWyVN71jMg5MdGfPECH8WxDwaumRepjmzi8yz+vfCVRoGWnd5P4XJA9T9JhimThqd1 +r8gcV3z6IIkR1bQiOCuj+jmU9UUcY8AxeUFrzKmmBCfwCbGh67GTsVAcqWNnkFA+3I/ pcd26PonvoybFDWm1Jnk0AbJ+vz82bPbskqfhbgupZiKDsz8E1ZaCuHwuAB+H3Gf/RfV Cq3v7qvZz2pBDWNu/5gmirglUzE2+PFfbLVcKVzo/5BSaBardG9jrF+tycb1PTty5/z6 iN3Q== X-Gm-Message-State: AEkoouufSO7e2CKYPTxbiIRjQxvf7Xf9Kq/a/J9om3dZeFiJjLEzFJYho72y98UMjjARNGdC X-Received: by 10.37.211.131 with SMTP id e125mr6296296ybf.62.1471617721212; Fri, 19 Aug 2016 07:42:01 -0700 (PDT) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 3/4] Consolidate posix_fallocate{64} implementations Date: Fri, 19 Aug 2016 11:41:48 -0300 Message-Id: <1471617709-16267-4-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1471617709-16267-1-git-send-email-adhemerval.zanella@linaro.org> References: <1471617709-16267-1-git-send-email-adhemerval.zanella@linaro.org> This patch consolidates all the posix_fallocate{64} implementation for Linux in only one (sysdeps/unix/sysv/linux/posix_fallocate{64}.c). It also removes the syscall from the auto-generation using assembly macros. The macro SYSCALL_LL{64} is used to handle the offset argument along with the new INTERNAL_SYSCALL_CALL macro to define correct argument count for internal INTERNAL_SYSCALL call. Tested on x86_64, i686, x32, aarch64, ppc64le, and armhf. * sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate.c: Remove file. * sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate64.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate64.c: Likewise. * sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate.c: Likewise. * sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate64.c: Likewise. * sysdeps/unix/sysv/linux/posix_fallocate.c (posix_fallocate): Use SYSCALL_LL to pass both offset and len arguments. * sysdeps/unix/sysv/linux/posix_fallocate64.c (posix_fallocate64): Likewise. --- io/Makefile | 2 +- io/tst-posix_fallocate-common.c | 92 ++++++++++++++++++ io/tst-posix_fallocate.c | 107 ++++----------------- io/tst-posix_fallocate64.c | 44 +++++++++ .../sysv/linux/mips/mips64/n32/posix_fallocate.c | 37 ------- .../sysv/linux/mips/mips64/n32/posix_fallocate64.c | 38 -------- .../sysv/linux/mips/mips64/n64/posix_fallocate.c | 1 - .../sysv/linux/mips/mips64/n64/posix_fallocate64.c | 1 - sysdeps/unix/sysv/linux/posix_fallocate.c | 6 +- sysdeps/unix/sysv/linux/posix_fallocate64.c | 8 +- .../unix/sysv/linux/wordsize-64/posix_fallocate.c | 46 --------- .../sysv/linux/wordsize-64/posix_fallocate64.c | 1 - 13 files changed, 180 insertions(+), 222 deletions(-) create mode 100644 io/tst-posix_fallocate-common.c create mode 100644 io/tst-posix_fallocate64.c delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate.c delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate64.c delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate.c delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate64.c delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate.c delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate64.c diff --git a/io/Makefile b/io/Makefile index deb6100..20fe3de 100644 --- a/io/Makefile +++ b/io/Makefile @@ -71,7 +71,7 @@ tests := test-utime test-stat test-stat2 test-lfs tst-getcwd \ tst-renameat tst-fchownat tst-fchmodat tst-faccessat \ tst-symlinkat tst-linkat tst-readlinkat tst-mkdirat \ tst-mknodat tst-mkfifoat tst-ttyname_r bug-ftw5 \ - tst-posix_fallocate tst-fts tst-fts-lfs + tst-posix_fallocate tst-posix_fallocate64 tst-fts tst-fts-lfs ifeq ($(run-built-tests),yes) tests-special += $(objpfx)ftwtest.out diff --git a/io/tst-posix_fallocate-common.c b/io/tst-posix_fallocate-common.c new file mode 100644 index 0000000..42d6ec6 --- /dev/null +++ b/io/tst-posix_fallocate-common.c @@ -0,0 +1,92 @@ +/* Common posix_fallocate 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 () + +#define TIMEOUT 20 /* sec. */ + +#include + +static char *temp_filename; +static int temp_fd; + +static void +do_prepare (void) +{ + temp_fd = create_temp_file ("tst-posix_fallocate.", &temp_filename); + if (temp_fd == -1) + { + printf ("cannot create temporary file: %m\n"); + exit (1); + } +} + +#define FAIL(str) \ + do { printf ("error: %s (line %d)\n", str, __LINE__); return 1; } while (0) + +static int +do_test_with_offset (off_t offset) +{ + struct stat st; + + if (posix_fallocate (temp_fd, offset, 768) != 0) + FAIL ("1st posix_fallocate call failed"); + + if (fstat (temp_fd, &st) != 0) + FAIL ("2nd fstat failed"); + + if (st.st_size != (offset + 768)) + { + printf ("file size after first posix_fallocate call is %llu, expected %u\n", + (unsigned long long int) st.st_size, 512u + 768u); + return 1; + } + + if (posix_fallocate (temp_fd, 0, 1024) != 0) + FAIL ("2nd posix_fallocate call failed"); + + if (fstat (temp_fd, &st) != 0) + FAIL ("3rd fstat failed"); + + if (st.st_size != (offset) + 768) + FAIL ("file size changed in second posix_fallocate"); + + offset += 2048; + if (posix_fallocate (temp_fd, offset, 64) != 0) + FAIL ("3rd posix_fallocate call failed"); + + if (fstat (temp_fd, &st) != 0) + FAIL ("4th fstat failed"); + + if (st.st_size != (offset + 64)) + { + printf ("file size after first posix_fallocate call is %llu, expected %u\n", + (unsigned long long int) st.st_size, 2048u + 64u); + return 1; + } + + return 0; +} diff --git a/io/tst-posix_fallocate.c b/io/tst-posix_fallocate.c index 53f0704..59f3fa1 100644 --- a/io/tst-posix_fallocate.c +++ b/io/tst-posix_fallocate.c @@ -1,100 +1,33 @@ -#include -#include +/* Basic posix_fallocate tests. + Copyright (C) 2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. -static void do_prepare (void); -#define PREPARE(argc, argv) do_prepare () -static int do_test (void); -#define TEST_FUNCTION do_test () -#include + 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. -static int fd; + 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. -static void -do_prepare (void) -{ - fd = create_temp_file ("tst-posix_fallocate.", NULL); - if (fd == -1) - { - printf ("cannot create temporary file: %m\n"); - exit (1); - } -} + 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_fallocate-common.c" static int do_test (void) { - struct stat64 st; + struct stat st; - if (fstat64 (fd, &st) != 0) - { - puts ("1st fstat failed"); - return 1; - } + if (fstat (temp_fd, &st) != 0) + FAIL ("1st fstat failed"); if (st.st_size != 0) - { - puts ("file not created with size 0"); - return 1; - } - - if (posix_fallocate (fd, 512, 768) != 0) - { - puts ("1st posix_fallocate call failed"); - return 1; - } - - if (fstat64 (fd, &st) != 0) - { - puts ("2nd fstat failed"); - return 1; - } - - if (st.st_size != 512 + 768) - { - printf ("file size after first posix_fallocate call is %llu, expected %u\n", - (unsigned long long int) st.st_size, 512u + 768u); - return 1; - } - - if (posix_fallocate (fd, 0, 1024) != 0) - { - puts ("2nd posix_fallocate call failed"); - return 1; - } - - if (fstat64 (fd, &st) != 0) - { - puts ("3rd fstat failed"); - return 1; - } - - if (st.st_size != 512 + 768) - { - puts ("file size changed in second posix_fallocate"); - return 1; - } - - if (posix_fallocate (fd, 2048, 64) != 0) - { - puts ("3rd posix_fallocate call failed"); - return 1; - } - - if (fstat64 (fd, &st) != 0) - { - puts ("4th fstat failed"); - return 1; - } - - if (st.st_size != 2048 + 64) - { - printf ("file size after first posix_fallocate call is %llu, expected %u\n", - (unsigned long long int) st.st_size, 2048u + 64u); - return 1; - } - - close (fd); + FAIL ("file not created with size 0"); - return 0; + return do_test_with_offset (512); } diff --git a/io/tst-posix_fallocate64.c b/io/tst-posix_fallocate64.c new file mode 100644 index 0000000..cbb57ff --- /dev/null +++ b/io/tst-posix_fallocate64.c @@ -0,0 +1,44 @@ +/* Basic posix_fallocate tests (with _FILE_OFFSET_BITS). + 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_fallocate-common.c" + +static int +do_test (void) +{ + struct stat st; + int ret; + + if (fstat (temp_fd, &st) != 0) + FAIL ("1st fstat failed"); + + if (st.st_size != 0) + FAIL ("file not created with size 0"); + + ret = do_test_with_offset (512); + if (ret == -1) + return -1; + + off_t base_offset = UINT32_MAX + 512LL; + ret = do_test_with_offset (base_offset); + if (ret == -1) + return 1; + + return 0; +} diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate.c deleted file mode 100644 index e652e5b..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate.c +++ /dev/null @@ -1,37 +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 - -#define posix_fallocate static internal_fallocate -#include -#undef posix_fallocate - -/* Reserve storage for the data of the file associated with FD. */ -int -posix_fallocate (int fd, __off_t offset, __off_t len) -{ - INTERNAL_SYSCALL_DECL (err); - int res = INTERNAL_SYSCALL (fallocate, err, 4, fd, 0, offset, len); - - if (! INTERNAL_SYSCALL_ERROR_P (res, err)) - return 0; - if (INTERNAL_SYSCALL_ERRNO (res, err) != EOPNOTSUPP) - return INTERNAL_SYSCALL_ERRNO (res, err); - return internal_fallocate (fd, offset, len); -} diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate64.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate64.c deleted file mode 100644 index d5659e0..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate64.c +++ /dev/null @@ -1,38 +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 - -extern int __posix_fallocate64_l64 (int fd, __off64_t offset, __off64_t len); -#define __posix_fallocate64_l64 static internal_fallocate64 -#include -#undef __posix_fallocate64_l64 - -/* Reserve storage for the data of the file associated with FD. */ -int -__posix_fallocate64_l64 (int fd, __off64_t offset, __off64_t len) -{ - INTERNAL_SYSCALL_DECL (err); - int res = INTERNAL_SYSCALL (fallocate, err, 4, fd, 0, offset, len); - - if (! INTERNAL_SYSCALL_ERROR_P (res, err)) - return 0; - if (INTERNAL_SYSCALL_ERRNO (res, err) != EOPNOTSUPP) - return INTERNAL_SYSCALL_ERRNO (res, err); - return internal_fallocate64 (fd, offset, len); -} diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate.c deleted file mode 100644 index b3fe81b..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate64.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate64.c deleted file mode 100644 index f466f13..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate64.c +++ /dev/null @@ -1 +0,0 @@ -/* posix_fallocate64 is in posix_fallocate.c */ diff --git a/sysdeps/unix/sysv/linux/posix_fallocate.c b/sysdeps/unix/sysv/linux/posix_fallocate.c index fc9ac37..139cb56 100644 --- a/sysdeps/unix/sysv/linux/posix_fallocate.c +++ b/sysdeps/unix/sysv/linux/posix_fallocate.c @@ -27,10 +27,8 @@ int posix_fallocate (int fd, __off_t offset, __off_t len) { INTERNAL_SYSCALL_DECL (err); - int res = INTERNAL_SYSCALL (fallocate, err, 6, fd, 0, - __LONG_LONG_PAIR (offset >> 31, offset), - __LONG_LONG_PAIR (len >> 31, len)); - + int res = INTERNAL_SYSCALL_CALL (fallocate, err, fd, 0, + SYSCALL_LL (offset), SYSCALL_LL (len)); if (! INTERNAL_SYSCALL_ERROR_P (res, err)) return 0; if (INTERNAL_SYSCALL_ERRNO (res, err) != EOPNOTSUPP) diff --git a/sysdeps/unix/sysv/linux/posix_fallocate64.c b/sysdeps/unix/sysv/linux/posix_fallocate64.c index 4a0a722..8a870cb 100644 --- a/sysdeps/unix/sysv/linux/posix_fallocate64.c +++ b/sysdeps/unix/sysv/linux/posix_fallocate64.c @@ -28,12 +28,8 @@ int __posix_fallocate64_l64 (int fd, __off64_t offset, __off64_t len) { INTERNAL_SYSCALL_DECL (err); - int res = INTERNAL_SYSCALL (fallocate, err, 6, fd, 0, - __LONG_LONG_PAIR ((long int) (offset >> 32), - (long int) offset), - __LONG_LONG_PAIR ((long int) (len >> 32), - (long int) len)); - + int res = INTERNAL_SYSCALL_CALL (fallocate, err, fd, 0, + SYSCALL_LL64 (offset), SYSCALL_LL64 (len)); if (! INTERNAL_SYSCALL_ERROR_P (res, err)) return 0; if (INTERNAL_SYSCALL_ERRNO (res, err) != EOPNOTSUPP) diff --git a/sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate.c b/sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate.c deleted file mode 100644 index 8caee31..0000000 --- a/sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate.c +++ /dev/null @@ -1,46 +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 - -#define posix_fallocate static internal_fallocate -#include -#undef posix_fallocate - -/* Reserve storage for the data of the file associated with FD. */ -int -posix_fallocate (int fd, __off_t offset, __off_t len) -{ - INTERNAL_SYSCALL_DECL (err); -#ifdef INTERNAL_SYSCALL_TYPES - int res = INTERNAL_SYSCALL_TYPES (fallocate, err, 4, int, fd, - int, 0, off_t, offset, - off_t, len); -#else - int res = INTERNAL_SYSCALL (fallocate, err, 4, fd, 0, offset, len); -#endif - - if (! INTERNAL_SYSCALL_ERROR_P (res, err)) - return 0; - - if (INTERNAL_SYSCALL_ERRNO (res, err) != EOPNOTSUPP) - return INTERNAL_SYSCALL_ERRNO (res, err); - - return internal_fallocate (fd, offset, len); -} -weak_alias (posix_fallocate, posix_fallocate64) diff --git a/sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate64.c b/sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate64.c deleted file mode 100644 index f466f13..0000000 --- a/sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate64.c +++ /dev/null @@ -1 +0,0 @@ -/* posix_fallocate64 is in posix_fallocate.c */