Merge branch 'master' of https://github.com/goldsteinn/liburing

* 'master' of https://github.com/goldsteinn/liburing:
  man/io_uring_register.2: Add documentation on IORING_REGISTER_FILES_SKIP
  test/file-register.c: Add tests for skipping file
diff --git a/man/io_uring_register.2 b/man/io_uring_register.2
index 225e461..6636b6e 100644
--- a/man/io_uring_register.2
+++ b/man/io_uring_register.2
@@ -144,6 +144,7 @@
 ones, either turning a sparse entry (one where fd is equal to -1) into a
 real one, removing an existing entry (new one is set to -1), or replacing
 an existing entry with a new existing entry.
+
 .I arg
 must contain a pointer to a struct io_uring_files_update, which contains
 an offset on which to start the update, and an array of file descriptors to
@@ -152,6 +153,12 @@
 must contain the number of descriptors in the passed in array. Available
 since 5.5.
 
+File descriptors can be skipped if they are set to
+.B IORING_REGISTER_FILES_SKIP.
+Skipping an fd will not touch the file assosiated with the previous
+fd at that index. Available since 5.12.
+
+
 .TP
 .B IORING_UNREGISTER_FILES
 This operation requires no argument, and
diff --git a/test/file-register.c b/test/file-register.c
index fc8b887..effa021 100644
--- a/test/file-register.c
+++ b/test/file-register.c
@@ -550,6 +550,44 @@
 	return 1;
 }
 
+static int test_skip(struct io_uring *ring)
+{
+	int *files;
+	int ret;
+
+	files = open_files(100, 0, 0);
+	ret = io_uring_register_files(ring, files, 100);
+	if (ret) {
+		fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
+		goto err;
+	}
+
+    /* -2 to skip */
+    files[90] = -2;
+	ret = io_uring_register_files_update(ring, 90, &files[90], 1);
+	if (ret != 1) {
+		fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
+		goto err;
+	}
+
+    /* verify can still use file index 90 */
+    if (test_fixed_read_write(ring, 90))
+		goto err;
+
+	ret = io_uring_unregister_files(ring);
+	if (ret) {
+		fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
+		goto err;
+	}
+
+	close_files(files, 100, 0);
+	return 0;
+err:
+	close_files(files, 100, 0);
+	return 1;
+}
+
+
 static int test_sparse_updates(void)
 {
 	struct io_uring ring;
@@ -687,6 +725,8 @@
 	return 0;
 }
 
+
+
 int main(int argc, char *argv[])
 {
 	struct io_uring ring;
@@ -776,6 +816,12 @@
 		return ret;
 	}
 
+    ret = test_skip(&ring);
+	if (ret) {
+		printf("test_skip failed\n");
+		return 1;
+	}
+
 	ret = test_sparse_updates();
 	if (ret) {
 		printf("test_sparse_updates failed\n");
@@ -790,3 +836,4 @@
 
 	return 0;
 }
+