diff mbox

[4/4] Consolidate Linux truncate implementations

Message ID 1474383714-15187-5-git-send-email-adhemerval.zanella@linaro.org
State New
Headers show

Commit Message

Adhemerval Zanella Sept. 20, 2016, 3:01 p.m. UTC
Changes from previous version:

  - Using __NR_truncate64 for truncate in case of __NR_truncate is
    not defined.  This will still use 32-bit off_t offsets (similar to
    pread).

--

This patch consolidates all Linux truncate implementation on
sysdeps/unix/sysv/linux/truncate{64}.c.  It is based on
{INTERNAL,INLINE}_SYSCALL patch [1] to simplify the syscall
construction.

General idea is to build ftruncate iff __OFF_T_MATCHES_OFF64_T is not
defined, otherwise ftruncate64 will be build and ftruncate will be an
alias.  The fallocate will use old compat syscall and pass 32-bit off_t
argument, while fallocate64 will handle the correct off64_t passing using
__ALIGNMENT_ARG and SYSCALL_LL64 macros.

Tested on x86_64, i386, aarch64, and armhf.

	* sysdeps/unix/sysv/linux/arm/truncate64.c: Remove file.
	* sysdeps/unix/sysv/linux/generic/wordsize-32/truncate.c: Likewise.
	* sysdeps/sysv/linux/generic/wordsize-32/truncate64.c: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips32/truncate64.c: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/truncate64.c: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/truncate64.c: Likewise.
	* sysdeps/unix/sysv/linux/wordsize-64/truncate64.c: Likewise.
	* sysdeps/unix/sysv/linux/truncate.c: New file.
	* sysdeps/unix/sysv/linux/truncate64.c (truncate64): Use
	INLINE_SYSCALL_CALL, __ALIGNMENT_ARG and SYSCALL_LL64 macros.

[1] https://sourceware.org/ml/libc-alpha/2016-08/msg00646.html
---
 sysdeps/unix/sysv/linux/arm/truncate64.c           | 35 ----------------------
 .../unix/sysv/linux/generic/wordsize-32/truncate.c | 31 -------------------
 .../sysv/linux/generic/wordsize-32/truncate64.c    | 31 -------------------
 sysdeps/unix/sysv/linux/mips/mips32/truncate64.c   | 35 ----------------------
 sysdeps/unix/sysv/linux/mips/mips64/truncate64.c   |  1 -
 .../unix/sysv/linux/powerpc/powerpc32/truncate64.c | 34 ---------------------
 sysdeps/unix/sysv/linux/truncate.c                 | 35 ++++++++++++++++++++++
 sysdeps/unix/sysv/linux/truncate64.c               | 26 ++++++++--------
 sysdeps/unix/sysv/linux/wordsize-64/truncate64.c   |  1 -
 9 files changed, 49 insertions(+), 180 deletions(-)
 delete mode 100644 sysdeps/unix/sysv/linux/arm/truncate64.c
 delete mode 100644 sysdeps/unix/sysv/linux/generic/wordsize-32/truncate.c
 delete mode 100644 sysdeps/unix/sysv/linux/generic/wordsize-32/truncate64.c
 delete mode 100644 sysdeps/unix/sysv/linux/mips/mips32/truncate64.c
 delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/truncate64.c
 delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/truncate64.c
 create mode 100644 sysdeps/unix/sysv/linux/truncate.c
 delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/truncate64.c

-- 
2.7.4

Comments

Adhemerval Zanella Sept. 22, 2016, 2:42 p.m. UTC | #1
On 22/09/2016 11:24, Yury Norov wrote:
>> +/* Truncate PATH to LENGTH bytes.  */

>>  int

>> -truncate64 (const char *path, off64_t length)

>> +__truncate64 (const char *path, off64_t length)

>>  {

>> -  unsigned int low = length & 0xffffffff;

>> -  unsigned int high = length >> 32;

>> -  int result = INLINE_SYSCALL (truncate64, 3, path,

>> -			       __LONG_LONG_PAIR (high, low));

>> -  return result;

>> +  return INLINE_SYSCALL_CALL (truncate64, path,

>> +			      __ALIGNMENT_ARG SYSCALL_LL64 (length));

>>  }

