Merge branch 'issue25'

* issue25:
  Add test case for commit 7ad0e4b2f83c
  Fix flush/submit with internal timeout

Fixes: https://github.com/axboe/liburing/issues/25
Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/src/include/liburing.h b/src/include/liburing.h
index 7ee7b28..2923fce 100644
--- a/src/include/liburing.h
+++ b/src/include/liburing.h
@@ -61,15 +61,6 @@
 };
 
 /*
- * System calls
- */
-extern int io_uring_setup(unsigned entries, struct io_uring_params *p);
-extern int io_uring_enter(unsigned fd, unsigned to_submit,
-	unsigned min_complete, unsigned flags, sigset_t *sig);
-extern int io_uring_register(int fd, unsigned int opcode, const void *arg,
-	unsigned int nr_args);
-
-/*
  * Library interface
  */
 extern int io_uring_queue_init_params(unsigned entries, struct io_uring *ring,
diff --git a/src/liburing.map b/src/liburing.map
index 2c071d6..8f89e20 100644
--- a/src/liburing.map
+++ b/src/liburing.map
@@ -20,7 +20,6 @@
 		io_uring_unregister_eventfd;
 	local:
 		*;
-
 };
 
 LIBURING_0.2 {
@@ -34,3 +33,39 @@
 		io_uring_queue_init_params;
 		io_uring_register_files_update;
 } LIBURING_0.1;
+
+LIBURING_0.3 {
+	global:
+		io_uring_queue_init;
+		io_uring_queue_mmap;
+		io_uring_queue_exit;
+		io_uring_peek_cqe;
+		io_uring_wait_cqe;
+		io_uring_submit;
+		io_uring_submit_and_wait;
+		io_uring_get_sqe;
+		io_uring_register;
+		io_uring_setup;
+		io_uring_enter;
+		io_uring_mmap;
+		io_uring_register_buffers;
+		io_uring_unregister_buffers;
+		io_uring_register_files;
+		io_uring_unregister_files;
+		io_uring_register_eventfd;
+		io_uring_unregister_eventfd;
+
+		io_uring_peek_batch_cqe;
+		io_uring_wait_cqe_timeout;
+		io_uring_wait_cqes;
+
+		__io_uring_get_cqe;
+
+		io_uring_queue_init_params;
+		io_uring_register_files_update;
+	local:
+		__sys_io_uring_setup;
+		__sys_io_uring_enter;
+		__sys_io_uring_register;
+		*;
+};
diff --git a/src/queue.c b/src/queue.c
index 6a96594..77d5b12 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -11,6 +11,8 @@
 #include "liburing.h"
 #include "liburing/barrier.h"
 
