@nxtedition/rocksdb 5.2.36 → 5.2.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/binding.cc +66 -91
  2. package/deps/liburing/liburing/COPYING +502 -0
  3. package/deps/liburing/liburing/COPYING.GPL +339 -0
  4. package/deps/liburing/liburing/LICENSE +7 -0
  5. package/deps/liburing/liburing/Makefile +84 -0
  6. package/deps/liburing/liburing/Makefile.quiet +11 -0
  7. package/deps/liburing/liburing/README +46 -0
  8. package/deps/liburing/liburing/configure +420 -0
  9. package/deps/liburing/liburing/debian/README.Debian +7 -0
  10. package/deps/liburing/liburing/debian/changelog +27 -0
  11. package/deps/liburing/liburing/debian/compat +1 -0
  12. package/deps/liburing/liburing/debian/control +48 -0
  13. package/deps/liburing/liburing/debian/copyright +49 -0
  14. package/deps/liburing/liburing/debian/liburing-dev.install +4 -0
  15. package/deps/liburing/liburing/debian/liburing-dev.manpages +6 -0
  16. package/deps/liburing/liburing/debian/liburing1-udeb.install +1 -0
  17. package/deps/liburing/liburing/debian/liburing1.install +1 -0
  18. package/deps/liburing/liburing/debian/liburing1.symbols +32 -0
  19. package/deps/liburing/liburing/debian/patches/series +1 -0
  20. package/deps/liburing/liburing/debian/rules +81 -0
  21. package/deps/liburing/liburing/debian/source/format +1 -0
  22. package/deps/liburing/liburing/debian/source/local-options +2 -0
  23. package/deps/liburing/liburing/debian/source/options +1 -0
  24. package/deps/liburing/liburing/debian/watch +3 -0
  25. package/deps/liburing/liburing/examples/Makefile +29 -0
  26. package/deps/liburing/liburing/examples/io_uring-cp.c +279 -0
  27. package/deps/liburing/liburing/examples/io_uring-test.c +112 -0
  28. package/deps/liburing/liburing/examples/link-cp.c +193 -0
  29. package/deps/liburing/liburing/examples/ucontext-cp.c +273 -0
  30. package/deps/liburing/liburing/liburing.pc.in +12 -0
  31. package/deps/liburing/liburing/liburing.spec +66 -0
  32. package/deps/liburing/liburing/make-debs.sh +53 -0
  33. package/deps/liburing/liburing/man/io_uring.7 +736 -0
  34. package/deps/liburing/liburing/man/io_uring_enter.2 +1403 -0
  35. package/deps/liburing/liburing/man/io_uring_get_sqe.3 +37 -0
  36. package/deps/liburing/liburing/man/io_uring_queue_exit.3 +27 -0
  37. package/deps/liburing/liburing/man/io_uring_queue_init.3 +44 -0
  38. package/deps/liburing/liburing/man/io_uring_register.2 +605 -0
  39. package/deps/liburing/liburing/man/io_uring_setup.2 +515 -0
  40. package/deps/liburing/liburing/src/Makefile +76 -0
  41. package/deps/liburing/liburing/src/include/liburing/barrier.h +73 -0
  42. package/deps/liburing/liburing/src/include/liburing/io_uring.h +422 -0
  43. package/deps/liburing/liburing/src/include/liburing.h +775 -0
  44. package/deps/liburing/liburing/src/liburing.map +46 -0
  45. package/deps/liburing/liburing/src/queue.c +403 -0
  46. package/deps/liburing/liburing/src/register.c +299 -0
  47. package/deps/liburing/liburing/src/setup.c +356 -0
  48. package/deps/liburing/liburing/src/syscall.c +73 -0
  49. package/deps/liburing/liburing/src/syscall.h +20 -0
  50. package/deps/liburing/liburing/test/232c93d07b74-test.c +305 -0
  51. package/deps/liburing/liburing/test/35fa71a030ca-test.c +329 -0
  52. package/deps/liburing/liburing/test/500f9fbadef8-test.c +89 -0
  53. package/deps/liburing/liburing/test/7ad0e4b2f83c-test.c +93 -0
  54. package/deps/liburing/liburing/test/8a9973408177-test.c +106 -0
  55. package/deps/liburing/liburing/test/917257daa0fe-test.c +53 -0
  56. package/deps/liburing/liburing/test/Makefile +312 -0
  57. package/deps/liburing/liburing/test/a0908ae19763-test.c +58 -0
  58. package/deps/liburing/liburing/test/a4c0b3decb33-test.c +180 -0
  59. package/deps/liburing/liburing/test/accept-link.c +251 -0
  60. package/deps/liburing/liburing/test/accept-reuse.c +164 -0
  61. package/deps/liburing/liburing/test/accept-test.c +79 -0
  62. package/deps/liburing/liburing/test/accept.c +476 -0
  63. package/deps/liburing/liburing/test/across-fork.c +283 -0
  64. package/deps/liburing/liburing/test/b19062a56726-test.c +53 -0
  65. package/deps/liburing/liburing/test/b5837bd5311d-test.c +77 -0
  66. package/deps/liburing/liburing/test/ce593a6c480a-test.c +135 -0
  67. package/deps/liburing/liburing/test/close-opath.c +122 -0
  68. package/deps/liburing/liburing/test/config +10 -0
  69. package/deps/liburing/liburing/test/connect.c +398 -0
  70. package/deps/liburing/liburing/test/cq-full.c +96 -0
  71. package/deps/liburing/liburing/test/cq-overflow.c +294 -0
  72. package/deps/liburing/liburing/test/cq-peek-batch.c +102 -0
  73. package/deps/liburing/liburing/test/cq-ready.c +94 -0
  74. package/deps/liburing/liburing/test/cq-size.c +58 -0
  75. package/deps/liburing/liburing/test/d4ae271dfaae-test.c +96 -0
  76. package/deps/liburing/liburing/test/d77a67ed5f27-test.c +65 -0
  77. package/deps/liburing/liburing/test/defer.c +307 -0
  78. package/deps/liburing/liburing/test/double-poll-crash.c +186 -0
  79. package/deps/liburing/liburing/test/eeed8b54e0df-test.c +114 -0
  80. package/deps/liburing/liburing/test/empty-eownerdead.c +42 -0
  81. package/deps/liburing/liburing/test/eventfd-disable.c +151 -0
  82. package/deps/liburing/liburing/test/eventfd-ring.c +97 -0
  83. package/deps/liburing/liburing/test/eventfd.c +112 -0
  84. package/deps/liburing/liburing/test/fadvise.c +202 -0
  85. package/deps/liburing/liburing/test/fallocate.c +249 -0
  86. package/deps/liburing/liburing/test/fc2a85cb02ef-test.c +138 -0
  87. package/deps/liburing/liburing/test/file-register.c +843 -0
  88. package/deps/liburing/liburing/test/file-update.c +173 -0
  89. package/deps/liburing/liburing/test/files-exit-hang-poll.c +128 -0
  90. package/deps/liburing/liburing/test/files-exit-hang-timeout.c +134 -0
  91. package/deps/liburing/liburing/test/fixed-link.c +90 -0
  92. package/deps/liburing/liburing/test/fsync.c +224 -0
  93. package/deps/liburing/liburing/test/hardlink.c +136 -0
  94. package/deps/liburing/liburing/test/helpers.c +135 -0
  95. package/deps/liburing/liburing/test/helpers.h +67 -0
  96. package/deps/liburing/liburing/test/io-cancel.c +537 -0
  97. package/deps/liburing/liburing/test/io_uring_enter.c +296 -0
  98. package/deps/liburing/liburing/test/io_uring_register.c +664 -0
  99. package/deps/liburing/liburing/test/io_uring_setup.c +192 -0
  100. package/deps/liburing/liburing/test/iopoll.c +366 -0
  101. package/deps/liburing/liburing/test/lfs-openat-write.c +117 -0
  102. package/deps/liburing/liburing/test/lfs-openat.c +273 -0
  103. package/deps/liburing/liburing/test/link-timeout.c +1107 -0
  104. package/deps/liburing/liburing/test/link.c +496 -0
  105. package/deps/liburing/liburing/test/link_drain.c +229 -0
  106. package/deps/liburing/liburing/test/madvise.c +195 -0
  107. package/deps/liburing/liburing/test/mkdir.c +108 -0
  108. package/deps/liburing/liburing/test/multicqes_drain.c +383 -0
  109. package/deps/liburing/liburing/test/nop-all-sizes.c +107 -0
  110. package/deps/liburing/liburing/test/nop.c +115 -0
  111. package/deps/liburing/liburing/test/open-close.c +146 -0
  112. package/deps/liburing/liburing/test/openat2.c +240 -0
  113. package/deps/liburing/liburing/test/personality.c +204 -0
  114. package/deps/liburing/liburing/test/pipe-eof.c +81 -0
  115. package/deps/liburing/liburing/test/pipe-reuse.c +105 -0
  116. package/deps/liburing/liburing/test/poll-cancel-ton.c +139 -0
  117. package/deps/liburing/liburing/test/poll-cancel.c +135 -0
  118. package/deps/liburing/liburing/test/poll-link.c +227 -0
  119. package/deps/liburing/liburing/test/poll-many.c +208 -0
  120. package/deps/liburing/liburing/test/poll-mshot-update.c +273 -0
  121. package/deps/liburing/liburing/test/poll-ring.c +48 -0
  122. package/deps/liburing/liburing/test/poll-v-poll.c +353 -0
  123. package/deps/liburing/liburing/test/poll.c +109 -0
  124. package/deps/liburing/liburing/test/probe.c +137 -0
  125. package/deps/liburing/liburing/test/read-write.c +876 -0
  126. package/deps/liburing/liburing/test/register-restrictions.c +633 -0
  127. package/deps/liburing/liburing/test/rename.c +134 -0
  128. package/deps/liburing/liburing/test/ring-leak.c +173 -0
  129. package/deps/liburing/liburing/test/ring-leak2.c +249 -0
  130. package/deps/liburing/liburing/test/rsrc_tags.c +449 -0
  131. package/deps/liburing/liburing/test/runtests-loop.sh +16 -0
  132. package/deps/liburing/liburing/test/runtests.sh +170 -0
  133. package/deps/liburing/liburing/test/rw_merge_test.c +97 -0
  134. package/deps/liburing/liburing/test/self.c +91 -0
  135. package/deps/liburing/liburing/test/send_recv.c +291 -0
  136. package/deps/liburing/liburing/test/send_recvmsg.c +345 -0
  137. package/deps/liburing/liburing/test/sendmsg_fs_cve.c +198 -0
  138. package/deps/liburing/liburing/test/shared-wq.c +84 -0
  139. package/deps/liburing/liburing/test/short-read.c +75 -0
  140. package/deps/liburing/liburing/test/shutdown.c +163 -0
  141. package/deps/liburing/liburing/test/sigfd-deadlock.c +74 -0
  142. package/deps/liburing/liburing/test/socket-rw-eagain.c +156 -0
  143. package/deps/liburing/liburing/test/socket-rw.c +147 -0
  144. package/deps/liburing/liburing/test/splice.c +511 -0
  145. package/deps/liburing/liburing/test/sq-full-cpp.cc +45 -0
  146. package/deps/liburing/liburing/test/sq-full.c +45 -0
  147. package/deps/liburing/liburing/test/sq-poll-dup.c +200 -0
  148. package/deps/liburing/liburing/test/sq-poll-kthread.c +168 -0
  149. package/deps/liburing/liburing/test/sq-poll-share.c +137 -0
  150. package/deps/liburing/liburing/test/sq-space_left.c +159 -0
  151. package/deps/liburing/liburing/test/sqpoll-cancel-hang.c +159 -0
  152. package/deps/liburing/liburing/test/sqpoll-disable-exit.c +195 -0
  153. package/deps/liburing/liburing/test/sqpoll-exit-hang.c +77 -0
  154. package/deps/liburing/liburing/test/sqpoll-sleep.c +68 -0
  155. package/deps/liburing/liburing/test/statx.c +172 -0
  156. package/deps/liburing/liburing/test/stdout.c +232 -0
  157. package/deps/liburing/liburing/test/submit-link-fail.c +154 -0
  158. package/deps/liburing/liburing/test/submit-reuse.c +239 -0
  159. package/deps/liburing/liburing/test/symlink.c +116 -0
  160. package/deps/liburing/liburing/test/teardowns.c +58 -0
  161. package/deps/liburing/liburing/test/thread-exit.c +131 -0
  162. package/deps/liburing/liburing/test/timeout-new.c +246 -0
  163. package/deps/liburing/liburing/test/timeout-overflow.c +204 -0
  164. package/deps/liburing/liburing/test/timeout.c +1354 -0
  165. package/deps/liburing/liburing/test/unlink.c +111 -0
  166. package/deps/liburing/liburing/test/wakeup-hang.c +162 -0
  167. package/deps/liburing/liburing.gyp +20 -0
  168. package/deps/rocksdb/rocksdb/db/corruption_test.cc +62 -0
  169. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +7 -62
  170. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +25 -11
  171. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +74 -155
  172. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -2
  173. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +2 -2
  174. package/deps/rocksdb/rocksdb/env/fs_posix.cc +13 -0
  175. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +4 -2
  176. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +22 -4
  177. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +5 -0
  178. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +15 -0
  179. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +5 -0
  180. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  181. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +3 -0
  182. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +3 -7
  183. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +2 -1
  184. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +44 -29
  185. package/deps/rocksdb/rocksdb.gyp +4 -3
  186. package/package.json +1 -1
  187. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  188. package/prebuilds/darwin-x64/node.napi.node +0 -0
  189. package/prebuilds/linux-x64/node.napi.node +0 -0
  190. package/prebuilds/prebuilds/linux-x64/node.napi.node +0 -0