>> +weak_alias (__truncate64, truncate64)

>> +

>> +#ifdef __OFF_T_MATCHES_OFF64_T

>> +weak_alias (__truncate64, truncate);

>> +#endif

> 

> It seems you forgot weak_alias (__truncate64, __truncate);

> 


I do not think it requires to add __truncate alias since glibc currently
does have internal calls to truncate.
Adhemerval Zanella Sept. 22, 2016, 7:04 p.m. UTC | #2
On 22/09/2016 12:51, Yury Norov wrote:
> On Thu, Sep 22, 2016 at 11:42:11AM -0300, Adhemerval Zanella wrote:

>>

>>

>> On 22/09/2016 11:24, Yury Norov wrote:

>>>> +/* Truncate PATH to LENGTH bytes.  */

>>>>  int

>>>> -truncate64 (const char *path, off64_t length)

>>>> +__truncate64 (const char *path, off64_t length)

>>>>  {

>>>> -  unsigned int low = length & 0xffffffff;

>>>> -  unsigned int high = length >> 32;

>>>> -  int result = INLINE_SYSCALL (truncate64, 3, path,

>>>> -			       __LONG_LONG_PAIR (high, low));

>>>> -  return result;

>>>> +  return INLINE_SYSCALL_CALL (truncate64, path,

>>>> +			      __ALIGNMENT_ARG SYSCALL_LL64 (length));

>>>>  }

>>>> +weak_alias (__truncate64, truncate64)

>>>> +

>>>> +#ifdef __OFF_T_MATCHES_OFF64_T

>>>> +weak_alias (__truncate64, truncate);

>>>> +#endif

>>>

>>> It seems you forgot weak_alias (__truncate64, __truncate);

>>>

>>

>> I do not think it requires to add __truncate alias since glibc currently

>> does have internal calls to truncate.

> 

> Sorry, I was meaning __ftruncate: 

> /home/yury/work/toolchain/build-glibc-aarch64-thunderx-linux-gnu-mabi-ilp32/libc_pic.os:

> In function `internal_fallocate':

> /home/yury/work/toolchain/gits/glibc/io/../sysdeps/posix/posix_fallocate.c:64:

> undefined reference to `__ftruncate'

> 

> Truncate looks correct.

> The fix is like this to me:

> 

> --

> diff --git a/sysdeps/unix/sysv/linux/ftruncate64.c b/sysdeps/unix/sysv/linux/ftruncate64.c

> index 914ce67..4a00db5 100644

> --- a/sysdeps/unix/sysv/linux/ftruncate64.c

> +++ b/sysdeps/unix/sysv/linux/ftruncate64.c

> @@ -33,5 +33,6 @@ __ftruncate64 (int fd, off64_t length)

>  weak_alias (__ftruncate64, ftruncate64)

> 

>  #ifdef __OFF_T_MATCHES_OFF64_T

> +weak_alias (__ftruncate64, __ftruncate)

>  weak_alias (__ftruncate64, ftruncate);

>  #endif

> 


Ah right, the fallback posix_fallocate implementation. I will add this to
the patch, thanks.
Adhemerval Zanella Oct. 25, 2016, 5:54 p.m. UTC | #3
Ping.

On 22/09/2016 16:04, Adhemerval Zanella wrote:
> 

> 

> On 22/09/2016 12:51, Yury Norov wrote:

>> On Thu, Sep 22, 2016 at 11:42:11AM -0300, Adhemerval Zanella wrote:

>>>

>>>

>>> On 22/09/2016 11:24, Yury Norov wrote:

>>>>> +/* Truncate PATH to LENGTH bytes.  */

>>>>>  int

>>>>> -truncate64 (const char *path, off64_t length)

>>>>> +__truncate64 (const char *path, off64_t length)

>>>>>  {

>>>>> -  unsigned int low = length & 0xffffffff;

>>>>> -  unsigned int high = length >> 32;

>>>>> -  int result = INLINE_SYSCALL (truncate64, 3, path,

>>>>> -			       __LONG_LONG_PAIR (high, low));

>>>>> -  return result;

>>>>> +  return INLINE_SYSCALL_CALL (truncate64, path,

>>>>> +			      __ALIGNMENT_ARG SYSCALL_LL64 (length));

>>>>>  }

