Message ID | 1474383714-15187-5-git-send-email-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
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.
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.
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. >
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 --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. */