Re: [PATCH 0.9.33 0/7] Backport pread/pwrite fixes from master

2012-08-29 Thread Rich Felker
On Wed, Aug 29, 2012 at 04:50:37PM +0200, Natanael Copa wrote:
> On Wed, Aug 29, 2012 at 2:42 PM, Johannes Stezenbach  wrote:
> > Hi Natanael,
> >
> > On Wed, Aug 29, 2012 at 09:18:57AM +, Natanael Copa wrote:
> >> I previously sent a bug report for pread/pwrite with a link to a
> >> patch that i hacked up quick and dirty. This showed up to be severly
> >> broken on x86_64 and corrupted several qemu disks images for me.
> >>
> >> I see that this bad patch made it into 0.9.33 stabel tree. I think it
> >> should be reverted and instead use cherry-picks from master. This is
> >> what we currently use with success in Alpine Linux.
> >>
> >> Tested on x86_64 and x86.
> >
> > I just built a toolchain for ARM from 0.9.33 stable branch
> > and I'm trying to figure out if the breakage is x86_64 only.
> > could you give more details what breaks and why?
> 
> It is only 64bit that is broke. On 64bit it should be an alias to the
> pread64/pwrite64 syscalls and not do the offset hi/lo stuff like it
> need to do on 32bit. The result was that offsets bigger than 4G (or
> 2G?) got cutted. Typical 64 bit vs 32 bit bug.

You might take a look at how we do it in musl; it's much simpler:

http://git.etalabs.net/cgi-bin/cgit.cgi?url=musl/tree/src/unistd/pread.c