>>>>> +weak_alias (__truncate64, truncate64)

>>>>> +

>>>>> +#ifdef __OFF_T_MATCHES_OFF64_T

>>>>> +weak_alias (__truncate64, truncate);

>>>>> +#endif

>>>>

>>>> It seems you forgot weak_alias (__truncate64, __truncate);

>>>>

>>>

>>> I do not think it requires to add __truncate alias since glibc currently

>>> does have internal calls to truncate.

>>

>> Sorry, I was meaning __ftruncate: 

>> /home/yury/work/toolchain/build-glibc-aarch64-thunderx-linux-gnu-mabi-ilp32/libc_pic.os:

>> In function `internal_fallocate':

>> /home/yury/work/toolchain/gits/glibc/io/../sysdeps/posix/posix_fallocate.c:64:

>> undefined reference to `__ftruncate'

>>

>> Truncate looks correct.

>> The fix is like this to me:

>>

>> --

>> diff --git a/sysdeps/unix/sysv/linux/ftruncate64.c b/sysdeps/unix/sysv/linux/ftruncate64.c

>> index 914ce67..4a00db5 100644

>> --- a/sysdeps/unix/sysv/linux/ftruncate64.c

>> +++ b/sysdeps/unix/sysv/linux/ftruncate64.c

>> @@ -33,5 +33,6 @@ __ftruncate64 (int fd, off64_t length)

>>  weak_alias (__ftruncate64, ftruncate64)

>>

>>  #ifdef __OFF_T_MATCHES_OFF64_T

>> +weak_alias (__ftruncate64, __ftruncate)

>>  weak_alias (__ftruncate64, ftruncate);

>>  #endif

>>

> 

> Ah right, the fallback posix_fallocate implementation. I will add this to

> the patch, thanks.

>
Adhemerval Zanella Nov. 9, 2016, 1:44 p.m. UTC | #4
Does anyone have any objection with this patch? If no one opposes I 
would like to push it to avoid get in late near freeze.

On 25/10/2016 15:54, Adhemerval Zanella wrote:
> Ping.

> 

> On 22/09/2016 16:04, Adhemerval Zanella wrote:

>>

>>

>> On 22/09/2016 12:51, Yury Norov wrote:

>>> On Thu, Sep 22, 2016 at 11:42:11AM -0300, Adhemerval Zanella wrote:

>>>>

>>>>

>>>> On 22/09/2016 11:24, Yury Norov wrote:

>>>>>> +/* Truncate PATH to LENGTH bytes.  */

>>>>>>  int

>>>>>> -truncate64 (const char *path, off64_t length)

>>>>>> +__truncate64 (const char *path, off64_t length)

>>>>>>  {

>>>>>> -  unsigned int low = length & 0xffffffff;

>>>>>> -  unsigned int high = length >> 32;

>>>>>> -  int result = INLINE_SYSCALL (truncate64, 3, path,

>>>>>> -			       __LONG_LONG_PAIR (high, low));

>>>>>> -  return result;

>>>>>> +  return INLINE_SYSCALL_CALL (truncate64, path,

>>>>>> +			      __ALIGNMENT_ARG SYSCALL_LL64 (length));

>>>>>>  }

>>>>>> +weak_alias (__truncate64, truncate64)

>>>>>> +

>>>>>> +#ifdef __OFF_T_MATCHES_OFF64_T

>>>>>> +weak_alias (__truncate64, truncate);

>>>>>> +#endif

>>>>>

>>>>> It seems you forgot weak_alias (__truncate64, __truncate);

>>>>>

>>>>

>>>> I do not think it requires to add __truncate alias since glibc currently

>>>> does have internal calls to truncate.

>>>

>>> Sorry, I was meaning __ftruncate: 

>>> /home/yury/work/toolchain/build-glibc-aarch64-thunderx-linux-gnu-mabi-ilp32/libc_pic.os:

