[PATCH libaio v3 9/9] Add time64 public functions on 32-bit architectures

Guillem Jover <[email protected]> Wed, 17 Jun 2026 03:31:00 +0200
Newsgroups gmane.linux.kernel.aio.general
Message-ID <[email protected]>
From: Guillem Jover <[email protected]>

This adds new time64 functions for io_getevents() and io_pgetevents()
that will get redirected when building with _TIME_BITS=64.

Ideally we should generate the .map file and not include these symbols
on 64-bit architectures, but this will do for now.

Signed-off-by: Guillem Jover <[email protected]>
---
 harness/Makefile                               |  2 +-
 src/Makefile                                   |  3 ++-
 src/compat-0_1.c                               |  7 +++++++
 src/io_getevents.c                             |  7 +++++++
 src/{io_getevents.c => io_getevents_time64.c}  |  8 ++++----
 src/io_pgetevents.c                            |  7 +++++++
 ...{io_pgetevents.c => io_pgetevents_time64.c} |  4 +++-
 src/io_queue_wait.c                            |  7 +++++++
 src/libaio.h                                   | 18 ++++++++++++++++++
 src/libaio.map                                 |  6 ++++++
 10 files changed, 62 insertions(+), 7 deletions(-)
 copy src/{io_getevents.c => io_getevents_time64.c} (90%)
 copy src/{io_pgetevents.c => io_pgetevents_time64.c} (92%)

diff --git a/harness/Makefile b/harness/Makefile
index 4f225d3..470d46e 100644
--- a/harness/Makefile
+++ b/harness/Makefile
@@ -6,7 +6,7 @@ PROGS:=$(PARTPROGS) $(EXTRAPROGS)
 HARNESS_SRCS:=main.c
 # io_queue.c
 
-CFLAGS+=-Wall -Werror -I../src -g -O2
+CFLAGS+=-Wall -Werror -I../src -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 -g -O2
 #-lpthread -lrt
 
 # gcc-11 does not like the test case in 3.t that
diff --git a/src/Makefile b/src/Makefile
index 7e56172..13618a6 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -3,7 +3,7 @@ includedir=$(prefix)/include
 libdir=$(prefix)/lib
 
 CFLAGS ?= -g -fomit-frame-pointer -O2
-CFLAGS += -Wall -I. -fPIC
+CFLAGS += -Wall -I. -fPIC -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64
 SO_CFLAGS=-shared $(CFLAGS)
 L_CFLAGS=$(CFLAGS)
 LINK_FLAGS=
@@ -30,6 +30,7 @@ libaio_srcs += io_queue_wait.c io_queue_run.c
 libaio_srcs += aio_pgetevents.c aio_getevents.c
 libaio_srcs += io_getevents.c io_submit.c io_cancel.c
 libaio_srcs += io_setup.c io_destroy.c io_pgetevents.c
+libaio_srcs += io_pgetevents_time64.c io_getevents_time64.c
 
 # old symbols
 libaio_srcs += compat-0_1.c
diff --git a/src/compat-0_1.c b/src/compat-0_1.c
index 25b789a..61df3b3 100644
--- a/src/compat-0_1.c
+++ b/src/compat-0_1.c
@@ -19,6 +19,13 @@
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
  */
+
+/*
+ * On 32-bit systems these were using 32-bit struct timespec, keep these
+ * backward compatibility functions that way.
+ */
+#undef _TIME_BITS
+
 #include <stdlib.h>
 #include <asm/errno.h>
 
diff --git a/src/io_getevents.c b/src/io_getevents.c
index f3eaaed..88a95dc 100644
--- a/src/io_getevents.c
+++ b/src/io_getevents.c
@@ -17,6 +17,13 @@
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
  */
+
+/*
+ * On 32-bit systems these were using 32-bit struct timespec, keep this
+ * backward compatibility function that way.
+ */
+#undef _TIME_BITS
+
 #include <libaio.h>
 #include <errno.h>
 #include <stdlib.h>
diff --git a/src/io_getevents.c b/src/io_getevents_time64.c
similarity index 90%
copy from src/io_getevents.c
copy to src/io_getevents_time64.c
index f3eaaed..942743d 100644
--- a/src/io_getevents.c
+++ b/src/io_getevents_time64.c
@@ -1,4 +1,4 @@
-/* io_getevents.c
+/* io_getevents_time64.c
    libaio Linux async I/O interface
    Copyright 2002 Red Hat, Inc.
    Copyright 2024 Guillem Jover <[email protected]>
@@ -24,7 +24,8 @@
 #include "syscall.h"
 #include "aio_time.h"
 
-int io_getevents_0_4(io_context_t ctx, long min_nr, long nr,
+#if __BITS_PER_LONG == 32
+int io_getevents_time64(io_context_t ctx, long min_nr, long nr,
 		struct io_event * events, struct timespec * timeout)
 {
 	struct __kernel_timespec kts;
@@ -33,5 +34,4 @@ int io_getevents_0_4(io_context_t ctx, long min_nr, long nr,
 		aio_get_timespec(&kts, timeout);
 	return aio_getevents(ctx, min_nr, nr, events, timeout ? &kts : NULL);
 }
-
-DEFSYMVER(io_getevents_0_4, io_getevents, 0.4);
+#endif
diff --git a/src/io_pgetevents.c b/src/io_pgetevents.c
index ca821a9..2d98e90 100644
--- a/src/io_pgetevents.c
+++ b/src/io_pgetevents.c
@@ -17,6 +17,13 @@
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
  */