The definition of __SYSCALL_LL_O expands correctly to put the long
long argument at the right slots for the target arch where there are
an odd number of arguments before the long long argument (it might
expand to a single long, for 64-bit archs, two longs, for 32-bit archs
with no alignment requirement, or 3 longs, the first being zero, for
32-bit archs where 64-bit arguments must be aligned on an even slot.

The same macro works for most syscalls that take long long arguments.

Rich
___
uClibc mailing list
uClibc@uclibc.org
http://lists.busybox.net/mailman/listinfo/uclibc


Re: [PATCH 0.9.33 0/7] Backport pread/pwrite fixes from master

2012-08-29 Thread Natanael Copa
On Wed, Aug 29, 2012 at 2:42 PM, Johannes Stezenbach  wrote:
> Hi Natanael,
>
> On Wed, Aug 29, 2012 at 09:18:57AM +, Natanael Copa wrote:
>> I previously sent a bug report for pread/pwrite with a link to a
>> patch that i hacked up quick and dirty. This showed up to be severly
>> broken on x86_64 and corrupted several qemu disks images for me.
>>
>> I see that this bad patch made it into 0.9.33 stabel tree. I think it
>> should be reverted and instead use cherry-picks from master. This is
>> what we currently use with success in Alpine Linux.
>>
>> Tested on x86_64 and x86.
>
> I just built a toolchain for ARM from 0.9.33 stable branch
> and I'm trying to figure out if the breakage is x86_64 only.
> could you give more details what breaks and why?

It is only 64bit that is broke. On 64bit it should be an alias to the
pread64/pwrite64 syscalls and not do the offset hi/lo stuff like it
need to do on 32bit. The result was that offsets bigger than 4G (or
2G?) got cutted. Typical 64 bit vs 32 bit bug.

-- 
Natanael Copa
___
uClibc mailing list
uClibc@uclibc.org
http://lists.busybox.net/mailman/listinfo/uclibc


Re: [PATCH 0.9.33 0/7] Backport pread/pwrite fixes from master

2012-08-29 Thread Johannes Stezenbach
Hi Natanael,

On Wed, Aug 29, 2012 at 09:18:57AM +, Natanael Copa wrote:
> I previously sent a bug report for pread/pwrite with a link to a
> patch that i hacked up quick and dirty. This showed up to be severly
> broken on x86_64 and corrupted several qemu disks images for me.
> 
> I see that this bad patch made it into 0.9.33 stabel tree. I think it
> should be reverted and instead use cherry-picks from master. This is
> what we currently use with success in Alpine Linux.
> 
> Tested on x86_64 and x86.

I just built a toolchain for ARM from 0.9.33 stable branch
and I'm trying to figure out if the breakage is x86_64 only.
could you give more details what breaks and why?


Thanks,
Johannes
___
uClibc mailing list
uClibc@uclibc.org
http://lists.busybox.net/mailman/listinfo/uclibc


Re: Race condition on SIGCANCEL signal in POSIX timers

2012-08-29 Thread Carmelo AMOROSO
On 28/08/2012 18.57, Khem Raj wrote:
> On Tue, Aug 28, 2012 at 12:16 AM, Carmelo AMOROSO
>  wrote:
>> On 28/08/2012 9.07, mail...@gmx.de wrote:
>>> Hi,
>>>
>>
>> Hi,
>>
>>> [Please keep me on CC:, I'm not subscribed]
>>>
>>> I'm working with current uClibc and had problems with POSIX timers.
>>>
>>> I use the timer with SIGEV_THREAD to create one thread each timer event. It
>>> seems there is a race condition between the thread waiting on SIGCANCEL 
>>> signal
>>> (timer_helper_thread in timer_routine.c) and the default signal handler for 
>>> this
>>> signal.
>>> Many timer events will be lost, because they will be dequeued before
>>> rt_sigtimedwait() could catch it.
>>>
>>> I found a change on creating the helper thread. (Please see:
>>> http://git.uclibc.org/uClibc/commit/libpthread/nptl/sysdeps/unix/sysv/linux/timer_routines.c?id=162cfaea20d807f0ae329efe39292a9b22593b41)
>>>
>>> After reverting this change, it works for me as expected.
>>> Could anybody remember, why this change was necessary?
>>>
>>> I think the comment is wrong:
>>> /*__sigaddset (&ss, SIGCANCEL); - already done by sigfillset */
>>>
>>> Currently SIGCANCEL will not be blocked by sigfillset, I had to reenable the
>>> __sidaddset() comment.
>>>
>>> I already asked Denys Vlasenko via mail, but didn't get an answer so far.
>>>
>>> Because I'm not subscribed to your bugtracker (and not intent to do so), 
>>> could
>>> anybody please report a bug against uClibc or did I miss something and this
>>> change make any sense?
>>>
>>>
>>> Thank you in advance,
>>>
>>> Erik
>>>
>>
>> we have spotted this issue recently as well, indeed the modifications
>> you mentioned have introduced a regression.
>> I have the fix in the STLinux uClibc repo
>> (http://git.stlinux.com/?p=stm/uclibc.git;a=commit;h=1eed623153b5139c8b5dca08030b3a4a1838d4db).
>>
>> It's on my list for upstream to uclibc.org as well.
>>
> 
> please commit it upstream too.
> 

just done.

Carmelo


___
uClibc mailing list
uClibc@uclibc.org
http://lists.busybox.net/mailman/listinfo/uclibc


[PATCH 0.9.33 6/7] pread_write.c: make all archs use common code

2012-08-29 Thread Natanael Copa
From: "Peter S. Mazinger" 

c6x does not need own version at all

Signed-off-by: Peter S. Mazinger 
Signed-off-by: Bernhard Reutner-Fischer 
(cherry picked from commit 836d74b92d70b71792d3d6136db7cdf0c3775ee3)
---
 libc/sysdeps/linux/c6x/Makefile.arch |   3 +-
 libc/sysdeps/linux/c6x/pread_write.c | 103 ---
 libc/sysdeps/linux/common/pread_write.c  |   2 +
 libc/sysdeps/linux/mips/pread_write.c| 116 +--
 libc/sysdeps/linux/powerpc/pread_write.c |  70 +--
 libc/sysdeps/linux/sh/pread_write.c  | 109 -
 libc/sysdeps/linux/xtensa/pread_write.c  |  79 +
 7 files changed, 88 insertions(+), 394 deletions(-)
 delete mode 100644 libc/sysdeps/linux/c6x/pread_write.c

diff --git a/libc/sysdeps/linux/c6x/Makefile.arch 
b/libc/sysdeps/linux/c6x/Makefile.arch
index 6bb44f2..5f8aaec 100644
--- a/libc/sysdeps/linux/c6x/Makefile.arch
+++ b/libc/sysdeps/linux/c6x/Makefile.arch
@@ -5,6 +5,7 @@
 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
 #
 
-CSRC := brk.c pread_write.c syscall.c prctl.c
+CSRC := brk.c syscall.c prctl.c
+#CSRC :=
 
 SSRC := __longjmp.S bsd-_setjmp.S bsd-setjmp.S clone.S setjmp.S _vfork.S
diff --git a/libc/sysdeps/linux/c6x/pread_write.c 
b/libc/sysdeps/linux/c6x/pread_write.c
deleted file mode 100644
index f985b43..000
--- a/libc/sysdeps/linux/c6x/pread_write.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/* vi: set sw=4 ts=4:
- *
- * Copyright (C) 2002 by Erik Andersen 
- * Based in part on the files
- * ./sysdeps/unix/sysv/linux/pwrite.c,
- * ./sysdeps/unix/sysv/linux/pread.c,
- * sysdeps/posix/pread.c
- * sysdeps/posix/pwrite.c
- * from GNU libc 2.2.5, but reworked considerably...
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Library General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program 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 Library General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#define _LARGEFILE64_SOURCE
-#include 
-#undef __OPTIMIZE__
-/* We absolutely do _NOT_ want interfaces silently
- *  *  * renamed under us or very bad things will happen... */
-#ifdef __USE_FILE_OFFSET64
-# undef __USE_FILE_OFFSET64
-#endif
-
-
-#include 
-#include 
-#include 
-#include 
-#include 
-
-extern __typeof(pread) __libc_pread;
-extern __typeof(pwrite) __libc_pwrite;
-#ifdef __UCLIBC_HAS_LFS__
-extern __typeof(pread64) __libc_pread64;
-extern __typeof(pwrite64) __libc_pwrite64;
-#endif
-
-#ifdef __NR_pread64 /* Newer kernels renamed but it's the same.  */
-# ifdef __NR_pread
-#  error "__NR_pread and __NR_pread64 both defined???"
-# endif
-# define __NR_pread __NR_pread64
-#endif
-
-#define __NR___syscall_pread __NR_pread
-static inline _syscall5(ssize_t, __syscall_pread, int, fd, void *, buf,
-   size_t, count, off_t, offset_hi, off_t, offset_lo);
-
-ssize_t __libc_pread(int fd, void *buf, size_t count, off_t offset)
-{
-   return(__syscall_pread(fd,buf,count,offset,offset >> 31));
-}
-weak_alias (__libc_pread, pread)
-
-#if defined __UCLIBC_HAS_LFS__
-ssize_t __libc_pread64(int fd, void *buf, size_t count, off64_t offset)
-{
-uint32_t low = offset & 0x;
-uint32_t high = offset >> 32;
-   return(__syscall_pread(fd, buf, count, low, high));
-}
-weak_alias (__libc_pread64, pread64)
-#endif /* __UCLIBC_HAS_LFS__  */
-
-
-#ifdef __NR_pwrite64/* Newer kernels renamed but it's the same.  */
-# ifdef __NR_pwrite
-#  error "__NR_pwrite and __NR_pwrite64 both defined???"
-# endif
-# define __NR_pwrite __NR_pwrite64
-#endif
-
-#define __NR___syscall_pwrite __NR_pwrite
-static inline _syscall5(ssize_t, __syscall_pwrite, int, fd, const void *, buf,
-   size_t, count, off_t, offset_hi, off_t, offset_lo);
-
-ssize_t __libc_pwrite(int fd, const void *buf, size_t count, off_t offset)
-{
-   return(__syscall_pwrite(fd,buf,count,offset,offset >> 31));
-}
-weak_alias (__libc_pwrite, pwrite)
-
-#if defined __UCLIBC_HAS_LFS__
-ssize_t __libc_pwrite64(int fd, const void *buf, size_t count, off64_t offset)
-{
-uint32_t low = offset & 0x;
-uint32_t high = offset >> 32;
-   return(__syscall_pwrite(fd, buf, count, low, high));
-}
-weak_alias (__libc_pwrite64, pwrite64)
-#endif /* __UCLIBC_HAS_LFS__  */
-
diff --git a/libc/sysdeps/linux/common/pread_write.c 
b/libc/sysdeps/linux/common/pread_write.c
index 3

[PATCH 0.9.33 4/7] pread/pwrite: drop fallback funcs

2012-08-29 Thread Natanael Copa
From: Mike Frysinger 

Linux has provided these functions since the 2.1.x era, so no need to
keep these around.  We'd rather find out when things are missing (and
fix that) than fall back to the unsafe hacks.

Signed-off-by: Mike Frysinger 
(cherry picked from commit 80c9bfc4668e2370b3434a801dc266f336265832)
---
 libc/sysdeps/linux/common/pread_write.c  | 112 -
 libc/sysdeps/linux/powerpc/pread_write.c | 117 ---
 libc/sysdeps/linux/xtensa/pread_write.c  | 112 -
 3 files changed, 341 deletions(-)

diff --git a/libc/sysdeps/linux/common/pread_write.c 
b/libc/sysdeps/linux/common/pread_write.c
index 089ee93..48fe7dd 100644
--- a/libc/sysdeps/linux/common/pread_write.c
+++ b/libc/sysdeps/linux/common/pread_write.c
@@ -83,115 +83,3 @@ ssize_t __libc_pwrite64(int fd, const void *buf, size_t 
count, off64_t offset)
 weak_alias(__libc_pwrite64,pwrite64)
 # endif /* __UCLIBC_HAS_LFS__  */
 #endif /* __NR_pwrite */
-
-#if ! defined __NR_pread || ! defined __NR_pwrite
-
-static ssize_t __fake_pread_write(int fd, void *buf,
-   size_t count, off_t offset, int do_pwrite)
-{
-   int save_errno;
-   ssize_t result;
-   off_t old_offset;
-
-   /* Since we must not change the file pointer preserve the
-* value so that we can restore it later.  */
-   if ((old_offset=lseek(fd, 0, SEEK_CUR)) == (off_t) -1)
-   return -1;
-
-   /* Set to wanted position.  */
-   if (lseek(fd, offset, SEEK_SET) == (off_t) -1)
-   return -1;
-
-   if (do_pwrite == 1) {
-   /* Write the data.  */
-   result = write(fd, buf, count);
-   } else {
-   /* Read the data.  */
-   result = read(fd, buf, count);
-   }
-
-   /* Now we have to restore the position.  If this fails we
-* have to return this as an error.  */
-   save_errno = errno;
-   if (lseek(fd, old_offset, SEEK_SET) == (off_t) -1)
-   {
-   if (result == -1)
-   __set_errno(save_errno);
-   return -1;
-   }
-   __set_errno(save_errno);
-   return(result);
-}
-
-# ifdef __UCLIBC_HAS_LFS__
-
-static ssize_t __fake_pread_write64(int fd, void *buf,
-   size_t count, off64_t offset, int do_pwrite)
-{
-   int save_errno;
-   ssize_t result;
-   off64_t old_offset;
-
-   /* Since we must not change the file pointer preserve the
-* value so that we can restore it later.  */
-   if ((old_offset=lseek64(fd, 0, SEEK_CUR)) == (off64_t) -1)
-   return -1;
-
-   /* Set to wanted position.  */
-   if (lseek64(fd, offset, SEEK_SET) == (off64_t) -1)
-   return -1;
-
-   if (do_pwrite == 1) {
-   /* Write the data.  */
-   result = write(fd, buf, count);
-   } else {
-   /* Read the data.  */
-   result = read(fd, buf, count);
-   }
-
-   /* Now we have to restore the position. */
-   save_errno = errno;
-   if (lseek64(fd, old_offset, SEEK_SET) == (off64_t) -1) {
-   if (result == -1)
-   __set_errno (save_errno);
-   return -1;
-   }
-   __set_errno (save_errno);
-   return result;
-}
-# endif /* __UCLIBC_HAS_LFS__  */
-#endif /*  ! defined __NR_pread || ! defined __NR_pwrite */
-
-#ifndef __NR_pread
-ssize_t __libc_pread(int fd, void *buf, size_t count, off_t offset)
-{
-   return __fake_pread_write(fd, buf, count, offset, 0);
-}
-weak_alias(__libc_pread,pread)
-
-# ifdef __UCLIBC_HAS_LFS__
-ssize_t __libc_pread64(int fd, void *buf, size_t count, off64_t offset)
-{
-   return __fake_pread_write64(fd, buf, count, offset, 0);
-}
-weak_alias(__libc_pread64,pread64)
-# endif /* __UCLIBC_HAS_LFS__  */
-#endif /* ! __NR_pread */
-
-#ifndef __NR_pwrite
-ssize_t __libc_pwrite(int fd, const void *buf, size_t count, off_t offset)
-{
-   /* we won't actually be modifying the buffer,
-*just cast it to get rid of warnings */
-   return __fake_pread_write(fd, (void*)buf, count, offset, 1);
-}
-weak_alias(__libc_pwrite,pwrite)
-
-# ifdef __UCLIBC_HAS_LFS__
-ssize_t __libc_pwrite64(int fd, const void *buf, size_t count, off64_t offset)
-{
-   return __fake_pread_write64(fd, (void*)buf, count, offset, 1);
-}
-weak_alias(__libc_pwrite64,pwrite64)
-# endif /* __UCLIBC_HAS_LFS__  */
-#endif /* ! __NR_pwrite */
diff --git a/libc/sysdeps/linux/powerpc/pread_write.c 
b/libc/sysdeps/linux/powerpc/pread_write.c
index 23f256f..92a184c 100644
--- a/libc/sysdeps/linux/powerpc/pread_write.c
+++ b/libc/sysdeps/linux/powerpc/pread_write.c
@@ -77,120 +77,3 @@ ssize_t __libc_pwrite64(int fd, const void *buf, size_t 
count, off64_t offset)
 weak_alias(__libc_pwrite64,pwrite64)
 # endif /* __UCLIBC_HAS_LFS__  */
 #endif /* __NR_pwrite */
-
-
-
-#if ! defined __NR_pread || ! defined __NR_pwrite
-
-static ssize_t __fake_pre

[PATCH 0.9.33 7/7] endian.h: add some handy macros to be used in syscalls

2012-08-29 Thread Natanael Copa
From: "Peter S. Mazinger" 

Signed-off-by: Peter S. Mazinger 
Signed-off-by: Bernhard Reutner-Fischer 
(cherry picked from commit f6a03f19cf2807170717593b4de8056a1248b99b)
---
 include/endian.h | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/include/endian.h b/include/endian.h
index 0ba7384..1e2fc93 100644
--- a/include/endian.h
+++ b/include/endian.h
@@ -55,6 +55,17 @@
 # define __LONG_LONG_PAIR(HI, LO) HI, LO
 #endif
 
+#ifdef _LIBC
+# ifndef __ASSEMBLER__
+#  include 
+#  define OFF_HI(offset) (offset >> 31)
+#  define OFF_LO(offset) (offset)
+#  define OFF64_HI(offset) (uint32_t)(offset >> 32)
+#  define OFF64_LO(offset) (uint32_t)(offset & 0x)
+#  define OFF_HI_LO(offset) __LONG_LONG_PAIR(OFF_HI(offset), OFF_LO(offset))
+#  define OFF64_HI_LO(offset) __LONG_LONG_PAIR(OFF64_HI(offset), 
OFF64_LO(offset))
+# endif
+#endif
 
 #ifdef __USE_BSD
 /* Conversion interfaces.  */
-- 
1.7.12

___
uClibc mailing list
uClibc@uclibc.org
http://lists.busybox.net/mailman/listinfo/uclibc


[PATCH 0.9.33 2/7] cancel.h: add generic file to ease cancellation support

2012-08-29 Thread Natanael Copa
From: "Peter S. Mazinger" 

Signed-off-by: Peter S. Mazinger 
Signed-off-by: Bernhard Reutner-Fischer 
(cherry picked from commit 9f68f0cbf8c8eea6a7f9e195e4617bbaa808d7c6)

Conflicts:
Makefile.in
---
 Makefile.in  |   1 +
 include/cancel.h | 101 +++
 2 files changed, 102 insertions(+)
 create mode 100644 include/cancel.h

diff --git a/Makefile.in b/Makefile.in
index 9ba590d..e81926d 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -210,6 +210,7 @@ $(top_builddir)extra/scripts/unifdef: 
$(top_srcdir)extra/scripts/unifdef.c
 # a "y" here means the feature is enabled and so we should *not* rm it.
 # if the option expands to nothing though, we can punt the headers.
 HEADERS_RM- := \
+   cancel.h \
dl-osinfo.h \
hp-timing.h \
_lfs_64.h \
diff --git a/include/cancel.h b/include/cancel.h
new file mode 100644
index 000..ac6f6b6
--- /dev/null
+++ b/include/cancel.h
@@ -0,0 +1,101 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Copyright (C) 2000-2011 Erik Andersen 
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#ifndef _CANCEL_H
+#define _CANCEL_H
+
+/*
+ * Usage of this header:
+ * 1. define a static or hidden function __NC(NAME) - expands to 
__NAME_nocancel
+ * 2. if it is hidden, add the prototype to the appropiate header where NAME 
has
+ * it's prototype (guarded by _LIBC)
+ * 3. add a CANCELLABLE_SYSCALL(...) line at the end, this will create the 
function
+ * NAME (as weak) with enabled cancellation for NPTL (and later for new LT), 
for
+ * LT_OLD it will also create a strong_alias to __libc_NAME to be used in 
libpthread
+ * 4. if you need libc_hidden_(weak|def) line, use instead lt_libc_hidden, 
this will
+ * take care of the correct type, weak or strong depending on the THREADS type
+ * 5. If the implementation can't be done using CANCELLABLE_SYSCALL (like for 
fcntl)
+ * you need to manually add lt_strong_alias() line too, to optionally create 
the
+ * __libc_NAME alias
+ * 6. if functions are needed to implement __NC(NAME), that themselves are 
cancellable,
+ * decide how the cancellation should be solved, two variants are possible:
+ *  a. use the other function as __NC(FUNC), this way you access the 
non-cancellable
+ *  variant and provide by CANCELLABLE_SYSCALL(...) the dedicated cancellation 
for NAME.
+ *  be aware, that for this case __NC(FUNC) has to be hidden (not static)
+ *  b. use the other function with it's name (FUNC) and add 
LIBC_CANCEL_HANDLED(); at
+ *  the end of file with a comment telling us which function took care of the 
cancellation
+ * Note: LIBC_CANCEL_HANDLED() is noop on uClibc, glibc uses it only for 
tests, we use
+ * it only for "documentation".
+ *
+ * For now the use of this file is limited to libc, will expand later to 
support libpthread
+ * and librt as well.
+ */
+
+#include 
+
+#ifndef NOT_IN_libc
+
+#define __NC(name) _NC(name)
+#define _NC(name) __##name##_nocancel
+
+#define __NC_OLD(name) _NC_OLD(name)
+#define _NC_OLD(name) __libc_##name
+
+#define __NC_PROTO(name) extern __typeof(name) __NC(name) attribute_hidden;
+#define __NC_OLD_PROTO(name) extern __typeof(name) __NC_OLD(name);
+
+#if defined __UCLIBC_HAS_THREADS__ && !defined __LINUXTHREADS_OLD__
+# define __NEW_THREADS 1
+#else
+# define SINGLE_THREAD_P 1
+#endif
+
+#ifdef __NEW_THREADS
+# include 
+
+# define CANCELLABLE_SYSCALL(res_type, name, param_list, params)   \
+res_type weak_function name param_list \
+{  \
+   if (SINGLE_THREAD_P)\
+   return __NC(name) params;   \
+   int oldtype = LIBC_CANCEL_ASYNC();  \
+   res_type result = __NC(name) params;\
+   LIBC_CANCEL_RESET(oldtype); \
+   return result;  \
+}
+
+# define lt_strong_alias(name)
+# define lt_libc_hidden(name) libc_hidden_def(name)
+
+#elif defined __LINUXTHREADS_OLD__
+
+# define CANCELLABLE_SYSCALL(res_type, name, param_list, params)   \
+weak_alias(__NC(name),name)\
+lt_strong_alias(name)
+
+# define lt_strong_alias(name) \
+__NC_OLD_PROTO(name)   \
+strong_alias(name,__NC_OLD(name))
+# define lt_libc_hidden(name) libc_hidden_weak(name)
+
+#else
+
+# define CANCELLABLE_SYSCALL(res_type, name, param_list, params)   \
+strong_alias(__NC(name),name)
+
+# define lt_strong_alias(name)
+# define lt_libc_hidden(name) libc_hidden_def(name)
+
+#endif
+
+/* disable it, useless, glibc uses it only for tests */
+# undef LIBC_CANCEL_HANDLED
+# define LIBC_CANCEL_HANDLED()
+
+#endif /* NOT_IN_libc */
+
+#endif
-- 
1.7.12

___

[PATCH 0.9.33 3/7] pread/pwrite: handle renamed syscalls in common/ppc/xtensa code

2012-08-29 Thread Natanael Copa
From: Mike Frysinger 

Some arches got this fix, but many did not.  So copy the ifdef logic to
the ones that missed it to fix behavior in linux-2.6+.

URL: https://bugs.busybox.net/show_bug.cgi?id=5258
Reported-by: David Laight 
Signed-off-by: Mike Frysinger 
(cherry picked from commit 52fa45da0f86651b70608a58914f3aece7fdfed5)
---
 libc/sysdeps/linux/common/pread_write.c  | 10 ++
 libc/sysdeps/linux/powerpc/pread_write.c | 13 +
 libc/sysdeps/linux/xtensa/pread_write.c  | 14 ++
 3 files changed, 37 insertions(+)

diff --git a/libc/sysdeps/linux/common/pread_write.c 
b/libc/sysdeps/linux/common/pread_write.c
index 88e6957..089ee93 100644
--- a/libc/sysdeps/linux/common/pread_write.c
+++ b/libc/sysdeps/linux/common/pread_write.c
@@ -25,6 +25,11 @@ extern __typeof(pread64) __libc_pread64;
 extern __typeof(pwrite64) __libc_pwrite64;
 #endif
 
+#ifdef __NR_pread64 /* Newer kernels renamed but it's the same.  */
+# undef __NR_pread
+# define __NR_pread __NR_pread64
+#endif
+
 #include 
 
 #ifdef __NR_pread
@@ -51,6 +56,11 @@ weak_alias(__libc_pread64,pread64)
 
 #endif /* __NR_pread */
 
+#ifdef __NR_pwrite64 /* Newer kernels renamed but it's the same.  
*/
+# undef __NR_pwrite
+# define __NR_pwrite __NR_pwrite64
+#endif
+
 #ifdef __NR_pwrite
 
 # define __NR___syscall_pwrite __NR_pwrite
diff --git a/libc/sysdeps/linux/powerpc/pread_write.c 
b/libc/sysdeps/linux/powerpc/pread_write.c
index 7f988d3..23f256f 100644
--- a/libc/sysdeps/linux/powerpc/pread_write.c
+++ b/libc/sysdeps/linux/powerpc/pread_write.c
@@ -20,6 +20,13 @@
 # define off64_t off_t
 #endif
 
+#ifdef __NR_pread64 /* Newer kernels renamed but it's the same.  */
+# ifdef __NR_pread
+#  error "__NR_pread and __NR_pread64 both defined???"
+# endif
+# define __NR_pread __NR_pread64
+#endif
+
 #ifdef __NR_pread
 extern __typeof(pread) __libc_pread;
 # define __NR___syscall_pread __NR_pread
@@ -42,6 +49,12 @@ weak_alias(__libc_pread64,pread64)
 # endif /* __UCLIBC_HAS_LFS__  */
 #endif /* __NR_pread */
 
+#ifdef __NR_pwrite64/* Newer kernels renamed but it's the same.  */
+# ifdef __NR_pwrite
+#  error "__NR_pwrite and __NR_pwrite64 both defined???"
+# endif
+# define __NR_pwrite __NR_pwrite64
+#endif
 
 #ifdef __NR_pwrite
 extern __typeof(pwrite) __libc_pwrite;
diff --git a/libc/sysdeps/linux/xtensa/pread_write.c 
b/libc/sysdeps/linux/xtensa/pread_write.c
index 71ba22b..bcf7dee 100644
--- a/libc/sysdeps/linux/xtensa/pread_write.c
+++ b/libc/sysdeps/linux/xtensa/pread_write.c
@@ -27,6 +27,13 @@ extern __typeof(pwrite64) __libc_pwrite64;
 
 #include 
 
+#ifdef __NR_pread64 /* Newer kernels renamed but it's the same.  */
+# ifdef __NR_pread
+#  error "__NR_pread and __NR_pread64 both defined???"
+# endif
+# define __NR_pread __NR_pread64
+#endif
+
 #ifdef __NR_pread
 
 # define __NR___syscall_pread __NR_pread
@@ -52,6 +59,13 @@ weak_alias(__libc_pread64,pread64)
 
 #endif /* __NR_pread */
 
+#ifdef __NR_pwrite64/* Newer kernels renamed but it's the same.  */
+# ifdef __NR_pwrite
+#  error "__NR_pwrite and __NR_pwrite64 both defined???"
+# endif
+# define __NR_pwrite __NR_pwrite64
+#endif
+
 #ifdef __NR_pwrite
 
 # define __NR___syscall_pwrite __NR_pwrite
-- 
1.7.12

___
uClibc mailing list
uClibc@uclibc.org
http://lists.busybox.net/mailman/listinfo/uclibc


[PATCH 0.9.33 5/7] add cancellation to generic pread_write

2012-08-29 Thread Natanael Copa
From: "Peter S. Mazinger" 

Prepare the file to be used in all arch specific files

Signed-off-by: Peter S. Mazinger 
Signed-off-by: Bernhard Reutner-Fischer 
(cherry picked from commit 61198b43ee8a639544622d0e666b972418c9c383)
---
 libc/sysdeps/linux/common/pread_write.c | 100 
 1 file changed, 51 insertions(+), 49 deletions(-)

diff --git a/libc/sysdeps/linux/common/pread_write.c 
b/libc/sysdeps/linux/common/pread_write.c
index 48fe7dd..3d04bb7 100644
--- a/libc/sysdeps/linux/common/pread_write.c
+++ b/libc/sysdeps/linux/common/pread_write.c
@@ -15,71 +15,73 @@
 
 #include 
 #include 
-#include 
 #include 
+#include 
+#include 
 
-extern __typeof(pread) __libc_pread;
-extern __typeof(pwrite) __libc_pwrite;
-#ifdef __UCLIBC_HAS_LFS__
-extern __typeof(pread64) __libc_pread64;
-extern __typeof(pwrite64) __libc_pwrite64;
-#endif
-
-#ifdef __NR_pread64 /* Newer kernels renamed but it's the same.  */
+#ifdef __NR_pread64
 # undef __NR_pread
 # define __NR_pread __NR_pread64
 #endif
+#ifdef __NR_pwrite64
+# undef __NR_pwrite
+# define __NR_pwrite __NR_pwrite64
+#endif
 
-#include 
-
-#ifdef __NR_pread
+#ifndef MY_PREAD
+# ifdef __NR_pread
+#  define __NR___syscall_pread __NR_pread
+static _syscall5(ssize_t, __syscall_pread, int, fd, void *, buf,
+size_t, count, off_t, offset_hi, off_t, offset_lo)
+#  define MY_PREAD(fd, buf, count, offset) __syscall_pread(fd, buf, count, 
OFF_HI_LO(offset))
+#  define MY_PREAD64(fd, buf, count, offset) __syscall_pread(fd, buf, count, 
OFF64_HI_LO(offset))
+#endif
 
