From: Felix Fietkau Date: Sun, 29 Mar 2015 04:26:42 +0000 (+0000) Subject: uClibc: add another missing backport patch X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=b97c3b0249d90d99e610db7588cc89aa3e92a770;p=librecmc%2Flibrecmc.git uClibc: add another missing backport patch Signed-off-by: Felix Fietkau SVN-Revision: 45102 --- diff --git a/toolchain/uClibc/patches-0.9.33.2/020-add-posix_madvise.c.patch b/toolchain/uClibc/patches-0.9.33.2/020-add-posix_madvise.c.patch deleted file mode 100644 index 2b18c258d9..0000000000 --- a/toolchain/uClibc/patches-0.9.33.2/020-add-posix_madvise.c.patch +++ /dev/null @@ -1,48 +0,0 @@ -From: "Peter S. Mazinger" -Date: Tue, 26 Apr 2011 23:03:44 +0200 -Subject: [PATCH] add posix_madvise.c - -Signed-off-by: Peter S. Mazinger -Signed-off-by: Bernhard Reutner-Fischer ---- - create mode 100644 libc/sysdeps/linux/common/posix_madvise.c - ---- a/libc/sysdeps/linux/common/Makefile.in -+++ b/libc/sysdeps/linux/common/Makefile.in -@@ -81,7 +81,7 @@ CSRC-$(UCLIBC_HAS_REALTIME) += clock_get - sched_get_priority_max.c sched_get_priority_min.c sched_getscheduler.c \ - sched_rr_get_interval.c sched_setparam.c sched_setscheduler.c sigqueue.c - # clock_getcpuclockid|clock_nanosleep|mq_timedreceive|mq_timedsend|posix_fadvise|posix_fallocate|posix_madvise|posix_memalign|posix_mem_offset|posix_spawnattr_destroy|posix_spawnattr_init|posix_spawnattr_getflags|posix_spawnattr_setflags|posix_spawnattr_getpgroup|posix_spawnattr_setpgroup|posix_spawnattr_getschedparam|posix_spawnattr_setschedparam|posix_spawnattr_getschedpolicy|posix_spawnattr_setschedpolicy|posix_spawnattr_getsigdefault|posix_spawnattr_setsigdefault|posix_spawnattr_getsigmask|posix_spawnattr_setsigmask|posix_spawnattr_init|posix_spawnattr_setflags|posix_spawnattr_setpgroup|posix_spawnattr_setschedparam|posix_spawnattr_setschedpolicy|posix_spawnattr_setsigdefault|posix_spawnattr_setsigmask|posix_spawn_file_actions_addclose|posix_spawn_file_actions_addopen|posix_spawn_file_actions_adddup2|posix_spawn_file_actions_addopen|posix_spawn_file_actions_destroy|posix_spawn_file_actions_init|posix_spawn_file_actions_init|posix_spawn|posix_spawnp|posix_spawnp|posix_typed_mem_get_info|pthread_mutex_timedlock|sem_timedwait --CSRC-$(UCLIBC_HAS_ADVANCED_REALTIME) += posix_fadvise64.c posix_fadvise.c -+CSRC-$(UCLIBC_HAS_ADVANCED_REALTIME) += posix_fadvise64.c posix_fadvise.c posix_madvise.c - CSRC-$(UCLIBC_SUSV4_LEGACY) += utime.c - CSRC-$(UCLIBC_HAS_EPOLL) += epoll.c - CSRC-$(UCLIBC_HAS_XATTR) += xattr.c ---- /dev/null -+++ b/libc/sysdeps/linux/common/posix_madvise.c -@@ -0,0 +1,25 @@ -+/* vi: set sw=4 ts=4: */ -+/* Licensed under the LGPL v2.1, see the file LICENSE in this tarball. */ -+ -+#include -+#include -+ -+#if defined __NR_madvise && defined __USE_XOPEN2K && defined __UCLIBC_HAS_ADVANCED_REALTIME__ -+int posix_madvise(void *addr, size_t len, int advice) -+{ -+ int result; -+ /* We have one problem: the kernel's MADV_DONTNEED does not -+ * correspond to POSIX's POSIX_MADV_DONTNEED. The former simply -+ * discards changes made to the memory without writing it back to -+ * disk, if this would be necessary. The POSIX behaviour does not -+ * allow this. There is no functionality mapping for the POSIX -+ * behaviour so far so we ignore that advice for now. */ -+ if (advice == POSIX_MADV_DONTNEED) -+ return 0; -+ -+ /* this part might use madvise function */ -+ INTERNAL_SYSCALL_DECL (err); -+ result = INTERNAL_SYSCALL (madvise, err, 3, addr, len, advice); -+ return INTERNAL_SYSCALL_ERRNO (result, err); -+} -+#endif diff --git a/toolchain/uClibc/patches-0.9.33.2/020-endian.h-add-some-handy-macros-to-be-used-in-syscall.patch b/toolchain/uClibc/patches-0.9.33.2/020-endian.h-add-some-handy-macros-to-be-used-in-syscall.patch new file mode 100644 index 0000000000..720104195a --- /dev/null +++ b/toolchain/uClibc/patches-0.9.33.2/020-endian.h-add-some-handy-macros-to-be-used-in-syscall.patch @@ -0,0 +1,28 @@ +From: "Peter S. Mazinger" +Date: Thu, 21 Apr 2011 21:20:55 +0200 +Subject: [PATCH] endian.h: add some handy macros to be used in syscalls + +Signed-off-by: Peter S. Mazinger +Signed-off-by: Bernhard Reutner-Fischer +--- + +--- 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 & 0xffffffff) ++# 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. */ diff --git a/toolchain/uClibc/patches-0.9.33.2/021-add-posix_madvise.c.patch b/toolchain/uClibc/patches-0.9.33.2/021-add-posix_madvise.c.patch new file mode 100644 index 0000000000..2b18c258d9 --- /dev/null +++ b/toolchain/uClibc/patches-0.9.33.2/021-add-posix_madvise.c.patch @@ -0,0 +1,48 @@ +From: "Peter S. Mazinger" +Date: Tue, 26 Apr 2011 23:03:44 +0200 +Subject: [PATCH] add posix_madvise.c + +Signed-off-by: Peter S. Mazinger +Signed-off-by: Bernhard Reutner-Fischer +--- + create mode 100644 libc/sysdeps/linux/common/posix_madvise.c + +--- a/libc/sysdeps/linux/common/Makefile.in ++++ b/libc/sysdeps/linux/common/Makefile.in +@@ -81,7 +81,7 @@ CSRC-$(UCLIBC_HAS_REALTIME) += clock_get + sched_get_priority_max.c sched_get_priority_min.c sched_getscheduler.c \ + sched_rr_get_interval.c sched_setparam.c sched_setscheduler.c sigqueue.c + # clock_getcpuclockid|clock_nanosleep|mq_timedreceive|mq_timedsend|posix_fadvise|posix_fallocate|posix_madvise|posix_memalign|posix_mem_offset|posix_spawnattr_destroy|posix_spawnattr_init|posix_spawnattr_getflags|posix_spawnattr_setflags|posix_spawnattr_getpgroup|posix_spawnattr_setpgroup|posix_spawnattr_getschedparam|posix_spawnattr_setschedparam|posix_spawnattr_getschedpolicy|posix_spawnattr_setschedpolicy|posix_spawnattr_getsigdefault|posix_spawnattr_setsigdefault|posix_spawnattr_getsigmask|posix_spawnattr_setsigmask|posix_spawnattr_init|posix_spawnattr_setflags|posix_spawnattr_setpgroup|posix_spawnattr_setschedparam|posix_spawnattr_setschedpolicy|posix_spawnattr_setsigdefault|posix_spawnattr_setsigmask|posix_spawn_file_actions_addclose|posix_spawn_file_actions_addopen|posix_spawn_file_actions_adddup2|posix_spawn_file_actions_addopen|posix_spawn_file_actions_destroy|posix_spawn_file_actions_init|posix_spawn_file_actions_init|posix_spawn|posix_spawnp|posix_spawnp|posix_typed_mem_get_info|pthread_mutex_timedlock|sem_timedwait +-CSRC-$(UCLIBC_HAS_ADVANCED_REALTIME) += posix_fadvise64.c posix_fadvise.c ++CSRC-$(UCLIBC_HAS_ADVANCED_REALTIME) += posix_fadvise64.c posix_fadvise.c posix_madvise.c + CSRC-$(UCLIBC_SUSV4_LEGACY) += utime.c + CSRC-$(UCLIBC_HAS_EPOLL) += epoll.c + CSRC-$(UCLIBC_HAS_XATTR) += xattr.c +--- /dev/null ++++ b/libc/sysdeps/linux/common/posix_madvise.c +@@ -0,0 +1,25 @@ ++/* vi: set sw=4 ts=4: */ ++/* Licensed under the LGPL v2.1, see the file LICENSE in this tarball. */ ++ ++#include ++#include ++ ++#if defined __NR_madvise && defined __USE_XOPEN2K && defined __UCLIBC_HAS_ADVANCED_REALTIME__ ++int posix_madvise(void *addr, size_t len, int advice) ++{ ++ int result; ++ /* We have one problem: the kernel's MADV_DONTNEED does not ++ * correspond to POSIX's POSIX_MADV_DONTNEED. The former simply ++ * discards changes made to the memory without writing it back to ++ * disk, if this would be necessary. The POSIX behaviour does not ++ * allow this. There is no functionality mapping for the POSIX ++ * behaviour so far so we ignore that advice for now. */ ++ if (advice == POSIX_MADV_DONTNEED) ++ return 0; ++ ++ /* this part might use madvise function */ ++ INTERNAL_SYSCALL_DECL (err); ++ result = INTERNAL_SYSCALL (madvise, err, 3, addr, len, advice); ++ return INTERNAL_SYSCALL_ERRNO (result, err); ++} ++#endif diff --git a/toolchain/uClibc/patches-0.9.33.2/021-libc-add-posix_fallocate.patch b/toolchain/uClibc/patches-0.9.33.2/021-libc-add-posix_fallocate.patch deleted file mode 100644 index 504405a716..0000000000 --- a/toolchain/uClibc/patches-0.9.33.2/021-libc-add-posix_fallocate.patch +++ /dev/null @@ -1,301 +0,0 @@ -From: Bernhard Reutner-Fischer -Date: Tue, 17 Apr 2012 09:30:15 +0200 -Subject: [PATCH] libc: add posix_fallocate() - -Signed-off-by: Bernhard Reutner-Fischer ---- - create mode 100644 libc/sysdeps/linux/common/posix_fallocate.c - create mode 100644 libc/sysdeps/linux/common/posix_fallocate64.c - create mode 100644 test/unistd/tst-posix_fallocate.c - create mode 100644 test/unistd/tst-posix_fallocate64.c - ---- a/include/fcntl.h -+++ b/include/fcntl.h -@@ -210,9 +210,7 @@ extern int posix_fadvise64 (int __fd, __ - - #endif - --#if 0 /* && defined __UCLIBC_HAS_ADVANCED_REALTIME__ */ -- --/* FIXME -- uClibc should probably implement these... */ -+#if defined __UCLIBC_HAS_ADVANCED_REALTIME__ - - /* Reserve storage for the data of the file associated with FD. - ---- a/libc/sysdeps/linux/common/Makefile.in -+++ b/libc/sysdeps/linux/common/Makefile.in -@@ -81,7 +81,8 @@ CSRC-$(UCLIBC_HAS_REALTIME) += clock_get - sched_get_priority_max.c sched_get_priority_min.c sched_getscheduler.c \ - sched_rr_get_interval.c sched_setparam.c sched_setscheduler.c sigqueue.c - # clock_getcpuclockid|clock_nanosleep|mq_timedreceive|mq_timedsend|posix_fadvise|posix_fallocate|posix_madvise|posix_memalign|posix_mem_offset|posix_spawnattr_destroy|posix_spawnattr_init|posix_spawnattr_getflags|posix_spawnattr_setflags|posix_spawnattr_getpgroup|posix_spawnattr_setpgroup|posix_spawnattr_getschedparam|posix_spawnattr_setschedparam|posix_spawnattr_getschedpolicy|posix_spawnattr_setschedpolicy|posix_spawnattr_getsigdefault|posix_spawnattr_setsigdefault|posix_spawnattr_getsigmask|posix_spawnattr_setsigmask|posix_spawnattr_init|posix_spawnattr_setflags|posix_spawnattr_setpgroup|posix_spawnattr_setschedparam|posix_spawnattr_setschedpolicy|posix_spawnattr_setsigdefault|posix_spawnattr_setsigmask|posix_spawn_file_actions_addclose|posix_spawn_file_actions_addopen|posix_spawn_file_actions_adddup2|posix_spawn_file_actions_addopen|posix_spawn_file_actions_destroy|posix_spawn_file_actions_init|posix_spawn_file_actions_init|posix_spawn|posix_spawnp|posix_spawnp|posix_typed_mem_get_info|pthread_mutex_timedlock|sem_timedwait --CSRC-$(UCLIBC_HAS_ADVANCED_REALTIME) += posix_fadvise64.c posix_fadvise.c posix_madvise.c -+CSRC-$(UCLIBC_HAS_ADVANCED_REALTIME) += posix_fadvise64.c posix_fadvise.c posix_madvise.c \ -+ posix_fallocate.c posix_fallocate64.c - CSRC-$(UCLIBC_SUSV4_LEGACY) += utime.c - CSRC-$(UCLIBC_HAS_EPOLL) += epoll.c - CSRC-$(UCLIBC_HAS_XATTR) += xattr.c ---- a/libc/sysdeps/linux/common/bits/kernel-features.h -+++ b/libc/sysdeps/linux/common/bits/kernel-features.h -@@ -494,6 +494,14 @@ - # define __ASSUME_PRIVATE_FUTEX 1 - #endif - -+/* Support for fallocate was added in 2.6.23, -+ on s390 only after 2.6.23-rc1, on alpha only after 2.6.33-rc1. */ -+#if __LINUX_KERNEL_VERSION >= 0x020617 \ -+ && (!defined __s390__ || __LINUX_KERNEL_VERSION >= 0x020618) \ -+ && (!defined __alpha__ || __LINUX_KERNEL_VERSION >= 0x020621) -+# define __ASSUME_FALLOCATE 1 -+#endif -+ - /* getcpu is a syscall for x86-64 since 3.1. */ - #if defined __x86_64__ && __LINUX_KERNEL_VERSION >= 0x030100 - # define __ASSUME_GETCPU_SYSCALL 1 ---- /dev/null -+++ b/libc/sysdeps/linux/common/posix_fallocate.c -@@ -0,0 +1,43 @@ -+/* vi: set sw=4 ts=4: */ -+/* -+ * posix_fallocate() for uClibc -+ * http://www.opengroup.org/onlinepubs/9699919799/functions/posix_fallocate.html -+ * -+ * Copyright (C) 2000-2006 Erik Andersen -+ * -+ * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. -+ */ -+ -+#include -+#include -+#include -+#include -+ -+#if defined __NR_fallocate -+int posix_fallocate(int fd, __off_t offset, __off_t len) -+{ -+ int ret; -+ -+# if __WORDSIZE == 32 -+ uint32_t off_low = offset; -+ uint32_t len_low = len; -+ /* may assert that these >>31 are 0 */ -+ uint32_t zero = 0; -+ INTERNAL_SYSCALL_DECL(err); -+ ret = (int) (INTERNAL_SYSCALL(fallocate, err, 6, fd, 0, -+ __LONG_LONG_PAIR (zero, off_low), -+ __LONG_LONG_PAIR (zero, len_low))); -+# elif __WORDSIZE == 64 -+ INTERNAL_SYSCALL_DECL(err); -+ ret = (int) (INTERNAL_SYSCALL(fallocate, err, 4, fd, 0, offset, len)); -+# else -+# error your machine is neither 32 bit or 64 bit ... it must be magical -+#endif -+ if (unlikely(INTERNAL_SYSCALL_ERROR_P (ret, err))) -+ return INTERNAL_SYSCALL_ERRNO (ret, err); -+ return 0; -+} -+# if defined __UCLIBC_HAS_LFS__ && __WORDSIZE == 64 -+strong_alias(posix_fallocate,posix_fallocate64) -+# endif -+#endif ---- /dev/null -+++ b/libc/sysdeps/linux/common/posix_fallocate64.c -@@ -0,0 +1,39 @@ -+/* vi: set sw=4 ts=4: */ -+/* -+ * posix_fallocate() for uClibc -+ * http://www.opengroup.org/onlinepubs/9699919799/functions/posix_fallocate.html -+ * -+ * Copyright (C) 2000-2006 Erik Andersen -+ * -+ * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. -+ */ -+ -+#include -+#include -+#include -+#include -+ -+#if defined __NR_fallocate -+ -+# if __WORDSIZE == 64 -+/* Can use normal posix_fallocate() */ -+# elif __WORDSIZE == 32 -+int posix_fallocate64(int fd, __off64_t offset, __off64_t len) -+{ -+ int ret; -+ uint32_t off_low = offset & 0xffffffff; -+ uint32_t off_high = offset >> 32; -+ uint32_t len_low = len & 0xffffffff; -+ uint32_t len_high = len >> 32; -+ INTERNAL_SYSCALL_DECL(err); -+ ret = (int) (INTERNAL_SYSCALL(fallocate, err, 6, fd, 0, -+ __LONG_LONG_PAIR (off_high, off_low), -+ __LONG_LONG_PAIR (len_high, len_low))); -+ if (unlikely(INTERNAL_SYSCALL_ERROR_P (ret, err))) -+ return INTERNAL_SYSCALL_ERRNO (ret, err); -+ return 0; -+} -+# else -+# error your machine is neither 32 bit or 64 bit ... it must be magical -+# endif -+#endif ---- a/test/.gitignore -+++ b/test/.gitignore -@@ -302,6 +302,8 @@ unistd/getcwd - unistd/getopt - unistd/getopt_long - unistd/tstgetopt -+unistd/tst-posix_fallocate -+unistd/tst-posix_fallocate64 - unistd/tst-preadwrite - unistd/tst-preadwrite64 - unistd/vfork ---- a/test/unistd/Makefile.in -+++ b/test/unistd/Makefile.in -@@ -2,7 +2,10 @@ - # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. - - ifeq ($(UCLIBC_HAS_LFS),) --TESTS_DISABLED := tst-preadwrite64 -+TESTS_DISABLED := tst-preadwrite64 tst-posix_fallocate64 -+endif -+ifeq ($(UCLIBC_HAS_ADVANCED_REALTIME),) -+TESTS_DISABLED := tst-posix_fallocate - endif - OPTS_getopt := -abcXXX -9 - OPTS_getopt_long := --add XXX --delete YYY --verbose ---- /dev/null -+++ b/test/unistd/tst-posix_fallocate.c -@@ -0,0 +1,127 @@ -+#include -+#include -+ -+#ifndef TST_POSIX_FALLOCATE64 -+# define stat64 stat -+# define fstat64 fstat -+# else -+# ifndef O_LARGEFILE -+# error no O_LARGEFILE but you want to test with LFS enabled -+# endif -+#endif -+ -+static void do_prepare (void); -+#define PREPARE(argc, argv) do_prepare () -+static int do_test (void); -+#define TEST_FUNCTION do_test () -+#include -+ -+static int fd; -+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); -+ } -+} -+ -+ -+static int -+do_test (void) -+{ -+ struct stat64 st; -+ -+ if (fstat64 (fd, &st) != 0) -+ { -+ puts ("1st fstat failed"); -+ return 1; -+ } -+ -+ 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 1st 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 2nd 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 3rd posix_fallocate call is %llu, expected %u\n", -+ (unsigned long long int) st.st_size, 2048u + 64u); -+ return 1; -+ } -+#ifdef TST_POSIX_FALLOCATE64 -+ if (posix_fallocate64 (fd, 4097ULL, 4294967295ULL + 2ULL) != 0) -+ { -+ puts ("4th posix_fallocate call failed"); -+ return 1; -+ } -+ -+ if (fstat64 (fd, &st) != 0) -+ { -+ puts ("5th fstat failed"); -+ return 1; -+ } -+ -+ if (st.st_size != 4097ULL + 4294967295ULL + 2ULL) -+ { -+ printf ("file size after 4th posix_fallocate call is %llu, expected %llu\n", -+ (unsigned long long int) st.st_size, 4097ULL + 4294967295ULL + 2ULL); -+ return 1; -+ } -+#endif -+ close (fd); -+ -+ return 0; -+} ---- /dev/null -+++ b/test/unistd/tst-posix_fallocate64.c -@@ -0,0 +1,2 @@ -+#define TST_POSIX_FALLOCATE64 -+#include "tst-posix_fallocate.c" diff --git a/toolchain/uClibc/patches-0.9.33.2/022-libc-add-fallocate-and-fallocate64.patch b/toolchain/uClibc/patches-0.9.33.2/022-libc-add-fallocate-and-fallocate64.patch deleted file mode 100644 index 282b64f52e..0000000000 --- a/toolchain/uClibc/patches-0.9.33.2/022-libc-add-fallocate-and-fallocate64.patch +++ /dev/null @@ -1,447 +0,0 @@ -From: "Anthony G. Basile" -Date: Sun, 7 Sep 2014 15:33:46 -0400 -Subject: [PATCH] libc: add fallocate() and fallocate64() - -We add the Linux-specific function fallocate() which allows the user to -directly manipulate allocate space for a file. fallocate() can operate -in different modes, but the default mode is equivalent to posix_fallocate() -which is specified in POSIX.1. - -Recent releases of e2fsprogs 1.42.11 and above expect fallocate64() to be -available. - -Signed-off-by: Anthony G. Basile -Signed-off-by: Bernhard Reutner-Fischer ---- - create mode 100644 libc/sysdeps/linux/common/fallocate.c - create mode 100644 libc/sysdeps/linux/common/fallocate64.c - create mode 100644 test/unistd/tst-fallocate.c - create mode 100644 test/unistd/tst-fallocate64.c - ---- a/extra/Configs/Config.in -+++ b/extra/Configs/Config.in -@@ -952,8 +952,8 @@ config UCLIBC_LINUX_SPECIFIC - default y - help - accept4(), bdflush(), -- capget(), capset(), eventfd(), fstatfs(), -- inotify_*(), ioperm(), iopl(), -+ capget(), capset(), eventfd(), fallocate(), -+ fstatfs(), inotify_*(), ioperm(), iopl(), - madvise(), modify_ldt(), pipe2(), personality(), - prctl()/arch_prctl(), pivot_root(), modify_ldt(), - ppoll(), readahead(), reboot(), remap_file_pages(), ---- a/include/fcntl.h -+++ b/include/fcntl.h -@@ -237,6 +237,38 @@ extern int __fcntl_nocancel (int fd, int - libc_hidden_proto(__fcntl_nocancel) - #endif - -+#if (defined __UCLIBC_LINUX_SPECIFIC__ && defined __USE_GNU) || defined _LIBC -+/* Reserve storage for the data of a file associated with FD. This function -+ is Linux-specific. For the portable version, use posix_fallocate(). -+ Unlike the latter, fallocate can operate in different modes. The default -+ mode = 0 is equivalent to posix_fallocate(). -+ -+ Note: These declarations are used in posix_fallocate.c and -+ posix_fallocate64.c, so we expose them internally. -+ */ -+ -+/* Flags for fallocate's mode. */ -+# define FALLOC_FL_KEEP_SIZE 1 /* Don't extend size of file -+ even if offset + len is -+ greater than file size. */ -+# define FALLOC_FL_PUNCH_HOLE 2 /* Create a hole in the file. */ -+ -+# ifndef __USE_FILE_OFFSET64 -+extern int fallocate (int __fd, int __mode, __off_t __offset, __off_t __len); -+# else -+# ifdef __REDIRECT -+extern int __REDIRECT (fallocate, (int __fd, int __mode, __off64_t __offset, -+ __off64_t __len), -+ fallocate64); -+# else -+# define fallocate fallocate64 -+# endif -+# endif -+# ifdef __USE_LARGEFILE64 -+extern int fallocate64 (int __fd, int __mode, __off64_t __offset, __off64_t __len); -+# endif -+#endif -+ - __END_DECLS - - #endif /* fcntl.h */ ---- a/libc/sysdeps/linux/common/Makefile.in -+++ b/libc/sysdeps/linux/common/Makefile.in -@@ -61,6 +61,10 @@ CSRC-$(UCLIBC_LINUX_SPECIFIC) += \ - vmsplice.c - CSRC-$(if $(findstring yy,$(UCLIBC_LINUX_SPECIFIC)$(UCLIBC_HAS_LFS)),y) += \ - sendfile64.c -+# posix_fallocate() needs __libc_fallocate() from fallocate.c -+# posix_fallocate64() needs __libc_fallocate64() from fallocate64.c -+CSRC-$(if $(UCLIBC_LINUX_SPECIFIC)$(UCLIBC_HAS_ADVANCED_REALTIME),y,) += \ -+ fallocate.c $(filter fallocate64.c,$(CSRC-y)) - # NPTL needs these internally: madvise.c - CSRC-$(findstring y,$(UCLIBC_LINUX_SPECIFIC)$(UCLIBC_HAS_THREADS_NATIVE)) += madvise.c - ifeq ($(UCLIBC_HAS_THREADS_NATIVE),y) ---- /dev/null -+++ b/libc/sysdeps/linux/common/fallocate.c -@@ -0,0 +1,48 @@ -+/* vi: set sw=4 ts=4: */ -+/* -+ * fallocate() for uClibc - Based off of posix_fallocate() by Erik Andersen -+ * http://www.opengroup.org/onlinepubs/9699919799/functions/posix_fallocate.html -+ * -+ * Copyright (C) 2000-2006 Erik Andersen -+ * -+ * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. -+ */ -+ -+#include -+#include -+#include -+#include -+ -+#if defined __NR_fallocate -+extern __typeof(fallocate) __libc_fallocate attribute_hidden; -+int attribute_hidden __libc_fallocate(int fd, int mode, __off_t offset, __off_t len) -+{ -+ int ret; -+ -+# if __WORDSIZE == 32 -+ uint32_t off_low = offset; -+ uint32_t len_low = len; -+ /* may assert that these >>31 are 0 */ -+ uint32_t zero = 0; -+ INTERNAL_SYSCALL_DECL(err); -+ ret = (int) (INTERNAL_SYSCALL(fallocate, err, 6, fd, mode, -+ __LONG_LONG_PAIR (zero, off_low), -+ __LONG_LONG_PAIR (zero, len_low))); -+# elif __WORDSIZE == 64 -+ INTERNAL_SYSCALL_DECL(err); -+ ret = (int) (INTERNAL_SYSCALL(fallocate, err, 4, fd, mode, offset, len)); -+# else -+# error your machine is neither 32 bit or 64 bit ... it must be magical -+# endif -+ if (unlikely(INTERNAL_SYSCALL_ERROR_P (ret, err))) -+ return INTERNAL_SYSCALL_ERRNO (ret, err); -+ return 0; -+} -+ -+# if defined __UCLIBC_LINUX_SPECIFIC__ && defined __USE_GNU -+strong_alias(__libc_fallocate,fallocate) -+# if __WORDSIZE == 64 -+strong_alias(__libc_fallocate,fallocate64) -+# endif -+# endif -+#endif ---- /dev/null -+++ b/libc/sysdeps/linux/common/fallocate64.c -@@ -0,0 +1,42 @@ -+/* vi: set sw=4 ts=4: */ -+/* -+ * fallocate() for uClibc - based off posix_fallocate() by Erik Andersen -+ * http://www.opengroup.org/onlinepubs/9699919799/functions/posix_fallocate.html -+ * -+ * Copyright (C) 2000-2006 Erik Andersen -+ * -+ * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. -+ */ -+ -+#include -+ -+#include -+#include -+#include -+ -+#if defined __NR_fallocate -+ -+# if __WORDSIZE == 64 -+/* Can use normal fallocate() */ -+# elif __WORDSIZE == 32 -+extern __typeof(fallocate64) __libc_fallocate64 attribute_hidden; -+int attribute_hidden __libc_fallocate64(int fd, int mode, __off64_t offset, -+ __off64_t len) -+{ -+ int ret; -+ INTERNAL_SYSCALL_DECL(err); -+ ret = (int) (INTERNAL_SYSCALL(fallocate, err, 6, fd, mode, -+ OFF64_HI_LO (offset), OFF64_HI_LO (len))); -+ if (unlikely(INTERNAL_SYSCALL_ERROR_P (ret, err))) -+ return INTERNAL_SYSCALL_ERRNO (ret, err); -+ return 0; -+} -+ -+# if defined __UCLIBC_LINUX_SPECIFIC__ && defined __USE_GNU -+strong_alias(__libc_fallocate64,fallocate64) -+# endif -+ -+# else -+# error your machine is neither 32 bit or 64 bit ... it must be magical -+# endif -+#endif ---- a/libc/sysdeps/linux/common/posix_fallocate.c -+++ b/libc/sysdeps/linux/common/posix_fallocate.c -@@ -14,28 +14,10 @@ - #include - - #if defined __NR_fallocate -+extern __typeof(fallocate) __libc_fallocate attribute_hidden; - int posix_fallocate(int fd, __off_t offset, __off_t len) - { -- int ret; -- --# if __WORDSIZE == 32 -- uint32_t off_low = offset; -- uint32_t len_low = len; -- /* may assert that these >>31 are 0 */ -- uint32_t zero = 0; -- INTERNAL_SYSCALL_DECL(err); -- ret = (int) (INTERNAL_SYSCALL(fallocate, err, 6, fd, 0, -- __LONG_LONG_PAIR (zero, off_low), -- __LONG_LONG_PAIR (zero, len_low))); --# elif __WORDSIZE == 64 -- INTERNAL_SYSCALL_DECL(err); -- ret = (int) (INTERNAL_SYSCALL(fallocate, err, 4, fd, 0, offset, len)); --# else --# error your machine is neither 32 bit or 64 bit ... it must be magical --#endif -- if (unlikely(INTERNAL_SYSCALL_ERROR_P (ret, err))) -- return INTERNAL_SYSCALL_ERRNO (ret, err); -- return 0; -+ return __libc_fallocate(fd, 0, offset, len); - } - # if defined __UCLIBC_HAS_LFS__ && __WORDSIZE == 64 - strong_alias(posix_fallocate,posix_fallocate64) ---- a/libc/sysdeps/linux/common/posix_fallocate64.c -+++ b/libc/sysdeps/linux/common/posix_fallocate64.c -@@ -18,22 +18,12 @@ - # if __WORDSIZE == 64 - /* Can use normal posix_fallocate() */ - # elif __WORDSIZE == 32 -+extern __typeof(fallocate64) __libc_fallocate64 attribute_hidden; - int posix_fallocate64(int fd, __off64_t offset, __off64_t len) - { -- int ret; -- uint32_t off_low = offset & 0xffffffff; -- uint32_t off_high = offset >> 32; -- uint32_t len_low = len & 0xffffffff; -- uint32_t len_high = len >> 32; -- INTERNAL_SYSCALL_DECL(err); -- ret = (int) (INTERNAL_SYSCALL(fallocate, err, 6, fd, 0, -- __LONG_LONG_PAIR (off_high, off_low), -- __LONG_LONG_PAIR (len_high, len_low))); -- if (unlikely(INTERNAL_SYSCALL_ERROR_P (ret, err))) -- return INTERNAL_SYSCALL_ERRNO (ret, err); -- return 0; -+ return __libc_fallocate64(fd, 0, offset, len); - } - # else --# error your machine is neither 32 bit or 64 bit ... it must be magical -+# error your machine is neither 32 bit or 64 bit ... it must be magical - # endif - #endif ---- a/test/.gitignore -+++ b/test/.gitignore -@@ -302,6 +302,8 @@ unistd/getcwd - unistd/getopt - unistd/getopt_long - unistd/tstgetopt -+unistd/tst-fallocate -+unistd/tst-fallocate64 - unistd/tst-posix_fallocate - unistd/tst-posix_fallocate64 - unistd/tst-preadwrite ---- /dev/null -+++ b/test/unistd/tst-fallocate.c -@@ -0,0 +1,166 @@ -+#include -+#include -+ -+#ifndef TST_FALLOCATE64 -+# define stat64 stat -+# define fstat64 fstat -+# else -+# ifndef O_LARGEFILE -+# error no O_LARGEFILE but you want to test with LFS enabled -+# endif -+#endif -+ -+static void do_prepare(void); -+static int do_test(void); -+#define PREPARE(argc, argv) do_prepare () -+#define TEST_FUNCTION do_test () -+#include -+ -+static int fd; -+static void -+do_prepare (void) -+{ -+ fd = create_temp_file ("tst-fallocate.", NULL); -+ if (fd == -1) -+ { -+ printf ("cannot create temporary file: %m\n"); -+ exit (1); -+ } -+} -+ -+ -+static int -+do_test (void) -+{ -+ struct stat64 st; -+ int c; -+ char garbage[4096]; -+ blkcnt_t blksb4; -+ -+ if (fstat64 (fd, &st) != 0) -+ { -+ puts ("1st fstat failed"); -+ return 1; -+ } -+ -+ if (st.st_size != 0) -+ { -+ puts ("file not created with size 0"); -+ return 1; -+ } -+ -+ /* This is the default mode which is identical to posix_fallocate(). -+ Note: we need a few extra blocks for FALLOC_FL_PUNCH_HOLE below. -+ While block sizes vary, we'll assume eight 4K blocks for good measure. */ -+ if (fallocate (fd, 0, 8 * 4096, 128) != 0) -+ { -+ puts ("1st fallocate call failed"); -+ return 1; -+ } -+ -+ if (fstat64 (fd, &st) != 0) -+ { -+ puts ("2nd fstat failed"); -+ return 1; -+ } -+ -+ if (st.st_size != 8 * 4096 + 128) -+ { -+ printf ("file size after 1st fallocate call is %llu, expected %u\n", -+ (unsigned long long int) st.st_size, 8u * 4096u + 128u); -+ return 1; -+ } -+ -+ /* Without FALLOC_FL_KEEP_SIZE, this would increaste the size of the file. */ -+ if (fallocate (fd, FALLOC_FL_KEEP_SIZE, 0, 16 * 4096) != 0) -+ { -+ puts ("2nd fallocate call failed"); -+ return 1; -+ } -+ -+ if (fstat64 (fd, &st) != 0) -+ { -+ puts ("3rd fstat failed"); -+ return 1; -+ } -+ -+ if (st.st_size != 8 * 4096 + 128) -+ { -+ printf ("file size changed in 2nd fallocate call to %llu, expected %u\n", -+ (unsigned long long int) st.st_size, 8u * 4096u + 128u); -+ return 1; -+ } -+ -+ /* Let's fill up the first eight 4k blocks with 'x' to force some allocations. */ -+ -+ memset(garbage, 'x', 4096); -+ for(c=0; c < 8; c++) -+ if(write(fd, garbage, 4096) == -1) -+ { -+ puts ("write failed"); -+ return 1; -+ } -+ -+ if (fstat64 (fd, &st) != 0) -+ { -+ puts ("4th fstat failed"); -+ return 1; -+ } -+ -+ blksb4 = st.st_blocks; -+ -+ /* Let's punch a hole in the entire file, turning it effectively into a sparse file. */ -+ if (fallocate (fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 8 * 4096 + 128) != 0) -+ { -+ puts ("3rd fallocate call failed"); -+ return 1; -+ } -+ -+ if (fstat64 (fd, &st) != 0) -+ { -+ puts ("5th fstat failed"); -+ return 1; -+ } -+ -+ if (st.st_size != 8 * 4096 + 128) -+ { -+ printf ("file size after 3rd fallocate call is %llu, expected %u\n", -+ (unsigned long long int) st.st_size, 8u * 4096u + 128u); -+ return 1; -+ } -+ -+ /* The number of allocated blocks should decrease. I hope this works on -+ all filesystems! */ -+ if (st.st_blocks >= blksb4) -+ { -+ printf ("number of blocks after 3rd fallocate call is %lu, expected less than %lu\n", -+ (unsigned long int) st.st_blocks, blksb4); -+ return 1; -+ } -+ -+#ifdef TST_FALLOCATE64 -+ /* We'll just do a mode = 0 test for fallocate64() */ -+ if (fallocate64 (fd, 0, 4097ULL, 4294967295ULL + 2ULL) != 0) -+ { -+ puts ("1st fallocate64 call failed"); -+ return 1; -+ } -+ -+ if (fstat64 (fd, &st) != 0) -+ { -+ puts ("6th fstat failed"); -+ return 1; -+ } -+ -+ if (st.st_size != 4097ULL + 4294967295ULL + 2ULL) -+ { -+ printf ("file size after 1st fallocate64 call is %llu, expected %llu\n", -+ (unsigned long long int) st.st_size, 4097ULL + 4294967295ULL + 2ULL); -+ return 1; -+ } -+#endif -+ close (fd); -+ -+ return 0; -+} -+ ---- /dev/null -+++ b/test/unistd/tst-fallocate64.c -@@ -0,0 +1,2 @@ -+#define TST_FALLOCATE64 -+#include "tst-fallocate.c" ---- a/test/unistd/Makefile.in -+++ b/test/unistd/Makefile.in -@@ -2,10 +2,13 @@ - # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. - - ifeq ($(UCLIBC_HAS_LFS),) --TESTS_DISABLED := tst-preadwrite64 tst-posix_fallocate64 -+TESTS_DISABLED := tst-preadwrite64 tst-posix_fallocate64 tst-fallocate64 - endif - ifeq ($(UCLIBC_HAS_ADVANCED_REALTIME),) --TESTS_DISABLED := tst-posix_fallocate -+TESTS_DISABLED := tst-posix_fallocate tst-fallocate64 -+endif -+ifeq ($(UCLIBC_LINUX_SPECIFIC),) -+TESTS_DISABLED += tst-fallocate - endif - OPTS_getopt := -abcXXX -9 - OPTS_getopt_long := --add XXX --delete YYY --verbose diff --git a/toolchain/uClibc/patches-0.9.33.2/022-libc-add-posix_fallocate.patch b/toolchain/uClibc/patches-0.9.33.2/022-libc-add-posix_fallocate.patch new file mode 100644 index 0000000000..504405a716 --- /dev/null +++ b/toolchain/uClibc/patches-0.9.33.2/022-libc-add-posix_fallocate.patch @@ -0,0 +1,301 @@ +From: Bernhard Reutner-Fischer +Date: Tue, 17 Apr 2012 09:30:15 +0200 +Subject: [PATCH] libc: add posix_fallocate() + +Signed-off-by: Bernhard Reutner-Fischer +--- + create mode 100644 libc/sysdeps/linux/common/posix_fallocate.c + create mode 100644 libc/sysdeps/linux/common/posix_fallocate64.c + create mode 100644 test/unistd/tst-posix_fallocate.c + create mode 100644 test/unistd/tst-posix_fallocate64.c + +--- a/include/fcntl.h ++++ b/include/fcntl.h +@@ -210,9 +210,7 @@ extern int posix_fadvise64 (int __fd, __ + + #endif + +-#if 0 /* && defined __UCLIBC_HAS_ADVANCED_REALTIME__ */ +- +-/* FIXME -- uClibc should probably implement these... */ ++#if defined __UCLIBC_HAS_ADVANCED_REALTIME__ + + /* Reserve storage for the data of the file associated with FD. + +--- a/libc/sysdeps/linux/common/Makefile.in ++++ b/libc/sysdeps/linux/common/Makefile.in +@@ -81,7 +81,8 @@ CSRC-$(UCLIBC_HAS_REALTIME) += clock_get + sched_get_priority_max.c sched_get_priority_min.c sched_getscheduler.c \ + sched_rr_get_interval.c sched_setparam.c sched_setscheduler.c sigqueue.c + # clock_getcpuclockid|clock_nanosleep|mq_timedreceive|mq_timedsend|posix_fadvise|posix_fallocate|posix_madvise|posix_memalign|posix_mem_offset|posix_spawnattr_destroy|posix_spawnattr_init|posix_spawnattr_getflags|posix_spawnattr_setflags|posix_spawnattr_getpgroup|posix_spawnattr_setpgroup|posix_spawnattr_getschedparam|posix_spawnattr_setschedparam|posix_spawnattr_getschedpolicy|posix_spawnattr_setschedpolicy|posix_spawnattr_getsigdefault|posix_spawnattr_setsigdefault|posix_spawnattr_getsigmask|posix_spawnattr_setsigmask|posix_spawnattr_init|posix_spawnattr_setflags|posix_spawnattr_setpgroup|posix_spawnattr_setschedparam|posix_spawnattr_setschedpolicy|posix_spawnattr_setsigdefault|posix_spawnattr_setsigmask|posix_spawn_file_actions_addclose|posix_spawn_file_actions_addopen|posix_spawn_file_actions_adddup2|posix_spawn_file_actions_addopen|posix_spawn_file_actions_destroy|posix_spawn_file_actions_init|posix_spawn_file_actions_init|posix_spawn|posix_spawnp|posix_spawnp|posix_typed_mem_get_info|pthread_mutex_timedlock|sem_timedwait +-CSRC-$(UCLIBC_HAS_ADVANCED_REALTIME) += posix_fadvise64.c posix_fadvise.c posix_madvise.c ++CSRC-$(UCLIBC_HAS_ADVANCED_REALTIME) += posix_fadvise64.c posix_fadvise.c posix_madvise.c \ ++ posix_fallocate.c posix_fallocate64.c + CSRC-$(UCLIBC_SUSV4_LEGACY) += utime.c + CSRC-$(UCLIBC_HAS_EPOLL) += epoll.c + CSRC-$(UCLIBC_HAS_XATTR) += xattr.c +--- a/libc/sysdeps/linux/common/bits/kernel-features.h ++++ b/libc/sysdeps/linux/common/bits/kernel-features.h +@@ -494,6 +494,14 @@ + # define __ASSUME_PRIVATE_FUTEX 1 + #endif + ++/* Support for fallocate was added in 2.6.23, ++ on s390 only after 2.6.23-rc1, on alpha only after 2.6.33-rc1. */ ++#if __LINUX_KERNEL_VERSION >= 0x020617 \ ++ && (!defined __s390__ || __LINUX_KERNEL_VERSION >= 0x020618) \ ++ && (!defined __alpha__ || __LINUX_KERNEL_VERSION >= 0x020621) ++# define __ASSUME_FALLOCATE 1 ++#endif ++ + /* getcpu is a syscall for x86-64 since 3.1. */ + #if defined __x86_64__ && __LINUX_KERNEL_VERSION >= 0x030100 + # define __ASSUME_GETCPU_SYSCALL 1 +--- /dev/null ++++ b/libc/sysdeps/linux/common/posix_fallocate.c +@@ -0,0 +1,43 @@ ++/* vi: set sw=4 ts=4: */ ++/* ++ * posix_fallocate() for uClibc ++ * http://www.opengroup.org/onlinepubs/9699919799/functions/posix_fallocate.html ++ * ++ * Copyright (C) 2000-2006 Erik Andersen ++ * ++ * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. ++ */ ++ ++#include ++#include ++#include ++#include ++ ++#if defined __NR_fallocate ++int posix_fallocate(int fd, __off_t offset, __off_t len) ++{ ++ int ret; ++ ++# if __WORDSIZE == 32 ++ uint32_t off_low = offset; ++ uint32_t len_low = len; ++ /* may assert that these >>31 are 0 */ ++ uint32_t zero = 0; ++ INTERNAL_SYSCALL_DECL(err); ++ ret = (int) (INTERNAL_SYSCALL(fallocate, err, 6, fd, 0, ++ __LONG_LONG_PAIR (zero, off_low), ++ __LONG_LONG_PAIR (zero, len_low))); ++# elif __WORDSIZE == 64 ++ INTERNAL_SYSCALL_DECL(err); ++ ret = (int) (INTERNAL_SYSCALL(fallocate, err, 4, fd, 0, offset, len)); ++# else ++# error your machine is neither 32 bit or 64 bit ... it must be magical ++#endif ++ if (unlikely(INTERNAL_SYSCALL_ERROR_P (ret, err))) ++ return INTERNAL_SYSCALL_ERRNO (ret, err); ++ return 0; ++} ++# if defined __UCLIBC_HAS_LFS__ && __WORDSIZE == 64 ++strong_alias(posix_fallocate,posix_fallocate64) ++# endif ++#endif +--- /dev/null ++++ b/libc/sysdeps/linux/common/posix_fallocate64.c +@@ -0,0 +1,39 @@ ++/* vi: set sw=4 ts=4: */ ++/* ++ * posix_fallocate() for uClibc ++ * http://www.opengroup.org/onlinepubs/9699919799/functions/posix_fallocate.html ++ * ++ * Copyright (C) 2000-2006 Erik Andersen ++ * ++ * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. ++ */ ++ ++#include ++#include ++#include ++#include ++ ++#if defined __NR_fallocate ++ ++# if __WORDSIZE == 64 ++/* Can use normal posix_fallocate() */ ++# elif __WORDSIZE == 32 ++int posix_fallocate64(int fd, __off64_t offset, __off64_t len) ++{ ++ int ret; ++ uint32_t off_low = offset & 0xffffffff; ++ uint32_t off_high = offset >> 32; ++ uint32_t len_low = len & 0xffffffff; ++ uint32_t len_high = len >> 32; ++ INTERNAL_SYSCALL_DECL(err); ++ ret = (int) (INTERNAL_SYSCALL(fallocate, err, 6, fd, 0, ++ __LONG_LONG_PAIR (off_high, off_low), ++ __LONG_LONG_PAIR (len_high, len_low))); ++ if (unlikely(INTERNAL_SYSCALL_ERROR_P (ret, err))) ++ return INTERNAL_SYSCALL_ERRNO (ret, err); ++ return 0; ++} ++# else ++# error your machine is neither 32 bit or 64 bit ... it must be magical ++# endif ++#endif +--- a/test/.gitignore ++++ b/test/.gitignore +@@ -302,6 +302,8 @@ unistd/getcwd + unistd/getopt + unistd/getopt_long + unistd/tstgetopt ++unistd/tst-posix_fallocate ++unistd/tst-posix_fallocate64 + unistd/tst-preadwrite + unistd/tst-preadwrite64 + unistd/vfork +--- a/test/unistd/Makefile.in ++++ b/test/unistd/Makefile.in +@@ -2,7 +2,10 @@ + # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + + ifeq ($(UCLIBC_HAS_LFS),) +-TESTS_DISABLED := tst-preadwrite64 ++TESTS_DISABLED := tst-preadwrite64 tst-posix_fallocate64 ++endif ++ifeq ($(UCLIBC_HAS_ADVANCED_REALTIME),) ++TESTS_DISABLED := tst-posix_fallocate + endif + OPTS_getopt := -abcXXX -9 + OPTS_getopt_long := --add XXX --delete YYY --verbose +--- /dev/null ++++ b/test/unistd/tst-posix_fallocate.c +@@ -0,0 +1,127 @@ ++#include ++#include ++ ++#ifndef TST_POSIX_FALLOCATE64 ++# define stat64 stat ++# define fstat64 fstat ++# else ++# ifndef O_LARGEFILE ++# error no O_LARGEFILE but you want to test with LFS enabled ++# endif ++#endif ++ ++static void do_prepare (void); ++#define PREPARE(argc, argv) do_prepare () ++static int do_test (void); ++#define TEST_FUNCTION do_test () ++#include ++ ++static int fd; ++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); ++ } ++} ++ ++ ++static int ++do_test (void) ++{ ++ struct stat64 st; ++ ++ if (fstat64 (fd, &st) != 0) ++ { ++ puts ("1st fstat failed"); ++ return 1; ++ } ++ ++ 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 1st 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 2nd 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 3rd posix_fallocate call is %llu, expected %u\n", ++ (unsigned long long int) st.st_size, 2048u + 64u); ++ return 1; ++ } ++#ifdef TST_POSIX_FALLOCATE64 ++ if (posix_fallocate64 (fd, 4097ULL, 4294967295ULL + 2ULL) != 0) ++ { ++ puts ("4th posix_fallocate call failed"); ++ return 1; ++ } ++ ++ if (fstat64 (fd, &st) != 0) ++ { ++ puts ("5th fstat failed"); ++ return 1; ++ } ++ ++ if (st.st_size != 4097ULL + 4294967295ULL + 2ULL) ++ { ++ printf ("file size after 4th posix_fallocate call is %llu, expected %llu\n", ++ (unsigned long long int) st.st_size, 4097ULL + 4294967295ULL + 2ULL); ++ return 1; ++ } ++#endif ++ close (fd); ++ ++ return 0; ++} +--- /dev/null ++++ b/test/unistd/tst-posix_fallocate64.c +@@ -0,0 +1,2 @@ ++#define TST_POSIX_FALLOCATE64 ++#include "tst-posix_fallocate.c" diff --git a/toolchain/uClibc/patches-0.9.33.2/023-libc-add-fallocate-and-fallocate64.patch b/toolchain/uClibc/patches-0.9.33.2/023-libc-add-fallocate-and-fallocate64.patch new file mode 100644 index 0000000000..282b64f52e --- /dev/null +++ b/toolchain/uClibc/patches-0.9.33.2/023-libc-add-fallocate-and-fallocate64.patch @@ -0,0 +1,447 @@ +From: "Anthony G. Basile" +Date: Sun, 7 Sep 2014 15:33:46 -0400 +Subject: [PATCH] libc: add fallocate() and fallocate64() + +We add the Linux-specific function fallocate() which allows the user to +directly manipulate allocate space for a file. fallocate() can operate +in different modes, but the default mode is equivalent to posix_fallocate() +which is specified in POSIX.1. + +Recent releases of e2fsprogs 1.42.11 and above expect fallocate64() to be +available. + +Signed-off-by: Anthony G. Basile +Signed-off-by: Bernhard Reutner-Fischer +--- + create mode 100644 libc/sysdeps/linux/common/fallocate.c + create mode 100644 libc/sysdeps/linux/common/fallocate64.c + create mode 100644 test/unistd/tst-fallocate.c + create mode 100644 test/unistd/tst-fallocate64.c + +--- a/extra/Configs/Config.in ++++ b/extra/Configs/Config.in +@@ -952,8 +952,8 @@ config UCLIBC_LINUX_SPECIFIC + default y + help + accept4(), bdflush(), +- capget(), capset(), eventfd(), fstatfs(), +- inotify_*(), ioperm(), iopl(), ++ capget(), capset(), eventfd(), fallocate(), ++ fstatfs(), inotify_*(), ioperm(), iopl(), + madvise(), modify_ldt(), pipe2(), personality(), + prctl()/arch_prctl(), pivot_root(), modify_ldt(), + ppoll(), readahead(), reboot(), remap_file_pages(), +--- a/include/fcntl.h ++++ b/include/fcntl.h +@@ -237,6 +237,38 @@ extern int __fcntl_nocancel (int fd, int + libc_hidden_proto(__fcntl_nocancel) + #endif + ++#if (defined __UCLIBC_LINUX_SPECIFIC__ && defined __USE_GNU) || defined _LIBC ++/* Reserve storage for the data of a file associated with FD. This function ++ is Linux-specific. For the portable version, use posix_fallocate(). ++ Unlike the latter, fallocate can operate in different modes. The default ++ mode = 0 is equivalent to posix_fallocate(). ++ ++ Note: These declarations are used in posix_fallocate.c and ++ posix_fallocate64.c, so we expose them internally. ++ */ ++ ++/* Flags for fallocate's mode. */ ++# define FALLOC_FL_KEEP_SIZE 1 /* Don't extend size of file ++ even if offset + len is ++ greater than file size. */ ++# define FALLOC_FL_PUNCH_HOLE 2 /* Create a hole in the file. */ ++ ++# ifndef __USE_FILE_OFFSET64 ++extern int fallocate (int __fd, int __mode, __off_t __offset, __off_t __len); ++# else ++# ifdef __REDIRECT ++extern int __REDIRECT (fallocate, (int __fd, int __mode, __off64_t __offset, ++ __off64_t __len), ++ fallocate64); ++# else ++# define fallocate fallocate64 ++# endif ++# endif ++# ifdef __USE_LARGEFILE64 ++extern int fallocate64 (int __fd, int __mode, __off64_t __offset, __off64_t __len); ++# endif ++#endif ++ + __END_DECLS + + #endif /* fcntl.h */ +--- a/libc/sysdeps/linux/common/Makefile.in ++++ b/libc/sysdeps/linux/common/Makefile.in +@@ -61,6 +61,10 @@ CSRC-$(UCLIBC_LINUX_SPECIFIC) += \ + vmsplice.c + CSRC-$(if $(findstring yy,$(UCLIBC_LINUX_SPECIFIC)$(UCLIBC_HAS_LFS)),y) += \ + sendfile64.c ++# posix_fallocate() needs __libc_fallocate() from fallocate.c ++# posix_fallocate64() needs __libc_fallocate64() from fallocate64.c ++CSRC-$(if $(UCLIBC_LINUX_SPECIFIC)$(UCLIBC_HAS_ADVANCED_REALTIME),y,) += \ ++ fallocate.c $(filter fallocate64.c,$(CSRC-y)) + # NPTL needs these internally: madvise.c + CSRC-$(findstring y,$(UCLIBC_LINUX_SPECIFIC)$(UCLIBC_HAS_THREADS_NATIVE)) += madvise.c + ifeq ($(UCLIBC_HAS_THREADS_NATIVE),y) +--- /dev/null ++++ b/libc/sysdeps/linux/common/fallocate.c +@@ -0,0 +1,48 @@ ++/* vi: set sw=4 ts=4: */ ++/* ++ * fallocate() for uClibc - Based off of posix_fallocate() by Erik Andersen ++ * http://www.opengroup.org/onlinepubs/9699919799/functions/posix_fallocate.html ++ * ++ * Copyright (C) 2000-2006 Erik Andersen ++ * ++ * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. ++ */ ++ ++#include ++#include ++#include ++#include ++ ++#if defined __NR_fallocate ++extern __typeof(fallocate) __libc_fallocate attribute_hidden; ++int attribute_hidden __libc_fallocate(int fd, int mode, __off_t offset, __off_t len) ++{ ++ int ret; ++ ++# if __WORDSIZE == 32 ++ uint32_t off_low = offset; ++ uint32_t len_low = len; ++ /* may assert that these >>31 are 0 */ ++ uint32_t zero = 0; ++ INTERNAL_SYSCALL_DECL(err); ++ ret = (int) (INTERNAL_SYSCALL(fallocate, err, 6, fd, mode, ++ __LONG_LONG_PAIR (zero, off_low), ++ __LONG_LONG_PAIR (zero, len_low))); ++# elif __WORDSIZE == 64 ++ INTERNAL_SYSCALL_DECL(err); ++ ret = (int) (INTERNAL_SYSCALL(fallocate, err, 4, fd, mode, offset, len)); ++# else ++# error your machine is neither 32 bit or 64 bit ... it must be magical ++# endif ++ if (unlikely(INTERNAL_SYSCALL_ERROR_P (ret, err))) ++ return INTERNAL_SYSCALL_ERRNO (ret, err); ++ return 0; ++} ++ ++# if defined __UCLIBC_LINUX_SPECIFIC__ && defined __USE_GNU ++strong_alias(__libc_fallocate,fallocate) ++# if __WORDSIZE == 64 ++strong_alias(__libc_fallocate,fallocate64) ++# endif ++# endif ++#endif +--- /dev/null ++++ b/libc/sysdeps/linux/common/fallocate64.c +@@ -0,0 +1,42 @@ ++/* vi: set sw=4 ts=4: */ ++/* ++ * fallocate() for uClibc - based off posix_fallocate() by Erik Andersen ++ * http://www.opengroup.org/onlinepubs/9699919799/functions/posix_fallocate.html ++ * ++ * Copyright (C) 2000-2006 Erik Andersen ++ * ++ * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. ++ */ ++ ++#include ++ ++#include ++#include ++#include ++ ++#if defined __NR_fallocate ++ ++# if __WORDSIZE == 64 ++/* Can use normal fallocate() */ ++# elif __WORDSIZE == 32 ++extern __typeof(fallocate64) __libc_fallocate64 attribute_hidden; ++int attribute_hidden __libc_fallocate64(int fd, int mode, __off64_t offset, ++ __off64_t len) ++{ ++ int ret; ++ INTERNAL_SYSCALL_DECL(err); ++ ret = (int) (INTERNAL_SYSCALL(fallocate, err, 6, fd, mode, ++ OFF64_HI_LO (offset), OFF64_HI_LO (len))); ++ if (unlikely(INTERNAL_SYSCALL_ERROR_P (ret, err))) ++ return INTERNAL_SYSCALL_ERRNO (ret, err); ++ return 0; ++} ++ ++# if defined __UCLIBC_LINUX_SPECIFIC__ && defined __USE_GNU ++strong_alias(__libc_fallocate64,fallocate64) ++# endif ++ ++# else ++# error your machine is neither 32 bit or 64 bit ... it must be magical ++# endif ++#endif +--- a/libc/sysdeps/linux/common/posix_fallocate.c ++++ b/libc/sysdeps/linux/common/posix_fallocate.c +@@ -14,28 +14,10 @@ + #include + + #if defined __NR_fallocate ++extern __typeof(fallocate) __libc_fallocate attribute_hidden; + int posix_fallocate(int fd, __off_t offset, __off_t len) + { +- int ret; +- +-# if __WORDSIZE == 32 +- uint32_t off_low = offset; +- uint32_t len_low = len; +- /* may assert that these >>31 are 0 */ +- uint32_t zero = 0; +- INTERNAL_SYSCALL_DECL(err); +- ret = (int) (INTERNAL_SYSCALL(fallocate, err, 6, fd, 0, +- __LONG_LONG_PAIR (zero, off_low), +- __LONG_LONG_PAIR (zero, len_low))); +-# elif __WORDSIZE == 64 +- INTERNAL_SYSCALL_DECL(err); +- ret = (int) (INTERNAL_SYSCALL(fallocate, err, 4, fd, 0, offset, len)); +-# else +-# error your machine is neither 32 bit or 64 bit ... it must be magical +-#endif +- if (unlikely(INTERNAL_SYSCALL_ERROR_P (ret, err))) +- return INTERNAL_SYSCALL_ERRNO (ret, err); +- return 0; ++ return __libc_fallocate(fd, 0, offset, len); + } + # if defined __UCLIBC_HAS_LFS__ && __WORDSIZE == 64 + strong_alias(posix_fallocate,posix_fallocate64) +--- a/libc/sysdeps/linux/common/posix_fallocate64.c ++++ b/libc/sysdeps/linux/common/posix_fallocate64.c +@@ -18,22 +18,12 @@ + # if __WORDSIZE == 64 + /* Can use normal posix_fallocate() */ + # elif __WORDSIZE == 32 ++extern __typeof(fallocate64) __libc_fallocate64 attribute_hidden; + int posix_fallocate64(int fd, __off64_t offset, __off64_t len) + { +- int ret; +- uint32_t off_low = offset & 0xffffffff; +- uint32_t off_high = offset >> 32; +- uint32_t len_low = len & 0xffffffff; +- uint32_t len_high = len >> 32; +- INTERNAL_SYSCALL_DECL(err); +- ret = (int) (INTERNAL_SYSCALL(fallocate, err, 6, fd, 0, +- __LONG_LONG_PAIR (off_high, off_low), +- __LONG_LONG_PAIR (len_high, len_low))); +- if (unlikely(INTERNAL_SYSCALL_ERROR_P (ret, err))) +- return INTERNAL_SYSCALL_ERRNO (ret, err); +- return 0; ++ return __libc_fallocate64(fd, 0, offset, len); + } + # else +-# error your machine is neither 32 bit or 64 bit ... it must be magical ++# error your machine is neither 32 bit or 64 bit ... it must be magical + # endif + #endif +--- a/test/.gitignore ++++ b/test/.gitignore +@@ -302,6 +302,8 @@ unistd/getcwd + unistd/getopt + unistd/getopt_long + unistd/tstgetopt ++unistd/tst-fallocate ++unistd/tst-fallocate64 + unistd/tst-posix_fallocate + unistd/tst-posix_fallocate64 + unistd/tst-preadwrite +--- /dev/null ++++ b/test/unistd/tst-fallocate.c +@@ -0,0 +1,166 @@ ++#include ++#include ++ ++#ifndef TST_FALLOCATE64 ++# define stat64 stat ++# define fstat64 fstat ++# else ++# ifndef O_LARGEFILE ++# error no O_LARGEFILE but you want to test with LFS enabled ++# endif ++#endif ++ ++static void do_prepare(void); ++static int do_test(void); ++#define PREPARE(argc, argv) do_prepare () ++#define TEST_FUNCTION do_test () ++#include ++ ++static int fd; ++static void ++do_prepare (void) ++{ ++ fd = create_temp_file ("tst-fallocate.", NULL); ++ if (fd == -1) ++ { ++ printf ("cannot create temporary file: %m\n"); ++ exit (1); ++ } ++} ++ ++ ++static int ++do_test (void) ++{ ++ struct stat64 st; ++ int c; ++ char garbage[4096]; ++ blkcnt_t blksb4; ++ ++ if (fstat64 (fd, &st) != 0) ++ { ++ puts ("1st fstat failed"); ++ return 1; ++ } ++ ++ if (st.st_size != 0) ++ { ++ puts ("file not created with size 0"); ++ return 1; ++ } ++ ++ /* This is the default mode which is identical to posix_fallocate(). ++ Note: we need a few extra blocks for FALLOC_FL_PUNCH_HOLE below. ++ While block sizes vary, we'll assume eight 4K blocks for good measure. */ ++ if (fallocate (fd, 0, 8 * 4096, 128) != 0) ++ { ++ puts ("1st fallocate call failed"); ++ return 1; ++ } ++ ++ if (fstat64 (fd, &st) != 0) ++ { ++ puts ("2nd fstat failed"); ++ return 1; ++ } ++ ++ if (st.st_size != 8 * 4096 + 128) ++ { ++ printf ("file size after 1st fallocate call is %llu, expected %u\n", ++ (unsigned long long int) st.st_size, 8u * 4096u + 128u); ++ return 1; ++ } ++ ++ /* Without FALLOC_FL_KEEP_SIZE, this would increaste the size of the file. */ ++ if (fallocate (fd, FALLOC_FL_KEEP_SIZE, 0, 16 * 4096) != 0) ++ { ++ puts ("2nd fallocate call failed"); ++ return 1; ++ } ++ ++ if (fstat64 (fd, &st) != 0) ++ { ++ puts ("3rd fstat failed"); ++ return 1; ++ } ++ ++ if (st.st_size != 8 * 4096 + 128) ++ { ++ printf ("file size changed in 2nd fallocate call to %llu, expected %u\n", ++ (unsigned long long int) st.st_size, 8u * 4096u + 128u); ++ return 1; ++ } ++ ++ /* Let's fill up the first eight 4k blocks with 'x' to force some allocations. */ ++ ++ memset(garbage, 'x', 4096); ++ for(c=0; c < 8; c++) ++ if(write(fd, garbage, 4096) == -1) ++ { ++ puts ("write failed"); ++ return 1; ++ } ++ ++ if (fstat64 (fd, &st) != 0) ++ { ++ puts ("4th fstat failed"); ++ return 1; ++ } ++ ++ blksb4 = st.st_blocks; ++ ++ /* Let's punch a hole in the entire file, turning it effectively into a sparse file. */ ++ if (fallocate (fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 8 * 4096 + 128) != 0) ++ { ++ puts ("3rd fallocate call failed"); ++ return 1; ++ } ++ ++ if (fstat64 (fd, &st) != 0) ++ { ++ puts ("5th fstat failed"); ++ return 1; ++ } ++ ++ if (st.st_size != 8 * 4096 + 128) ++ { ++ printf ("file size after 3rd fallocate call is %llu, expected %u\n", ++ (unsigned long long int) st.st_size, 8u * 4096u + 128u); ++ return 1; ++ } ++ ++ /* The number of allocated blocks should decrease. I hope this works on ++ all filesystems! */ ++ if (st.st_blocks >= blksb4) ++ { ++ printf ("number of blocks after 3rd fallocate call is %lu, expected less than %lu\n", ++ (unsigned long int) st.st_blocks, blksb4); ++ return 1; ++ } ++ ++#ifdef TST_FALLOCATE64 ++ /* We'll just do a mode = 0 test for fallocate64() */ ++ if (fallocate64 (fd, 0, 4097ULL, 4294967295ULL + 2ULL) != 0) ++ { ++ puts ("1st fallocate64 call failed"); ++ return 1; ++ } ++ ++ if (fstat64 (fd, &st) != 0) ++ { ++ puts ("6th fstat failed"); ++ return 1; ++ } ++ ++ if (st.st_size != 4097ULL + 4294967295ULL + 2ULL) ++ { ++ printf ("file size after 1st fallocate64 call is %llu, expected %llu\n", ++ (unsigned long long int) st.st_size, 4097ULL + 4294967295ULL + 2ULL); ++ return 1; ++ } ++#endif ++ close (fd); ++ ++ return 0; ++} ++ +--- /dev/null ++++ b/test/unistd/tst-fallocate64.c +@@ -0,0 +1,2 @@ ++#define TST_FALLOCATE64 ++#include "tst-fallocate.c" +--- a/test/unistd/Makefile.in ++++ b/test/unistd/Makefile.in +@@ -2,10 +2,13 @@ + # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + + ifeq ($(UCLIBC_HAS_LFS),) +-TESTS_DISABLED := tst-preadwrite64 tst-posix_fallocate64 ++TESTS_DISABLED := tst-preadwrite64 tst-posix_fallocate64 tst-fallocate64 + endif + ifeq ($(UCLIBC_HAS_ADVANCED_REALTIME),) +-TESTS_DISABLED := tst-posix_fallocate ++TESTS_DISABLED := tst-posix_fallocate tst-fallocate64 ++endif ++ifeq ($(UCLIBC_LINUX_SPECIFIC),) ++TESTS_DISABLED += tst-fallocate + endif + OPTS_getopt := -abcXXX -9 + OPTS_getopt_long := --add XXX --delete YYY --verbose