+#include "syscall.h"
+
 /*
  * Returns true if we're not using SQ thread (thus nobody submits but us)
  * or if IORING_SQ_NEED_WAKEUP is set, so submit thread must be explicitly
@@ -48,8 +50,8 @@
 		if (submit)
 			sq_ring_needs_enter(ring, &flags);
 		if (wait_nr || submit)
-			ret = io_uring_enter(ring->ring_fd, submit, wait_nr,
-						flags, sigmask);
+			ret = __sys_io_uring_enter(ring->ring_fd, submit,
+						   wait_nr, flags, sigmask);
 		if (ret < 0)
 			err = -errno;
 		submit -= ret;
@@ -190,8 +192,8 @@
 		if (wait_nr)
 			flags |= IORING_ENTER_GETEVENTS;
 
-		ret = io_uring_enter(ring->ring_fd, submitted, wait_nr, flags,
-					NULL);
+		ret = __sys_io_uring_enter(ring->ring_fd, submitted, wait_nr,
+						flags, NULL);
 		if (ret < 0)
 			return -errno;
 	} else
diff --git a/src/register.c b/src/register.c
index 858f787..a8ec27a 100644
--- a/src/register.c
+++ b/src/register.c
@@ -9,13 +9,15 @@
 #include "liburing/io_uring.h"
 #include "liburing.h"
 
+#include "syscall.h"
+
 int io_uring_register_buffers(struct io_uring *ring, const struct iovec *iovecs,
 			      unsigned nr_iovecs)
 {
 	int ret;
 
-	ret = io_uring_register(ring->ring_fd, IORING_REGISTER_BUFFERS,
-				iovecs, nr_iovecs);
+	ret = __sys_io_uring_register(ring->ring_fd, IORING_REGISTER_BUFFERS,
+					iovecs, nr_iovecs);
 	if (ret < 0)
 		return -errno;
 
@@ -26,8 +28,8 @@
 {
 	int ret;
 
-	ret = io_uring_register(ring->ring_fd, IORING_UNREGISTER_BUFFERS, NULL,
-				0);
+	ret = __sys_io_uring_register(ring->ring_fd, IORING_UNREGISTER_BUFFERS,
+					NULL, 0);
 	if (ret < 0)
 		return -errno;
 
@@ -50,8 +52,9 @@
 	};
 	int ret;
 
-	ret = io_uring_register(ring->ring_fd, IORING_REGISTER_FILES_UPDATE,
-				&up, nr_files);
+	ret = __sys_io_uring_register(ring->ring_fd,
+					IORING_REGISTER_FILES_UPDATE, &up,
+					nr_files);
 	if (ret < 0)
 		return -errno;
 
@@ -63,8 +66,8 @@
 {
 	int ret;
 
-	ret = io_uring_register(ring->ring_fd, IORING_REGISTER_FILES, files,
-				nr_files);
+	ret = __sys_io_uring_register(ring->ring_fd, IORING_REGISTER_FILES,
+					files, nr_files);
 	if (ret < 0)
 		return -errno;
 
@@ -75,8 +78,8 @@
 {
 	int ret;
 
-	ret = io_uring_register(ring->ring_fd, IORING_UNREGISTER_FILES, NULL,
-				0);
+	ret = __sys_io_uring_register(ring->ring_fd, IORING_UNREGISTER_FILES,
+					NULL, 0);
 	if (ret < 0)
 		return -errno;
 
@@ -87,8 +90,8 @@
 {
 	int ret;
 
-	ret = io_uring_register(ring->ring_fd, IORING_REGISTER_EVENTFD,
-				&event_fd, 1);
+	ret = __sys_io_uring_register(ring->ring_fd, IORING_REGISTER_EVENTFD,
+					&event_fd, 1);
 	if (ret < 0)
 		return -errno;
 
@@ -99,8 +102,8 @@
 {
 	int ret;
 
-	ret = io_uring_register(ring->ring_fd, IORING_UNREGISTER_EVENTFD, NULL,
-				0);
+	ret = __sys_io_uring_register(ring->ring_fd, IORING_UNREGISTER_EVENTFD,
+					NULL, 0);
 	if (ret < 0)
 		return -errno;
 
diff --git a/src/setup.c b/src/setup.c
index a52071b..550c0de 100644
--- a/src/setup.c
+++ b/src/setup.c
@@ -9,6 +9,8 @@
 #include "liburing/io_uring.h"
 #include "liburing.h"
 
+#include "syscall.h"
+
 static void io_uring_unmap_rings(struct io_uring_sq *sq, struct io_uring_cq *cq)
 {
 	munmap(sq->ring_ptr, sq->ring_sz);
@@ -99,7 +101,7 @@
 {
 	int fd, ret;
 
-	fd = io_uring_setup(entries, p);
+	fd = __sys_io_uring_setup(entries, p);
 	if (fd < 0)
 		return -errno;
 
diff --git a/src/syscall.c b/src/syscall.c
index 3fd8713..3bb5575 100644
--- a/src/syscall.c
+++ b/src/syscall.c
@@ -7,6 +7,7 @@
 #include <signal.h>
 #include "liburing/compat.h"
 #include "liburing/io_uring.h"
+#include "syscall.h"
 
 #ifdef __alpha__
 /*
@@ -34,19 +35,19 @@
 # endif
 #endif
 
-int io_uring_register(int fd, unsigned int opcode, const void *arg,
-		      unsigned int nr_args)
+int __sys_io_uring_register(int fd, unsigned opcode, const void *arg,
+			    unsigned nr_args)
 {
 	return syscall(__NR_io_uring_register, fd, opcode, arg, nr_args);
 }
 
-int io_uring_setup(unsigned int entries, struct io_uring_params *p)
+int __sys_io_uring_setup(unsigned entries, struct io_uring_params *p)
 {
 	return syscall(__NR_io_uring_setup, entries, p);
 }
 
-int io_uring_enter(int fd, unsigned int to_submit, unsigned int min_complete,
-		   unsigned int flags, sigset_t *sig)
+int __sys_io_uring_enter(int fd, unsigned to_submit, unsigned min_complete,
+			 unsigned flags, sigset_t *sig)
 {
 	return syscall(__NR_io_uring_enter, fd, to_submit, min_complete,
 			flags, sig, _NSIG / 8);
diff --git a/src/syscall.h b/src/syscall.h
new file mode 100644
index 0000000..7d56224
--- /dev/null
+++ b/src/syscall.h
@@ -0,0 +1,13 @@
+#ifndef LIBURING_SYSCALL_H
+#define LIBURING_SYSCALL_H
+
+/*
+ * System calls
+ */
+extern int __sys_io_uring_setup(unsigned entries, struct io_uring_params *p);
+extern int __sys_io_uring_enter(int fd, unsigned to_submit,
+	unsigned min_complete, unsigned flags, sigset_t *sig);
+extern int __sys_io_uring_register(int fd, unsigned int opcode, const void *arg,
+	unsigned int nr_args);
+
+#endif
diff --git a/test/io_uring_enter.c b/test/io_uring_enter.c
index 578185f..65beca6 100644
--- a/test/io_uring_enter.c
+++ b/test/io_uring_enter.c
@@ -24,6 +24,7 @@
 #include <sys/time.h>
 #include "liburing.h"
 #include "liburing/barrier.h"