-# define __NR___syscall_pread __NR_pread
-static __inline__ _syscall5(ssize_t, __syscall_pread, int, fd, void *, buf,
-   size_t, count, off_t, offset_hi, off_t, offset_lo)
+#ifndef MY_PWRITE
+# ifdef __NR_pwrite
+#  define __NR___syscall_pwrite __NR_pwrite
+static _syscall5(ssize_t, __syscall_pwrite, int, fd, const void *, buf,
+size_t, count, off_t, offset_hi, off_t, offset_lo)
+#  define MY_PWRITE(fd, buf, count, offset) __syscall_pwrite(fd, buf, count, 
OFF_HI_LO(offset))
+#  define MY_PWRITE64(fd, buf, count, offset) __syscall_pwrite(fd, buf, count, 
OFF64_HI_LO(offset))
+#endif
 
-ssize_t __libc_pread(int fd, void *buf, size_t count, off_t offset)
+static ssize_t __NC(pread)(int fd, void *buf, size_t count, off_t offset)
 {
-   return __syscall_pread(fd, buf, count, __LONG_LONG_PAIR(offset >> 31, 
offset));
+   return MY_PREAD(fd, buf, count, offset);
 }
-weak_alias(__libc_pread,pread)
+CANCELLABLE_SYSCALL(ssize_t, pread, (int fd, void *buf, size_t count, off_t 
offset),
+   (fd, buf, count, offset))
 
