xref: /aosp_15_r20/external/liburing/test/file-register.c (revision 25da2bea747f3a93b4c30fd9708b0618ef55a0e6)
1*25da2beaSAndroid Build Coastguard Worker /* SPDX-License-Identifier: MIT */
2*25da2beaSAndroid Build Coastguard Worker /*
3*25da2beaSAndroid Build Coastguard Worker  * Description: run various file registration tests
4*25da2beaSAndroid Build Coastguard Worker  *
5*25da2beaSAndroid Build Coastguard Worker  */
6*25da2beaSAndroid Build Coastguard Worker #include <errno.h>
7*25da2beaSAndroid Build Coastguard Worker #include <stdio.h>
8*25da2beaSAndroid Build Coastguard Worker #include <unistd.h>
9*25da2beaSAndroid Build Coastguard Worker #include <stdlib.h>
10*25da2beaSAndroid Build Coastguard Worker #include <string.h>
11*25da2beaSAndroid Build Coastguard Worker #include <fcntl.h>
12*25da2beaSAndroid Build Coastguard Worker #include <sys/resource.h>
13*25da2beaSAndroid Build Coastguard Worker 
14*25da2beaSAndroid Build Coastguard Worker #include "helpers.h"
15*25da2beaSAndroid Build Coastguard Worker #include "liburing.h"
16*25da2beaSAndroid Build Coastguard Worker 
17*25da2beaSAndroid Build Coastguard Worker static int no_update = 0;
18*25da2beaSAndroid Build Coastguard Worker 
close_files(int * files,int nr_files,int add)19*25da2beaSAndroid Build Coastguard Worker static void close_files(int *files, int nr_files, int add)
20*25da2beaSAndroid Build Coastguard Worker {
21*25da2beaSAndroid Build Coastguard Worker 	char fname[32];
22*25da2beaSAndroid Build Coastguard Worker 	int i;
23*25da2beaSAndroid Build Coastguard Worker 
24*25da2beaSAndroid Build Coastguard Worker 	for (i = 0; i < nr_files; i++) {
25*25da2beaSAndroid Build Coastguard Worker 		if (files)
26*25da2beaSAndroid Build Coastguard Worker 			close(files[i]);
27*25da2beaSAndroid Build Coastguard Worker 		if (!add)
28*25da2beaSAndroid Build Coastguard Worker 			sprintf(fname, ".reg.%d", i);
29*25da2beaSAndroid Build Coastguard Worker 		else
30*25da2beaSAndroid Build Coastguard Worker 			sprintf(fname, ".add.%d", i + add);
31*25da2beaSAndroid Build Coastguard Worker 		unlink(fname);
32*25da2beaSAndroid Build Coastguard Worker 	}
33*25da2beaSAndroid Build Coastguard Worker 	if (files)
34*25da2beaSAndroid Build Coastguard Worker 		free(files);
35*25da2beaSAndroid Build Coastguard Worker }
36*25da2beaSAndroid Build Coastguard Worker 
open_files(int nr_files,int extra,int add)37*25da2beaSAndroid Build Coastguard Worker static int *open_files(int nr_files, int extra, int add)
38*25da2beaSAndroid Build Coastguard Worker {
39*25da2beaSAndroid Build Coastguard Worker 	char fname[32];
40*25da2beaSAndroid Build Coastguard Worker 	int *files;
41*25da2beaSAndroid Build Coastguard Worker 	int i;
42*25da2beaSAndroid Build Coastguard Worker 
43*25da2beaSAndroid Build Coastguard Worker 	files = t_calloc(nr_files + extra, sizeof(int));
44*25da2beaSAndroid Build Coastguard Worker 
45*25da2beaSAndroid Build Coastguard Worker 	for (i = 0; i < nr_files; i++) {
46*25da2beaSAndroid Build Coastguard Worker 		if (!add)
47*25da2beaSAndroid Build Coastguard Worker 			sprintf(fname, ".reg.%d", i);
48*25da2beaSAndroid Build Coastguard Worker 		else
49*25da2beaSAndroid Build Coastguard Worker 			sprintf(fname, ".add.%d", i + add);
50*25da2beaSAndroid Build Coastguard Worker 		files[i] = open(fname, O_RDWR | O_CREAT, 0644);
51*25da2beaSAndroid Build Coastguard Worker 		if (files[i] < 0) {
52*25da2beaSAndroid Build Coastguard Worker 			perror("open");
53*25da2beaSAndroid Build Coastguard Worker 			free(files);
54*25da2beaSAndroid Build Coastguard Worker 			files = NULL;
55*25da2beaSAndroid Build Coastguard Worker 			break;
56*25da2beaSAndroid Build Coastguard Worker 		}
57*25da2beaSAndroid Build Coastguard Worker 	}
58*25da2beaSAndroid Build Coastguard Worker 	if (extra) {
59*25da2beaSAndroid Build Coastguard Worker 		for (i = nr_files; i < nr_files + extra; i++)
60*25da2beaSAndroid Build Coastguard Worker 			files[i] = -1;
61*25da2beaSAndroid Build Coastguard Worker 	}
62*25da2beaSAndroid Build Coastguard Worker 
63*25da2beaSAndroid Build Coastguard Worker 	return files;
64*25da2beaSAndroid Build Coastguard Worker }
65*25da2beaSAndroid Build Coastguard Worker 
test_shrink(struct io_uring * ring)66*25da2beaSAndroid Build Coastguard Worker static int test_shrink(struct io_uring *ring)
67*25da2beaSAndroid Build Coastguard Worker {
68*25da2beaSAndroid Build Coastguard Worker 	int ret, off, fd;
69*25da2beaSAndroid Build Coastguard Worker 	int *files;
70*25da2beaSAndroid Build Coastguard Worker 
71*25da2beaSAndroid Build Coastguard Worker 	files = open_files(50, 0, 0);
72*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(ring, files, 50);
73*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
74*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
75*25da2beaSAndroid Build Coastguard Worker 		goto err;
76*25da2beaSAndroid Build Coastguard Worker 	}
77*25da2beaSAndroid Build Coastguard Worker 
78*25da2beaSAndroid Build Coastguard Worker 	off = 0;
79*25da2beaSAndroid Build Coastguard Worker 	do {
80*25da2beaSAndroid Build Coastguard Worker 		fd = -1;
81*25da2beaSAndroid Build Coastguard Worker 		ret = io_uring_register_files_update(ring, off, &fd, 1);
82*25da2beaSAndroid Build Coastguard Worker 		if (ret != 1) {
83*25da2beaSAndroid Build Coastguard Worker 			if (off == 50 && ret == -EINVAL)
84*25da2beaSAndroid Build Coastguard Worker 				break;
85*25da2beaSAndroid Build Coastguard Worker 			fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
86*25da2beaSAndroid Build Coastguard Worker 			break;
87*25da2beaSAndroid Build Coastguard Worker 		}
88*25da2beaSAndroid Build Coastguard Worker 		off++;
89*25da2beaSAndroid Build Coastguard Worker 	} while (1);
90*25da2beaSAndroid Build Coastguard Worker 
91*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_unregister_files(ring);
92*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
93*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
94*25da2beaSAndroid Build Coastguard Worker 		goto err;
95*25da2beaSAndroid Build Coastguard Worker 	}
96*25da2beaSAndroid Build Coastguard Worker 
97*25da2beaSAndroid Build Coastguard Worker 	close_files(files, 50, 0);
98*25da2beaSAndroid Build Coastguard Worker 	return 0;
99*25da2beaSAndroid Build Coastguard Worker err:
100*25da2beaSAndroid Build Coastguard Worker 	close_files(files, 50, 0);
101*25da2beaSAndroid Build Coastguard Worker 	return 1;
102*25da2beaSAndroid Build Coastguard Worker }
103*25da2beaSAndroid Build Coastguard Worker 
104*25da2beaSAndroid Build Coastguard Worker 
test_grow(struct io_uring * ring)105*25da2beaSAndroid Build Coastguard Worker static int test_grow(struct io_uring *ring)
106*25da2beaSAndroid Build Coastguard Worker {
107*25da2beaSAndroid Build Coastguard Worker 	int ret, off;
108*25da2beaSAndroid Build Coastguard Worker 	int *files, *fds = NULL;
109*25da2beaSAndroid Build Coastguard Worker 
110*25da2beaSAndroid Build Coastguard Worker 	files = open_files(50, 250, 0);
111*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(ring, files, 300);
112*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
113*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
114*25da2beaSAndroid Build Coastguard Worker 		goto err;
115*25da2beaSAndroid Build Coastguard Worker 	}
116*25da2beaSAndroid Build Coastguard Worker 
117*25da2beaSAndroid Build Coastguard Worker 	off = 50;
118*25da2beaSAndroid Build Coastguard Worker 	do {
119*25da2beaSAndroid Build Coastguard Worker 		fds = open_files(1, 0, off);
120*25da2beaSAndroid Build Coastguard Worker 		ret = io_uring_register_files_update(ring, off, fds, 1);
121*25da2beaSAndroid Build Coastguard Worker 		if (ret != 1) {
122*25da2beaSAndroid Build Coastguard Worker 			if (off == 300 && ret == -EINVAL)
123*25da2beaSAndroid Build Coastguard Worker 				break;
124*25da2beaSAndroid Build Coastguard Worker 			fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
125*25da2beaSAndroid Build Coastguard Worker 			break;
126*25da2beaSAndroid Build Coastguard Worker 		}
127*25da2beaSAndroid Build Coastguard Worker 		if (off >= 300) {
128*25da2beaSAndroid Build Coastguard Worker 			fprintf(stderr, "%s: Succeeded beyond end-of-list?\n", __FUNCTION__);
129*25da2beaSAndroid Build Coastguard Worker 			goto err;
130*25da2beaSAndroid Build Coastguard Worker 		}
131*25da2beaSAndroid Build Coastguard Worker 		off++;
132*25da2beaSAndroid Build Coastguard Worker 	} while (1);
133*25da2beaSAndroid Build Coastguard Worker 
134*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_unregister_files(ring);
135*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
136*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
137*25da2beaSAndroid Build Coastguard Worker 		goto err;
138*25da2beaSAndroid Build Coastguard Worker 	}
139*25da2beaSAndroid Build Coastguard Worker 
140*25da2beaSAndroid Build Coastguard Worker 	close_files(files, 100, 0);
141*25da2beaSAndroid Build Coastguard Worker 	close_files(NULL, 251, 50);
142*25da2beaSAndroid Build Coastguard Worker 	return 0;
143*25da2beaSAndroid Build Coastguard Worker err:
144*25da2beaSAndroid Build Coastguard Worker 	close_files(files, 100, 0);
145*25da2beaSAndroid Build Coastguard Worker 	close_files(NULL, 251, 50);
146*25da2beaSAndroid Build Coastguard Worker 	return 1;
147*25da2beaSAndroid Build Coastguard Worker }
148*25da2beaSAndroid Build Coastguard Worker 
test_replace_all(struct io_uring * ring)149*25da2beaSAndroid Build Coastguard Worker static int test_replace_all(struct io_uring *ring)
150*25da2beaSAndroid Build Coastguard Worker {
151*25da2beaSAndroid Build Coastguard Worker 	int *files, *fds = NULL;
152*25da2beaSAndroid Build Coastguard Worker 	int ret, i;
153*25da2beaSAndroid Build Coastguard Worker 
154*25da2beaSAndroid Build Coastguard Worker 	files = open_files(100, 0, 0);
155*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(ring, files, 100);
156*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
157*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
158*25da2beaSAndroid Build Coastguard Worker 		goto err;
159*25da2beaSAndroid Build Coastguard Worker 	}
160*25da2beaSAndroid Build Coastguard Worker 
161*25da2beaSAndroid Build Coastguard Worker 	fds = t_malloc(100 * sizeof(int));
162*25da2beaSAndroid Build Coastguard Worker 	for (i = 0; i < 100; i++)
163*25da2beaSAndroid Build Coastguard Worker 		fds[i] = -1;
164*25da2beaSAndroid Build Coastguard Worker 
165*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files_update(ring, 0, fds, 100);
166*25da2beaSAndroid Build Coastguard Worker 	if (ret != 100) {
167*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
168*25da2beaSAndroid Build Coastguard Worker 		goto err;
169*25da2beaSAndroid Build Coastguard Worker 	}
170*25da2beaSAndroid Build Coastguard Worker 
171*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_unregister_files(ring);
172*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
173*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
174*25da2beaSAndroid Build Coastguard Worker 		goto err;
175*25da2beaSAndroid Build Coastguard Worker 	}
176*25da2beaSAndroid Build Coastguard Worker 
177*25da2beaSAndroid Build Coastguard Worker 	close_files(files, 100, 0);
178*25da2beaSAndroid Build Coastguard Worker 	if (fds)
179*25da2beaSAndroid Build Coastguard Worker 		free(fds);
180*25da2beaSAndroid Build Coastguard Worker 	return 0;
181*25da2beaSAndroid Build Coastguard Worker err:
182*25da2beaSAndroid Build Coastguard Worker 	close_files(files, 100, 0);
183*25da2beaSAndroid Build Coastguard Worker 	if (fds)
184*25da2beaSAndroid Build Coastguard Worker 		free(fds);
185*25da2beaSAndroid Build Coastguard Worker 	return 1;
186*25da2beaSAndroid Build Coastguard Worker }
187*25da2beaSAndroid Build Coastguard Worker 
test_replace(struct io_uring * ring)188*25da2beaSAndroid Build Coastguard Worker static int test_replace(struct io_uring *ring)
189*25da2beaSAndroid Build Coastguard Worker {
190*25da2beaSAndroid Build Coastguard Worker 	int *files, *fds = NULL;
191*25da2beaSAndroid Build Coastguard Worker 	int ret;
192*25da2beaSAndroid Build Coastguard Worker 
193*25da2beaSAndroid Build Coastguard Worker 	files = open_files(100, 0, 0);
194*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(ring, files, 100);
195*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
196*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
197*25da2beaSAndroid Build Coastguard Worker 		goto err;
198*25da2beaSAndroid Build Coastguard Worker 	}
199*25da2beaSAndroid Build Coastguard Worker 
200*25da2beaSAndroid Build Coastguard Worker 	fds = open_files(10, 0, 1);
201*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files_update(ring, 90, fds, 10);
202*25da2beaSAndroid Build Coastguard Worker 	if (ret != 10) {
203*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
204*25da2beaSAndroid Build Coastguard Worker 		goto err;
205*25da2beaSAndroid Build Coastguard Worker 	}
206*25da2beaSAndroid Build Coastguard Worker 
207*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_unregister_files(ring);
208*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
209*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
210*25da2beaSAndroid Build Coastguard Worker 		goto err;
211*25da2beaSAndroid Build Coastguard Worker 	}
212*25da2beaSAndroid Build Coastguard Worker 
213*25da2beaSAndroid Build Coastguard Worker 	close_files(files, 100, 0);
214*25da2beaSAndroid Build Coastguard Worker 	if (fds)
215*25da2beaSAndroid Build Coastguard Worker 		close_files(fds, 10, 1);
216*25da2beaSAndroid Build Coastguard Worker 	return 0;
217*25da2beaSAndroid Build Coastguard Worker err:
218*25da2beaSAndroid Build Coastguard Worker 	close_files(files, 100, 0);
219*25da2beaSAndroid Build Coastguard Worker 	if (fds)
220*25da2beaSAndroid Build Coastguard Worker 		close_files(fds, 10, 1);
221*25da2beaSAndroid Build Coastguard Worker 	return 1;
222*25da2beaSAndroid Build Coastguard Worker }
223*25da2beaSAndroid Build Coastguard Worker 
test_removals(struct io_uring * ring)224*25da2beaSAndroid Build Coastguard Worker static int test_removals(struct io_uring *ring)
225*25da2beaSAndroid Build Coastguard Worker {
226*25da2beaSAndroid Build Coastguard Worker 	int *files, *fds = NULL;
227*25da2beaSAndroid Build Coastguard Worker 	int ret, i;
228*25da2beaSAndroid Build Coastguard Worker 
229*25da2beaSAndroid Build Coastguard Worker 	files = open_files(100, 0, 0);
230*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(ring, files, 100);
231*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
232*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
233*25da2beaSAndroid Build Coastguard Worker 		goto err;
234*25da2beaSAndroid Build Coastguard Worker 	}
235*25da2beaSAndroid Build Coastguard Worker 
236*25da2beaSAndroid Build Coastguard Worker 	fds = t_calloc(10, sizeof(int));
237*25da2beaSAndroid Build Coastguard Worker 	for (i = 0; i < 10; i++)
238*25da2beaSAndroid Build Coastguard Worker 		fds[i] = -1;
239*25da2beaSAndroid Build Coastguard Worker 
240*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files_update(ring, 50, fds, 10);
241*25da2beaSAndroid Build Coastguard Worker 	if (ret != 10) {
242*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
243*25da2beaSAndroid Build Coastguard Worker 		goto err;
244*25da2beaSAndroid Build Coastguard Worker 	}
245*25da2beaSAndroid Build Coastguard Worker 
246*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_unregister_files(ring);
247*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
248*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
249*25da2beaSAndroid Build Coastguard Worker 		goto err;
250*25da2beaSAndroid Build Coastguard Worker 	}
251*25da2beaSAndroid Build Coastguard Worker 
252*25da2beaSAndroid Build Coastguard Worker 	close_files(files, 100, 0);
253*25da2beaSAndroid Build Coastguard Worker 	if (fds)
254*25da2beaSAndroid Build Coastguard Worker 		free(fds);
255*25da2beaSAndroid Build Coastguard Worker 	return 0;
256*25da2beaSAndroid Build Coastguard Worker err:
257*25da2beaSAndroid Build Coastguard Worker 	close_files(files, 100, 0);
258*25da2beaSAndroid Build Coastguard Worker 	if (fds)
259*25da2beaSAndroid Build Coastguard Worker 		free(fds);
260*25da2beaSAndroid Build Coastguard Worker 	return 1;
261*25da2beaSAndroid Build Coastguard Worker }
262*25da2beaSAndroid Build Coastguard Worker 
test_additions(struct io_uring * ring)263*25da2beaSAndroid Build Coastguard Worker static int test_additions(struct io_uring *ring)
264*25da2beaSAndroid Build Coastguard Worker {
265*25da2beaSAndroid Build Coastguard Worker 	int *files, *fds = NULL;
266*25da2beaSAndroid Build Coastguard Worker 	int ret;
267*25da2beaSAndroid Build Coastguard Worker 
268*25da2beaSAndroid Build Coastguard Worker 	files = open_files(100, 100, 0);
269*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(ring, files, 200);
270*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
271*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
272*25da2beaSAndroid Build Coastguard Worker 		goto err;
273*25da2beaSAndroid Build Coastguard Worker 	}
274*25da2beaSAndroid Build Coastguard Worker 
275*25da2beaSAndroid Build Coastguard Worker 	fds = open_files(2, 0, 1);
276*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files_update(ring, 100, fds, 2);
277*25da2beaSAndroid Build Coastguard Worker 	if (ret != 2) {
278*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
279*25da2beaSAndroid Build Coastguard Worker 		goto err;
280*25da2beaSAndroid Build Coastguard Worker 	}
281*25da2beaSAndroid Build Coastguard Worker 
282*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_unregister_files(ring);
283*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
284*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
285*25da2beaSAndroid Build Coastguard Worker 		goto err;
286*25da2beaSAndroid Build Coastguard Worker 	}
287*25da2beaSAndroid Build Coastguard Worker 
288*25da2beaSAndroid Build Coastguard Worker 	close_files(files, 100, 0);
289*25da2beaSAndroid Build Coastguard Worker 	if (fds)
290*25da2beaSAndroid Build Coastguard Worker 		close_files(fds, 2, 1);
291*25da2beaSAndroid Build Coastguard Worker 	return 0;
292*25da2beaSAndroid Build Coastguard Worker err:
293*25da2beaSAndroid Build Coastguard Worker 	close_files(files, 100, 0);
294*25da2beaSAndroid Build Coastguard Worker 	if (fds)
295*25da2beaSAndroid Build Coastguard Worker 		close_files(fds, 2, 1);
296*25da2beaSAndroid Build Coastguard Worker 	return 1;
297*25da2beaSAndroid Build Coastguard Worker }
298*25da2beaSAndroid Build Coastguard Worker 
test_sparse(struct io_uring * ring)299*25da2beaSAndroid Build Coastguard Worker static int test_sparse(struct io_uring *ring)
300*25da2beaSAndroid Build Coastguard Worker {
301*25da2beaSAndroid Build Coastguard Worker 	int *files;
302*25da2beaSAndroid Build Coastguard Worker 	int ret;
303*25da2beaSAndroid Build Coastguard Worker 
304*25da2beaSAndroid Build Coastguard Worker 	files = open_files(100, 100, 0);
305*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(ring, files, 200);
306*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
307*25da2beaSAndroid Build Coastguard Worker 		if (ret == -EBADF) {
308*25da2beaSAndroid Build Coastguard Worker 			fprintf(stdout, "Sparse files not supported\n");
309*25da2beaSAndroid Build Coastguard Worker 			no_update = 1;
310*25da2beaSAndroid Build Coastguard Worker 			goto done;
311*25da2beaSAndroid Build Coastguard Worker 		}
312*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
313*25da2beaSAndroid Build Coastguard Worker 		goto err;
314*25da2beaSAndroid Build Coastguard Worker 	}
315*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_unregister_files(ring);
316*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
317*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
318*25da2beaSAndroid Build Coastguard Worker 		goto err;
319*25da2beaSAndroid Build Coastguard Worker 	}
320*25da2beaSAndroid Build Coastguard Worker done:
321*25da2beaSAndroid Build Coastguard Worker 	close_files(files, 100, 0);
322*25da2beaSAndroid Build Coastguard Worker 	return 0;
323*25da2beaSAndroid Build Coastguard Worker err:
324*25da2beaSAndroid Build Coastguard Worker 	close_files(files, 100, 0);
325*25da2beaSAndroid Build Coastguard Worker 	return 1;
326*25da2beaSAndroid Build Coastguard Worker }
327*25da2beaSAndroid Build Coastguard Worker 
test_basic_many(struct io_uring * ring)328*25da2beaSAndroid Build Coastguard Worker static int test_basic_many(struct io_uring *ring)
329*25da2beaSAndroid Build Coastguard Worker {
330*25da2beaSAndroid Build Coastguard Worker 	int *files;
331*25da2beaSAndroid Build Coastguard Worker 	int ret;
332*25da2beaSAndroid Build Coastguard Worker 
333*25da2beaSAndroid Build Coastguard Worker 	files = open_files(768, 0, 0);
334*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(ring, files, 768);
335*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
336*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: register %d\n", __FUNCTION__, ret);
337*25da2beaSAndroid Build Coastguard Worker 		goto err;
338*25da2beaSAndroid Build Coastguard Worker 	}
339*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_unregister_files(ring);
340*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
341*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: unregister %d\n", __FUNCTION__, ret);
342*25da2beaSAndroid Build Coastguard Worker 		goto err;
343*25da2beaSAndroid Build Coastguard Worker 	}
344*25da2beaSAndroid Build Coastguard Worker 	close_files(files, 768, 0);
345*25da2beaSAndroid Build Coastguard Worker 	return 0;
346*25da2beaSAndroid Build Coastguard Worker err:
347*25da2beaSAndroid Build Coastguard Worker 	close_files(files, 768, 0);
348*25da2beaSAndroid Build Coastguard Worker 	return 1;
349*25da2beaSAndroid Build Coastguard Worker }
350*25da2beaSAndroid Build Coastguard Worker 
test_basic(struct io_uring * ring,int fail)351*25da2beaSAndroid Build Coastguard Worker static int test_basic(struct io_uring *ring, int fail)
352*25da2beaSAndroid Build Coastguard Worker {
353*25da2beaSAndroid Build Coastguard Worker 	int *files;
354*25da2beaSAndroid Build Coastguard Worker 	int ret;
355*25da2beaSAndroid Build Coastguard Worker 	int nr_files = fail ? 10 : 100;
356*25da2beaSAndroid Build Coastguard Worker 
357*25da2beaSAndroid Build Coastguard Worker 	files = open_files(nr_files, 0, 0);
358*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(ring, files, 100);
359*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
360*25da2beaSAndroid Build Coastguard Worker 		if (fail) {
361*25da2beaSAndroid Build Coastguard Worker 			if (ret == -EBADF || ret == -EFAULT)
362*25da2beaSAndroid Build Coastguard Worker 				return 0;
363*25da2beaSAndroid Build Coastguard Worker 		}
364*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: register %d\n", __FUNCTION__, ret);
365*25da2beaSAndroid Build Coastguard Worker 		goto err;
366*25da2beaSAndroid Build Coastguard Worker 	}
367*25da2beaSAndroid Build Coastguard Worker 	if (fail) {
368*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "Registration succeeded, but expected fail\n");
369*25da2beaSAndroid Build Coastguard Worker 		goto err;
370*25da2beaSAndroid Build Coastguard Worker 	}
371*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_unregister_files(ring);
372*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
373*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: unregister %d\n", __FUNCTION__, ret);
374*25da2beaSAndroid Build Coastguard Worker 		goto err;
375*25da2beaSAndroid Build Coastguard Worker 	}
376*25da2beaSAndroid Build Coastguard Worker 	close_files(files, nr_files, 0);
377*25da2beaSAndroid Build Coastguard Worker 	return 0;
378*25da2beaSAndroid Build Coastguard Worker err:
379*25da2beaSAndroid Build Coastguard Worker 	close_files(files, nr_files, 0);
380*25da2beaSAndroid Build Coastguard Worker 	return 1;
381*25da2beaSAndroid Build Coastguard Worker }
382*25da2beaSAndroid Build Coastguard Worker 
383*25da2beaSAndroid Build Coastguard Worker /*
384*25da2beaSAndroid Build Coastguard Worker  * Register 0 files, but reserve space for 10.  Then add one file.
385*25da2beaSAndroid Build Coastguard Worker  */
test_zero(struct io_uring * ring)386*25da2beaSAndroid Build Coastguard Worker static int test_zero(struct io_uring *ring)
387*25da2beaSAndroid Build Coastguard Worker {
388*25da2beaSAndroid Build Coastguard Worker 	int *files, *fds = NULL;
389*25da2beaSAndroid Build Coastguard Worker 	int ret;
390*25da2beaSAndroid Build Coastguard Worker 
391*25da2beaSAndroid Build Coastguard Worker 	files = open_files(0, 10, 0);
392*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(ring, files, 10);
393*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
394*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
395*25da2beaSAndroid Build Coastguard Worker 		goto err;
396*25da2beaSAndroid Build Coastguard Worker 	}
397*25da2beaSAndroid Build Coastguard Worker 
398*25da2beaSAndroid Build Coastguard Worker 	fds = open_files(1, 0, 1);
399*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files_update(ring, 0, fds, 1);
400*25da2beaSAndroid Build Coastguard Worker 	if (ret != 1) {
401*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
402*25da2beaSAndroid Build Coastguard Worker 		goto err;
403*25da2beaSAndroid Build Coastguard Worker 	}
404*25da2beaSAndroid Build Coastguard Worker 
405*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_unregister_files(ring);
406*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
407*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
408*25da2beaSAndroid Build Coastguard Worker 		goto err;
409*25da2beaSAndroid Build Coastguard Worker 	}
410*25da2beaSAndroid Build Coastguard Worker 
411*25da2beaSAndroid Build Coastguard Worker 	if (fds)
412*25da2beaSAndroid Build Coastguard Worker 		close_files(fds, 1, 1);
413*25da2beaSAndroid Build Coastguard Worker 	free(files);
414*25da2beaSAndroid Build Coastguard Worker 	return 0;
415*25da2beaSAndroid Build Coastguard Worker err:
416*25da2beaSAndroid Build Coastguard Worker 	if (fds)
417*25da2beaSAndroid Build Coastguard Worker 		close_files(fds, 1, 1);
418*25da2beaSAndroid Build Coastguard Worker 	free(files);
419*25da2beaSAndroid Build Coastguard Worker 	return 1;
420*25da2beaSAndroid Build Coastguard Worker }
421*25da2beaSAndroid Build Coastguard Worker 
test_fixed_read_write(struct io_uring * ring,int index)422*25da2beaSAndroid Build Coastguard Worker static int test_fixed_read_write(struct io_uring *ring, int index)
423*25da2beaSAndroid Build Coastguard Worker {
424*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_sqe *sqe;
425*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_cqe *cqe;
426*25da2beaSAndroid Build Coastguard Worker 	struct iovec iov[2];
427*25da2beaSAndroid Build Coastguard Worker 	int ret;
428*25da2beaSAndroid Build Coastguard Worker 
429*25da2beaSAndroid Build Coastguard Worker 	iov[0].iov_base = t_malloc(4096);
430*25da2beaSAndroid Build Coastguard Worker 	iov[0].iov_len = 4096;
431*25da2beaSAndroid Build Coastguard Worker 	memset(iov[0].iov_base, 0x5a, 4096);
432*25da2beaSAndroid Build Coastguard Worker 
433*25da2beaSAndroid Build Coastguard Worker 	iov[1].iov_base = t_malloc(4096);
434*25da2beaSAndroid Build Coastguard Worker 	iov[1].iov_len = 4096;
435*25da2beaSAndroid Build Coastguard Worker 
436*25da2beaSAndroid Build Coastguard Worker 	sqe = io_uring_get_sqe(ring);
437*25da2beaSAndroid Build Coastguard Worker 	if (!sqe) {
438*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: failed to get sqe\n", __FUNCTION__);
439*25da2beaSAndroid Build Coastguard Worker 		return 1;
440*25da2beaSAndroid Build Coastguard Worker 	}
441*25da2beaSAndroid Build Coastguard Worker 	io_uring_prep_writev(sqe, index, &iov[0], 1, 0);
442*25da2beaSAndroid Build Coastguard Worker 	sqe->flags |= IOSQE_FIXED_FILE;
443*25da2beaSAndroid Build Coastguard Worker 	sqe->user_data = 1;
444*25da2beaSAndroid Build Coastguard Worker 
445*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_submit(ring);
446*25da2beaSAndroid Build Coastguard Worker 	if (ret != 1) {
447*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: got %d, wanted 1\n", __FUNCTION__, ret);
448*25da2beaSAndroid Build Coastguard Worker 		return 1;
449*25da2beaSAndroid Build Coastguard Worker 	}
450*25da2beaSAndroid Build Coastguard Worker 
451*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_wait_cqe(ring, &cqe);
452*25da2beaSAndroid Build Coastguard Worker 	if (ret < 0) {
453*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: io_uring_wait_cqe=%d\n", __FUNCTION__, ret);
454*25da2beaSAndroid Build Coastguard Worker 		return 1;
455*25da2beaSAndroid Build Coastguard Worker 	}
456*25da2beaSAndroid Build Coastguard Worker 	if (cqe->res != 4096) {
457*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: write cqe->res=%d\n", __FUNCTION__, cqe->res);
458*25da2beaSAndroid Build Coastguard Worker 		return 1;
459*25da2beaSAndroid Build Coastguard Worker 	}
460*25da2beaSAndroid Build Coastguard Worker 	io_uring_cqe_seen(ring, cqe);
461*25da2beaSAndroid Build Coastguard Worker 
462*25da2beaSAndroid Build Coastguard Worker 	sqe = io_uring_get_sqe(ring);
463*25da2beaSAndroid Build Coastguard Worker 	if (!sqe) {
464*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: failed to get sqe\n", __FUNCTION__);
465*25da2beaSAndroid Build Coastguard Worker 		return 1;
466*25da2beaSAndroid Build Coastguard Worker 	}
467*25da2beaSAndroid Build Coastguard Worker 	io_uring_prep_readv(sqe, index, &iov[1], 1, 0);
468*25da2beaSAndroid Build Coastguard Worker 	sqe->flags |= IOSQE_FIXED_FILE;
469*25da2beaSAndroid Build Coastguard Worker 	sqe->user_data = 2;
470*25da2beaSAndroid Build Coastguard Worker 
471*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_submit(ring);
472*25da2beaSAndroid Build Coastguard Worker 	if (ret != 1) {
473*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: got %d, wanted 1\n", __FUNCTION__, ret);
474*25da2beaSAndroid Build Coastguard Worker 		return 1;
475*25da2beaSAndroid Build Coastguard Worker 	}
476*25da2beaSAndroid Build Coastguard Worker 
477*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_wait_cqe(ring, &cqe);
478*25da2beaSAndroid Build Coastguard Worker 	if (ret < 0) {
479*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: io_uring_wait_cqe=%d\n", __FUNCTION__, ret);
480*25da2beaSAndroid Build Coastguard Worker 		return 1;
481*25da2beaSAndroid Build Coastguard Worker 	}
482*25da2beaSAndroid Build Coastguard Worker 	if (cqe->res != 4096) {
483*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: read cqe->res=%d\n", __FUNCTION__, cqe->res);
484*25da2beaSAndroid Build Coastguard Worker 		return 1;
485*25da2beaSAndroid Build Coastguard Worker 	}
486*25da2beaSAndroid Build Coastguard Worker 	io_uring_cqe_seen(ring, cqe);
487*25da2beaSAndroid Build Coastguard Worker 
488*25da2beaSAndroid Build Coastguard Worker 	if (memcmp(iov[1].iov_base, iov[0].iov_base, 4096)) {
489*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: data mismatch\n", __FUNCTION__);
490*25da2beaSAndroid Build Coastguard Worker 		return 1;
491*25da2beaSAndroid Build Coastguard Worker 	}
492*25da2beaSAndroid Build Coastguard Worker 
493*25da2beaSAndroid Build Coastguard Worker 	free(iov[0].iov_base);
494*25da2beaSAndroid Build Coastguard Worker 	free(iov[1].iov_base);
495*25da2beaSAndroid Build Coastguard Worker 	return 0;
496*25da2beaSAndroid Build Coastguard Worker }
497*25da2beaSAndroid Build Coastguard Worker 
adjust_nfiles(int want_files)498*25da2beaSAndroid Build Coastguard Worker static void adjust_nfiles(int want_files)
499*25da2beaSAndroid Build Coastguard Worker {
500*25da2beaSAndroid Build Coastguard Worker 	struct rlimit rlim;
501*25da2beaSAndroid Build Coastguard Worker 
502*25da2beaSAndroid Build Coastguard Worker 	if (getrlimit(RLIMIT_NOFILE, &rlim) < 0)
503*25da2beaSAndroid Build Coastguard Worker 		return;
504*25da2beaSAndroid Build Coastguard Worker 	if (rlim.rlim_cur >= want_files)
505*25da2beaSAndroid Build Coastguard Worker 		return;
506*25da2beaSAndroid Build Coastguard Worker 	rlim.rlim_cur = want_files;
507*25da2beaSAndroid Build Coastguard Worker 	setrlimit(RLIMIT_NOFILE, &rlim);
508*25da2beaSAndroid Build Coastguard Worker }
509*25da2beaSAndroid Build Coastguard Worker 
510*25da2beaSAndroid Build Coastguard Worker /*
511*25da2beaSAndroid Build Coastguard Worker  * Register 8K of sparse files, update one at a random spot, then do some
512*25da2beaSAndroid Build Coastguard Worker  * file IO to verify it works.
513*25da2beaSAndroid Build Coastguard Worker  */
test_huge(struct io_uring * ring)514*25da2beaSAndroid Build Coastguard Worker static int test_huge(struct io_uring *ring)
515*25da2beaSAndroid Build Coastguard Worker {
516*25da2beaSAndroid Build Coastguard Worker 	int *files;
517*25da2beaSAndroid Build Coastguard Worker 	int ret;
518*25da2beaSAndroid Build Coastguard Worker 
519*25da2beaSAndroid Build Coastguard Worker 	adjust_nfiles(16384);
520*25da2beaSAndroid Build Coastguard Worker 
521*25da2beaSAndroid Build Coastguard Worker 	files = open_files(0, 8192, 0);
522*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(ring, files, 8192);
523*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
524*25da2beaSAndroid Build Coastguard Worker 		/* huge sets not supported */
525*25da2beaSAndroid Build Coastguard Worker 		if (ret == -EMFILE) {
526*25da2beaSAndroid Build Coastguard Worker 			fprintf(stdout, "%s: No huge file set support, skipping\n", __FUNCTION__);
527*25da2beaSAndroid Build Coastguard Worker 			goto out;
528*25da2beaSAndroid Build Coastguard Worker 		}
529*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
530*25da2beaSAndroid Build Coastguard Worker 		goto err;
531*25da2beaSAndroid Build Coastguard Worker 	}
532*25da2beaSAndroid Build Coastguard Worker 
533*25da2beaSAndroid Build Coastguard Worker 	files[7193] = open(".reg.7193", O_RDWR | O_CREAT, 0644);
534*25da2beaSAndroid Build Coastguard Worker 	if (files[7193] < 0) {
535*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: open=%d\n", __FUNCTION__, errno);
536*25da2beaSAndroid Build Coastguard Worker 		goto err;
537*25da2beaSAndroid Build Coastguard Worker 	}
538*25da2beaSAndroid Build Coastguard Worker 
539*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files_update(ring, 7193, &files[7193], 1);
540*25da2beaSAndroid Build Coastguard Worker 	if (ret != 1) {
541*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
542*25da2beaSAndroid Build Coastguard Worker 		goto err;
543*25da2beaSAndroid Build Coastguard Worker 	}
544*25da2beaSAndroid Build Coastguard Worker 
545*25da2beaSAndroid Build Coastguard Worker 	if (test_fixed_read_write(ring, 7193))
546*25da2beaSAndroid Build Coastguard Worker 		goto err;
547*25da2beaSAndroid Build Coastguard Worker 
548*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_unregister_files(ring);
549*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
550*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
551*25da2beaSAndroid Build Coastguard Worker 		goto err;
552*25da2beaSAndroid Build Coastguard Worker 	}
553*25da2beaSAndroid Build Coastguard Worker 
554*25da2beaSAndroid Build Coastguard Worker 	if (files[7193] != -1) {
555*25da2beaSAndroid Build Coastguard Worker 		close(files[7193]);
556*25da2beaSAndroid Build Coastguard Worker 		unlink(".reg.7193");
557*25da2beaSAndroid Build Coastguard Worker 	}
558*25da2beaSAndroid Build Coastguard Worker out:
559*25da2beaSAndroid Build Coastguard Worker 	free(files);
560*25da2beaSAndroid Build Coastguard Worker 	return 0;
561*25da2beaSAndroid Build Coastguard Worker err:
562*25da2beaSAndroid Build Coastguard Worker 	if (files[7193] != -1) {
563*25da2beaSAndroid Build Coastguard Worker 		close(files[7193]);
564*25da2beaSAndroid Build Coastguard Worker 		unlink(".reg.7193");
565*25da2beaSAndroid Build Coastguard Worker 	}
566*25da2beaSAndroid Build Coastguard Worker 	free(files);
567*25da2beaSAndroid Build Coastguard Worker 	return 1;
568*25da2beaSAndroid Build Coastguard Worker }
569*25da2beaSAndroid Build Coastguard Worker 
test_skip(struct io_uring * ring)570*25da2beaSAndroid Build Coastguard Worker static int test_skip(struct io_uring *ring)
571*25da2beaSAndroid Build Coastguard Worker {
572*25da2beaSAndroid Build Coastguard Worker 	int *files;
573*25da2beaSAndroid Build Coastguard Worker 	int ret;
574*25da2beaSAndroid Build Coastguard Worker 
575*25da2beaSAndroid Build Coastguard Worker 	files = open_files(100, 0, 0);
576*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(ring, files, 100);
577*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
578*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: register ret=%d\n", __FUNCTION__, ret);
579*25da2beaSAndroid Build Coastguard Worker 		goto err;
580*25da2beaSAndroid Build Coastguard Worker 	}
581*25da2beaSAndroid Build Coastguard Worker 
582*25da2beaSAndroid Build Coastguard Worker 	files[90] = IORING_REGISTER_FILES_SKIP;
583*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files_update(ring, 90, &files[90], 1);
584*25da2beaSAndroid Build Coastguard Worker 	if (ret != 1) {
585*25da2beaSAndroid Build Coastguard Worker 		if (ret == -EBADF) {
586*25da2beaSAndroid Build Coastguard Worker 			fprintf(stdout, "Skipping files not supported\n");
587*25da2beaSAndroid Build Coastguard Worker 			goto done;
588*25da2beaSAndroid Build Coastguard Worker 		}
589*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: update ret=%d\n", __FUNCTION__, ret);
590*25da2beaSAndroid Build Coastguard Worker 		goto err;
591*25da2beaSAndroid Build Coastguard Worker 	}
592*25da2beaSAndroid Build Coastguard Worker 
593*25da2beaSAndroid Build Coastguard Worker 	/* verify can still use file index 90 */
594*25da2beaSAndroid Build Coastguard Worker 	if (test_fixed_read_write(ring, 90))
595*25da2beaSAndroid Build Coastguard Worker 		goto err;
596*25da2beaSAndroid Build Coastguard Worker 
597*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_unregister_files(ring);
598*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
599*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: unregister ret=%d\n", __FUNCTION__, ret);
600*25da2beaSAndroid Build Coastguard Worker 		goto err;
601*25da2beaSAndroid Build Coastguard Worker 	}
602*25da2beaSAndroid Build Coastguard Worker 
603*25da2beaSAndroid Build Coastguard Worker done:
604*25da2beaSAndroid Build Coastguard Worker 	close_files(files, 100, 0);
605*25da2beaSAndroid Build Coastguard Worker 	return 0;
606*25da2beaSAndroid Build Coastguard Worker err:
607*25da2beaSAndroid Build Coastguard Worker 	close_files(files, 100, 0);
608*25da2beaSAndroid Build Coastguard Worker 	return 1;
609*25da2beaSAndroid Build Coastguard Worker }
610*25da2beaSAndroid Build Coastguard Worker 
test_sparse_updates(void)611*25da2beaSAndroid Build Coastguard Worker static int test_sparse_updates(void)
612*25da2beaSAndroid Build Coastguard Worker {
613*25da2beaSAndroid Build Coastguard Worker 	struct io_uring ring;
614*25da2beaSAndroid Build Coastguard Worker 	int ret, i, *fds, newfd;
615*25da2beaSAndroid Build Coastguard Worker 
616*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_queue_init(8, &ring, 0);
617*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
618*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "queue_init: %d\n", ret);
619*25da2beaSAndroid Build Coastguard Worker 		return ret;
620*25da2beaSAndroid Build Coastguard Worker 	}
621*25da2beaSAndroid Build Coastguard Worker 
622*25da2beaSAndroid Build Coastguard Worker 	fds = t_malloc(256 * sizeof(int));
623*25da2beaSAndroid Build Coastguard Worker 	for (i = 0; i < 256; i++)
624*25da2beaSAndroid Build Coastguard Worker 		fds[i] = -1;
625*25da2beaSAndroid Build Coastguard Worker 
626*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(&ring, fds, 256);
627*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
628*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "file_register: %d\n", ret);
629*25da2beaSAndroid Build Coastguard Worker 		return ret;
630*25da2beaSAndroid Build Coastguard Worker 	}
631*25da2beaSAndroid Build Coastguard Worker 
632*25da2beaSAndroid Build Coastguard Worker 	newfd = 1;
633*25da2beaSAndroid Build Coastguard Worker 	for (i = 0; i < 256; i++) {
634*25da2beaSAndroid Build Coastguard Worker 		ret = io_uring_register_files_update(&ring, i, &newfd, 1);
635*25da2beaSAndroid Build Coastguard Worker 		if (ret != 1) {
636*25da2beaSAndroid Build Coastguard Worker 			fprintf(stderr, "file_update: %d\n", ret);
637*25da2beaSAndroid Build Coastguard Worker 			return ret;
638*25da2beaSAndroid Build Coastguard Worker 		}
639*25da2beaSAndroid Build Coastguard Worker 	}
640*25da2beaSAndroid Build Coastguard Worker 	io_uring_unregister_files(&ring);
641*25da2beaSAndroid Build Coastguard Worker 
642*25da2beaSAndroid Build Coastguard Worker 	for (i = 0; i < 256; i++)
643*25da2beaSAndroid Build Coastguard Worker 		fds[i] = 1;
644*25da2beaSAndroid Build Coastguard Worker 
645*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(&ring, fds, 256);
646*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
647*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "file_register: %d\n", ret);
648*25da2beaSAndroid Build Coastguard Worker 		return ret;
649*25da2beaSAndroid Build Coastguard Worker 	}
650*25da2beaSAndroid Build Coastguard Worker 
651*25da2beaSAndroid Build Coastguard Worker 	newfd = -1;
652*25da2beaSAndroid Build Coastguard Worker 	for (i = 0; i < 256; i++) {
653*25da2beaSAndroid Build Coastguard Worker 		ret = io_uring_register_files_update(&ring, i, &newfd, 1);
654*25da2beaSAndroid Build Coastguard Worker 		if (ret != 1) {
655*25da2beaSAndroid Build Coastguard Worker 			fprintf(stderr, "file_update: %d\n", ret);
656*25da2beaSAndroid Build Coastguard Worker 			return ret;
657*25da2beaSAndroid Build Coastguard Worker 		}
658*25da2beaSAndroid Build Coastguard Worker 	}
659*25da2beaSAndroid Build Coastguard Worker 	io_uring_unregister_files(&ring);
660*25da2beaSAndroid Build Coastguard Worker 
661*25da2beaSAndroid Build Coastguard Worker 	io_uring_queue_exit(&ring);
662*25da2beaSAndroid Build Coastguard Worker 	return 0;
663*25da2beaSAndroid Build Coastguard Worker }
664*25da2beaSAndroid Build Coastguard Worker 
test_fixed_removal_ordering(void)665*25da2beaSAndroid Build Coastguard Worker static int test_fixed_removal_ordering(void)
666*25da2beaSAndroid Build Coastguard Worker {
667*25da2beaSAndroid Build Coastguard Worker 	char buffer[128];
668*25da2beaSAndroid Build Coastguard Worker 	struct io_uring ring;
669*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_sqe *sqe;
670*25da2beaSAndroid Build Coastguard Worker 	struct io_uring_cqe *cqe;
671*25da2beaSAndroid Build Coastguard Worker 	struct __kernel_timespec ts;
672*25da2beaSAndroid Build Coastguard Worker 	int ret, fd, i, fds[2];
673*25da2beaSAndroid Build Coastguard Worker 
674*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_queue_init(8, &ring, 0);
675*25da2beaSAndroid Build Coastguard Worker 	if (ret < 0) {
676*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "failed to init io_uring: %s\n", strerror(-ret));
677*25da2beaSAndroid Build Coastguard Worker 		return ret;
678*25da2beaSAndroid Build Coastguard Worker 	}
679*25da2beaSAndroid Build Coastguard Worker 	if (pipe(fds)) {
680*25da2beaSAndroid Build Coastguard Worker 		perror("pipe");
681*25da2beaSAndroid Build Coastguard Worker 		return -1;
682*25da2beaSAndroid Build Coastguard Worker 	}
683*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(&ring, fds, 2);
684*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
685*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "file_register: %d\n", ret);
686*25da2beaSAndroid Build Coastguard Worker 		return ret;
687*25da2beaSAndroid Build Coastguard Worker 	}
688*25da2beaSAndroid Build Coastguard Worker 	/* ring should have fds referenced, can close them */
689*25da2beaSAndroid Build Coastguard Worker 	close(fds[0]);
690*25da2beaSAndroid Build Coastguard Worker 	close(fds[1]);
691*25da2beaSAndroid Build Coastguard Worker 
692*25da2beaSAndroid Build Coastguard Worker 	sqe = io_uring_get_sqe(&ring);
693*25da2beaSAndroid Build Coastguard Worker 	if (!sqe) {
694*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
695*25da2beaSAndroid Build Coastguard Worker 		return 1;
696*25da2beaSAndroid Build Coastguard Worker 	}
697*25da2beaSAndroid Build Coastguard Worker 	/* outwait file recycling delay */
698*25da2beaSAndroid Build Coastguard Worker 	ts.tv_sec = 3;
699*25da2beaSAndroid Build Coastguard Worker 	ts.tv_nsec = 0;
700*25da2beaSAndroid Build Coastguard Worker 	io_uring_prep_timeout(sqe, &ts, 0, 0);
701*25da2beaSAndroid Build Coastguard Worker 	sqe->flags |= IOSQE_IO_LINK | IOSQE_IO_HARDLINK;
702*25da2beaSAndroid Build Coastguard Worker 	sqe->user_data = 1;
703*25da2beaSAndroid Build Coastguard Worker 
704*25da2beaSAndroid Build Coastguard Worker 	sqe = io_uring_get_sqe(&ring);
705*25da2beaSAndroid Build Coastguard Worker 	if (!sqe) {
706*25da2beaSAndroid Build Coastguard Worker 		printf("get sqe failed\n");
707*25da2beaSAndroid Build Coastguard Worker 		return -1;
708*25da2beaSAndroid Build Coastguard Worker 	}
709*25da2beaSAndroid Build Coastguard Worker 	io_uring_prep_write(sqe, 1, buffer, sizeof(buffer), 0);
710*25da2beaSAndroid Build Coastguard Worker 	sqe->flags |= IOSQE_FIXED_FILE;
711*25da2beaSAndroid Build Coastguard Worker 	sqe->user_data = 2;
712*25da2beaSAndroid Build Coastguard Worker 
713*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_submit(&ring);
714*25da2beaSAndroid Build Coastguard Worker 	if (ret != 2) {
715*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "%s: got %d, wanted 2\n", __FUNCTION__, ret);
716*25da2beaSAndroid Build Coastguard Worker 		return -1;
717*25da2beaSAndroid Build Coastguard Worker 	}
718*25da2beaSAndroid Build Coastguard Worker 
719*25da2beaSAndroid Build Coastguard Worker 	/* remove unused pipe end */
720*25da2beaSAndroid Build Coastguard Worker 	fd = -1;
721*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files_update(&ring, 0, &fd, 1);
722*25da2beaSAndroid Build Coastguard Worker 	if (ret != 1) {
723*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "update off=0 failed\n");
724*25da2beaSAndroid Build Coastguard Worker 		return -1;
725*25da2beaSAndroid Build Coastguard Worker 	}
726*25da2beaSAndroid Build Coastguard Worker 
727*25da2beaSAndroid Build Coastguard Worker 	/* remove used pipe end */
728*25da2beaSAndroid Build Coastguard Worker 	fd = -1;
729*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files_update(&ring, 1, &fd, 1);
730*25da2beaSAndroid Build Coastguard Worker 	if (ret != 1) {
731*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "update off=1 failed\n");
732*25da2beaSAndroid Build Coastguard Worker 		return -1;
733*25da2beaSAndroid Build Coastguard Worker 	}
734*25da2beaSAndroid Build Coastguard Worker 
735*25da2beaSAndroid Build Coastguard Worker 	for (i = 0; i < 2; ++i) {
736*25da2beaSAndroid Build Coastguard Worker 		ret = io_uring_wait_cqe(&ring, &cqe);
737*25da2beaSAndroid Build Coastguard Worker 		if (ret < 0) {
738*25da2beaSAndroid Build Coastguard Worker 			fprintf(stderr, "%s: io_uring_wait_cqe=%d\n", __FUNCTION__, ret);
739*25da2beaSAndroid Build Coastguard Worker 			return 1;
740*25da2beaSAndroid Build Coastguard Worker 		}
741*25da2beaSAndroid Build Coastguard Worker 		io_uring_cqe_seen(&ring, cqe);
742*25da2beaSAndroid Build Coastguard Worker 	}
743*25da2beaSAndroid Build Coastguard Worker 
744*25da2beaSAndroid Build Coastguard Worker 	io_uring_queue_exit(&ring);
745*25da2beaSAndroid Build Coastguard Worker 	return 0;
746*25da2beaSAndroid Build Coastguard Worker }
747*25da2beaSAndroid Build Coastguard Worker 
748*25da2beaSAndroid Build Coastguard Worker /* mix files requiring SCM-accounting and not in a single register */
test_mixed_af_unix(void)749*25da2beaSAndroid Build Coastguard Worker static int test_mixed_af_unix(void)
750*25da2beaSAndroid Build Coastguard Worker {
751*25da2beaSAndroid Build Coastguard Worker 	struct io_uring ring;
752*25da2beaSAndroid Build Coastguard Worker 	int i, ret, fds[2];
753*25da2beaSAndroid Build Coastguard Worker 	int reg_fds[32];
754*25da2beaSAndroid Build Coastguard Worker 	int sp[2];
755*25da2beaSAndroid Build Coastguard Worker 
756*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_queue_init(8, &ring, 0);
757*25da2beaSAndroid Build Coastguard Worker 	if (ret < 0) {
758*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "failed to init io_uring: %s\n", strerror(-ret));
759*25da2beaSAndroid Build Coastguard Worker 		return ret;
760*25da2beaSAndroid Build Coastguard Worker 	}
761*25da2beaSAndroid Build Coastguard Worker 	if (pipe(fds)) {
762*25da2beaSAndroid Build Coastguard Worker 		perror("pipe");
763*25da2beaSAndroid Build Coastguard Worker 		return -1;
764*25da2beaSAndroid Build Coastguard Worker 	}
765*25da2beaSAndroid Build Coastguard Worker 	if (socketpair(AF_UNIX, SOCK_DGRAM, 0, sp) != 0) {
766*25da2beaSAndroid Build Coastguard Worker 		perror("Failed to create Unix-domain socket pair\n");
767*25da2beaSAndroid Build Coastguard Worker 		return 1;
768*25da2beaSAndroid Build Coastguard Worker 	}
769*25da2beaSAndroid Build Coastguard Worker 
770*25da2beaSAndroid Build Coastguard Worker 	for (i = 0; i < 16; i++) {
771*25da2beaSAndroid Build Coastguard Worker 		reg_fds[i * 2] = fds[0];
772*25da2beaSAndroid Build Coastguard Worker 		reg_fds[i * 2 + 1] = sp[0];
773*25da2beaSAndroid Build Coastguard Worker 	}
774*25da2beaSAndroid Build Coastguard Worker 
775*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(&ring, reg_fds, 32);
776*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
777*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "file_register: %d\n", ret);
778*25da2beaSAndroid Build Coastguard Worker 		return ret;
779*25da2beaSAndroid Build Coastguard Worker 	}
780*25da2beaSAndroid Build Coastguard Worker 
781*25da2beaSAndroid Build Coastguard Worker 	close(fds[0]);
782*25da2beaSAndroid Build Coastguard Worker 	close(fds[1]);
783*25da2beaSAndroid Build Coastguard Worker 	close(sp[0]);
784*25da2beaSAndroid Build Coastguard Worker 	close(sp[1]);
785*25da2beaSAndroid Build Coastguard Worker 	io_uring_queue_exit(&ring);
786*25da2beaSAndroid Build Coastguard Worker 	return 0;
787*25da2beaSAndroid Build Coastguard Worker }
788*25da2beaSAndroid Build Coastguard Worker 
test_partial_register_fail(void)789*25da2beaSAndroid Build Coastguard Worker static int test_partial_register_fail(void)
790*25da2beaSAndroid Build Coastguard Worker {
791*25da2beaSAndroid Build Coastguard Worker 	char buffer[128];
792*25da2beaSAndroid Build Coastguard Worker 	struct io_uring ring;
793*25da2beaSAndroid Build Coastguard Worker 	int ret, fds[2];
794*25da2beaSAndroid Build Coastguard Worker 	int reg_fds[5];
795*25da2beaSAndroid Build Coastguard Worker 
796*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_queue_init(8, &ring, 0);
797*25da2beaSAndroid Build Coastguard Worker 	if (ret < 0) {
798*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "failed to init io_uring: %s\n", strerror(-ret));
799*25da2beaSAndroid Build Coastguard Worker 		return ret;
800*25da2beaSAndroid Build Coastguard Worker 	}
801*25da2beaSAndroid Build Coastguard Worker 	if (pipe(fds)) {
802*25da2beaSAndroid Build Coastguard Worker 		perror("pipe");
803*25da2beaSAndroid Build Coastguard Worker 		return -1;
804*25da2beaSAndroid Build Coastguard Worker 	}
805*25da2beaSAndroid Build Coastguard Worker 
806*25da2beaSAndroid Build Coastguard Worker 	/*
807*25da2beaSAndroid Build Coastguard Worker 	 * Expect register to fail as it doesn't support io_uring fds, shouldn't
808*25da2beaSAndroid Build Coastguard Worker 	 * leave any fds referenced afterwards.
809*25da2beaSAndroid Build Coastguard Worker 	 */
810*25da2beaSAndroid Build Coastguard Worker 	reg_fds[0] = fds[0];
811*25da2beaSAndroid Build Coastguard Worker 	reg_fds[1] = fds[1];
812*25da2beaSAndroid Build Coastguard Worker 	reg_fds[2] = -1;
813*25da2beaSAndroid Build Coastguard Worker 	reg_fds[3] = ring.ring_fd;
814*25da2beaSAndroid Build Coastguard Worker 	reg_fds[4] = -1;
815*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_register_files(&ring, reg_fds, 5);
816*25da2beaSAndroid Build Coastguard Worker 	if (!ret) {
817*25da2beaSAndroid Build Coastguard Worker 		fprintf(stderr, "file_register unexpectedly succeeded\n");
818*25da2beaSAndroid Build Coastguard Worker 		return 1;
819*25da2beaSAndroid Build Coastguard Worker 	}
820*25da2beaSAndroid Build Coastguard Worker 
821*25da2beaSAndroid Build Coastguard Worker 	/* ring should have fds referenced, can close them */
822*25da2beaSAndroid Build Coastguard Worker 	close(fds[1]);
823*25da2beaSAndroid Build Coastguard Worker 
824*25da2beaSAndroid Build Coastguard Worker 	/* confirm that fds[1] is actually close and to ref'ed by io_uring */
825*25da2beaSAndroid Build Coastguard Worker 	ret = read(fds[0], buffer, 10);
826*25da2beaSAndroid Build Coastguard Worker 	if (ret < 0)
827*25da2beaSAndroid Build Coastguard Worker 		perror("read");
828*25da2beaSAndroid Build Coastguard Worker 	close(fds[0]);
829*25da2beaSAndroid Build Coastguard Worker 	io_uring_queue_exit(&ring);
830*25da2beaSAndroid Build Coastguard Worker 	return 0;
831*25da2beaSAndroid Build Coastguard Worker }
832*25da2beaSAndroid Build Coastguard Worker 
main(int argc,char * argv[])833*25da2beaSAndroid Build Coastguard Worker int main(int argc, char *argv[])
834*25da2beaSAndroid Build Coastguard Worker {
835*25da2beaSAndroid Build Coastguard Worker 	struct io_uring ring;
836*25da2beaSAndroid Build Coastguard Worker 	int ret;
837*25da2beaSAndroid Build Coastguard Worker 
838*25da2beaSAndroid Build Coastguard Worker 	if (argc > 1)
839*25da2beaSAndroid Build Coastguard Worker 		return 0;
840*25da2beaSAndroid Build Coastguard Worker 
841*25da2beaSAndroid Build Coastguard Worker 	ret = io_uring_queue_init(8, &ring, 0);
842*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
843*25da2beaSAndroid Build Coastguard Worker 		printf("ring setup failed\n");
844*25da2beaSAndroid Build Coastguard Worker 		return 1;
845*25da2beaSAndroid Build Coastguard Worker 	}
846*25da2beaSAndroid Build Coastguard Worker 
847*25da2beaSAndroid Build Coastguard Worker 	ret = test_basic(&ring, 0);
848*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
849*25da2beaSAndroid Build Coastguard Worker 		printf("test_basic failed\n");
850*25da2beaSAndroid Build Coastguard Worker 		return ret;
851*25da2beaSAndroid Build Coastguard Worker 	}
852*25da2beaSAndroid Build Coastguard Worker 
853*25da2beaSAndroid Build Coastguard Worker 	ret = test_basic(&ring, 1);
854*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
855*25da2beaSAndroid Build Coastguard Worker 		printf("test_basic failed\n");
856*25da2beaSAndroid Build Coastguard Worker 		return ret;
857*25da2beaSAndroid Build Coastguard Worker 	}
858*25da2beaSAndroid Build Coastguard Worker 
859*25da2beaSAndroid Build Coastguard Worker 	ret = test_basic_many(&ring);
860*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
861*25da2beaSAndroid Build Coastguard Worker 		printf("test_basic_many failed\n");
862*25da2beaSAndroid Build Coastguard Worker 		return ret;
863*25da2beaSAndroid Build Coastguard Worker 	}
864*25da2beaSAndroid Build Coastguard Worker 
865*25da2beaSAndroid Build Coastguard Worker 	ret = test_sparse(&ring);
866*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
867*25da2beaSAndroid Build Coastguard Worker 		printf("test_sparse failed\n");
868*25da2beaSAndroid Build Coastguard Worker 		return ret;
869*25da2beaSAndroid Build Coastguard Worker 	}
870*25da2beaSAndroid Build Coastguard Worker 
871*25da2beaSAndroid Build Coastguard Worker 	if (no_update)
872*25da2beaSAndroid Build Coastguard Worker 		return 0;
873*25da2beaSAndroid Build Coastguard Worker 
874*25da2beaSAndroid Build Coastguard Worker 	ret = test_additions(&ring);
875*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
876*25da2beaSAndroid Build Coastguard Worker 		printf("test_additions failed\n");
877*25da2beaSAndroid Build Coastguard Worker 		return ret;
878*25da2beaSAndroid Build Coastguard Worker 	}
879*25da2beaSAndroid Build Coastguard Worker 
880*25da2beaSAndroid Build Coastguard Worker 	ret = test_removals(&ring);
881*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
882*25da2beaSAndroid Build Coastguard Worker 		printf("test_removals failed\n");
883*25da2beaSAndroid Build Coastguard Worker 		return ret;
884*25da2beaSAndroid Build Coastguard Worker 	}
885*25da2beaSAndroid Build Coastguard Worker 
886*25da2beaSAndroid Build Coastguard Worker 	ret = test_replace(&ring);
887*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
888*25da2beaSAndroid Build Coastguard Worker 		printf("test_replace failed\n");
889*25da2beaSAndroid Build Coastguard Worker 		return ret;
890*25da2beaSAndroid Build Coastguard Worker 	}
891*25da2beaSAndroid Build Coastguard Worker 
892*25da2beaSAndroid Build Coastguard Worker 	ret = test_replace_all(&ring);
893*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
894*25da2beaSAndroid Build Coastguard Worker 		printf("test_replace_all failed\n");
895*25da2beaSAndroid Build Coastguard Worker 		return ret;
896*25da2beaSAndroid Build Coastguard Worker 	}
897*25da2beaSAndroid Build Coastguard Worker 
898*25da2beaSAndroid Build Coastguard Worker 	ret = test_grow(&ring);
899*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
900*25da2beaSAndroid Build Coastguard Worker 		printf("test_grow failed\n");
901*25da2beaSAndroid Build Coastguard Worker 		return ret;
902*25da2beaSAndroid Build Coastguard Worker 	}
903*25da2beaSAndroid Build Coastguard Worker 
904*25da2beaSAndroid Build Coastguard Worker 	ret = test_shrink(&ring);
905*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
906*25da2beaSAndroid Build Coastguard Worker 		printf("test_shrink failed\n");
907*25da2beaSAndroid Build Coastguard Worker 		return ret;
908*25da2beaSAndroid Build Coastguard Worker 	}
909*25da2beaSAndroid Build Coastguard Worker 
910*25da2beaSAndroid Build Coastguard Worker 	ret = test_zero(&ring);
911*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
912*25da2beaSAndroid Build Coastguard Worker 		printf("test_zero failed\n");
913*25da2beaSAndroid Build Coastguard Worker 		return ret;
914*25da2beaSAndroid Build Coastguard Worker 	}
915*25da2beaSAndroid Build Coastguard Worker 
916*25da2beaSAndroid Build Coastguard Worker 	ret = test_huge(&ring);
917*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
918*25da2beaSAndroid Build Coastguard Worker 		printf("test_huge failed\n");
919*25da2beaSAndroid Build Coastguard Worker 		return ret;
920*25da2beaSAndroid Build Coastguard Worker 	}
921*25da2beaSAndroid Build Coastguard Worker 
922*25da2beaSAndroid Build Coastguard Worker 	ret = test_skip(&ring);
923*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
924*25da2beaSAndroid Build Coastguard Worker 		printf("test_skip failed\n");
925*25da2beaSAndroid Build Coastguard Worker 		return 1;
926*25da2beaSAndroid Build Coastguard Worker 	}
927*25da2beaSAndroid Build Coastguard Worker 
928*25da2beaSAndroid Build Coastguard Worker 	ret = test_sparse_updates();
929*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
930*25da2beaSAndroid Build Coastguard Worker 		printf("test_sparse_updates failed\n");
931*25da2beaSAndroid Build Coastguard Worker 		return ret;
932*25da2beaSAndroid Build Coastguard Worker 	}
933*25da2beaSAndroid Build Coastguard Worker 
934*25da2beaSAndroid Build Coastguard Worker 	ret = test_fixed_removal_ordering();
935*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
936*25da2beaSAndroid Build Coastguard Worker 		printf("test_fixed_removal_ordering failed\n");
937*25da2beaSAndroid Build Coastguard Worker 		return 1;
938*25da2beaSAndroid Build Coastguard Worker 	}
939*25da2beaSAndroid Build Coastguard Worker 
940*25da2beaSAndroid Build Coastguard Worker 	ret = test_mixed_af_unix();
941*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
942*25da2beaSAndroid Build Coastguard Worker 		printf("test_mixed_af_unix failed\n");
943*25da2beaSAndroid Build Coastguard Worker 		return 1;
944*25da2beaSAndroid Build Coastguard Worker 	}
945*25da2beaSAndroid Build Coastguard Worker 
946*25da2beaSAndroid Build Coastguard Worker 	ret = test_partial_register_fail();
947*25da2beaSAndroid Build Coastguard Worker 	if (ret) {
948*25da2beaSAndroid Build Coastguard Worker 		printf("test_partial_register_fail failed\n");
949*25da2beaSAndroid Build Coastguard Worker 		return ret;
950*25da2beaSAndroid Build Coastguard Worker 	}
951*25da2beaSAndroid Build Coastguard Worker 
952*25da2beaSAndroid Build Coastguard Worker 	return 0;
953*25da2beaSAndroid Build Coastguard Worker }
954