On Wed, 6 Nov 2024 17:54:15 +1100
David Gibson <david(a)gibson.dropbear.id.au> wrote:
log.c has several #ifdefs on
FALLOC_FL_COLLAPSE_RANGE that won't attempt
to use it if not defined. But even if the value is defined at compile
time, it might not be available in the runtime kernel, so we need to check
for errors from a fallocate() call and fall back to other methods.
Simplify this to only need the runtime check by using linux_dep.h to define
FALLOC_FL_COLLAPSE_RANGE if it's not in the kernel headers.
Signed-off-by: David Gibson <david(a)gibson.dropbear.id.au>
---
Makefile | 5 -----
linux_dep.h | 6 ++++++
log.c | 9 +--------
3 files changed, 7 insertions(+), 13 deletions(-)
diff --git a/Makefile b/Makefile
index 56bf2e8..cb91535 100644
--- a/Makefile
+++ b/Makefile
@@ -59,11 +59,6 @@ ifeq ($(shell :|$(CC) -fstack-protector-strong -S -xc - -o -
>/dev/null 2>&1; ec
FLAGS += -fstack-protector-strong
endif
-C := \#define _GNU_SOURCE\n\#include <fcntl.h>\nint x = FALLOC_FL_COLLAPSE_RANGE;
-ifeq ($(shell printf "$(C)" | $(CC) -S -xc - -o - >/dev/null 2>&1;
echo $$?),0)
- EXTRA_SYSCALLS += fallocate
-endif
-
prefix ?= /usr/local
exec_prefix ?= $(prefix)
bindir ?= $(exec_prefix)/bin
diff --git a/linux_dep.h b/linux_dep.h
index 8921623..eae9c3c 100644
--- a/linux_dep.h
+++ b/linux_dep.h
@@ -119,4 +119,10 @@ struct tcp_info_linux {
*/
};
+#include <linux/falloc.h>
+
+#ifndef FALLOC_FL_COLLAPSE_RANGE
+#define FALLOC_FL_COLLAPSE_RANGE 0x08
+#endif
+
#endif /* LINUX_DEP_H */
diff --git a/log.c b/log.c
index 19f1d98..3c1b39c 100644
--- a/log.c
+++ b/log.c
@@ -92,7 +92,6 @@ const char *logfile_prefix[] = {
" ", /* LOG_DEBUG */
};
-#ifdef FALLOC_FL_COLLAPSE_RANGE
This breaks the build on Alpine (and I suppose on Void Linux too, that
is, whenever we build against musl):
log.c: In function 'logfile_rotate':
log.c:207:28: error: 'FALLOC_FL_COLLAPSE_RANGE' undeclared (first use in this
function)
207 | if (!fallocate(fd, FALLOC_FL_COLLAPSE_RANGE, 0, log_cut_size))
| ^~~~~~~~~~~~~~~~~~~~~~~~
log.c:207:28: note: each undeclared identifier is reported only once for each function it
appears in
and it's fixed by including linux_dep.h from log.c.
Oops, that was careless. Fixed for the next spin.
--
David Gibson (he or they) | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you, not the other way
| around.