-# ifdef __UCLIBC_HAS_LFS__
-ssize_t __libc_pread64(int fd, void *buf, size_t count, off64_t offset)
+static ssize_t __NC(pwrite)(int fd, const void *buf, size_t count, off_t 
offset)
 {
-   uint32_t low = offset & 0x;
-   uint32_t high = offset >> 32;
-   return __syscall_pread(fd, buf, count, __LONG_LONG_PAIR(high, low));
+   return MY_PWRITE(fd, buf, count, offset);
 }
-weak_alias(__libc_pread64,pread64)
-# endif /* __UCLIBC_HAS_LFS__  */
+CANCELLABLE_SYSCALL(ssize_t, pwrite, (int fd, const void *buf, size_t count, 
off_t offset),
+   (fd, buf, count, offset))
 
-#endif /* __NR_pread */
-
-#ifdef __NR_pwrite64 /* Newer kernels renamed but it's the same.  
*/
-# undef __NR_pwrite
-# define __NR_pwrite __NR_pwrite64
-#endif
-
-#ifdef __NR_pwrite
-
-# define __NR___syscall_pwrite __NR_pwrite
-static __inline__ _syscall5(ssize_t, __syscall_pwrite, int, fd, const void *, 
buf,
-   size_t, count, off_t, offset_hi, off_t, offset_lo)
-
-ssize_t __libc_pwrite(int fd, const void *buf, size_t count, off_t offset)
+#ifdef __UCLIBC_HAS_LFS__
+# if __WORDSIZE == 32
+static ssize_t __NC(pread64)(int fd, void *buf, size_t count, off64_t offset)
 {
-   return __syscall_pwrite(fd, buf, count, __LONG_LONG_PAIR(offset >> 31, 
offset));
+   return MY_PREAD64(fd, buf, count, offset);
 }