>>> In function `internal_fallocate':

>>> /home/yury/work/toolchain/gits/glibc/io/../sysdeps/posix/posix_fallocate.c:64:

>>> undefined reference to `__ftruncate'

>>>

>>> Truncate looks correct.

>>> The fix is like this to me:

>>>

>>> --

>>> diff --git a/sysdeps/unix/sysv/linux/ftruncate64.c b/sysdeps/unix/sysv/linux/ftruncate64.c

>>> index 914ce67..4a00db5 100644

>>> --- a/sysdeps/unix/sysv/linux/ftruncate64.c

>>> +++ b/sysdeps/unix/sysv/linux/ftruncate64.c

>>> @@ -33,5 +33,6 @@ __ftruncate64 (int fd, off64_t length)

>>>  weak_alias (__ftruncate64, ftruncate64)

>>>

>>>  #ifdef __OFF_T_MATCHES_OFF64_T

>>> +weak_alias (__ftruncate64, __ftruncate)

>>>  weak_alias (__ftruncate64, ftruncate);

>>>  #endif

>>>

>>

>> Ah right, the fallback posix_fallocate implementation. I will add this to

>> the patch, thanks.

>>
diff mbox

Patch

diff --git a/sysdeps/unix/sysv/linux/arm/truncate64.c b/sysdeps/unix/sysv/linux/arm/truncate64.c
deleted file mode 100644
index 28563af..0000000
--- a/sysdeps/unix/sysv/linux/arm/truncate64.c
+++ /dev/null
@@ -1,35 +0,0 @@ 
-/* Copyright (C) 1997-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
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sys/types.h>
-#include <endian.h>
-#include <errno.h>
-#include <unistd.h>
-
-#include <sysdep.h>
-#include <sys/syscall.h>
-
-/* Truncate the file FD refers to to LENGTH bytes.  */
-int
-truncate64 (const char *path, off64_t length)
-{
-  unsigned int low = length & 0xffffffff;
-  unsigned int high = length >> 32;
-  int result = INLINE_SYSCALL (truncate64, 4, path, 0,
-			       __LONG_LONG_PAIR (high, low));
-  return result;
-}
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/truncate.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/truncate.c
deleted file mode 100644
index 2579951..0000000
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/truncate.c
+++ /dev/null
@@ -1,31 +0,0 @@ 
-/* Copyright (C) 2011-2016 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Chris Metcalf <cmetcalf@tilera.com>, 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
-   <http://www.gnu.org/licenses/>.  */
-
-#include <errno.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-/* Truncate PATH to LENGTH bytes.  */
-int
-__truncate (const char *path, off_t length)
-{
-  return INLINE_SYSCALL (truncate64, __ALIGNMENT_COUNT (3, 4), path,
-                         __ALIGNMENT_ARG
-                         __LONG_LONG_PAIR (length >> 31, length));
-}
-weak_alias (__truncate, truncate)
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/truncate64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/truncate64.c
deleted file mode 100644
index f2927ea..0000000
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/truncate64.c
+++ /dev/null
@@ -1,31 +0,0 @@ 
-/* Copyright (C) 2011-2016 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Chris Metcalf <cmetcalf@tilera.com>, 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
-   <http://www.gnu.org/licenses/>.  */
-
-#include <errno.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-/* Truncate the file PATH to LENGTH bytes.  */
-int
-truncate64 (const char *path, off64_t length)
-{
-  unsigned int low = length & 0xffffffff;
-  unsigned int high = length >> 32;
-  return INLINE_SYSCALL (truncate64, __ALIGNMENT_COUNT (3, 4), path,
-                         __ALIGNMENT_ARG __LONG_LONG_PAIR (high, low));
-}
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/truncate64.c b/sysdeps/unix/sysv/linux/mips/mips32/truncate64.c
deleted file mode 100644
index 28563af..0000000
--- a/sysdeps/unix/sysv/linux/mips/mips32/truncate64.c
+++ /dev/null
@@ -1,35 +0,0 @@ 
-/* Copyright (C) 1997-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
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sys/types.h>
-#include <endian.h>
-#include <errno.h>
-#include <unistd.h>
-
-#include <sysdep.h>
-#include <sys/syscall.h>
-
-/* Truncate the file FD refers to to LENGTH bytes.  */
-int
-truncate64 (const char *path, off64_t length)
-{
-  unsigned int low = length & 0xffffffff;
-  unsigned int high = length >> 32;
-  int result = INLINE_SYSCALL (truncate64, 4, path, 0,
-			       __LONG_LONG_PAIR (high, low));
-  return result;
-}
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/truncate64.c b/sysdeps/unix/sysv/linux/mips/mips64/truncate64.c
deleted file mode 100644
index 6e25b02..0000000
--- a/sysdeps/unix/sysv/linux/mips/mips64/truncate64.c
+++ /dev/null
@@ -1 +0,0 @@ 
-/* Empty.  */
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/truncate64.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/truncate64.c
deleted file mode 100644
index ccfdafa..0000000
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/truncate64.c
+++ /dev/null
@@ -1,34 +0,0 @@ 
-/* Copyright (C) 1997-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
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sys/types.h>
-#include <errno.h>
-#include <unistd.h>
-
-#include <sysdep.h>
-#include <sys/syscall.h>
-
-/* Truncate the file referenced by FD to LENGTH bytes.  */
-int
-truncate64 (const char *path, off64_t length)
-{
-  /* On PPC32 64bit values are aligned in odd/even register pairs.  */
-  int result = INLINE_SYSCALL (truncate64, 4, path, 0,
-			       (long) (length >> 32),
-			       (long) length);
-  return result;
-}
diff --git a/sysdeps/unix/sysv/linux/truncate.c b/sysdeps/unix/sysv/linux/truncate.c
new file mode 100644
index 0000000..9e71288
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/truncate.c
@@ -0,0 +1,35 @@ 
+/* 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
+   <http://www.gnu.org/licenses/>.  */
+
+#include <unistd.h>
+#include <sysdep.h>
+#include <errno.h>
+
+#ifndef __OFF_T_MATCHES_OFF64_T
+/* Truncate PATH to LENGTH bytes.  */
+int
+__truncate (const char *path, off_t length)
+{
+# ifndef __NR_truncate
+  return INLINE_SYSCALL_CALL (truncate64, path,
+			      __ALIGNMENT_ARG SYSCALL_LL (length));
+# else
+  return INLINE_SYSCALL_CALL (truncate, path, length);
+# endif
+}
+weak_alias (__truncate, truncate)
+#endif
diff --git a/sysdeps/unix/sysv/linux/truncate64.c b/sysdeps/unix/sysv/linux/truncate64.c
index 92a6bc4..0d70da7 100644
--- a/sysdeps/unix/sysv/linux/truncate64.c
+++ b/sysdeps/unix/sysv/linux/truncate64.c
@@ -15,21 +15,23 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <sys/types.h>
-#include <endian.h>
-#include <errno.h>
 #include <unistd.h>