+
+/*
+ * On 32-bit systems these were using 32-bit struct timespec, keep this
+ * backward compatibility function that way.
+ */
+#undef _TIME_BITS
+
 #include <libaio.h>
 #include <errno.h>
 #include <stdlib.h>
diff --git a/src/io_pgetevents.c b/src/io_pgetevents_time64.c
similarity index 92%
copy from src/io_pgetevents.c
copy to src/io_pgetevents_time64.c
index ca821a9..55e4ad1 100644
--- a/src/io_pgetevents.c
+++ b/src/io_pgetevents_time64.c
@@ -24,7 +24,8 @@
 #include <signal.h>
 #include "aio_time.h"
 
-int io_pgetevents(io_context_t ctx, long min_nr, long nr,
+#if __BITS_PER_LONG == 32
+int io_pgetevents_time64(io_context_t ctx, long min_nr, long nr,
 		struct io_event *events, struct timespec *timeout,
 		sigset_t *sigmask)
 {
@@ -35,3 +36,4 @@ int io_pgetevents(io_context_t ctx, long min_nr, long nr,
 	return aio_pgetevents(ctx, min_nr, nr, events, timeout ? &kts : NULL,
 			sigmask);
 }
+#endif
diff --git a/src/io_queue_wait.c b/src/io_queue_wait.c
index e4e223c..e61b208 100644
--- a/src/io_queue_wait.c
+++ b/src/io_queue_wait.c
@@ -17,6 +17,13 @@
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
  */
+
+/*
+ * On 32-bit systems these were using 32-bit struct timespec, keep this
+ * backward compatibility function that way.
+ */
+#undef _TIME_BITS
+
 #define NO_SYSCALL_ERRNO
 #include <sys/types.h>
 #include <libaio.h>
diff --git a/src/libaio.h b/src/libaio.h
index f247c96..8198047 100644
--- a/src/libaio.h
+++ b/src/libaio.h
@@ -27,6 +27,7 @@
 extern "C" {
 #endif
 
+#include <linux/types.h>
 #include <sys/types.h>
 #include <string.h>
 #include <signal.h>
@@ -50,6 +51,12 @@ typedef enum io_iocb_cmd {
 	IO_CMD_PWRITEV = 8,
 } io_iocb_cmd_t;
 
+#define LIBAIO_STRING(x) #x
+
+#define LIBAIO_REDIRECT(name, proto, alias) name proto __asm__(LIBAIO_ASMNAME(#alias))
+#define LIBAIO_ASMNAME(cname) LIBAIO_ASMNAME_PREFIX(__USER_LABEL_PREFIX__, cname)
+#define LIBAIO_ASMNAME_PREFIX(prefix, cname) LIBAIO_STRING(prefix) cname
+
 /* little endian, 32 bits */
 #if defined(__i386__) || (defined(__arm__) && !defined(__ARMEB__)) || \
     defined(__sh__) || defined(__bfin__) || defined(__MIPSEL__) || \
@@ -170,6 +177,17 @@ extern int io_getevents(io_context_t ctx, long min_nr, long nr,
 extern int io_pgetevents(io_context_t ctx, long min_nr, long nr,
 		struct io_event *events, struct timespec *timeout,
 		sigset_t *sigmask);
+#if __BITS_PER_LONG == 32 && defined(_TIME_BITS) && _TIME_BITS == 64
+extern int LIBAIO_REDIRECT(io_getevents, (io_context_t ctx,
+		long min_nr, long nr,
+		struct io_event *events, struct timespec *timeout),
+		io_getevents_time64);
+extern int LIBAIO_REDIRECT(io_pgetevents, (io_context_t ctx,
+		long min_nr, long nr,
+		struct io_event *events, struct timespec *timeout,
+		sigset_t *sigmask),
+		io_pgetevents_time64);
+#endif
 
 
 static inline void io_set_callback(struct iocb *iocb, io_callback_t cb)
diff --git a/src/libaio.map b/src/libaio.map
index ec9d13b..74b2c08 100644
--- a/src/libaio.map
+++ b/src/libaio.map
@@ -25,3 +25,9 @@ LIBAIO_0.5 {
 	global:
 		io_pgetevents;
 } LIBAIO_0.4;
+
+LIBAIO_0.6 {
+	global:
+		io_getevents_time64;
+		io_pgetevents_time64;
+} LIBAIO_0.5;
-- 
2.53.0


--
To unsubscribe, send a message with 'unsubscribe linux-aio' in
the body to [email protected].  For more info on Linux AIO,
see: http://www.kvack.org/aio/
Don't email: <a href=mailto:"[email protected]">[email protected]</a>