-weak_alias(__libc_pwrite,pwrite)
+CANCELLABLE_SYSCALL(ssize_t, pread64, (int fd, void *buf, size_t count, 
off64_t offset),
+   (fd, buf, count, offset))
 
-# ifdef __UCLIBC_HAS_LFS__
-ssize_t __libc_pwrite64(int fd, const void *buf, size_t count, off64_t offset)
+static ssize_t __NC(pwrite64)(int fd, const void *buf, size_t count, off64_t 
offset)
 {
-   uint32_t low = offset & 0x;
-   uint32_t high = offset >> 32;
-   return __syscall_pwrite(fd, buf, count, __LONG_LONG_PAIR(high, low));
+   return MY_PWRITE64(fd, buf, count, offset);
 }
-weak_alias(__libc_pwrite64,pwrite64)
-# endif /* __UCLIBC_HAS_LFS__  */
-#endif /* __NR_pwrite */
+CANCELLABLE_SYSCALL(ssize_t, pwrite64, (int fd, const void *buf, size_t count, 
off64_t offset),
+   (fd, buf, count, offset))
+# else
+#  ifdef __LINUXTHREADS_OLD__
+weak_alias(pread,pread64)
+weak_alias(pwrite,pwrite64)
+#  else
+strong_alias_untyped(pread,pread64)
+strong_alia