@@ -0,0 +1,843 @@
1
+ /* SPDX-License-Identifier: MIT */
2
+ /*
3
+ * Description: run various file registration tests
4
+ *
5
+ */
6
+ #include <errno.h>
7
+ #include <stdio.h>
8
+ #include <unistd.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+ #include <fcntl.h>
12
+
13
+ #include "helpers.h"
14
+ #include "liburing.h"
15
+
16
+ static int no_update = 0;
17
+
18
+ static void close_files(int *files, int nr_files, int add)
19
+ {
20
+ char fname[32];
21
+ int i;
22
+
23
+ for (i = 0; i < nr_files; i++) {
24
+ if (files)
25
+ close(files[i]);
26
+ if (!add)
27
+ sprintf(fname, ".reg.%d", i);
28
+ else
29
+ sprintf(fname, ".add.%d", i + add);
30
+ unlink(fname);
31
+ }
32
+ if (files)
33
+ free(files);
34
+ }
35
+
36
+ static int *open_files(int nr_files, int extra, int add)
37
+ {
38
+ char fname[32];
39
+ int *files;
40
+ int i;
41
+
42
+ files = t_calloc(nr_files + extra, sizeof(int));
43
+
44
+ for (i = 0; i < nr_files; i++) {
45
+ if (!add)
46
+ sprintf(fname, ".reg.%d", i);
47
+ else
48
+ sprintf(fname, ".add.%d", i + add);
49
+ files[i] = open(fname, O_RDWR | O_CREAT, 0644);
50
+ if (files[i] < 0) {
51
+ perror("open");
52
+ free(files);
53
+ files = NULL;
54
+ break;
55
+ }
56
+ }
57
+ if (extra) {
58
+ for (i = nr_files; i < nr_files + extra; i++)
59
+ files[i] = -1;
60
+ }
61
+
62
+ return files;
63
+ }
64
+
65
+ static int test_shrink(struct io_uring *ring)
66
+ {
67
+ int ret, off, fd;
68
+ int *files;
69
+
70
+ files = open_files(50, 0, 0);
71
+ ret = io_uring_register_files(ring, files, 50);
72
+ if (ret) {
73
+ fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
74
+ goto err;
75
+ }
76
+
77
+ off = 0;
78
+ do {
79
+ fd = -1;
80
+ ret = io_uring_register_files_update(ring, off, &fd, 1);
81
+ if (ret != 1) {
82
+ if (off == 50 && ret == -EINVAL)
83
+ break;
84
+ fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
85
+ break;
86
+ }
87
+ off++;
88
+ } while (1);
89
+
90
+ ret = io_uring_unregister_files(ring);
91
+ if (ret) {
92
+ fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
93
+ goto err;
94
+ }
95
+
96
+ close_files(files, 50, 0);
97
+ return 0;
98
+ err:
99
+ close_files(files, 50, 0);
100
+ return 1;
101
+ }
102
+
103
+
104
+ static int test_grow(struct io_uring *ring)
105
+ {
106
+ int ret, off;
107
+ int *files, *fds = NULL;
108
+
109
+ files = open_files(50, 250, 0);
110
+ ret = io_uring_register_files(ring, files, 300);
111
+ if (ret) {
112
+ fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
113
+ goto err;
114
+ }
115
+
116
+ off = 50;
117
+ do {
118
+ fds = open_files(1, 0, off);
119
+ ret = io_uring_register_files_update(ring, off, fds, 1);
120
+ if (ret != 1) {
121
+ if (off == 300 && ret == -EINVAL)
122
+ break;
123
+ fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
124
+ break;
125
+ }
126
+ if (off >= 300) {
127
+ fprintf(stderr, "%s: Succeeded beyond end-of-list?\n", __FUNCTION__);
128
+ goto err;
129
+ }
130
+ off++;
131
+ } while (1);
132
+
133
+ ret = io_uring_unregister_files(ring);
134
+ if (ret) {
135
+ fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
136
+ goto err;
137
+ }
138
+
139
+ close_files(files, 100, 0);
140
+ close_files(NULL, 251, 50);
141
+ return 0;
142
+ err:
143
+ close_files(files, 100, 0);
144
+ close_files(NULL, 251, 50);
145
+ return 1;
146
+ }
147
+
148
+ static int test_replace_all(struct io_uring *ring)
149
+ {
150
+ int *files, *fds = NULL;
151
+ int ret, i;
152
+
153
+ files = open_files(100, 0, 0);
154
+ ret = io_uring_register_files(ring, files, 100);
155
+ if (ret) {
156
+ fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
157
+ goto err;
158
+ }
159
+
160
+ fds = t_malloc(100 * sizeof(int));
161
+ for (i = 0; i < 100; i++)
162
+ fds[i] = -1;
163
+
164
+ ret = io_uring_register_files_update(ring, 0, fds, 100);
165
+ if (ret != 100) {
166
+ fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
167
+ goto err;
168
+ }
169
+
170
+ ret = io_uring_unregister_files(ring);
171
+ if (ret) {
172
+ fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
173
+ goto err;
174
+ }
175
+
176
+ close_files(files, 100, 0);
177
+ if (fds)
178
+ free(fds);
179
+ return 0;
180
+ err:
181
+ close_files(files, 100, 0);
182
+ if (fds)
183
+ free(fds);
184
+ return 1;
185
+ }
186
+
187
+ static int test_replace(struct io_uring *ring)
188
+ {
189
+ int *files, *fds = NULL;
190
+ int ret;
191
+
192
+ files = open_files(100, 0, 0);
193
+ ret = io_uring_register_files(ring, files, 100);
194
+ if (ret) {
195
+ fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
196
+ goto err;
197
+ }
198
+
199
+ fds = open_files(10, 0, 1);
200
+ ret = io_uring_register_files_update(ring, 90, fds, 10);
201
+ if (ret != 10) {
202
+ fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
203
+ goto err;
204
+ }
205
+
206
+ ret = io_uring_unregister_files(ring);
207
+ if (ret) {
208
+ fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
209
+ goto err;
210
+ }
211
+
212
+ close_files(files, 100, 0);
213
+ if (fds)
214
+ close_files(fds, 10, 1);
215
+ return 0;
216
+ err:
217
+ close_files(files, 100, 0);
218
+ if (fds)
219
+ close_files(fds, 10, 1);
220
+ return 1;
221
+ }
222
+
223
+ static int test_removals(struct io_uring *ring)
224
+ {
225
+ int *files, *fds = NULL;
226
+ int ret, i;
227
+
228
+ files = open_files(100, 0, 0);
229
+ ret = io_uring_register_files(ring, files, 100);
230
+ if (ret) {
231
+ fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
232
+ goto err;
233
+ }
234
+
235
+ fds = t_calloc(10, sizeof(int));
236
+ for (i = 0; i < 10; i++)
237
+ fds[i] = -1;
238
+
239
+ ret = io_uring_register_files_update(ring, 50, fds, 10);
240
+ if (ret != 10) {
241
+ fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
242
+ goto err;
243
+ }
244
+
245
+ ret = io_uring_unregister_files(ring);
246
+ if (ret) {
247
+ fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
248
+ goto err;
249
+ }
250
+
251
+ close_files(files, 100, 0);
252
+ if (fds)
253
+ free(fds);
254
+ return 0;
255
+ err:
256
+ close_files(files, 100, 0);
257
+ if (fds)
258
+ free(fds);
259
+ return 1;
260
+ }
261
+
262
+ static int test_additions(struct io_uring *ring)
263
+ {
264
+ int *files, *fds = NULL;
265
+ int ret;
266
+
267
+ files = open_files(100, 100, 0);
268
+ ret = io_uring_register_files(ring, files, 200);
269
+ if (ret) {
270
+ fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
271
+ goto err;
272
+ }
273
+
274
+ fds = open_files(2, 0, 1);
275
+ ret = io_uring_register_files_update(ring, 100, fds, 2);
276
+ if (ret != 2) {
277
+ fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
278
+ goto err;
279
+ }
280
+
281
+ ret = io_uring_unregister_files(ring);
282
+ if (ret) {
283
+ fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
284
+ goto err;
285
+ }
286
+
287
+ close_files(files, 100, 0);
288
+ if (fds)
289
+ close_files(fds, 2, 1);
290
+ return 0;
291
+ err:
292
+ close_files(files, 100, 0);
293
+ if (fds)
294
+ close_files(fds, 2, 1);
295
+ return 1;
296
+ }
297
+
298
+ static int test_sparse(struct io_uring *ring)
299
+ {
300
+ int *files;
301
+ int ret;
302
+
303
+ files = open_files(100, 100, 0);
304
+ ret = io_uring_register_files(ring, files, 200);
305
+ if (ret) {
306
+ if (ret == -EBADF) {
307
+ fprintf(stdout, "Sparse files not supported\n");
308
+ no_update = 1;
309
+ goto done;
310
+ }
311
+ fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
312
+ goto err;
313
+ }
314
+ ret = io_uring_unregister_files(ring);
315
+ if (ret) {
316
+ fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
317
+ goto err;
318
+ }
319
+ done:
320
+ close_files(files, 100, 0);
321
+ return 0;
322
+ err:
323
+ close_files(files, 100, 0);
324
+ return 1;
325
+ }
326
+
327
+ static int test_basic_many(struct io_uring *ring)
328
+ {
329
+ int *files;
330
+ int ret;
331
+
332
+ files = open_files(768, 0, 0);
333
+ ret = io_uring_register_files(ring, files, 768);
334
+ if (ret) {
335
+ fprintf(stderr, "%s: register %d\n", __FUNCTION__, ret);
336
+ goto err;
337
+ }
338
+ ret = io_uring_unregister_files(ring);
339
+ if (ret) {
340
+ fprintf(stderr, "%s: unregister %d\n", __FUNCTION__, ret);
341
+ goto err;
342
+ }
343
+ close_files(files, 768, 0);
344
+ return 0;
345
+ err:
346
+ close_files(files, 768, 0);
347
+ return 1;
348
+ }
349
+
350
+ static int test_basic(struct io_uring *ring, int fail)
351
+ {
352
+ int *files;
353
+ int ret;
354
+ int nr_files = fail ? 10 : 100;
355
+
356
+ files = open_files(nr_files, 0, 0);
357
+ ret = io_uring_register_files(ring, files, 100);
358
+ if (ret) {
359
+ if (fail) {
360
+ if (ret == -EBADF || ret == -EFAULT)
361
+ return 0;
362
+ }
363
+ fprintf(stderr, "%s: register %d\n", __FUNCTION__, ret);
364
+ goto err;
365
+ }
366
+ if (fail) {
367
+ fprintf(stderr, "Registration succeeded, but expected fail\n");
368
+ goto err;
369
+ }
370
+ ret = io_uring_unregister_files(ring);
371
+ if (ret) {
372
+ fprintf(stderr, "%s: unregister %d\n", __FUNCTION__, ret);
373
+ goto err;
374
+ }
375
+ close_files(files, nr_files, 0);
376
+ return 0;
377
+ err:
378
+ close_files(files, nr_files, 0);
379
+ return 1;
380
+ }
381
+
382
+ /*
383
+ * Register 0 files, but reserve space for 10. Then add one file.
384
+ */
385
+ static int test_zero(struct io_uring *ring)
386
+ {
387
+ int *files, *fds = NULL;
388
+ int ret;
389
+
390
+ files = open_files(0, 10, 0);
391
+ ret = io_uring_register_files(ring, files, 10);
392
+ if (ret) {
393
+ fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
394
+ goto err;
395
+ }
396
+
397
+ fds = open_files(1, 0, 1);
398
+ ret = io_uring_register_files_update(ring, 0, fds, 1);
399
+ if (ret != 1) {
400
+ fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
401
+ goto err;
402
+ }
403
+
404
+ ret = io_uring_unregister_files(ring);
405
+ if (ret) {
406
+ fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
407
+ goto err;
408
+ }
409
+
410
+ if (fds)
411
+ close_files(fds, 1, 1);
412
+ free(files);
413
+ return 0;
414
+ err:
415
+ if (fds)
416
+ close_files(fds, 1, 1);
417
+ free(files);
418
+ return 1;
419
+ }
420
+
421
+ static int test_fixed_read_write(struct io_uring *ring, int index)
422
+ {
423
+ struct io_uring_sqe *sqe;
424
+ struct io_uring_cqe *cqe;
425
+ struct iovec iov[2];
426
+ int ret;
427
+
428
+ iov[0].iov_base = t_malloc(4096);
429
+ iov[0].iov_len = 4096;
430
+ memset(iov[0].iov_base, 0x5a, 4096);
431
+
432
+ iov[1].iov_base = t_malloc(4096);
433
+ iov[1].iov_len = 4096;
434
+
435
+ sqe = io_uring_get_sqe(ring);
436
+ if (!sqe) {
437
+ fprintf(stderr, "%s: failed to get sqe\n", __FUNCTION__);
438
+ return 1;
439
+ }
440
+ io_uring_prep_writev(sqe, index, &iov[0], 1, 0);
441
+ sqe->flags |= IOSQE_FIXED_FILE;
442
+ sqe->user_data = 1;
443
+
444
+ ret = io_uring_submit(ring);
445
+ if (ret != 1) {
446
+ fprintf(stderr, "%s: got %d, wanted 1\n", __FUNCTION__, ret);
447
+ return 1;
448
+ }
449
+
450
+ ret = io_uring_wait_cqe(ring, &cqe);
451
+ if (ret < 0) {
452
+ fprintf(stderr, "%s: io_uring_wait_cqe=%d\n", __FUNCTION__, ret);
453
+ return 1;
454
+ }
455
+ if (cqe->res != 4096) {
456
+ fprintf(stderr, "%s: write cqe->res=%d\n", __FUNCTION__, cqe->res);
457
+ return 1;
458
+ }
459
+ io_uring_cqe_seen(ring, cqe);
460
+
461
+ sqe = io_uring_get_sqe(ring);
462
+ if (!sqe) {
463
+ fprintf(stderr, "%s: failed to get sqe\n", __FUNCTION__);
464
+ return 1;
465
+ }
466
+ io_uring_prep_readv(sqe, index, &iov[1], 1, 0);
467
+ sqe->flags |= IOSQE_FIXED_FILE;
468
+ sqe->user_data = 2;
469
+
470
+ ret = io_uring_submit(ring);
471
+ if (ret != 1) {
472
+ fprintf(stderr, "%s: got %d, wanted 1\n", __FUNCTION__, ret);
473
+ return 1;
474
+ }
475
+
476
+ ret = io_uring_wait_cqe(ring, &cqe);
477
+ if (ret < 0) {
478
+ fprintf(stderr, "%s: io_uring_wait_cqe=%d\n", __FUNCTION__, ret);
479
+ return 1;
480
+ }
481
+ if (cqe->res != 4096) {
482
+ fprintf(stderr, "%s: read cqe->res=%d\n", __FUNCTION__, cqe->res);
483
+ return 1;
484
+ }
485
+ io_uring_cqe_seen(ring, cqe);
486
+
487
+ if (memcmp(iov[1].iov_base, iov[0].iov_base, 4096)) {
488
+ fprintf(stderr, "%s: data mismatch\n", __FUNCTION__);
489
+ return 1;
490
+ }
491
+
492
+ free(iov[0].iov_base);
493
+ free(iov[1].iov_base);
494
+ return 0;
495
+ }
496
+
497
+ /*
498
+ * Register 8K of sparse files, update one at a random spot, then do some
499
+ * file IO to verify it works.
500
+ */
501
+ static int test_huge(struct io_uring *ring)
502
+ {
503
+ int *files;
504
+ int ret;
505
+
506
+ files = open_files(0, 8192, 0);
507
+ ret = io_uring_register_files(ring, files, 8192);
508
+ if (ret) {
509
+ /* huge sets not supported */
510
+ if (ret == -EMFILE) {
511
+ fprintf(stdout, "%s: No huge file set support, skipping\n", __FUNCTION__);
512
+ goto out;
513
+ }
514
+ fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
515
+ goto err;
516
+ }
517
+
518
+ files[7193] = open(".reg.7193", O_RDWR | O_CREAT, 0644);
519
+ if (files[7193] < 0) {
520
+ fprintf(stderr, "%s: open=%d\n", __FUNCTION__, errno);
521
+ goto err;
522
+ }
523
+
524
+ ret = io_uring_register_files_update(ring, 7193, &files[7193], 1);
525
+ if (ret != 1) {
526
+ fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
527
+ goto err;
528
+ }
529
+
530
+ if (test_fixed_read_write(ring, 7193))
531
+ goto err;
532
+
533
+ ret = io_uring_unregister_files(ring);
534
+ if (ret) {
535
+ fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
536
+ goto err;
537
+ }
538
+
539
+ if (files[7193] != -1) {
540
+ close(files[7193]);
541
+ unlink(".reg.7193");
542
+ }
543
+ out:
544
+ free(files);
545
+ return 0;
546
+ err:
547
+ if (files[7193] != -1) {
548
+ close(files[7193]);
549
+ unlink(".reg.7193");
550
+ }
551
+ free(files);
552
+ return 1;
553
+ }
554
+
555
+ static int test_skip(struct io_uring *ring)
556
+ {
557
+ int *files;
558
+ int ret;
559
+
560
+ files = open_files(100, 0, 0);
561
+ ret = io_uring_register_files(ring, files, 100);
562
+ if (ret) {
563
+ fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
564
+ goto err;
565
+ }
566
+
567
+ files[90] = IORING_REGISTER_FILES_SKIP;
568
+ ret = io_uring_register_files_update(ring, 90, &files[90], 1);
569
+ if (ret != 1) {
570
+ if (ret == -EBADF) {
571
+ fprintf(stdout, "Skipping files not supported\n");
572
+ goto done;
573
+ }
574
+ fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
575
+ goto err;
576
+ }
577
+
578
+ /* verify can still use file index 90 */
579
+ if (test_fixed_read_write(ring, 90))
580
+ goto err;
581
+
582
+ ret = io_uring_unregister_files(ring);
583
+ if (ret) {
584
+ fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
585
+ goto err;
586
+ }
587
+
588
+ done:
589
+ close_files(files, 100, 0);
590
+ return 0;
591
+ err:
592
+ close_files(files, 100, 0);
593
+ return 1;
594
+ }
595
+
596
+ static int test_sparse_updates(void)
597
+ {
598
+ struct io_uring ring;
599
+ int ret, i, *fds, newfd;
600
+
601
+ ret = io_uring_queue_init(8, &ring, 0);
602
+ if (ret) {
603
+ fprintf(stderr, "queue_init: %d\n", ret);
604
+ return ret;
605
+ }
606
+
607
+ fds = t_malloc(256 * sizeof(int));
608
+ for (i = 0; i < 256; i++)
609
+ fds[i] = -1;
610
+
611
+ ret = io_uring_register_files(&ring, fds, 256);
612
+ if (ret) {
613
+ fprintf(stderr, "file_register: %d\n", ret);
614
+ return ret;
615
+ }
616
+
617
+ newfd = 1;
618
+ for (i = 0; i < 256; i++) {
619
+ ret = io_uring_register_files_update(&ring, i, &newfd, 1);
620
+ if (ret != 1) {
621
+ fprintf(stderr, "file_update: %d\n", ret);
622
+ return ret;
623
+ }
624
+ }
625
+ io_uring_unregister_files(&ring);
626
+
627
+ for (i = 0; i < 256; i++)
628
+ fds[i] = 1;
629
+
630
+ ret = io_uring_register_files(&ring, fds, 256);
631
+ if (ret) {
632
+ fprintf(stderr, "file_register: %d\n", ret);
633
+ return ret;
634
+ }
635
+
636
+ newfd = -1;
637
+ for (i = 0; i < 256; i++) {
638
+ ret = io_uring_register_files_update(&ring, i, &newfd, 1);
639
+ if (ret != 1) {
640
+ fprintf(stderr, "file_update: %d\n", ret);
641
+ return ret;
642
+ }
643
+ }
644
+ io_uring_unregister_files(&ring);
645
+
646
+ io_uring_queue_exit(&ring);
647
+ return 0;
648
+ }
649
+
650
+ static int test_fixed_removal_ordering(void)
651
+ {
652
+ char buffer[128];
653
+ struct io_uring ring;
654
+ struct io_uring_sqe *sqe;
655
+ struct io_uring_cqe *cqe;
656
+ struct __kernel_timespec ts;
657
+ int ret, fd, i, fds[2];
658
+
659
+ ret = io_uring_queue_init(8, &ring, 0);
660
+ if (ret < 0) {
661
+ fprintf(stderr, "failed to init io_uring: %s\n", strerror(-ret));
662
+ return ret;
663
+ }
664
+ if (pipe(fds)) {
665
+ perror("pipe");
666
+ return -1;
667
+ }
668
+ ret = io_uring_register_files(&ring, fds, 2);
669
+ if (ret) {
670
+ fprintf(stderr, "file_register: %d\n", ret);
671
+ return ret;
672
+ }
673
+ /* ring should have fds referenced, can close them */
674
+ close(fds[0]);
675
+ close(fds[1]);
676
+
677
+ sqe = io_uring_get_sqe(&ring);
678
+ if (!sqe) {
679
+ fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
680
+ return 1;
681
+ }
682
+ /* outwait file recycling delay */
683
+ ts.tv_sec = 3;
684
+ ts.tv_nsec = 0;
685
+ io_uring_prep_timeout(sqe, &ts, 0, 0);
686
+ sqe->flags |= IOSQE_IO_LINK | IOSQE_IO_HARDLINK;
687
+ sqe->user_data = 1;
688
+
689
+ sqe = io_uring_get_sqe(&ring);
690
+ if (!sqe) {
691
+ printf("get sqe failed\n");
692
+ return -1;
693
+ }
694
+ io_uring_prep_write(sqe, 1, buffer, sizeof(buffer), 0);
695
+ sqe->flags |= IOSQE_FIXED_FILE;
696
+ sqe->user_data = 2;
697
+
698
+ ret = io_uring_submit(&ring);
699
+ if (ret != 2) {
700
+ fprintf(stderr, "%s: got %d, wanted 2\n", __FUNCTION__, ret);
701
+ return -1;
702
+ }
703
+
704
+ /* remove unused pipe end */
705
+ fd = -1;
706
+ ret = io_uring_register_files_update(&ring, 0, &fd, 1);
707
+ if (ret != 1) {
708
+ fprintf(stderr, "update off=0 failed\n");
709
+ return -1;
710
+ }
711
+
712
+ /* remove used pipe end */
713
+ fd = -1;
714
+ ret = io_uring_register_files_update(&ring, 1, &fd, 1);
715
+ if (ret != 1) {
716
+ fprintf(stderr, "update off=1 failed\n");
717
+ return -1;
718
+ }
719
+
720
+ for (i = 0; i < 2; ++i) {
721
+ ret = io_uring_wait_cqe(&ring, &cqe);
722
+ if (ret < 0) {
723
+ fprintf(stderr, "%s: io_uring_wait_cqe=%d\n", __FUNCTION__, ret);
724
+ return 1;
725
+ }
726
+ io_uring_cqe_seen(&ring, cqe);
727
+ }
728
+
729
+ io_uring_queue_exit(&ring);
730
+ return 0;
731
+ }
732
+
733
+
734
+
735
+ int main(int argc, char *argv[])
736
+ {
737
+ struct io_uring ring;
738
+ int ret;
739
+
740
+ if (argc > 1)
741
+ return 0;
742
+
743
+ ret = io_uring_queue_init(8, &ring, 0);
744
+ if (ret) {
745
+ printf("ring setup failed\n");
746
+ return 1;
747
+ }
748
+
749
+ ret = test_basic(&ring, 0);
750
+ if (ret) {
751
+ printf("test_basic failed\n");
752
+ return ret;
753
+ }
754
+
755
+ ret = test_basic(&ring, 1);
756
+ if (ret) {
757
+ printf("test_basic failed\n");
758
+ return ret;
759
+ }
760
+
761
+ ret = test_basic_many(&ring);
762
+ if (ret) {
763
+ printf("test_basic_many failed\n");
764
+ return ret;
765
+ }
766
+
767
+ ret = test_sparse(&ring);
768
+ if (ret) {
769
+ printf("test_sparse failed\n");
770
+ return ret;
771
+ }
772
+
773
+ if (no_update)
774
+ return 0;
775
+
776
+ ret = test_additions(&ring);
777
+ if (ret) {
778
+ printf("test_additions failed\n");
779
+ return ret;
780
+ }
781
+
782
+ ret = test_removals(&ring);
783
+ if (ret) {
784
+ printf("test_removals failed\n");
785
+ return ret;
786
+ }
787
+
788
+ ret = test_replace(&ring);
789
+ if (ret) {
790
+ printf("test_replace failed\n");
791
+ return ret;
792
+ }
793
+
794
+ ret = test_replace_all(&ring);
795
+ if (ret) {
796
+ printf("test_replace_all failed\n");
797
+ return ret;
798
+ }
799
+
800
+ ret = test_grow(&ring);
801
+ if (ret) {
802
+ printf("test_grow failed\n");
803
+ return ret;
804
+ }
805
+
806
+ ret = test_shrink(&ring);
807
+ if (ret) {
808
+ printf("test_shrink failed\n");
809
+ return ret;
810
+ }
811
+
812
+ ret = test_zero(&ring);
813
+ if (ret) {
814
+ printf("test_zero failed\n");
815
+ return ret;
816
+ }
817
+
818
+ ret = test_huge(&ring);
819
+ if (ret) {
820
+ printf("test_huge failed\n");
821
+ return ret;
822
+ }
823
+
824
+ ret = test_skip(&ring);
825
+ if (ret) {
826
+ printf("test_skip failed\n");
827
+ return 1;
828
+ }
829
+
830
+ ret = test_sparse_updates();
831
+ if (ret) {
832
+ printf("test_sparse_updates failed\n");
833
+ return ret;
834
+ }
835
+
836
+ ret = test_fixed_removal_ordering();
837
+ if (ret) {
838
+ printf("test_fixed_removal_ordering failed\n");
839
+ return 1;
840
+ }
841
+
842
+ return 0;
843
+ }