From: "Anthony G. Basile" <[email protected]> We add the Linux-specific system call fallocate() which allows the user to directly manipulate allocate space for a file. The default operation is equivalent to posix_fallocate() which is specified in POSIX.1. However, recent releases of e2fsprogs 1.42.11 and above expect fallocate() to be available.
Signed-off-by: Anthony G. Basile <[email protected]> --- extra/Configs/Config.in | 1 + include/fcntl.h | 14 ++++++++ libc/sysdeps/linux/common/Makefile.in | 4 +-- libc/sysdeps/linux/common/fallocate.c | 51 +++++++++++++++++++++++++++ libc/sysdeps/linux/common/fallocate64.c | 44 +++++++++++++++++++++++ libc/sysdeps/linux/common/posix_fallocate.c | 21 +---------- libc/sysdeps/linux/common/posix_fallocate64.c | 8 +---- 7 files changed, 114 insertions(+), 29 deletions(-) create mode 100644 libc/sysdeps/linux/common/fallocate.c create mode 100644 libc/sysdeps/linux/common/fallocate64.c diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in index 7789002..b22ffc7 100644 --- a/extra/Configs/Config.in +++ b/extra/Configs/Config.in @@ -1155,6 +1155,7 @@ config UCLIBC_HAS_ADVANCED_REALTIME clock_getcpuclockid() clock_nanosleep() + fallocate() mq_timedreceive() mq_timedsend() posix_fadvise() diff --git a/include/fcntl.h b/include/fcntl.h index c749ad5..c46cdc0 100644 --- a/include/fcntl.h +++ b/include/fcntl.h @@ -225,17 +225,31 @@ extern int posix_fadvise64 (int __fd, __off64_t __offset, __off64_t __len, marked with __THROW. */ # ifndef __USE_FILE_OFFSET64 extern int posix_fallocate (int __fd, __off_t __offset, __off_t __len); +# ifdef __USE_GNU +extern int fallocate (int __fd, int __mode, __off_t __offset, __off_t __len); +# endif # else # ifdef __REDIRECT extern int __REDIRECT (posix_fallocate, (int __fd, __off64_t __offset, __off64_t __len), posix_fallocate64); +# ifdef __USE_GNU +extern int __REDIRECT (fallocate, (int __fd, int __mode, __off64_t __offset, + __off64_t __len), + fallocate64); +# endif # else # define posix_fallocate posix_fallocate64 +# ifdef __USE_GNU +# define fallocate fallocate64 +# endif # endif # endif # ifdef __USE_LARGEFILE64 extern int posix_fallocate64 (int __fd, __off64_t __offset, __off64_t __len); +# ifdef __USE_GNU +extern int fallocate64 (int __fd, int __mode, __off64_t __offset, __off64_t __len); +# endif # endif #endif diff --git a/libc/sysdeps/linux/common/Makefile.in b/libc/sysdeps/linux/common/Makefile.in index 13dd77b..b0f1bde 100644 --- a/libc/sysdeps/linux/common/Makefile.in +++ b/libc/sysdeps/linux/common/Makefile.in @@ -86,9 +86,9 @@ CSRC-$(UCLIBC_HAS_REALTIME) += clock_adjtime.c clock_getres.c clock_gettime.c cl nanosleep.c __rt_sigtimedwait.c __rt_sigwaitinfo.c sched_getparam.c \ 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_typ ed_mem_g et_info|pthread_mutex_timedlock|sem_timedwait +# clock_getcpuclockid|clock_nanosleep|mq_timedreceive|mq_timedsend|posix_fadvise|posix_fallocate|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_t yped_mem_get_info|pthread_mutex_timedlock|sem_timedwait CSRC-$(UCLIBC_HAS_ADVANCED_REALTIME) += posix_fadvise64.c posix_fadvise.c posix_madvise.c \ - posix_fallocate.c posix_fallocate64.c + posix_fallocate.c posix_fallocate64.c fallocate.c fallocate64.c CSRC-$(UCLIBC_SUSV4_LEGACY) += utime.c CSRC-$(UCLIBC_HAS_EPOLL) += epoll.c CSRC-$(UCLIBC_HAS_XATTR) += xattr.c diff --git a/libc/sysdeps/linux/common/fallocate.c b/libc/sysdeps/linux/common/fallocate.c new file mode 100644 index 0000000..4f37265 --- /dev/null +++ b/libc/sysdeps/linux/common/fallocate.c @@ -0,0 +1,51 @@ +/* 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 <[email protected]> + * + * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. + */ + +#include <sys/syscall.h> +#include <fcntl.h> +#include <bits/kernel-features.h> +#include <stdint.h> + +#if defined __NR_fallocate +int attribute_hidden _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 __USE_GNU +int fallocate(int fd, int mode, __off_t offset, __off_t len) +{ + return _fallocate(fd, mode, offset, len); +} +# if defined __UCLIBC_HAS_LFS__ && __WORDSIZE == 64 +strong_alias(fallocate,fallocate64) +# endif +# endif + +#endif diff --git a/libc/sysdeps/linux/common/fallocate64.c b/libc/sysdeps/linux/common/fallocate64.c new file mode 100644 index 0000000..9dc0234 --- /dev/null +++ b/libc/sysdeps/linux/common/fallocate64.c @@ -0,0 +1,44 @@ +/* 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 <[email protected]> + * + * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. + */ + +#include <sys/syscall.h> + +#include <fcntl.h> +#include <bits/kernel-features.h> +#include <stdint.h> + +#if defined __NR_fallocate + +# if __WORDSIZE == 64 +/* Can use normal fallocate() */ +# elif __WORDSIZE == 32 +int attribute_hidden _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 __USE_GNU +int fallocate64(int fd, int mode, __off64_t offset, __off64_t len) +{ + return _fallocate64(fd, mode, offset, len); +} +# endif + +# else +# error your machine is neither 32 bit or 64 bit ... it must be magical +# endif +#endif + diff --git a/libc/sysdeps/linux/common/posix_fallocate.c b/libc/sysdeps/linux/common/posix_fallocate.c index 9aaa6ce..0da9267 100644 --- a/libc/sysdeps/linux/common/posix_fallocate.c +++ b/libc/sysdeps/linux/common/posix_fallocate.c @@ -16,26 +16,7 @@ #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; + return _fallocate(fd, 0, offset, len); } # if defined __UCLIBC_HAS_LFS__ && __WORDSIZE == 64 strong_alias(posix_fallocate,posix_fallocate64) diff --git a/libc/sysdeps/linux/common/posix_fallocate64.c b/libc/sysdeps/linux/common/posix_fallocate64.c index 76dc9b8..f003a57 100644 --- a/libc/sysdeps/linux/common/posix_fallocate64.c +++ b/libc/sysdeps/linux/common/posix_fallocate64.c @@ -20,13 +20,7 @@ # elif __WORDSIZE == 32 int posix_fallocate64(int fd, __off64_t offset, __off64_t len) { - int ret; - INTERNAL_SYSCALL_DECL(err); - ret = (int) (INTERNAL_SYSCALL(fallocate, err, 6, fd, 0, - OFF64_HI_LO (offset), OFF64_HI_LO (len))); - if (unlikely(INTERNAL_SYSCALL_ERROR_P (ret, err))) - return INTERNAL_SYSCALL_ERRNO (ret, err); - return 0; + return _fallocate64(fd, 0, offset, len); } # else # error your machine is neither 32 bit or 64 bit ... it must be magical -- 1.8.5.5 _______________________________________________ uClibc mailing list [email protected] http://lists.busybox.net/mailman/listinfo/uclibc