[PATCH 0.9.33 1/7] Revert "pread/pwrite: backport fix"

2012-08-29 Thread Natanael Copa
This backport breaks x86_64 badly.

This reverts commit 342a3d861fde5651ee53486addbacddcec6a0a58.

Signed-off-by: Natanael Copa 
---
 libc/sysdeps/linux/common/pread_write.c | 143 +++-
 1 file changed, 124 insertions(+), 19 deletions(-)

diff --git a/libc/sysdeps/linux/common/pread_write.c 
b/libc/sysdeps/linux/common/pread_write.c
index baf8691..88e6957 100644
--- a/libc/sysdeps/linux/common/pread_write.c
+++ b/libc/sysdeps/linux/common/pread_write.c
@@ -17,7 +17,6 @@
 #include 
 #include 
 #include 
-#include 
 
 extern __typeof(pread) __libc_pread;
 extern __typeof(pwrite) __libc_pwrite;
@@ -28,17 +27,15 @@ extern __typeof(pwrite64) __libc_pwrite64;
 
 #include 
 
-# define __NR___syscall_pread __NR_pread64
+#ifdef __NR_pread
+
+# define __NR___syscall_pread __NR_pread
 static __inline__ _syscall5(ssize_t, __syscall_pread, int, fd, void *, buf,
size_t, count, off_t, offset_hi, off_t, offset_lo)
 
 ssize_t __libc_pread(int fd, void *buf, size_t count, off_t offset)
 {
-   int oldtype = LIBC_CANCEL_ASYNC ();
-   int result = __syscall_pread(fd, buf, count, __LONG_LONG_PAIR(offset >> 
31, offset));
-   LIBC_CANCEL_RESET (oldtype);
-   return result;
-
+   return __syscall_pread(fd, buf, count, __LONG_LONG_PAIR(offset >> 31, 
offset));
 }
 weak_alias(__libc_pread,pread)
 