-
 #include <sysdep.h>
-#include <sys/syscall.h>
+#include <errno.h>
 
-/* Truncate the file referenced by FD to LENGTH bytes.  */
+#ifndef __NR_truncate64
+# define __NR_truncate64 __NR_truncate
+#endif
+
+/* Truncate PATH to LENGTH bytes.  */
 int
-truncate64 (const char *path, off64_t length)
+__truncate64 (const char *path, off64_t length)
 {
-  unsigned int low = length & 0xffffffff;
-  unsigned int high = length >> 32;
-  int result = INLINE_SYSCALL (truncate64, 3, path,
-			       __LONG_LONG_PAIR (high, low));
-  return result;
+  return INLINE_SYSCALL_CALL (truncate64, path,
+			      __ALIGNMENT_ARG SYSCALL_LL64 (length));
 }
+weak_alias (__truncate64, truncate64)
+
+#ifdef __OFF_T_MATCHES_OFF64_T
+weak_alias (__truncate64, truncate);
+#endif
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/truncate64.c b/sysdeps/unix/sysv/linux/wordsize-64/truncate64.c
deleted file mode 100644
index 8999768..0000000
--- a/sysdeps/unix/sysv/linux/wordsize-64/truncate64.c
+++ /dev/null
@@ -1 +0,0 @@ 
-/* truncate64 is the same as truncate. */