+#include "../src/syscall.h"
 
 #define IORING_MAX_ENTRIES 4096
 
@@ -52,7 +53,7 @@
 {
 	int ret;
 
-	ret = io_uring_enter(fd, to_submit, min_complete, flags, sig);
+	ret = __sys_io_uring_enter(fd, to_submit, min_complete, flags, sig);
 	if (ret != -1) {
 		printf("expected %s, but call succeeded\n", strerror(error));
 		return 1;
@@ -79,7 +80,7 @@
 		return expect_fail(fd, to_submit, min_complete,
 				   flags, sig, error);
 
-	ret = io_uring_enter(fd, to_submit, min_complete, flags, sig);
+	ret = __sys_io_uring_enter(fd, to_submit, min_complete, flags, sig);
 	if (ret != expect) {
 		printf("Expected %d, got %d\n", expect, errno);
 		return 1;
@@ -233,8 +234,8 @@
 	sq_entries = *ring.sq.kring_entries;
 	submit_io(&ring, sq_entries);
 	printf("Waiting for %u events\n", sq_entries);
-	ret = io_uring_enter(ring.ring_fd, 0, sq_entries,
-			     IORING_ENTER_GETEVENTS, NULL);
+	ret = __sys_io_uring_enter(ring.ring_fd, 0, sq_entries,
+					IORING_ENTER_GETEVENTS, NULL);
 	if (ret < 0) {
 		perror("io_uring_enter");
 		status = 1;
@@ -269,7 +270,7 @@
 	 */
 	io_uring_smp_store_release(sq->ktail, ktail);
 
-	ret = io_uring_enter(ring.ring_fd, 1, 0, 0, NULL);
+	ret = __sys_io_uring_enter(ring.ring_fd, 1, 0, 0, NULL);
 	/* now check to see if our sqe was dropped */
 	if (*sq->kdropped == dropped) {
 		printf("dropped counter did not increase\n");
diff --git a/test/io_uring_register.c b/test/io_uring_register.c
index 59c8a86..fe6b3e0 100644
--- a/test/io_uring_register.c
+++ b/test/io_uring_register.c
@@ -22,6 +22,7 @@
 #include <sys/resource.h>
 #include <limits.h>
 #include "liburing.h"
+#include "../src/syscall.h"
 
 static int pagesize;
 static rlim_t mlock_limit;
@@ -35,17 +36,17 @@
 
 	printf("io_uring_register(%d, %u, %p, %u)\n",
 	       fd, opcode, arg, nr_args);
-	ret = io_uring_register(fd, opcode, arg, nr_args);
+	ret = __sys_io_uring_register(fd, opcode, arg, nr_args);
 	if (ret != -1) {
 		int ret2 = 0;
 
 		printf("expected %s, but call succeeded\n", strerror(error));
 		if (opcode == IORING_REGISTER_BUFFERS) {
-			ret2 = io_uring_register(fd, IORING_UNREGISTER_BUFFERS,
-						 0, 0);
+			ret2 = __sys_io_uring_register(fd,
+					IORING_UNREGISTER_BUFFERS, 0, 0);
 		} else if (opcode == IORING_REGISTER_FILES) {
-			ret2 = io_uring_register(fd, IORING_UNREGISTER_FILES,
-						 0, 0);
+			ret2 = __sys_io_uring_register(fd,
+					IORING_UNREGISTER_FILES, 0, 0);
 		}
 		if (ret2) {
 			printf("internal error: failed to unregister\n");
@@ -66,7 +67,7 @@
 {
 	int fd;
 
-	fd = io_uring_setup(entries, p);
+	fd = __sys_io_uring_setup(entries, p);
 	if (fd < 0) {
 		perror("io_uring_setup");
 		exit(1);
@@ -191,8 +192,8 @@
 	 */
 	nr_fds = UINT_MAX;
 	while (nr_fds) {
-		ret = io_uring_register(uring_fd, IORING_REGISTER_FILES,
-					fd_as, nr_fds);
+		ret = __sys_io_uring_register(uring_fd, IORING_REGISTER_FILES,
+						fd_as, nr_fds);
 		if (ret != 0) {
 			nr_fds /= 2;
 			continue;
@@ -202,7 +203,8 @@
 		status = 0;
 		printf("io_uring_register(%d, IORING_UNREGISTER_FILES, 0, 0)...",
 		       uring_fd);
-		ret = io_uring_register(uring_fd, IORING_UNREGISTER_FILES, 0, 0);
+		ret = __sys_io_uring_register(uring_fd, IORING_UNREGISTER_FILES,
+						0, 0);
 		if (ret < 0) {
 			ret = errno;
 			printf("failed\n");
@@ -242,7 +244,7 @@
 	iov.iov_base = buf;
 
 	while (iov.iov_len) {
-		ret = io_uring_register(fd, IORING_REGISTER_BUFFERS, &iov, 1);
+		ret = __sys_io_uring_register(fd, IORING_REGISTER_BUFFERS, &iov, 1);
 		if (ret < 0) {
 			if (errno == ENOMEM) {
 				printf("io_uring_register of %zu bytes failed "
@@ -256,7 +258,8 @@
 		}
 		printf("successfully registered %zu bytes (%d).\n",
 		       iov.iov_len, ret);
-		ret = io_uring_register(fd, IORING_UNREGISTER_BUFFERS, NULL, 0);
+		ret = __sys_io_uring_register(fd, IORING_UNREGISTER_BUFFERS,
+						NULL, 0);
 		if (ret != 0) {
 			printf("error: unregister failed with %d\n", errno);
 			free(buf);
@@ -296,12 +299,12 @@
 	nr--;
 	printf("io_uring_register(%d, %u, %p, %u)\n",
 	       fd, IORING_REGISTER_BUFFERS, iovs, nr);
-	ret = io_uring_register(fd, IORING_REGISTER_BUFFERS, iovs, nr);
+	ret = __sys_io_uring_register(fd, IORING_REGISTER_BUFFERS, iovs, nr);
 	if (ret != 0) {
 		printf("expected success, got %d\n", errno);
 		status = 1;
 	} else
-		io_uring_register(fd, IORING_UNREGISTER_BUFFERS, 0, 0);
+		__sys_io_uring_register(fd, IORING_UNREGISTER_BUFFERS, 0, 0);
 
 	free(buf);
 	free(iovs);
@@ -356,7 +359,7 @@
 		 */
 		iov.iov_base = buf;
 		iov.iov_len = 2*1024*1024;
-		ret = io_uring_register(fd, IORING_REGISTER_BUFFERS, &iov, 1);
+		ret = __sys_io_uring_register(fd, IORING_REGISTER_BUFFERS, &iov, 1);
 		if (ret < 0) {
 			if (errno == ENOMEM)
 				printf("Unable to test registering of a huge "
@@ -369,8 +372,8 @@
 			}
 		} else {
 			printf("Success!\n");
-			ret = io_uring_register(fd, IORING_UNREGISTER_BUFFERS,
-						0, 0);
+			ret = __sys_io_uring_register(fd,
+					IORING_UNREGISTER_BUFFERS, 0, 0);
 			if (ret < 0) {
 				perror("io_uring_unregister");
 				status = 1;
diff --git a/test/io_uring_setup.c b/test/io_uring_setup.c
index 5ce460d..8b01dac 100644
--- a/test/io_uring_setup.c
+++ b/test/io_uring_setup.c
@@ -15,6 +15,8 @@
 #include <sys/sysinfo.h>
 #include "liburing.h"
 
+#include "../syscall.h"
+
 char *features_string(struct io_uring_params *p)
 {
 	static char flagstr[64];
@@ -102,7 +104,7 @@
 	       entries, p, flags_string(p), features_string(p), dump_resv(p),
 	       p ? p->sq_thread_cpu : 0);
 
-	ret = io_uring_setup(entries, p);
+	ret = __sys_io_uring_setup(entries, p);
 	if (ret != expect) {
 		printf("expected %d, got %d\n", expect, ret);
 		/* if we got a valid uring, close it */
@@ -161,7 +163,7 @@
 
 	/* read/write on io_uring_fd */
 	memset(&p, 0, sizeof(p));
-	fd = io_uring_setup(1, &p);
+	fd = __sys_io_uring_setup(1, &p);
 	if (fd < 0) {
 		printf("io_uring_setup failed with %d, expected success\n",
 		       errno);
diff --git a/test/ring-leak.c b/test/ring-leak.c
index 02b06f9..ca18642 100644
--- a/test/ring-leak.c
+++ b/test/ring-leak.c
@@ -22,12 +22,13 @@
 #include <linux/fs.h>
 
 #include "liburing.h"
+#include "../src/syscall.h"
 
 static int __io_uring_register_files(int ring_fd, int fd1, int fd2)
 {
 	__s32 fds[2] = { fd1, fd2 };
 
-	return io_uring_register(ring_fd, IORING_REGISTER_FILES, fds, 2);
+	return __sys_io_uring_register(ring_fd, IORING_REGISTER_FILES, fds, 2);
 }
 
 static int get_ring_fd(void)
@@ -37,7 +38,7 @@
 
 	memset(&p, 0, sizeof(p));
 
-	fd = io_uring_setup(2, &p);
+	fd = __sys_io_uring_setup(2, &p);
 	if (fd < 0) {
 		perror("io_uring_setup");
 		return -1;
diff --git a/test/timeout.c b/test/timeout.c
index fdf2223..7c0bebe 100644
--- a/test/timeout.c
+++ b/test/timeout.c
@@ -11,6 +11,7 @@
 #include <sys/time.h>
 
 #include "liburing.h"
+#include "../src/syscall.h"
 
 #define TIMEOUT_MSEC	200
 static int not_supported;
@@ -76,7 +77,8 @@
 	}
 
 	gettimeofday(&tv, NULL);
-	ret = io_uring_enter(ring->ring_fd, 0, 4, IORING_ENTER_GETEVENTS, NULL);
+	ret = __sys_io_uring_enter(ring->ring_fd, 0, 4, IORING_ENTER_GETEVENTS,
+					NULL);
 	if (ret < 0) {
 		fprintf(stderr, "%s: io_uring_enter %d\n", __FUNCTION__, ret);
 		goto err;