@@ -47,24 +44,22 @@ ssize_t __libc_pread64(int fd, void *buf, size_t count, 
off64_t offset)
 {
uint32_t low = offset & 0x;
uint32_t high = offset >> 32;
-   int oldtype = LIBC_CANCEL_ASYNC ();
-   int result = __syscall_pread(fd, buf, count, __LONG_LONG_PAIR(high, 
low));
-   LIBC_CANCEL_RESET (oldtype);
-   return result;
+   return __syscall_pread(fd, buf, count, __LONG_LONG_PAIR(high, low));
 }
 weak_alias(__libc_pread64,pread64)
 # endif /* __UCLIBC_HAS_LFS__  */
 
-# define __NR___syscall_pwrite __NR_pwrite64
+#endif /* __NR_pread */
+
+#ifdef __NR_pwrite
+
+# define __NR___syscall_pwrite __NR_pwrite
 static __inline__ _syscall5(ssize_t, __syscall_pwrite, int, fd, const void *, 
buf,
size_t, count, off_t, offset_hi, off_t, offset_lo)
 
 ssize_t __libc_pwrite(int fd, const void *buf, size_t count, off_t offset)
 {
-   int oldtype = LIBC_CANCEL_ASYNC ();
-   int result = __syscall_pwrite(fd, buf, count, __LONG_LONG_PAIR(offset 
>> 31, offset));
-   LIBC_CANCEL_RESET (oldtype);
-   return result;
+   return __syscall_pwrite(fd, buf, count, __LONG_LONG_PAIR(offset >> 31, 
offset));
 }
 weak_alias(__libc_pwrite,pwrite)
 
