xref: /freebsd/tests/sys/aio/aio_test.c (revision 3c4ba5f55438f7afd4f4b0b56f88f2bb505fd6a6)
1 /*-
2  * Copyright (c) 2004 Robert N. M. Watson
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD$
27  */
28 
29 /*
30  * Regression test to do some very basic AIO exercising on several types of
31  * file descriptors.  Currently, the tests consist of initializing a fixed
32  * size buffer with pseudo-random data, writing it to one fd using AIO, then
33  * reading it from a second descriptor using AIO.  For some targets, the same
34  * fd is used for write and read (i.e., file, md device), but for others the
35  * operation is performed on a peer (pty, socket, fifo, etc).  For each file
36  * descriptor type, several completion methods are tested.  This test program
37  * does not attempt to exercise error cases or more subtle asynchronous
38  * behavior, just make sure that the basic operations work on some basic object
39  * types.
40  */
41 
42 #include <sys/param.h>
43 #include <sys/event.h>
44 #include <sys/mdioctl.h>
45 #include <sys/module.h>
46 #include <sys/resource.h>
47 #include <sys/socket.h>
48 #include <sys/stat.h>
49 #include <sys/un.h>
50 
51 #include <aio.h>
52 #include <err.h>
53 #include <errno.h>
54 #include <fcntl.h>
55 #include <libutil.h>
56 #include <limits.h>
57 #include <semaphore.h>
58 #include <signal.h>
59 #include <stdint.h>
60 #include <stdio.h>
61 #include <stdlib.h>
62 #include <string.h>
63 #include <termios.h>
64 #include <unistd.h>
65 
66 #include <atf-c.h>
67 
68 #include "freebsd_test_suite/macros.h"
69 #include "local.h"
70 
71 /*
72  * GLOBAL_MAX sets the largest usable buffer size to be read and written, as
73  * it sizes ac_buffer in the aio_context structure.  It is also the default
74  * size for file I/O.  For other types, we use smaller blocks or we risk
75  * blocking (and we run in a single process/thread so that would be bad).
76  */
77 #define	GLOBAL_MAX	16384
78 
79 #define	BUFFER_MAX	GLOBAL_MAX
80 
81 /*
82  * A completion function will block until the aio has completed, then return
83  * the result of the aio.  errno will be set appropriately.
84  */
85 typedef ssize_t (*completion)(struct aiocb*);
86 
87 struct aio_context {
88 	int		 ac_read_fd, ac_write_fd;
89 	long		 ac_seed;
90 	char		 ac_buffer[GLOBAL_MAX];
91 	int		 ac_buflen;
92 	int		 ac_seconds;
93 };
94 
95 static sem_t		completions;
96 
97 /*
98  * Fill a buffer given a seed that can be fed into srandom() to initialize
99  * the PRNG in a repeatable manner.
100  */
101 static void
102 aio_fill_buffer(char *buffer, int len, long seed)
103 {
104 	char ch;
105 	int i;
106 
107 	srandom(seed);
108 	for (i = 0; i < len; i++) {
109 		ch = random() & 0xff;
110 		buffer[i] = ch;
111 	}
112 }
113 
114 /*
115  * Test that a buffer matches a given seed.  See aio_fill_buffer().  Return
116  * (1) on a match, (0) on a mismatch.
117  */
118 static int
119 aio_test_buffer(char *buffer, int len, long seed)
120 {
121 	char ch;
122 	int i;
123 
124 	srandom(seed);
125 	for (i = 0; i < len; i++) {
126 		ch = random() & 0xff;
127 		if (buffer[i] != ch)
128 			return (0);
129 	}
130 	return (1);
131 }
132 
133 /*
134  * Initialize a testing context given the file descriptors provided by the
135  * test setup.
136  */
137 static void
138 aio_context_init(struct aio_context *ac, int read_fd,
139     int write_fd, int buflen)
140 {
141 
142 	ATF_REQUIRE_MSG(buflen <= BUFFER_MAX,
143 	    "aio_context_init: buffer too large (%d > %d)",
144 	    buflen, BUFFER_MAX);
145 	bzero(ac, sizeof(*ac));
146 	ac->ac_read_fd = read_fd;
147 	ac->ac_write_fd = write_fd;
148 	ac->ac_buflen = buflen;
149 	srandomdev();
150 	ac->ac_seed = random();
151 	aio_fill_buffer(ac->ac_buffer, buflen, ac->ac_seed);
152 	ATF_REQUIRE_MSG(aio_test_buffer(ac->ac_buffer, buflen,
153 	    ac->ac_seed) != 0, "aio_test_buffer: internal error");
154 }
155 
156 static ssize_t
157 poll(struct aiocb *aio)
158 {
159 	int error;
160 
161 	while ((error = aio_error(aio)) == EINPROGRESS)
162 		usleep(25000);
163 	if (error)
164 		return (error);
165 	else
166 		return (aio_return(aio));
167 }
168 
169 static void
170 sigusr1_handler(int sig __unused)
171 {
172 	ATF_REQUIRE_EQ(0, sem_post(&completions));
173 }
174 
175 static void
176 thr_handler(union sigval sv __unused)
177 {
178 	ATF_REQUIRE_EQ(0, sem_post(&completions));
179 }
180 
181 static ssize_t
182 poll_signaled(struct aiocb *aio)
183 {
184 	int error;
185 
186 	ATF_REQUIRE_EQ(0, sem_wait(&completions));
187 	error = aio_error(aio);
188 	switch (error) {
189 		case EINPROGRESS:
190 			errno = EINTR;
191 			return (-1);
192 		case 0:
193 			return (aio_return(aio));
194 		default:
195 			return (error);
196 	}
197 }
198 
199 /*
200  * Setup a signal handler for signal delivery tests
201  * This isn't thread safe, but it's ok since ATF runs each testcase in a
202  * separate process
203  */
204 static struct sigevent*
205 setup_signal(void)
206 {
207 	static struct sigevent sev;
208 
209 	ATF_REQUIRE_EQ(0, sem_init(&completions, false, 0));
210 	sev.sigev_notify = SIGEV_SIGNAL;
211 	sev.sigev_signo = SIGUSR1;
212 	ATF_REQUIRE(SIG_ERR != signal(SIGUSR1, sigusr1_handler));
213 	return (&sev);
214 }
215 
216 /*
217  * Setup a thread for thread delivery tests
218  * This isn't thread safe, but it's ok since ATF runs each testcase in a
219  * separate process
220  */
221 static struct sigevent*
222 setup_thread(void)
223 {
224 	static struct sigevent sev;
225 
226 	ATF_REQUIRE_EQ(0, sem_init(&completions, false, 0));
227 	sev.sigev_notify = SIGEV_THREAD;
228 	sev.sigev_notify_function = thr_handler;
229 	sev.sigev_notify_attributes = NULL;
230 	return (&sev);
231 }
232 
233 static ssize_t
234 suspend(struct aiocb *aio)
235 {
236 	const struct aiocb *const iocbs[] = {aio};
237 	int error;
238 
239 	error = aio_suspend(iocbs, 1, NULL);
240 	if (error == 0)
241 		return (aio_return(aio));
242 	else
243 		return (error);
244 }
245 
246 static ssize_t
247 waitcomplete(struct aiocb *aio)
248 {
249 	struct aiocb *aiop;
250 	ssize_t ret;
251 
252 	ret = aio_waitcomplete(&aiop, NULL);
253 	ATF_REQUIRE_EQ(aio, aiop);
254 	return (ret);
255 }
256 
257 /*
258  * Setup an iocb for kqueue notification.  This isn't thread
259  * safe, but it's ok because ATF runs every test case in a separate process.
260  */
261 static struct sigevent*
262 setup_kqueue(void)
263 {
264 	static struct sigevent sev;
265 	static int kq;
266 
267 	kq = kqueue();
268 	ATF_REQUIRE(kq >= 0);
269 
270 	memset(&sev, 0, sizeof(sev));
271 	sev.sigev_notify_kqueue = kq;
272 	sev.sigev_value.sival_ptr = (void*)0xdeadbeef;
273 	sev.sigev_notify = SIGEV_KEVENT;
274 
275 	return (&sev);
276 }
277 
278 static ssize_t
279 poll_kqueue(struct aiocb *aio)
280 {
281 	int kq, nevents;
282 	struct kevent events[1];
283 
284 	kq = aio->aio_sigevent.sigev_notify_kqueue;
285 
286 	nevents = kevent(kq, NULL, 0, events, 1, NULL);
287 	ATF_CHECK_EQ(1, nevents);
288 	ATF_CHECK_EQ(events[0].ident, (uintptr_t) aio);
289 	ATF_CHECK_EQ(events[0].filter, EVFILT_AIO);
290 	ATF_CHECK_EQ(events[0].flags, EV_EOF);
291 	ATF_CHECK_EQ(events[0].fflags, 0);
292 	ATF_CHECK_EQ(events[0].data, 0);
293 	ATF_CHECK_EQ((uintptr_t)events[0].udata, 0xdeadbeef);
294 
295 	return (aio_return(aio));
296 }
297 
298 /*
299  * Perform a simple write test of our initialized data buffer to the provided
300  * file descriptor.
301  */
302 static void
303 aio_write_test(struct aio_context *ac, completion comp, struct sigevent *sev)
304 {
305 	struct aiocb aio;
306 	ssize_t len;
307 
308 	bzero(&aio, sizeof(aio));
309 	aio.aio_buf = ac->ac_buffer;
310 	aio.aio_nbytes = ac->ac_buflen;
311 	aio.aio_fildes = ac->ac_write_fd;
312 	aio.aio_offset = 0;
313 	if (sev)
314 		aio.aio_sigevent = *sev;
315 
316 	if (aio_write(&aio) < 0)
317 		atf_tc_fail("aio_write failed: %s", strerror(errno));
318 
319 	len = comp(&aio);
320 	if (len < 0)
321 		atf_tc_fail("aio failed: %s", strerror(errno));
322 
323 	if (len != ac->ac_buflen)
324 		atf_tc_fail("aio short write (%jd)", (intmax_t)len);
325 }
326 
327 /*
328  * Perform a vectored I/O test of our initialized data buffer to the provided
329  * file descriptor.
330  *
331  * To vectorize the linear buffer, chop it up into two pieces of dissimilar
332  * size, and swap their offsets.
333  */
334 static void
335 aio_writev_test(struct aio_context *ac, completion comp, struct sigevent *sev)
336 {
337 	struct aiocb aio;
338 	struct iovec iov[2];
339 	size_t len0, len1;
340 	ssize_t len;
341 
342 	bzero(&aio, sizeof(aio));
343 
344 	aio.aio_fildes = ac->ac_write_fd;
345 	aio.aio_offset = 0;
346 	len0 = ac->ac_buflen * 3 / 4;
347 	len1 = ac->ac_buflen / 4;
348 	iov[0].iov_base = ac->ac_buffer + len1;
349 	iov[0].iov_len = len0;
350 	iov[1].iov_base = ac->ac_buffer;
351 	iov[1].iov_len = len1;
352 	aio.aio_iov = iov;
353 	aio.aio_iovcnt = 2;
354 	if (sev)
355 		aio.aio_sigevent = *sev;
356 
357 	if (aio_writev(&aio) < 0)
358 		atf_tc_fail("aio_writev failed: %s", strerror(errno));
359 
360 	len = comp(&aio);
361 	if (len < 0)
362 		atf_tc_fail("aio failed: %s", strerror(errno));
363 
364 	if (len != ac->ac_buflen)
365 		atf_tc_fail("aio short write (%jd)", (intmax_t)len);
366 }
367 
368 /*
369  * Perform a simple read test of our initialized data buffer from the
370  * provided file descriptor.
371  */
372 static void
373 aio_read_test(struct aio_context *ac, completion comp, struct sigevent *sev)
374 {
375 	struct aiocb aio;
376 	ssize_t len;
377 
378 	bzero(ac->ac_buffer, ac->ac_buflen);
379 	bzero(&aio, sizeof(aio));
380 	aio.aio_buf = ac->ac_buffer;
381 	aio.aio_nbytes = ac->ac_buflen;
382 	aio.aio_fildes = ac->ac_read_fd;
383 	aio.aio_offset = 0;
384 	if (sev)
385 		aio.aio_sigevent = *sev;
386 
387 	if (aio_read(&aio) < 0)
388 		atf_tc_fail("aio_read failed: %s", strerror(errno));
389 
390 	len = comp(&aio);
391 	if (len < 0)
392 		atf_tc_fail("aio failed: %s", strerror(errno));
393 
394 	ATF_REQUIRE_EQ_MSG(len, ac->ac_buflen,
395 	    "aio short read (%jd)", (intmax_t)len);
396 
397 	if (aio_test_buffer(ac->ac_buffer, ac->ac_buflen, ac->ac_seed) == 0)
398 		atf_tc_fail("buffer mismatched");
399 }
400 
401 static void
402 aio_readv_test(struct aio_context *ac, completion comp, struct sigevent *sev)
403 {
404 	struct aiocb aio;
405 	struct iovec iov[2];
406 	size_t len0, len1;
407 	ssize_t len;
408 
409 	bzero(ac->ac_buffer, ac->ac_buflen);
410 	bzero(&aio, sizeof(aio));
411 	aio.aio_fildes = ac->ac_read_fd;
412 	aio.aio_offset = 0;
413 	len0 = ac->ac_buflen * 3 / 4;
414 	len1 = ac->ac_buflen / 4;
415 	iov[0].iov_base = ac->ac_buffer + len1;
416 	iov[0].iov_len = len0;
417 	iov[1].iov_base = ac->ac_buffer;
418 	iov[1].iov_len = len1;
419 	aio.aio_iov = iov;
420 	aio.aio_iovcnt = 2;
421 	if (sev)
422 		aio.aio_sigevent = *sev;
423 
424 	if (aio_readv(&aio) < 0)
425 		atf_tc_fail("aio_read failed: %s", strerror(errno));
426 
427 	len = comp(&aio);
428 	if (len < 0)
429 		atf_tc_fail("aio failed: %s", strerror(errno));
430 
431 	ATF_REQUIRE_EQ_MSG(len, ac->ac_buflen,
432 	    "aio short read (%jd)", (intmax_t)len);
433 
434 	if (aio_test_buffer(ac->ac_buffer, ac->ac_buflen, ac->ac_seed) == 0)
435 		atf_tc_fail("buffer mismatched");
436 }
437 
438 /*
439  * Series of type-specific tests for AIO.  For now, we just make sure we can
440  * issue a write and then a read to each type.  We assume that once a write
441  * is issued, a read can follow.
442  */
443 
444 /*
445  * Test with a classic file.  Assumes we can create a moderate size temporary
446  * file.
447  */
448 #define	FILE_LEN	GLOBAL_MAX
449 #define	FILE_PATHNAME	"testfile"
450 
451 static void
452 aio_file_test(completion comp, struct sigevent *sev, bool vectored)
453 {
454 	struct aio_context ac;
455 	int fd;
456 
457 	ATF_REQUIRE_KERNEL_MODULE("aio");
458 	ATF_REQUIRE_UNSAFE_AIO();
459 
460 	fd = open(FILE_PATHNAME, O_RDWR | O_CREAT, 0600);
461 	ATF_REQUIRE_MSG(fd != -1, "open failed: %s", strerror(errno));
462 
463 	aio_context_init(&ac, fd, fd, FILE_LEN);
464 	if (vectored) {
465 		aio_writev_test(&ac, comp, sev);
466 		aio_readv_test(&ac, comp, sev);
467 	} else {
468 		aio_write_test(&ac, comp, sev);
469 		aio_read_test(&ac, comp, sev);
470 	}
471 	close(fd);
472 }
473 
474 ATF_TC_WITHOUT_HEAD(file_kq);
475 ATF_TC_BODY(file_kq, tc)
476 {
477 	aio_file_test(poll_kqueue, setup_kqueue(), false);
478 }
479 
480 ATF_TC_WITHOUT_HEAD(file_poll);
481 ATF_TC_BODY(file_poll, tc)
482 {
483 	aio_file_test(poll, NULL, false);
484 }
485 
486 ATF_TC_WITHOUT_HEAD(file_signal);
487 ATF_TC_BODY(file_signal, tc)
488 {
489 	aio_file_test(poll_signaled, setup_signal(), false);
490 }
491 
492 ATF_TC_WITHOUT_HEAD(file_suspend);
493 ATF_TC_BODY(file_suspend, tc)
494 {
495 	aio_file_test(suspend, NULL, false);
496 }
497 
498 ATF_TC_WITHOUT_HEAD(file_thread);
499 ATF_TC_BODY(file_thread, tc)
500 {
501 	aio_file_test(poll_signaled, setup_thread(), false);
502 }
503 
504 ATF_TC_WITHOUT_HEAD(file_waitcomplete);
505 ATF_TC_BODY(file_waitcomplete, tc)
506 {
507 	aio_file_test(waitcomplete, NULL, false);
508 }
509 
510 #define	FIFO_LEN	256
511 #define	FIFO_PATHNAME	"testfifo"
512 
513 static void
514 aio_fifo_test(completion comp, struct sigevent *sev)
515 {
516 	int error, read_fd = -1, write_fd = -1;
517 	struct aio_context ac;
518 
519 	ATF_REQUIRE_KERNEL_MODULE("aio");
520 	ATF_REQUIRE_UNSAFE_AIO();
521 
522 	ATF_REQUIRE_MSG(mkfifo(FIFO_PATHNAME, 0600) != -1,
523 	    "mkfifo failed: %s", strerror(errno));
524 
525 	read_fd = open(FIFO_PATHNAME, O_RDONLY | O_NONBLOCK);
526 	if (read_fd == -1) {
527 		error = errno;
528 		errno = error;
529 		atf_tc_fail("read_fd open failed: %s",
530 		    strerror(errno));
531 	}
532 
533 	write_fd = open(FIFO_PATHNAME, O_WRONLY);
534 	if (write_fd == -1) {
535 		error = errno;
536 		errno = error;
537 		atf_tc_fail("write_fd open failed: %s",
538 		    strerror(errno));
539 	}
540 
541 	aio_context_init(&ac, read_fd, write_fd, FIFO_LEN);
542 	aio_write_test(&ac, comp, sev);
543 	aio_read_test(&ac, comp, sev);
544 
545 	close(read_fd);
546 	close(write_fd);
547 }
548 
549 ATF_TC_WITHOUT_HEAD(fifo_kq);
550 ATF_TC_BODY(fifo_kq, tc)
551 {
552 	aio_fifo_test(poll_kqueue, setup_kqueue());
553 }
554 
555 ATF_TC_WITHOUT_HEAD(fifo_poll);
556 ATF_TC_BODY(fifo_poll, tc)
557 {
558 	aio_fifo_test(poll, NULL);
559 }
560 
561 ATF_TC_WITHOUT_HEAD(fifo_signal);
562 ATF_TC_BODY(fifo_signal, tc)
563 {
564 	aio_fifo_test(poll_signaled, setup_signal());
565 }
566 
567 ATF_TC_WITHOUT_HEAD(fifo_suspend);
568 ATF_TC_BODY(fifo_suspend, tc)
569 {
570 	aio_fifo_test(suspend, NULL);
571 }
572 
573 ATF_TC_WITHOUT_HEAD(fifo_thread);
574 ATF_TC_BODY(fifo_thread, tc)
575 {
576 	aio_fifo_test(poll_signaled, setup_thread());
577 }
578 
579 ATF_TC_WITHOUT_HEAD(fifo_waitcomplete);
580 ATF_TC_BODY(fifo_waitcomplete, tc)
581 {
582 	aio_fifo_test(waitcomplete, NULL);
583 }
584 
585 #define	UNIX_SOCKETPAIR_LEN	256
586 static void
587 aio_unix_socketpair_test(completion comp, struct sigevent *sev, bool vectored)
588 {
589 	struct aio_context ac;
590 	struct rusage ru_before, ru_after;
591 	int sockets[2];
592 
593 	ATF_REQUIRE_KERNEL_MODULE("aio");
594 
595 	ATF_REQUIRE_MSG(socketpair(PF_UNIX, SOCK_STREAM, 0, sockets) != -1,
596 	    "socketpair failed: %s", strerror(errno));
597 
598 	aio_context_init(&ac, sockets[0], sockets[1], UNIX_SOCKETPAIR_LEN);
599 	ATF_REQUIRE_MSG(getrusage(RUSAGE_SELF, &ru_before) != -1,
600 	    "getrusage failed: %s", strerror(errno));
601 	if (vectored) {
602 		aio_writev_test(&ac, comp, sev);
603 		aio_readv_test(&ac, comp, sev);
604 	} else {
605 		aio_write_test(&ac, comp, sev);
606 		aio_read_test(&ac, comp, sev);
607 	}
608 	ATF_REQUIRE_MSG(getrusage(RUSAGE_SELF, &ru_after) != -1,
609 	    "getrusage failed: %s", strerror(errno));
610 	ATF_REQUIRE(ru_after.ru_msgsnd == ru_before.ru_msgsnd + 1);
611 	ATF_REQUIRE(ru_after.ru_msgrcv == ru_before.ru_msgrcv + 1);
612 
613 	close(sockets[0]);
614 	close(sockets[1]);
615 }
616 
617 ATF_TC_WITHOUT_HEAD(socket_kq);
618 ATF_TC_BODY(socket_kq, tc)
619 {
620 	aio_unix_socketpair_test(poll_kqueue, setup_kqueue(), false);
621 }
622 
623 ATF_TC_WITHOUT_HEAD(socket_poll);
624 ATF_TC_BODY(socket_poll, tc)
625 {
626 	aio_unix_socketpair_test(poll, NULL, false);
627 }
628 
629 ATF_TC_WITHOUT_HEAD(socket_signal);
630 ATF_TC_BODY(socket_signal, tc)
631 {
632 	aio_unix_socketpair_test(poll_signaled, setup_signal(), false);
633 }
634 
635 ATF_TC_WITHOUT_HEAD(socket_suspend);
636 ATF_TC_BODY(socket_suspend, tc)
637 {
638 	aio_unix_socketpair_test(suspend, NULL, false);
639 }
640 
641 ATF_TC_WITHOUT_HEAD(socket_thread);
642 ATF_TC_BODY(socket_thread, tc)
643 {
644 	aio_unix_socketpair_test(poll_signaled, setup_thread(), false);
645 }
646 
647 ATF_TC_WITHOUT_HEAD(socket_waitcomplete);
648 ATF_TC_BODY(socket_waitcomplete, tc)
649 {
650 	aio_unix_socketpair_test(waitcomplete, NULL, false);
651 }
652 
653 struct aio_pty_arg {
654 	int	apa_read_fd;
655 	int	apa_write_fd;
656 };
657 
658 #define	PTY_LEN		256
659 static void
660 aio_pty_test(completion comp, struct sigevent *sev)
661 {
662 	struct aio_context ac;
663 	int read_fd, write_fd;
664 	struct termios ts;
665 	int error;
666 
667 	ATF_REQUIRE_KERNEL_MODULE("aio");
668 	ATF_REQUIRE_UNSAFE_AIO();
669 
670 	ATF_REQUIRE_MSG(openpty(&read_fd, &write_fd, NULL, NULL, NULL) == 0,
671 	    "openpty failed: %s", strerror(errno));
672 
673 
674 	if (tcgetattr(write_fd, &ts) < 0) {
675 		error = errno;
676 		errno = error;
677 		atf_tc_fail("tcgetattr failed: %s", strerror(errno));
678 	}
679 	cfmakeraw(&ts);
680 	if (tcsetattr(write_fd, TCSANOW, &ts) < 0) {
681 		error = errno;
682 		errno = error;
683 		atf_tc_fail("tcsetattr failed: %s", strerror(errno));
684 	}
685 	aio_context_init(&ac, read_fd, write_fd, PTY_LEN);
686 
687 	aio_write_test(&ac, comp, sev);
688 	aio_read_test(&ac, comp, sev);
689 
690 	close(read_fd);
691 	close(write_fd);
692 }
693 
694 ATF_TC_WITHOUT_HEAD(pty_kq);
695 ATF_TC_BODY(pty_kq, tc)
696 {
697 	aio_pty_test(poll_kqueue, setup_kqueue());
698 }
699 
700 ATF_TC_WITHOUT_HEAD(pty_poll);
701 ATF_TC_BODY(pty_poll, tc)
702 {
703 	aio_pty_test(poll, NULL);
704 }
705 
706 ATF_TC_WITHOUT_HEAD(pty_signal);
707 ATF_TC_BODY(pty_signal, tc)
708 {
709 	aio_pty_test(poll_signaled, setup_signal());
710 }
711 
712 ATF_TC_WITHOUT_HEAD(pty_suspend);
713 ATF_TC_BODY(pty_suspend, tc)
714 {
715 	aio_pty_test(suspend, NULL);
716 }
717 
718 ATF_TC_WITHOUT_HEAD(pty_thread);
719 ATF_TC_BODY(pty_thread, tc)
720 {
721 	aio_pty_test(poll_signaled, setup_thread());
722 }
723 
724 ATF_TC_WITHOUT_HEAD(pty_waitcomplete);
725 ATF_TC_BODY(pty_waitcomplete, tc)
726 {
727 	aio_pty_test(waitcomplete, NULL);
728 }
729 
730 #define	PIPE_LEN	256
731 static void
732 aio_pipe_test(completion comp, struct sigevent *sev)
733 {
734 	struct aio_context ac;
735 	int pipes[2];
736 
737 	ATF_REQUIRE_KERNEL_MODULE("aio");
738 	ATF_REQUIRE_UNSAFE_AIO();
739 
740 	ATF_REQUIRE_MSG(pipe(pipes) != -1,
741 	    "pipe failed: %s", strerror(errno));
742 
743 	aio_context_init(&ac, pipes[0], pipes[1], PIPE_LEN);
744 	aio_write_test(&ac, comp, sev);
745 	aio_read_test(&ac, comp, sev);
746 
747 	close(pipes[0]);
748 	close(pipes[1]);
749 }
750 
751 ATF_TC_WITHOUT_HEAD(pipe_kq);
752 ATF_TC_BODY(pipe_kq, tc)
753 {
754 	aio_pipe_test(poll_kqueue, setup_kqueue());
755 }
756 
757 ATF_TC_WITHOUT_HEAD(pipe_poll);
758 ATF_TC_BODY(pipe_poll, tc)
759 {
760 	aio_pipe_test(poll, NULL);
761 }
762 
763 ATF_TC_WITHOUT_HEAD(pipe_signal);
764 ATF_TC_BODY(pipe_signal, tc)
765 {
766 	aio_pipe_test(poll_signaled, setup_signal());
767 }
768 
769 ATF_TC_WITHOUT_HEAD(pipe_suspend);
770 ATF_TC_BODY(pipe_suspend, tc)
771 {
772 	aio_pipe_test(suspend, NULL);
773 }
774 
775 ATF_TC_WITHOUT_HEAD(pipe_thread);
776 ATF_TC_BODY(pipe_thread, tc)
777 {
778 	aio_pipe_test(poll_signaled, setup_thread());
779 }
780 
781 ATF_TC_WITHOUT_HEAD(pipe_waitcomplete);
782 ATF_TC_BODY(pipe_waitcomplete, tc)
783 {
784 	aio_pipe_test(waitcomplete, NULL);
785 }
786 
787 #define	MD_LEN		GLOBAL_MAX
788 #define	MDUNIT_LINK	"mdunit_link"
789 
790 static int
791 aio_md_setup(void)
792 {
793 	int error, fd, mdctl_fd, unit;
794 	char pathname[PATH_MAX];
795 	struct md_ioctl mdio;
796 	char buf[80];
797 
798 	ATF_REQUIRE_KERNEL_MODULE("aio");
799 
800 	mdctl_fd = open("/dev/" MDCTL_NAME, O_RDWR, 0);
801 	ATF_REQUIRE_MSG(mdctl_fd != -1,
802 	    "opening /dev/%s failed: %s", MDCTL_NAME, strerror(errno));
803 
804 	bzero(&mdio, sizeof(mdio));
805 	mdio.md_version = MDIOVERSION;
806 	mdio.md_type = MD_MALLOC;
807 	mdio.md_options = MD_AUTOUNIT | MD_COMPRESS;
808 	mdio.md_mediasize = GLOBAL_MAX;
809 	mdio.md_sectorsize = 512;
810 	strlcpy(buf, __func__, sizeof(buf));
811 	mdio.md_label = buf;
812 
813 	if (ioctl(mdctl_fd, MDIOCATTACH, &mdio) < 0) {
814 		error = errno;
815 		errno = error;
816 		atf_tc_fail("ioctl MDIOCATTACH failed: %s", strerror(errno));
817 	}
818 	close(mdctl_fd);
819 
820 	/* Store the md unit number in a symlink for future cleanup */
821 	unit = mdio.md_unit;
822 	snprintf(buf, sizeof(buf), "%d", unit);
823 	ATF_REQUIRE_EQ(0, symlink(buf, MDUNIT_LINK));
824 	snprintf(pathname, PATH_MAX, "/dev/md%d", unit);
825 	fd = open(pathname, O_RDWR);
826 	ATF_REQUIRE_MSG(fd != -1,
827 	    "opening %s failed: %s", pathname, strerror(errno));
828 
829 	return (fd);
830 }
831 
832 static void
833 aio_md_cleanup(void)
834 {
835 	struct md_ioctl mdio;
836 	int mdctl_fd, n, unit;
837 	char buf[80];
838 
839 	mdctl_fd = open("/dev/" MDCTL_NAME, O_RDWR, 0);
840 	if (mdctl_fd < 0) {
841 		fprintf(stderr, "opening /dev/%s failed: %s\n", MDCTL_NAME,
842 		    strerror(errno));
843 		return;
844 	}
845 	n = readlink(MDUNIT_LINK, buf, sizeof(buf) - 1);
846 	if (n > 0) {
847 		buf[n] = '\0';
848 		if (sscanf(buf, "%d", &unit) == 1 && unit >= 0) {
849 			bzero(&mdio, sizeof(mdio));
850 			mdio.md_version = MDIOVERSION;
851 			mdio.md_unit = unit;
852 			if (ioctl(mdctl_fd, MDIOCDETACH, &mdio) == -1) {
853 				fprintf(stderr,
854 				    "ioctl MDIOCDETACH unit %d failed: %s\n",
855 				    unit, strerror(errno));
856 			}
857 		}
858 	}
859 
860 	close(mdctl_fd);
861 }
862 
863 static void
864 aio_md_test(completion comp, struct sigevent *sev, bool vectored)
865 {
866 	struct aio_context ac;
867 	int fd;
868 
869 	fd = aio_md_setup();
870 	aio_context_init(&ac, fd, fd, MD_LEN);
871 	if (vectored) {
872 		aio_writev_test(&ac, comp, sev);
873 		aio_readv_test(&ac, comp, sev);
874 	} else {
875 		aio_write_test(&ac, comp, sev);
876 		aio_read_test(&ac, comp, sev);
877 	}
878 
879 	close(fd);
880 }
881 
882 ATF_TC_WITH_CLEANUP(md_kq);
883 ATF_TC_HEAD(md_kq, tc)
884 {
885 
886 	atf_tc_set_md_var(tc, "require.user", "root");
887 }
888 ATF_TC_BODY(md_kq, tc)
889 {
890 	aio_md_test(poll_kqueue, setup_kqueue(), false);
891 }
892 ATF_TC_CLEANUP(md_kq, tc)
893 {
894 	aio_md_cleanup();
895 }
896 
897 ATF_TC_WITH_CLEANUP(md_poll);
898 ATF_TC_HEAD(md_poll, tc)
899 {
900 
901 	atf_tc_set_md_var(tc, "require.user", "root");
902 }
903 ATF_TC_BODY(md_poll, tc)
904 {
905 	aio_md_test(poll, NULL, false);
906 }
907 ATF_TC_CLEANUP(md_poll, tc)
908 {
909 	aio_md_cleanup();
910 }
911 
912 ATF_TC_WITH_CLEANUP(md_signal);
913 ATF_TC_HEAD(md_signal, tc)
914 {
915 
916 	atf_tc_set_md_var(tc, "require.user", "root");
917 }
918 ATF_TC_BODY(md_signal, tc)
919 {
920 	aio_md_test(poll_signaled, setup_signal(), false);
921 }
922 ATF_TC_CLEANUP(md_signal, tc)
923 {
924 	aio_md_cleanup();
925 }
926 
927 ATF_TC_WITH_CLEANUP(md_suspend);
928 ATF_TC_HEAD(md_suspend, tc)
929 {
930 
931 	atf_tc_set_md_var(tc, "require.user", "root");
932 }
933 ATF_TC_BODY(md_suspend, tc)
934 {
935 	aio_md_test(suspend, NULL, false);
936 }
937 ATF_TC_CLEANUP(md_suspend, tc)
938 {
939 	aio_md_cleanup();
940 }
941 
942 ATF_TC_WITH_CLEANUP(md_thread);
943 ATF_TC_HEAD(md_thread, tc)
944 {
945 
946 	atf_tc_set_md_var(tc, "require.user", "root");
947 }
948 ATF_TC_BODY(md_thread, tc)
949 {
950 	aio_md_test(poll_signaled, setup_thread(), false);
951 }
952 ATF_TC_CLEANUP(md_thread, tc)
953 {
954 	aio_md_cleanup();
955 }
956 
957 ATF_TC_WITH_CLEANUP(md_waitcomplete);
958 ATF_TC_HEAD(md_waitcomplete, tc)
959 {
960 
961 	atf_tc_set_md_var(tc, "require.user", "root");
962 }
963 ATF_TC_BODY(md_waitcomplete, tc)
964 {
965 	aio_md_test(waitcomplete, NULL, false);
966 }
967 ATF_TC_CLEANUP(md_waitcomplete, tc)
968 {
969 	aio_md_cleanup();
970 }
971 
972 #define	ZVOL_VDEV_PATHNAME	"test_vdev"
973 #define POOL_SIZE		(1 << 28)	/* 256 MB */
974 #define ZVOL_SIZE		"64m"
975 #define POOL_NAME		"aio_testpool"
976 #define ZVOL_NAME		"aio_testvol"
977 
978 static int
979 aio_zvol_setup(const char *unique)
980 {
981 	FILE *pidfile;
982 	int fd;
983 	pid_t pid;
984 	char vdev_name[160];
985 	char pool_name[80];
986 	char cmd[160];
987 	char zvol_name[160];
988 	char devname[160];
989 
990 	ATF_REQUIRE_KERNEL_MODULE("aio");
991 	ATF_REQUIRE_KERNEL_MODULE("zfs");
992 
993 	pid = getpid();
994 	snprintf(vdev_name, sizeof(vdev_name), "%s", ZVOL_VDEV_PATHNAME);
995 	snprintf(pool_name, sizeof(pool_name), "%s_%s.%d", POOL_NAME, unique,
996 	    pid);
997 	snprintf(zvol_name, sizeof(zvol_name), "%s/%s_%s", pool_name, ZVOL_NAME,
998 	    unique);
999 
1000 	fd = open(vdev_name, O_RDWR | O_CREAT, 0600);
1001 	ATF_REQUIRE_MSG(fd != -1, "open failed: %s", strerror(errno));
1002 	ATF_REQUIRE_EQ_MSG(0,
1003 	    ftruncate(fd, POOL_SIZE), "ftruncate failed: %s", strerror(errno));
1004 	close(fd);
1005 
1006 	pidfile = fopen("pidfile", "w");
1007 	ATF_REQUIRE_MSG(NULL != pidfile, "fopen: %s", strerror(errno));
1008 	fprintf(pidfile, "%d", pid);
1009 	fclose(pidfile);
1010 
1011 	snprintf(cmd, sizeof(cmd), "zpool create %s $PWD/%s", pool_name,
1012 	    vdev_name);
1013 	ATF_REQUIRE_EQ_MSG(0, system(cmd),
1014 	    "zpool create failed: %s", strerror(errno));
1015 	snprintf(cmd, sizeof(cmd),
1016 	    "zfs create -o volblocksize=8192 -o volmode=dev -V %s %s",
1017 	    ZVOL_SIZE, zvol_name);
1018 	ATF_REQUIRE_EQ_MSG(0, system(cmd),
1019 	    "zfs create failed: %s", strerror(errno));
1020 
1021 	snprintf(devname, sizeof(devname), "/dev/zvol/%s", zvol_name);
1022 	do {
1023 		fd = open(devname, O_RDWR);
1024 	} while (fd == -1 && errno == EINTR);
1025 	ATF_REQUIRE_MSG(fd != -1, "open failed: %s", strerror(errno));
1026 	return (fd);
1027 }
1028 
1029 static void
1030 aio_zvol_cleanup(const char *unique)
1031 {
1032 	FILE *pidfile;
1033 	pid_t testpid;
1034 	char cmd[160];
1035 
1036 	pidfile = fopen("pidfile", "r");
1037 	if (pidfile == NULL && errno == ENOENT) {
1038 		/* Setup probably failed */
1039 		return;
1040 	}
1041 	ATF_REQUIRE_MSG(NULL != pidfile, "fopen: %s", strerror(errno));
1042 	ATF_REQUIRE_EQ(1, fscanf(pidfile, "%d", &testpid));
1043 	fclose(pidfile);
1044 
1045 	snprintf(cmd, sizeof(cmd), "zpool destroy %s_%s.%d", POOL_NAME, unique,
1046 	    testpid);
1047 	system(cmd);
1048 }
1049 
1050 
1051 ATF_TC_WITHOUT_HEAD(aio_large_read_test);
1052 ATF_TC_BODY(aio_large_read_test, tc)
1053 {
1054 	struct aiocb cb, *cbp;
1055 	ssize_t nread;
1056 	size_t len;
1057 	int fd;
1058 #ifdef __LP64__
1059 	int clamped;
1060 #endif
1061 
1062 	ATF_REQUIRE_KERNEL_MODULE("aio");
1063 	ATF_REQUIRE_UNSAFE_AIO();
1064 
1065 #ifdef __LP64__
1066 	len = sizeof(clamped);
1067 	if (sysctlbyname("debug.iosize_max_clamp", &clamped, &len, NULL, 0) ==
1068 	    -1)
1069 		atf_libc_error(errno, "Failed to read debug.iosize_max_clamp");
1070 #endif
1071 
1072 	/* Determine the maximum supported read(2) size. */
1073 	len = SSIZE_MAX;
1074 #ifdef __LP64__
1075 	if (clamped)
1076 		len = INT_MAX;
1077 #endif
1078 
1079 	fd = open(FILE_PATHNAME, O_RDWR | O_CREAT, 0600);
1080 	ATF_REQUIRE_MSG(fd != -1, "open failed: %s", strerror(errno));
1081 
1082 	unlink(FILE_PATHNAME);
1083 
1084 	memset(&cb, 0, sizeof(cb));
1085 	cb.aio_nbytes = len;
1086 	cb.aio_fildes = fd;
1087 	cb.aio_buf = NULL;
1088 	if (aio_read(&cb) == -1)
1089 		atf_tc_fail("aio_read() of maximum read size failed: %s",
1090 		    strerror(errno));
1091 
1092 	nread = aio_waitcomplete(&cbp, NULL);
1093 	if (nread == -1)
1094 		atf_tc_fail("aio_waitcomplete() failed: %s", strerror(errno));
1095 	if (nread != 0)
1096 		atf_tc_fail("aio_read() from empty file returned data: %zd",
1097 		    nread);
1098 
1099 	memset(&cb, 0, sizeof(cb));
1100 	cb.aio_nbytes = len + 1;
1101 	cb.aio_fildes = fd;
1102 	cb.aio_buf = NULL;
1103 	if (aio_read(&cb) == -1) {
1104 		if (errno == EINVAL)
1105 			goto finished;
1106 		atf_tc_fail("aio_read() of too large read size failed: %s",
1107 		    strerror(errno));
1108 	}
1109 
1110 	nread = aio_waitcomplete(&cbp, NULL);
1111 	if (nread == -1) {
1112 		if (errno == EINVAL)
1113 			goto finished;
1114 		atf_tc_fail("aio_waitcomplete() failed: %s", strerror(errno));
1115 	}
1116 	atf_tc_fail("aio_read() of too large read size returned: %zd", nread);
1117 
1118 finished:
1119 	close(fd);
1120 }
1121 
1122 /*
1123  * This tests for a bug where arriving socket data can wakeup multiple
1124  * AIO read requests resulting in an uncancellable request.
1125  */
1126 ATF_TC_WITHOUT_HEAD(aio_socket_two_reads);
1127 ATF_TC_BODY(aio_socket_two_reads, tc)
1128 {
1129 	struct ioreq {
1130 		struct aiocb iocb;
1131 		char buffer[1024];
1132 	} ioreq[2];
1133 	struct aiocb *iocb;
1134 	unsigned i;
1135 	int s[2];
1136 	char c;
1137 
1138 	ATF_REQUIRE_KERNEL_MODULE("aio");
1139 #if __FreeBSD_version < 1100101
1140 	aft_tc_skip("kernel version %d is too old (%d required)",
1141 	    __FreeBSD_version, 1100101);
1142 #endif
1143 
1144 	ATF_REQUIRE(socketpair(PF_UNIX, SOCK_STREAM, 0, s) != -1);
1145 
1146 	/* Queue two read requests. */
1147 	memset(&ioreq, 0, sizeof(ioreq));
1148 	for (i = 0; i < nitems(ioreq); i++) {
1149 		ioreq[i].iocb.aio_nbytes = sizeof(ioreq[i].buffer);
1150 		ioreq[i].iocb.aio_fildes = s[0];
1151 		ioreq[i].iocb.aio_buf = ioreq[i].buffer;
1152 		ATF_REQUIRE(aio_read(&ioreq[i].iocb) == 0);
1153 	}
1154 
1155 	/* Send a single byte.  This should complete one request. */
1156 	c = 0xc3;
1157 	ATF_REQUIRE(write(s[1], &c, sizeof(c)) == 1);
1158 
1159 	ATF_REQUIRE(aio_waitcomplete(&iocb, NULL) == 1);
1160 
1161 	/* Determine which request completed and verify the data was read. */
1162 	if (iocb == &ioreq[0].iocb)
1163 		i = 0;
1164 	else
1165 		i = 1;
1166 	ATF_REQUIRE(ioreq[i].buffer[0] == c);
1167 
1168 	i ^= 1;
1169 
1170 	/*
1171 	 * Try to cancel the other request.  On broken systems this
1172 	 * will fail and the process will hang on exit.
1173 	 */
1174 	ATF_REQUIRE(aio_error(&ioreq[i].iocb) == EINPROGRESS);
1175 	ATF_REQUIRE(aio_cancel(s[0], &ioreq[i].iocb) == AIO_CANCELED);
1176 
1177 	close(s[1]);
1178 	close(s[0]);
1179 }
1180 
1181 static void
1182 aio_socket_blocking_short_write_test(bool vectored)
1183 {
1184 	struct aiocb iocb, *iocbp;
1185 	struct iovec iov[2];
1186 	char *buffer[2];
1187 	ssize_t done, r;
1188 	int buffer_size, sb_size;
1189 	socklen_t len;
1190 	int s[2];
1191 
1192 	ATF_REQUIRE_KERNEL_MODULE("aio");
1193 
1194 	ATF_REQUIRE(socketpair(PF_UNIX, SOCK_STREAM, 0, s) != -1);
1195 
1196 	len = sizeof(sb_size);
1197 	ATF_REQUIRE(getsockopt(s[0], SOL_SOCKET, SO_RCVBUF, &sb_size, &len) !=
1198 	    -1);
1199 	ATF_REQUIRE(len == sizeof(sb_size));
1200 	buffer_size = sb_size;
1201 
1202 	ATF_REQUIRE(getsockopt(s[1], SOL_SOCKET, SO_SNDBUF, &sb_size, &len) !=
1203 	    -1);
1204 	ATF_REQUIRE(len == sizeof(sb_size));
1205 	if (sb_size > buffer_size)
1206 		buffer_size = sb_size;
1207 
1208 	/*
1209 	 * Use twice the size of the MAX(receive buffer, send buffer)
1210 	 * to ensure that the write is split up into multiple writes
1211 	 * internally.
1212 	 */
1213 	buffer_size *= 2;
1214 
1215 	buffer[0] = malloc(buffer_size);
1216 	ATF_REQUIRE(buffer[0] != NULL);
1217 	buffer[1] = malloc(buffer_size);
1218 	ATF_REQUIRE(buffer[1] != NULL);
1219 
1220 	srandomdev();
1221 	aio_fill_buffer(buffer[1], buffer_size, random());
1222 
1223 	memset(&iocb, 0, sizeof(iocb));
1224 	iocb.aio_fildes = s[1];
1225 	if (vectored) {
1226 		iov[0].iov_base = buffer[1];
1227 		iov[0].iov_len = buffer_size / 2 + 1;
1228 		iov[1].iov_base = buffer[1] + buffer_size / 2 + 1;
1229 		iov[1].iov_len = buffer_size / 2 - 1;
1230 		iocb.aio_iov = iov;
1231 		iocb.aio_iovcnt = 2;
1232 		r = aio_writev(&iocb);
1233 		ATF_CHECK_EQ_MSG(0, r, "aio_writev returned %zd", r);
1234 	} else {
1235 		iocb.aio_buf = buffer[1];
1236 		iocb.aio_nbytes = buffer_size;
1237 		r = aio_write(&iocb);
1238 		ATF_CHECK_EQ_MSG(0, r, "aio_writev returned %zd", r);
1239 	}
1240 
1241 	done = recv(s[0], buffer[0], buffer_size, MSG_WAITALL);
1242 	ATF_REQUIRE(done == buffer_size);
1243 
1244 	done = aio_waitcomplete(&iocbp, NULL);
1245 	ATF_REQUIRE(iocbp == &iocb);
1246 	ATF_REQUIRE(done == buffer_size);
1247 
1248 	ATF_REQUIRE(memcmp(buffer[0], buffer[1], buffer_size) == 0);
1249 
1250 	close(s[1]);
1251 	close(s[0]);
1252 }
1253 
1254 /*
1255  * This test ensures that aio_write() on a blocking socket of a "large"
1256  * buffer does not return a short completion.
1257  */
1258 ATF_TC_WITHOUT_HEAD(aio_socket_blocking_short_write);
1259 ATF_TC_BODY(aio_socket_blocking_short_write, tc)
1260 {
1261 	aio_socket_blocking_short_write_test(false);
1262 }
1263 
1264 /*
1265  * Like aio_socket_blocking_short_write, but also tests that partially
1266  * completed vectored sends can be retried correctly.
1267  */
1268 ATF_TC_WITHOUT_HEAD(aio_socket_blocking_short_write_vectored);
1269 ATF_TC_BODY(aio_socket_blocking_short_write_vectored, tc)
1270 {
1271 	aio_socket_blocking_short_write_test(true);
1272 }
1273 
1274 /*
1275  * Verify that AIO requests fail when applied to a listening socket.
1276  */
1277 ATF_TC_WITHOUT_HEAD(aio_socket_listen_fail);
1278 ATF_TC_BODY(aio_socket_listen_fail, tc)
1279 {
1280 	struct aiocb iocb;
1281 	struct sockaddr_un sun;
1282 	char buf[16];
1283 	int s;
1284 
1285 	s = socket(AF_LOCAL, SOCK_STREAM, 0);
1286 	ATF_REQUIRE(s != -1);
1287 
1288 	memset(&sun, 0, sizeof(sun));
1289 	snprintf(sun.sun_path, sizeof(sun.sun_path), "%s", "listen.XXXXXX");
1290 	mktemp(sun.sun_path);
1291 	sun.sun_family = AF_LOCAL;
1292 	sun.sun_len = SUN_LEN(&sun);
1293 
1294 	ATF_REQUIRE(bind(s, (struct sockaddr *)&sun, SUN_LEN(&sun)) == 0);
1295 	ATF_REQUIRE(listen(s, 5) == 0);
1296 
1297 	memset(buf, 0, sizeof(buf));
1298 	memset(&iocb, 0, sizeof(iocb));
1299 	iocb.aio_fildes = s;
1300 	iocb.aio_buf = buf;
1301 	iocb.aio_nbytes = sizeof(buf);
1302 
1303 	ATF_REQUIRE_ERRNO(EINVAL, aio_read(&iocb) == -1);
1304 	ATF_REQUIRE_ERRNO(EINVAL, aio_write(&iocb) == -1);
1305 
1306 	ATF_REQUIRE(unlink(sun.sun_path) == 0);
1307 	close(s);
1308 }
1309 
1310 /*
1311  * Verify that listen(2) fails if a socket has pending AIO requests.
1312  */
1313 ATF_TC_WITHOUT_HEAD(aio_socket_listen_pending);
1314 ATF_TC_BODY(aio_socket_listen_pending, tc)
1315 {
1316 	struct aiocb iocb;
1317 	struct sockaddr_un sun;
1318 	char buf[16];
1319 	int s;
1320 
1321 	s = socket(AF_LOCAL, SOCK_STREAM, 0);
1322 	ATF_REQUIRE(s != -1);
1323 
1324 	memset(&sun, 0, sizeof(sun));
1325 	snprintf(sun.sun_path, sizeof(sun.sun_path), "%s", "listen.XXXXXX");
1326 	mktemp(sun.sun_path);
1327 	sun.sun_family = AF_LOCAL;
1328 	sun.sun_len = SUN_LEN(&sun);
1329 
1330 	ATF_REQUIRE(bind(s, (struct sockaddr *)&sun, SUN_LEN(&sun)) == 0);
1331 
1332 	memset(buf, 0, sizeof(buf));
1333 	memset(&iocb, 0, sizeof(iocb));
1334 	iocb.aio_fildes = s;
1335 	iocb.aio_buf = buf;
1336 	iocb.aio_nbytes = sizeof(buf);
1337 	ATF_REQUIRE(aio_read(&iocb) == 0);
1338 
1339 	ATF_REQUIRE_ERRNO(EINVAL, listen(s, 5) == -1);
1340 
1341 	ATF_REQUIRE(aio_cancel(s, &iocb) != -1);
1342 
1343 	ATF_REQUIRE(unlink(sun.sun_path) == 0);
1344 	close(s);
1345 }
1346 
1347 /*
1348  * This test verifies that cancelling a partially completed socket write
1349  * returns a short write rather than ECANCELED.
1350  */
1351 ATF_TC_WITHOUT_HEAD(aio_socket_short_write_cancel);
1352 ATF_TC_BODY(aio_socket_short_write_cancel, tc)
1353 {
1354 	struct aiocb iocb, *iocbp;
1355 	char *buffer[2];
1356 	ssize_t done;
1357 	int buffer_size, sb_size;
1358 	socklen_t len;
1359 	int s[2];
1360 
1361 	ATF_REQUIRE_KERNEL_MODULE("aio");
1362 
1363 	ATF_REQUIRE(socketpair(PF_UNIX, SOCK_STREAM, 0, s) != -1);
1364 
1365 	len = sizeof(sb_size);
1366 	ATF_REQUIRE(getsockopt(s[0], SOL_SOCKET, SO_RCVBUF, &sb_size, &len) !=
1367 	    -1);
1368 	ATF_REQUIRE(len == sizeof(sb_size));
1369 	buffer_size = sb_size;
1370 
1371 	ATF_REQUIRE(getsockopt(s[1], SOL_SOCKET, SO_SNDBUF, &sb_size, &len) !=
1372 	    -1);
1373 	ATF_REQUIRE(len == sizeof(sb_size));
1374 	if (sb_size > buffer_size)
1375 		buffer_size = sb_size;
1376 
1377 	/*
1378 	 * Use three times the size of the MAX(receive buffer, send
1379 	 * buffer) for the write to ensure that the write is split up
1380 	 * into multiple writes internally.  The recv() ensures that
1381 	 * the write has partially completed, but a remaining size of
1382 	 * two buffers should ensure that the write has not completed
1383 	 * fully when it is cancelled.
1384 	 */
1385 	buffer[0] = malloc(buffer_size);
1386 	ATF_REQUIRE(buffer[0] != NULL);
1387 	buffer[1] = malloc(buffer_size * 3);
1388 	ATF_REQUIRE(buffer[1] != NULL);
1389 
1390 	srandomdev();
1391 	aio_fill_buffer(buffer[1], buffer_size * 3, random());
1392 
1393 	memset(&iocb, 0, sizeof(iocb));
1394 	iocb.aio_fildes = s[1];
1395 	iocb.aio_buf = buffer[1];
1396 	iocb.aio_nbytes = buffer_size * 3;
1397 	ATF_REQUIRE(aio_write(&iocb) == 0);
1398 
1399 	done = recv(s[0], buffer[0], buffer_size, MSG_WAITALL);
1400 	ATF_REQUIRE(done == buffer_size);
1401 
1402 	ATF_REQUIRE(aio_error(&iocb) == EINPROGRESS);
1403 	ATF_REQUIRE(aio_cancel(s[1], &iocb) == AIO_NOTCANCELED);
1404 
1405 	done = aio_waitcomplete(&iocbp, NULL);
1406 	ATF_REQUIRE(iocbp == &iocb);
1407 	ATF_REQUIRE(done >= buffer_size && done <= buffer_size * 2);
1408 
1409 	ATF_REQUIRE(memcmp(buffer[0], buffer[1], buffer_size) == 0);
1410 
1411 	close(s[1]);
1412 	close(s[0]);
1413 }
1414 
1415 /*
1416  * Test handling of aio_read() and aio_write() on shut-down sockets.
1417  */
1418 ATF_TC_WITHOUT_HEAD(aio_socket_shutdown);
1419 ATF_TC_BODY(aio_socket_shutdown, tc)
1420 {
1421 	struct aiocb iocb;
1422 	sigset_t set;
1423 	char *buffer;
1424 	ssize_t len;
1425 	size_t bsz;
1426 	int error, s[2];
1427 
1428 	ATF_REQUIRE_KERNEL_MODULE("aio");
1429 
1430 	ATF_REQUIRE(socketpair(PF_UNIX, SOCK_STREAM, 0, s) != -1);
1431 
1432 	bsz = 1024;
1433 	buffer = malloc(bsz);
1434 	memset(buffer, 0, bsz);
1435 
1436 	/* Put some data in s[0]'s recv buffer. */
1437 	ATF_REQUIRE(send(s[1], buffer, bsz, 0) == (ssize_t)bsz);
1438 
1439 	/* No more reading from s[0]. */
1440 	ATF_REQUIRE(shutdown(s[0], SHUT_RD) != -1);
1441 
1442 	ATF_REQUIRE(buffer != NULL);
1443 
1444 	memset(&iocb, 0, sizeof(iocb));
1445 	iocb.aio_fildes = s[0];
1446 	iocb.aio_buf = buffer;
1447 	iocb.aio_nbytes = bsz;
1448 	ATF_REQUIRE(aio_read(&iocb) == 0);
1449 
1450 	/* Expect to see zero bytes, analogous to recv(2). */
1451 	while ((error = aio_error(&iocb)) == EINPROGRESS)
1452 		usleep(25000);
1453 	ATF_REQUIRE_MSG(error == 0, "aio_error() returned %d", error);
1454 	len = aio_return(&iocb);
1455 	ATF_REQUIRE_MSG(len == 0, "read job returned %zd bytes", len);
1456 
1457 	/* No more writing to s[1]. */
1458 	ATF_REQUIRE(shutdown(s[1], SHUT_WR) != -1);
1459 
1460 	/* Block SIGPIPE so that we can detect the error in-band. */
1461 	sigemptyset(&set);
1462 	sigaddset(&set, SIGPIPE);
1463 	ATF_REQUIRE(sigprocmask(SIG_BLOCK, &set, NULL) == 0);
1464 
1465 	memset(&iocb, 0, sizeof(iocb));
1466 	iocb.aio_fildes = s[1];
1467 	iocb.aio_buf = buffer;
1468 	iocb.aio_nbytes = bsz;
1469 	ATF_REQUIRE(aio_write(&iocb) == 0);
1470 
1471 	/* Expect an error, analogous to send(2). */
1472 	while ((error = aio_error(&iocb)) == EINPROGRESS)
1473 		usleep(25000);
1474 	ATF_REQUIRE_MSG(error == EPIPE, "aio_error() returned %d", error);
1475 
1476 	ATF_REQUIRE(close(s[0]) != -1);
1477 	ATF_REQUIRE(close(s[1]) != -1);
1478 	free(buffer);
1479 }
1480 
1481 /*
1482  * test aio_fsync's behavior with bad inputs
1483  */
1484 ATF_TC_WITHOUT_HEAD(aio_fsync_errors);
1485 ATF_TC_BODY(aio_fsync_errors, tc)
1486 {
1487 	int fd;
1488 	struct aiocb iocb;
1489 
1490 	ATF_REQUIRE_KERNEL_MODULE("aio");
1491 	ATF_REQUIRE_UNSAFE_AIO();
1492 
1493 	fd = open(FILE_PATHNAME, O_RDWR | O_CREAT, 0600);
1494 	ATF_REQUIRE_MSG(fd != -1, "open failed: %s", strerror(errno));
1495 	unlink(FILE_PATHNAME);
1496 
1497 	/* aio_fsync should return EINVAL unless op is O_SYNC or O_DSYNC */
1498 	memset(&iocb, 0, sizeof(iocb));
1499 	iocb.aio_fildes = fd;
1500 	ATF_CHECK_EQ(-1, aio_fsync(666, &iocb));
1501 	ATF_CHECK_EQ(EINVAL, errno);
1502 
1503 	/* aio_fsync should return EBADF if fd is not a valid descriptor */
1504 	memset(&iocb, 0, sizeof(iocb));
1505 	iocb.aio_fildes = 666;
1506 	ATF_CHECK_EQ(-1, aio_fsync(O_SYNC, &iocb));
1507 	ATF_CHECK_EQ(EBADF, errno);
1508 
1509 	/* aio_fsync should return EINVAL if sigev_notify is invalid */
1510 	memset(&iocb, 0, sizeof(iocb));
1511 	iocb.aio_fildes = fd;
1512 	iocb.aio_sigevent.sigev_notify = 666;
1513 	ATF_CHECK_EQ(-1, aio_fsync(666, &iocb));
1514 	ATF_CHECK_EQ(EINVAL, errno);
1515 }
1516 
1517 /*
1518  * This test just performs a basic test of aio_fsync().
1519  */
1520 static void
1521 aio_fsync_test(int op)
1522 {
1523 	struct aiocb synccb, *iocbp;
1524 	struct {
1525 		struct aiocb iocb;
1526 		bool done;
1527 		char *buffer;
1528 	} buffers[16];
1529 	struct stat sb;
1530 	ssize_t rval;
1531 	unsigned i;
1532 	int fd;
1533 
1534 	ATF_REQUIRE_KERNEL_MODULE("aio");
1535 	ATF_REQUIRE_UNSAFE_AIO();
1536 
1537 	fd = open(FILE_PATHNAME, O_RDWR | O_CREAT, 0600);
1538 	ATF_REQUIRE_MSG(fd != -1, "open failed: %s", strerror(errno));
1539 	unlink(FILE_PATHNAME);
1540 
1541 	ATF_REQUIRE(fstat(fd, &sb) == 0);
1542 	ATF_REQUIRE(sb.st_blksize != 0);
1543 	ATF_REQUIRE(ftruncate(fd, sb.st_blksize * nitems(buffers)) == 0);
1544 
1545 	/*
1546 	 * Queue several asynchronous write requests.  Hopefully this
1547 	 * forces the aio_fsync() request to be deferred.  There is no
1548 	 * reliable way to guarantee that however.
1549 	 */
1550 	srandomdev();
1551 	for (i = 0; i < nitems(buffers); i++) {
1552 		buffers[i].done = false;
1553 		memset(&buffers[i].iocb, 0, sizeof(buffers[i].iocb));
1554 		buffers[i].buffer = malloc(sb.st_blksize);
1555 		aio_fill_buffer(buffers[i].buffer, sb.st_blksize, random());
1556 		buffers[i].iocb.aio_fildes = fd;
1557 		buffers[i].iocb.aio_buf = buffers[i].buffer;
1558 		buffers[i].iocb.aio_nbytes = sb.st_blksize;
1559 		buffers[i].iocb.aio_offset = sb.st_blksize * i;
1560 		ATF_REQUIRE(aio_write(&buffers[i].iocb) == 0);
1561 	}
1562 
1563 	/* Queue the aio_fsync request. */
1564 	memset(&synccb, 0, sizeof(synccb));
1565 	synccb.aio_fildes = fd;
1566 	ATF_REQUIRE(aio_fsync(op, &synccb) == 0);
1567 
1568 	/* Wait for requests to complete. */
1569 	for (;;) {
1570 	next:
1571 		rval = aio_waitcomplete(&iocbp, NULL);
1572 		ATF_REQUIRE(iocbp != NULL);
1573 		if (iocbp == &synccb) {
1574 			ATF_REQUIRE(rval == 0);
1575 			break;
1576 		}
1577 
1578 		for (i = 0; i < nitems(buffers); i++) {
1579 			if (iocbp == &buffers[i].iocb) {
1580 				ATF_REQUIRE(buffers[i].done == false);
1581 				ATF_REQUIRE(rval == sb.st_blksize);
1582 				buffers[i].done = true;
1583 				goto next;
1584 			}
1585 		}
1586 
1587 		ATF_REQUIRE_MSG(false, "unmatched AIO request");
1588 	}
1589 
1590 	for (i = 0; i < nitems(buffers); i++)
1591 		ATF_REQUIRE_MSG(buffers[i].done,
1592 		    "AIO request %u did not complete", i);
1593 
1594 	close(fd);
1595 }
1596 
1597 ATF_TC_WITHOUT_HEAD(aio_fsync_sync_test);
1598 ATF_TC_BODY(aio_fsync_sync_test, tc)
1599 {
1600 	aio_fsync_test(O_SYNC);
1601 }
1602 
1603 ATF_TC_WITHOUT_HEAD(aio_fsync_dsync_test);
1604 ATF_TC_BODY(aio_fsync_dsync_test, tc)
1605 {
1606 	aio_fsync_test(O_DSYNC);
1607 }
1608 
1609 /*
1610  * We shouldn't be able to DoS the system by setting iov_len to an insane
1611  * value
1612  */
1613 ATF_TC_WITHOUT_HEAD(aio_writev_dos_iov_len);
1614 ATF_TC_BODY(aio_writev_dos_iov_len, tc)
1615 {
1616 	struct aiocb aio;
1617 	const struct aiocb *const iocbs[] = {&aio};
1618 	const char *wbuf = "Hello, world!";
1619 	struct iovec iov[1];
1620 	ssize_t r;
1621 	int fd;
1622 
1623 	ATF_REQUIRE_KERNEL_MODULE("aio");
1624 	ATF_REQUIRE_UNSAFE_AIO();
1625 
1626 	fd = open("testfile", O_RDWR | O_CREAT, 0600);
1627 	ATF_REQUIRE_MSG(fd != -1, "open failed: %s", strerror(errno));
1628 
1629 	iov[0].iov_base = __DECONST(void*, wbuf);
1630 	iov[0].iov_len = 1 << 30;
1631 	bzero(&aio, sizeof(aio));
1632 	aio.aio_fildes = fd;
1633 	aio.aio_offset = 0;
1634 	aio.aio_iov = iov;
1635 	aio.aio_iovcnt = 1;
1636 
1637 	r = aio_writev(&aio);
1638 	ATF_CHECK_EQ_MSG(0, r, "aio_writev returned %zd", r);
1639 	ATF_REQUIRE_EQ(0, aio_suspend(iocbs, 1, NULL));
1640 	r = aio_return(&aio);
1641 	ATF_CHECK_EQ_MSG(-1, r, "aio_return returned %zd", r);
1642 	ATF_CHECK_MSG(errno == EFAULT || errno == EINVAL,
1643 	    "aio_writev: %s", strerror(errno));
1644 
1645 	close(fd);
1646 }
1647 
1648 /*
1649  * We shouldn't be able to DoS the system by setting aio_iovcnt to an insane
1650  * value
1651  */
1652 ATF_TC_WITHOUT_HEAD(aio_writev_dos_iovcnt);
1653 ATF_TC_BODY(aio_writev_dos_iovcnt, tc)
1654 {
1655 	struct aiocb aio;
1656 	const char *wbuf = "Hello, world!";
1657 	struct iovec iov[1];
1658 	ssize_t len;
1659 	int fd;
1660 
1661 	ATF_REQUIRE_KERNEL_MODULE("aio");
1662 	ATF_REQUIRE_UNSAFE_AIO();
1663 
1664 	fd = open("testfile", O_RDWR | O_CREAT, 0600);
1665 	ATF_REQUIRE_MSG(fd != -1, "open failed: %s", strerror(errno));
1666 
1667 	len = strlen(wbuf);
1668 	iov[0].iov_base = __DECONST(void*, wbuf);
1669 	iov[0].iov_len = len;
1670 	bzero(&aio, sizeof(aio));
1671 	aio.aio_fildes = fd;
1672 	aio.aio_offset = 0;
1673 	aio.aio_iov = iov;
1674 	aio.aio_iovcnt = 1 << 30;
1675 
1676 	ATF_REQUIRE_EQ(-1, aio_writev(&aio));
1677 	ATF_CHECK_EQ(EINVAL, errno);
1678 
1679 	close(fd);
1680 }
1681 
1682 ATF_TC_WITH_CLEANUP(aio_writev_efault);
1683 ATF_TC_HEAD(aio_writev_efault, tc)
1684 {
1685 	atf_tc_set_md_var(tc, "descr",
1686 	    "Vectored AIO should gracefully handle invalid addresses");
1687 	atf_tc_set_md_var(tc, "require.user", "root");
1688 }
1689 ATF_TC_BODY(aio_writev_efault, tc)
1690 {
1691 	struct aiocb aio;
1692 	ssize_t buflen;
1693 	char *buffer;
1694 	struct iovec iov[2];
1695 	long seed;
1696 	int fd;
1697 
1698 	ATF_REQUIRE_KERNEL_MODULE("aio");
1699 	ATF_REQUIRE_UNSAFE_AIO();
1700 
1701 	fd = aio_md_setup();
1702 
1703 	seed = random();
1704 	buflen = 4096;
1705 	buffer = malloc(buflen);
1706 	aio_fill_buffer(buffer, buflen, seed);
1707 	iov[0].iov_base = buffer;
1708 	iov[0].iov_len = buflen;
1709 	iov[1].iov_base = (void*)-1;	/* Invalid! */
1710 	iov[1].iov_len = buflen;
1711 	bzero(&aio, sizeof(aio));
1712 	aio.aio_fildes = fd;
1713 	aio.aio_offset = 0;
1714 	aio.aio_iov = iov;
1715 	aio.aio_iovcnt = nitems(iov);
1716 
1717 	ATF_REQUIRE_EQ(-1, aio_writev(&aio));
1718 	ATF_CHECK_EQ(EFAULT, errno);
1719 
1720 	close(fd);
1721 }
1722 ATF_TC_CLEANUP(aio_writev_efault, tc)
1723 {
1724 	aio_md_cleanup();
1725 }
1726 
1727 ATF_TC_WITHOUT_HEAD(aio_writev_empty_file_poll);
1728 ATF_TC_BODY(aio_writev_empty_file_poll, tc)
1729 {
1730 	struct aiocb aio;
1731 	int fd;
1732 
1733 	ATF_REQUIRE_KERNEL_MODULE("aio");
1734 	ATF_REQUIRE_UNSAFE_AIO();
1735 
1736 	fd = open("testfile", O_RDWR | O_CREAT, 0600);
1737 	ATF_REQUIRE_MSG(fd != -1, "open failed: %s", strerror(errno));
1738 
1739 	bzero(&aio, sizeof(aio));
1740 	aio.aio_fildes = fd;
1741 	aio.aio_offset = 0;
1742 	aio.aio_iovcnt = 0;
1743 
1744 	ATF_REQUIRE_EQ(0, aio_writev(&aio));
1745 	ATF_REQUIRE_EQ(0, suspend(&aio));
1746 
1747 	close(fd);
1748 }
1749 
1750 ATF_TC_WITHOUT_HEAD(aio_writev_empty_file_signal);
1751 ATF_TC_BODY(aio_writev_empty_file_signal, tc)
1752 {
1753 	struct aiocb aio;
1754 	int fd;
1755 
1756 	ATF_REQUIRE_KERNEL_MODULE("aio");
1757 	ATF_REQUIRE_UNSAFE_AIO();
1758 
1759 	fd = open("testfile", O_RDWR | O_CREAT, 0600);
1760 	ATF_REQUIRE_MSG(fd != -1, "open failed: %s", strerror(errno));
1761 
1762 	bzero(&aio, sizeof(aio));
1763 	aio.aio_fildes = fd;
1764 	aio.aio_offset = 0;
1765 	aio.aio_iovcnt = 0;
1766 	aio.aio_sigevent = *setup_signal();
1767 
1768 	ATF_REQUIRE_EQ(0, aio_writev(&aio));
1769 	ATF_REQUIRE_EQ(0, poll_signaled(&aio));
1770 
1771 	close(fd);
1772 }
1773 
1774 /*
1775  * Use an aiocb with kqueue and EV_ONESHOT.  kqueue should deliver the event
1776  * only once, even if the user doesn't promptly call aio_return.
1777  */
1778 ATF_TC_WITHOUT_HEAD(ev_oneshot);
1779 ATF_TC_BODY(ev_oneshot, tc)
1780 {
1781 	int fd, kq, nevents;
1782 	struct aiocb iocb;
1783 	struct kevent events[1];
1784 	struct timespec timeout;
1785 
1786 	ATF_REQUIRE_KERNEL_MODULE("aio");
1787 
1788 	kq = kqueue();
1789 	ATF_REQUIRE(kq >= 0);
1790 
1791 	fd = open(FILE_PATHNAME, O_RDWR | O_CREAT, 0600);
1792 	ATF_REQUIRE_MSG(fd != -1, "open failed: %s", strerror(errno));
1793 
1794 	memset(&iocb, 0, sizeof(iocb));
1795 	iocb.aio_fildes = fd;
1796 	iocb.aio_sigevent.sigev_notify_kqueue = kq;
1797 	iocb.aio_sigevent.sigev_value.sival_ptr = (void*)0xdeadbeef;
1798 	iocb.aio_sigevent.sigev_notify_kevent_flags = EV_ONESHOT;
1799 	iocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
1800 
1801 	ATF_CHECK_EQ(0, aio_fsync(O_SYNC, &iocb));
1802 
1803 	nevents = kevent(kq, NULL, 0, events, 1, NULL);
1804 	ATF_CHECK_EQ(1, nevents);
1805 	ATF_CHECK_EQ(events[0].ident, (uintptr_t) &iocb);
1806 	ATF_CHECK_EQ(events[0].filter, EVFILT_AIO);
1807 	ATF_CHECK_EQ(events[0].flags, EV_EOF | EV_ONESHOT);
1808 	ATF_CHECK_EQ(events[0].fflags, 0);
1809 	ATF_CHECK_EQ(events[0].data, 0);
1810 	ATF_CHECK_EQ((uintptr_t)events[0].udata, 0xdeadbeef);
1811 
1812 	/*
1813 	 * Even though we haven't called aio_return, kevent will not return the
1814 	 * event again due to EV_ONESHOT.
1815 	 */
1816 	timeout.tv_sec = 0;
1817 	timeout.tv_nsec = 100000000;
1818 	nevents = kevent(kq, NULL, 0, events, 1, &timeout);
1819 	ATF_CHECK_EQ(0, nevents);
1820 
1821 	ATF_CHECK_EQ(0, aio_return(&iocb));
1822 	close(fd);
1823 	close(kq);
1824 }
1825 
1826 
1827 // aio_writev and aio_readv should still work even if the iovcnt is greater
1828 // than the number of buffered AIO operations permitted per process.
1829 ATF_TC_WITH_CLEANUP(vectored_big_iovcnt);
1830 ATF_TC_HEAD(vectored_big_iovcnt, tc)
1831 {
1832 	atf_tc_set_md_var(tc, "descr",
1833 	    "Vectored AIO should still work even if the iovcnt is greater than "
1834 	    "the number of buffered AIO operations permitted by the process");
1835 	atf_tc_set_md_var(tc, "require.user", "root");
1836 }
1837 ATF_TC_BODY(vectored_big_iovcnt, tc)
1838 {
1839 	struct aiocb aio;
1840 	struct iovec *iov;
1841 	ssize_t len, buflen;
1842 	char *buffer;
1843 	const char *oid = "vfs.aio.max_buf_aio";
1844 	long seed;
1845 	int max_buf_aio;
1846 	int fd, i;
1847 	ssize_t sysctl_len = sizeof(max_buf_aio);
1848 
1849 	ATF_REQUIRE_KERNEL_MODULE("aio");
1850 	ATF_REQUIRE_UNSAFE_AIO();
1851 
1852 	if (sysctlbyname(oid, &max_buf_aio, &sysctl_len, NULL, 0) == -1)
1853 		atf_libc_error(errno, "Failed to read %s", oid);
1854 
1855 	seed = random();
1856 	buflen = 512 * (max_buf_aio + 1);
1857 	buffer = malloc(buflen);
1858 	aio_fill_buffer(buffer, buflen, seed);
1859 	iov = calloc(max_buf_aio + 1, sizeof(struct iovec));
1860 
1861 	fd = aio_md_setup();
1862 
1863 	bzero(&aio, sizeof(aio));
1864 	aio.aio_fildes = fd;
1865 	aio.aio_offset = 0;
1866 	for (i = 0; i < max_buf_aio + 1; i++) {
1867 		iov[i].iov_base = &buffer[i * 512];
1868 		iov[i].iov_len = 512;
1869 	}
1870 	aio.aio_iov = iov;
1871 	aio.aio_iovcnt = max_buf_aio + 1;
1872 
1873 	if (aio_writev(&aio) < 0)
1874 		atf_tc_fail("aio_writev failed: %s", strerror(errno));
1875 
1876 	len = poll(&aio);
1877 	if (len < 0)
1878 		atf_tc_fail("aio failed: %s", strerror(errno));
1879 
1880 	if (len != buflen)
1881 		atf_tc_fail("aio short write (%jd)", (intmax_t)len);
1882 
1883 	bzero(&aio, sizeof(aio));
1884 	aio.aio_fildes = fd;
1885 	aio.aio_offset = 0;
1886 	aio.aio_iov = iov;
1887 	aio.aio_iovcnt = max_buf_aio + 1;
1888 
1889 	if (aio_readv(&aio) < 0)
1890 		atf_tc_fail("aio_readv failed: %s", strerror(errno));
1891 
1892 	len = poll(&aio);
1893 	if (len < 0)
1894 		atf_tc_fail("aio failed: %s", strerror(errno));
1895 
1896 	if (len != buflen)
1897 		atf_tc_fail("aio short read (%jd)", (intmax_t)len);
1898 
1899 	if (aio_test_buffer(buffer, buflen, seed) == 0)
1900 		atf_tc_fail("buffer mismatched");
1901 
1902 	close(fd);
1903 }
1904 ATF_TC_CLEANUP(vectored_big_iovcnt, tc)
1905 {
1906 	aio_md_cleanup();
1907 }
1908 
1909 ATF_TC_WITHOUT_HEAD(vectored_file_poll);
1910 ATF_TC_BODY(vectored_file_poll, tc)
1911 {
1912 	aio_file_test(poll, NULL, true);
1913 }
1914 
1915 ATF_TC_WITHOUT_HEAD(vectored_thread);
1916 ATF_TC_BODY(vectored_thread, tc)
1917 {
1918 	aio_file_test(poll_signaled, setup_thread(), true);
1919 }
1920 
1921 ATF_TC_WITH_CLEANUP(vectored_md_poll);
1922 ATF_TC_HEAD(vectored_md_poll, tc)
1923 {
1924 	atf_tc_set_md_var(tc, "require.user", "root");
1925 }
1926 ATF_TC_BODY(vectored_md_poll, tc)
1927 {
1928 	aio_md_test(poll, NULL, true);
1929 }
1930 ATF_TC_CLEANUP(vectored_md_poll, tc)
1931 {
1932 	aio_md_cleanup();
1933 }
1934 
1935 ATF_TC_WITHOUT_HEAD(vectored_socket_poll);
1936 ATF_TC_BODY(vectored_socket_poll, tc)
1937 {
1938 	aio_unix_socketpair_test(poll, NULL, true);
1939 }
1940 
1941 // aio_writev and aio_readv should still work even if the iov contains elements
1942 // that aren't a multiple of the device's sector size, and even if the total
1943 // amount if I/O _is_ a multiple of the device's sector size.
1944 ATF_TC_WITH_CLEANUP(vectored_unaligned);
1945 ATF_TC_HEAD(vectored_unaligned, tc)
1946 {
1947 	atf_tc_set_md_var(tc, "descr",
1948 	    "Vectored AIO should still work even if the iov contains elements "
1949 	    "that aren't a multiple of the sector size.");
1950 	atf_tc_set_md_var(tc, "require.user", "root");
1951 }
1952 ATF_TC_BODY(vectored_unaligned, tc)
1953 {
1954 	struct aio_context ac;
1955 	struct aiocb aio;
1956 	struct iovec iov[3];
1957 	ssize_t len, total_len;
1958 	int fd;
1959 
1960 	if (atf_tc_get_config_var_as_bool_wd(tc, "ci", false))
1961 		atf_tc_skip("https://bugs.freebsd.org/258766");
1962 
1963 	ATF_REQUIRE_KERNEL_MODULE("aio");
1964 	ATF_REQUIRE_UNSAFE_AIO();
1965 
1966 	/*
1967 	 * Use a zvol with volmode=dev, so it will allow .d_write with
1968 	 * unaligned uio.  geom devices use physio, which doesn't allow that.
1969 	 */
1970 	fd = aio_zvol_setup(atf_tc_get_ident(tc));
1971 	aio_context_init(&ac, fd, fd, FILE_LEN);
1972 
1973 	/* Break the buffer into 3 parts:
1974 	 * * A 4kB part, aligned to 4kB
1975 	 * * Two other parts that add up to 4kB:
1976 	 *   - 256B
1977 	 *   - 4kB - 256B
1978 	 */
1979 	iov[0].iov_base = ac.ac_buffer;
1980 	iov[0].iov_len = 4096;
1981 	iov[1].iov_base = (void*)((uintptr_t)iov[0].iov_base + iov[0].iov_len);
1982 	iov[1].iov_len = 256;
1983 	iov[2].iov_base = (void*)((uintptr_t)iov[1].iov_base + iov[1].iov_len);
1984 	iov[2].iov_len = 4096 - iov[1].iov_len;
1985 	total_len = iov[0].iov_len + iov[1].iov_len + iov[2].iov_len;
1986 	bzero(&aio, sizeof(aio));
1987 	aio.aio_fildes = ac.ac_write_fd;
1988 	aio.aio_offset = 0;
1989 	aio.aio_iov = iov;
1990 	aio.aio_iovcnt = 3;
1991 
1992 	if (aio_writev(&aio) < 0)
1993 		atf_tc_fail("aio_writev failed: %s", strerror(errno));
1994 
1995 	len = poll(&aio);
1996 	if (len < 0)
1997 		atf_tc_fail("aio failed: %s", strerror(errno));
1998 
1999 	if (len != total_len)
2000 		atf_tc_fail("aio short write (%jd)", (intmax_t)len);
2001 
2002 	bzero(&aio, sizeof(aio));
2003 	aio.aio_fildes = ac.ac_read_fd;
2004 	aio.aio_offset = 0;
2005 	aio.aio_iov = iov;
2006 	aio.aio_iovcnt = 3;
2007 
2008 	if (aio_readv(&aio) < 0)
2009 		atf_tc_fail("aio_readv failed: %s", strerror(errno));
2010 	len = poll(&aio);
2011 
2012 	ATF_REQUIRE_MSG(aio_test_buffer(ac.ac_buffer, total_len,
2013 	    ac.ac_seed) != 0, "aio_test_buffer: internal error");
2014 
2015 	close(fd);
2016 }
2017 ATF_TC_CLEANUP(vectored_unaligned, tc)
2018 {
2019 	aio_zvol_cleanup(atf_tc_get_ident(tc));
2020 }
2021 
2022 static void
2023 aio_zvol_test(completion comp, struct sigevent *sev, bool vectored,
2024     const char *unique)
2025 {
2026 	struct aio_context ac;
2027 	int fd;
2028 
2029 	fd = aio_zvol_setup(unique);
2030 	aio_context_init(&ac, fd, fd, MD_LEN);
2031 	if (vectored) {
2032 		aio_writev_test(&ac, comp, sev);
2033 		aio_readv_test(&ac, comp, sev);
2034 	} else {
2035 		aio_write_test(&ac, comp, sev);
2036 		aio_read_test(&ac, comp, sev);
2037 	}
2038 
2039 	close(fd);
2040 }
2041 
2042 /*
2043  * Note that unlike md, the zvol is not a geom device, does not allow unmapped
2044  * buffers, and does not use physio.
2045  */
2046 ATF_TC_WITH_CLEANUP(vectored_zvol_poll);
2047 ATF_TC_HEAD(vectored_zvol_poll, tc)
2048 {
2049 	atf_tc_set_md_var(tc, "require.user", "root");
2050 }
2051 ATF_TC_BODY(vectored_zvol_poll, tc)
2052 {
2053 	if (atf_tc_get_config_var_as_bool_wd(tc, "ci", false))
2054 		atf_tc_skip("https://bugs.freebsd.org/258766");
2055 	aio_zvol_test(poll, NULL, true, atf_tc_get_ident(tc));
2056 }
2057 ATF_TC_CLEANUP(vectored_zvol_poll, tc)
2058 {
2059 	aio_zvol_cleanup(atf_tc_get_ident(tc));
2060 }
2061 
2062 ATF_TP_ADD_TCS(tp)
2063 {
2064 
2065 	/* Test every file type with every completion method */
2066 	ATF_TP_ADD_TC(tp, file_kq);
2067 	ATF_TP_ADD_TC(tp, file_poll);
2068 	ATF_TP_ADD_TC(tp, file_signal);
2069 	ATF_TP_ADD_TC(tp, file_suspend);
2070 	ATF_TP_ADD_TC(tp, file_thread);
2071 	ATF_TP_ADD_TC(tp, file_waitcomplete);
2072 	ATF_TP_ADD_TC(tp, fifo_kq);
2073 	ATF_TP_ADD_TC(tp, fifo_poll);
2074 	ATF_TP_ADD_TC(tp, fifo_signal);
2075 	ATF_TP_ADD_TC(tp, fifo_suspend);
2076 	ATF_TP_ADD_TC(tp, fifo_thread);
2077 	ATF_TP_ADD_TC(tp, fifo_waitcomplete);
2078 	ATF_TP_ADD_TC(tp, socket_kq);
2079 	ATF_TP_ADD_TC(tp, socket_poll);
2080 	ATF_TP_ADD_TC(tp, socket_signal);
2081 	ATF_TP_ADD_TC(tp, socket_suspend);
2082 	ATF_TP_ADD_TC(tp, socket_thread);
2083 	ATF_TP_ADD_TC(tp, socket_waitcomplete);
2084 	ATF_TP_ADD_TC(tp, pty_kq);
2085 	ATF_TP_ADD_TC(tp, pty_poll);
2086 	ATF_TP_ADD_TC(tp, pty_signal);
2087 	ATF_TP_ADD_TC(tp, pty_suspend);
2088 	ATF_TP_ADD_TC(tp, pty_thread);
2089 	ATF_TP_ADD_TC(tp, pty_waitcomplete);
2090 	ATF_TP_ADD_TC(tp, pipe_kq);
2091 	ATF_TP_ADD_TC(tp, pipe_poll);
2092 	ATF_TP_ADD_TC(tp, pipe_signal);
2093 	ATF_TP_ADD_TC(tp, pipe_suspend);
2094 	ATF_TP_ADD_TC(tp, pipe_thread);
2095 	ATF_TP_ADD_TC(tp, pipe_waitcomplete);
2096 	ATF_TP_ADD_TC(tp, md_kq);
2097 	ATF_TP_ADD_TC(tp, md_poll);
2098 	ATF_TP_ADD_TC(tp, md_signal);
2099 	ATF_TP_ADD_TC(tp, md_suspend);
2100 	ATF_TP_ADD_TC(tp, md_thread);
2101 	ATF_TP_ADD_TC(tp, md_waitcomplete);
2102 
2103 	/* Various special cases */
2104 	ATF_TP_ADD_TC(tp, aio_fsync_errors);
2105 	ATF_TP_ADD_TC(tp, aio_fsync_sync_test);
2106 	ATF_TP_ADD_TC(tp, aio_fsync_dsync_test);
2107 	ATF_TP_ADD_TC(tp, aio_large_read_test);
2108 	ATF_TP_ADD_TC(tp, aio_socket_two_reads);
2109 	ATF_TP_ADD_TC(tp, aio_socket_blocking_short_write);
2110 	ATF_TP_ADD_TC(tp, aio_socket_blocking_short_write_vectored);
2111 	ATF_TP_ADD_TC(tp, aio_socket_listen_fail);
2112 	ATF_TP_ADD_TC(tp, aio_socket_listen_pending);
2113 	ATF_TP_ADD_TC(tp, aio_socket_short_write_cancel);
2114 	ATF_TP_ADD_TC(tp, aio_socket_shutdown);
2115 	ATF_TP_ADD_TC(tp, aio_writev_dos_iov_len);
2116 	ATF_TP_ADD_TC(tp, aio_writev_dos_iovcnt);
2117 	ATF_TP_ADD_TC(tp, aio_writev_efault);
2118 	ATF_TP_ADD_TC(tp, aio_writev_empty_file_poll);
2119 	ATF_TP_ADD_TC(tp, aio_writev_empty_file_signal);
2120 	ATF_TP_ADD_TC(tp, ev_oneshot);
2121 	ATF_TP_ADD_TC(tp, vectored_big_iovcnt);
2122 	ATF_TP_ADD_TC(tp, vectored_file_poll);
2123 	ATF_TP_ADD_TC(tp, vectored_md_poll);
2124 	ATF_TP_ADD_TC(tp, vectored_zvol_poll);
2125 	ATF_TP_ADD_TC(tp, vectored_unaligned);
2126 	ATF_TP_ADD_TC(tp, vectored_socket_poll);
2127 	ATF_TP_ADD_TC(tp, vectored_thread);
2128 
2129 	return (atf_no_error());
2130 }
2131