@@ -73,10 +68,120 @@ ssize_t __libc_pwrite64(int fd, const void *buf, size_t 
count, off64_t offset)
 {
uint32_t low = offset & 0x;
uint32_t high = offset >> 32;
-   int oldtype = LIBC_CANCEL_ASYNC ();
-   int result = __syscall_pwrite(fd, buf, count, __LONG_LONG_PAIR(high, 
low));
-   LIBC_CANCEL_RESET (oldtype);
+   return __syscall_pwrite(fd, buf, count, __LONG_LONG_PAIR(high, low));
+}
+weak_alias(__libc_pwrite64,pwrite64)
+# endif /* __UCLIBC_HAS_LFS__  */
+#endif /* __NR_pwrite */
+
+#if ! defined __NR_pread || ! defined __NR_pwrite
+
+static ssize_t __fake_pread_write(int fd, void *buf,
+   size_t count, off_t offset, int do_pwrite)
+{
+   int save_errno;
+   ssize_t result;
+   off_t old_offset;
+
+   /* Since we must not change the file pointer preserve the
+* value so that we can restore it later.  */
+   if ((old_offset=lseek(fd, 0, SEEK_CUR)) == (off_t) -1)
+   return -1;
+
+   /* Set to wanted position.  */
+   if (lseek(fd, offset, SEEK_SET) == (off_t) -1)
+   return -1;
+
+   if (do_pwrite == 1) {
+   /* Write the data.  */
+   result = write(fd, buf, count);
+   } else {
+   /* Read the data.  */
+   result = read(fd, buf, count);
+   }
+
+   /* Now we have to restore the position.  If this fails we
+* have to return this as an error.  */
+   save_errno = errno;
+   if (lseek(fd, old_offset, SEEK_SET) == (off_t) -1)
+   {
+   if (result == -1)
+   __set_errno(save_errno);
+   return -1;
+   }
+   __set_errno(save_errno);
+   return(result);
+}
+
+# ifdef __UCLIBC_HAS_LFS__
+
+static ssize_t __fake_pread_write64(int fd, void *buf,
+   size_t count, off64_t offset, int do_pwrite)
+{
+   int save_errno;
+   ssize_t result;
+   off64_t old_offset;
+
+   /* Since we must not change the file pointer preserve the
+* value so that we can restore it later.  */
+   if ((old_offset=lseek64(fd, 0, SEEK_CUR)) == (off64_t) -1)
+   return -1;
+
+   /* Set to wanted position.  */
+   if (lseek64(fd, offset, SEEK_SET) == (off64_t) -1)
+   return -1;
+
+   if (do_pwrite == 1) {
+   /* Write the data.  */
+   result = write(fd, buf, count

[PATCH 0.9.33 0/7] Backport pread/pwrite fixes from master

2012-08-29 Thread Natanael Copa
I previously sent a bug report for pread/pwrite with a link to a
patch that i hacked up quick and dirty. This showed up to be severly
broken on x86_64 and corrupted several qemu disks images for me.

I see that this bad patch made it into 0.9.33 stabel tree. I think it
should be reverted and instead use cherry-picks from master. This is
what we currently use with success in Alpine Linux.

Tested on x86_64 and x86.


Mike Frysinger (2):
  pread/pwrite: handle renamed syscalls in common/ppc/xtensa code
  pread/pwrite: drop fallback funcs

Natanael Copa (1):
  Revert "pread/pwrite: backport fix"

Peter S. Mazinger (4):
  cancel.h: add generic file to ease cancellation support
  add cancellation to generic pread_write
  pread_write.c: make all archs use common code
  endian.h: add some handy macros to be used in syscalls

 Makefile.in  |   1 +
 include/cancel.h | 101 
 include/endian.h |  11 ++
 libc/sysdeps/linux/c6x/Makefile.arch |   3 +-
 libc/sysdeps/linux/c6x/pread_write.c | 103 
 libc/sysdeps/linux/common/pread_write.c  | 103 
 libc/sysdeps/linux/mips/pread_write.c| 116 ++
 libc/sysdeps/linux/powerpc/pread_write.c | 192 +-
 libc/sysdeps/linux/sh/pread_write.c  | 109 +++--
 libc/sysdeps/linux/xtensa/pread_write.c  | 195 +--
 10 files changed, 272 insertions(+), 662 deletions(-)
 create mode 100644 include/cancel.h
 delete mode 100644 libc/sysdeps/linux/c6x/pread_write.c

-- 
1.7.12

___
uClibc mailing list
uClibc@uclibc.org
http://lists.busybox.net/mailman/listinfo/uclibc