17e3db627SAlan Somers /*-
27e3db627SAlan Somers * Copyright (c) 2017 Spectra Logic Corp
37e3db627SAlan Somers * All rights reserved.
47e3db627SAlan Somers *
57e3db627SAlan Somers * Redistribution and use in source and binary forms, with or without
67e3db627SAlan Somers * modification, are permitted provided that the following conditions
77e3db627SAlan Somers * are met:
87e3db627SAlan Somers * 1. Redistributions of source code must retain the above copyright
97e3db627SAlan Somers * notice, this list of conditions and the following disclaimer.
107e3db627SAlan Somers * 2. Redistributions in binary form must reproduce the above copyright
117e3db627SAlan Somers * notice, this list of conditions and the following disclaimer in the
127e3db627SAlan Somers * documentation and/or other materials provided with the distribution.
137e3db627SAlan Somers *
147e3db627SAlan Somers * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
157e3db627SAlan Somers * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
167e3db627SAlan Somers * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
177e3db627SAlan Somers * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
187e3db627SAlan Somers * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
197e3db627SAlan Somers * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
207e3db627SAlan Somers * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
217e3db627SAlan Somers * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
227e3db627SAlan Somers * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
237e3db627SAlan Somers * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
247e3db627SAlan Somers * SUCH DAMAGE.
257e3db627SAlan Somers */
267e3db627SAlan Somers
27ff1a3078SAlan Somers #define _WANT_ALL_LIO_OPCODES
28ff1a3078SAlan Somers
297e3db627SAlan Somers #include <sys/param.h>
307e3db627SAlan Somers #include <sys/event.h>
31ff1a3078SAlan Somers #include <sys/uio.h>
327e3db627SAlan Somers
337e3db627SAlan Somers #include <aio.h>
3452c09831SAlan Somers #include <fcntl.h>
357e3db627SAlan Somers #include <semaphore.h>
3652c09831SAlan Somers #include <stdlib.h>
377e3db627SAlan Somers
387e3db627SAlan Somers #include <atf-c.h>
397e3db627SAlan Somers
4052c09831SAlan Somers #include "local.h"
417e3db627SAlan Somers #include "freebsd_test_suite/macros.h"
427e3db627SAlan Somers
437e3db627SAlan Somers static sem_t completions;
447e3db627SAlan Somers
457e3db627SAlan Somers
467e3db627SAlan Somers static void
handler(int sig __unused)477e3db627SAlan Somers handler(int sig __unused)
487e3db627SAlan Somers {
497e3db627SAlan Somers ATF_REQUIRE_EQ(0, sem_post(&completions));
507e3db627SAlan Somers }
517e3db627SAlan Somers
527e3db627SAlan Somers static void
thr_handler(union sigval sv __unused)537e3db627SAlan Somers thr_handler(union sigval sv __unused)
547e3db627SAlan Somers {
557e3db627SAlan Somers ATF_REQUIRE_EQ(0, sem_post(&completions));
567e3db627SAlan Somers }
577e3db627SAlan Somers
5852c09831SAlan Somers /*
5952c09831SAlan Somers * If lio_listio is unable to enqueue any requests at all, it should return
6052c09831SAlan Somers * EAGAIN.
6152c09831SAlan Somers */
6252c09831SAlan Somers ATF_TC_WITHOUT_HEAD(lio_listio_eagain_kevent);
ATF_TC_BODY(lio_listio_eagain_kevent,tc)6352c09831SAlan Somers ATF_TC_BODY(lio_listio_eagain_kevent, tc)
6452c09831SAlan Somers {
6552c09831SAlan Somers int fd, i, j, kq, max_queue_per_proc, ios_per_call;
6652c09831SAlan Somers size_t max_queue_per_proc_size;
6752c09831SAlan Somers struct aiocb *aiocbs[2];
6852c09831SAlan Somers struct aiocb **list[2];
6952c09831SAlan Somers struct sigevent sev[2];
7052c09831SAlan Somers char *buffer;
7152c09831SAlan Somers const char *path="tempfile";
7252c09831SAlan Somers void *udata[2];
7352c09831SAlan Somers
7452c09831SAlan Somers ATF_REQUIRE_KERNEL_MODULE("aio");
7552c09831SAlan Somers ATF_REQUIRE_UNSAFE_AIO();
7652c09831SAlan Somers
7752c09831SAlan Somers max_queue_per_proc_size = sizeof(max_queue_per_proc);
7852c09831SAlan Somers ATF_REQUIRE_EQ(sysctlbyname("vfs.aio.max_aio_queue_per_proc",
7952c09831SAlan Somers &max_queue_per_proc, &max_queue_per_proc_size, NULL, 0), 0);
8052c09831SAlan Somers ios_per_call = max_queue_per_proc;
8152c09831SAlan Somers
8252c09831SAlan Somers fd = open(path, O_RDWR|O_CREAT, 0666);
8352c09831SAlan Somers ATF_REQUIRE(fd >= 0);
8452c09831SAlan Somers
8552c09831SAlan Somers kq = kqueue();
8652c09831SAlan Somers ATF_REQUIRE(kq > 0);
8752c09831SAlan Somers
8852c09831SAlan Somers buffer = calloc(1, 4096);
8952c09831SAlan Somers ATF_REQUIRE(buffer != NULL);
9052c09831SAlan Somers
9152c09831SAlan Somers /*
9252c09831SAlan Somers * Call lio_listio twice, each with the maximum number of operations.
9352c09831SAlan Somers * The first call should succeed and the second should fail.
9452c09831SAlan Somers */
9552c09831SAlan Somers for (i = 0; i < 2; i++) {
9652c09831SAlan Somers aiocbs[i] = calloc(ios_per_call, sizeof(struct aiocb));
9752c09831SAlan Somers ATF_REQUIRE(aiocbs[i] != NULL);
9852c09831SAlan Somers list[i] = calloc(ios_per_call, sizeof(struct aiocb*));
9952c09831SAlan Somers ATF_REQUIRE(list[i] != NULL);
10052c09831SAlan Somers udata[i] = (void*)((caddr_t)0xdead0000 + i);
10152c09831SAlan Somers sev[i].sigev_notify = SIGEV_KEVENT;
10252c09831SAlan Somers sev[i].sigev_notify_kqueue = kq;
10352c09831SAlan Somers sev[i].sigev_value.sival_ptr = udata[i];
10452c09831SAlan Somers for (j = 0; j < ios_per_call; j++) {
10552c09831SAlan Somers aiocbs[i][j].aio_fildes = fd;
10652c09831SAlan Somers aiocbs[i][j].aio_offset = (i * ios_per_call + j) * 4096;
10752c09831SAlan Somers aiocbs[i][j].aio_buf = buffer;
10852c09831SAlan Somers aiocbs[i][j].aio_nbytes = 4096;
10952c09831SAlan Somers aiocbs[i][j].aio_lio_opcode = LIO_WRITE;
11052c09831SAlan Somers list[i][j] = &aiocbs[i][j];
11152c09831SAlan Somers }
11252c09831SAlan Somers }
11352c09831SAlan Somers
11452c09831SAlan Somers ATF_REQUIRE_EQ(0, lio_listio(LIO_NOWAIT, list[0], ios_per_call, &sev[0]));
11552c09831SAlan Somers ATF_REQUIRE_EQ(-1, lio_listio(LIO_NOWAIT, list[1], ios_per_call, &sev[1]));
11652c09831SAlan Somers /*
11752c09831SAlan Somers * The second lio_listio call should fail with EAGAIN. Bad timing may
11852c09831SAlan Somers * mean that some requests did get enqueued, but the result should
11952c09831SAlan Somers * still be EAGAIN.
12052c09831SAlan Somers */
12152c09831SAlan Somers ATF_REQUIRE_EQ(errno, EAGAIN);
12252c09831SAlan Somers }
12352c09831SAlan Somers
12452c09831SAlan Somers
1257e3db627SAlan Somers /* With LIO_WAIT, an empty lio_listio should return immediately */
1267e3db627SAlan Somers ATF_TC_WITHOUT_HEAD(lio_listio_empty_wait);
ATF_TC_BODY(lio_listio_empty_wait,tc)1277e3db627SAlan Somers ATF_TC_BODY(lio_listio_empty_wait, tc)
1287e3db627SAlan Somers {
1297e3db627SAlan Somers struct aiocb *list = NULL;
1307e3db627SAlan Somers
1317e3db627SAlan Somers ATF_REQUIRE_EQ(0, lio_listio(LIO_WAIT, &list, 0, NULL));
1327e3db627SAlan Somers }
1337e3db627SAlan Somers
1342e5f6152SMark Johnston /* With LIO_NOWAIT, an empty lio_listio should return immediately */
1352e5f6152SMark Johnston ATF_TC_WITHOUT_HEAD(lio_listio_empty_nowait);
ATF_TC_BODY(lio_listio_empty_nowait,tc)1362e5f6152SMark Johnston ATF_TC_BODY(lio_listio_empty_nowait, tc)
1372e5f6152SMark Johnston {
1382e5f6152SMark Johnston struct aiocb *list = NULL;
1392e5f6152SMark Johnston
1402e5f6152SMark Johnston ATF_REQUIRE_EQ(0, lio_listio(LIO_NOWAIT, &list, 0, NULL));
1412e5f6152SMark Johnston }
1422e5f6152SMark Johnston
1437e3db627SAlan Somers /*
1447e3db627SAlan Somers * With LIO_NOWAIT, an empty lio_listio should send completion notification
1457e3db627SAlan Somers * immediately
1467e3db627SAlan Somers */
1477e3db627SAlan Somers ATF_TC_WITHOUT_HEAD(lio_listio_empty_nowait_kevent);
ATF_TC_BODY(lio_listio_empty_nowait_kevent,tc)1487e3db627SAlan Somers ATF_TC_BODY(lio_listio_empty_nowait_kevent, tc)
1497e3db627SAlan Somers {
1507e3db627SAlan Somers struct aiocb *list = NULL;
1517e3db627SAlan Somers struct sigevent sev;
1527e3db627SAlan Somers struct kevent kq_returned;
1537e3db627SAlan Somers int kq, result;
1547e3db627SAlan Somers void *udata = (void*)0xdeadbeefdeadbeef;
1557e3db627SAlan Somers
15623693bd8SAlan Somers atf_tc_expect_timeout("Bug 251515 - lio_listio(2) never sends"
15723693bd8SAlan Somers " kevent if nent==0");
1587e3db627SAlan Somers kq = kqueue();
1597e3db627SAlan Somers ATF_REQUIRE(kq > 0);
1607e3db627SAlan Somers sev.sigev_notify = SIGEV_KEVENT;
1617e3db627SAlan Somers sev.sigev_notify_kqueue = kq;
1627e3db627SAlan Somers sev.sigev_value.sival_ptr = udata;
1637e3db627SAlan Somers ATF_REQUIRE_EQ(0, lio_listio(LIO_NOWAIT, &list, 0, &sev));
1647e3db627SAlan Somers result = kevent(kq, NULL, 0, &kq_returned, 1, NULL);
1657e3db627SAlan Somers ATF_REQUIRE_MSG(result == 1, "Never got completion notification");
1667e3db627SAlan Somers ATF_REQUIRE_EQ((uintptr_t)list, kq_returned.ident);
1677e3db627SAlan Somers ATF_REQUIRE_EQ(EVFILT_LIO, kq_returned.filter);
1687e3db627SAlan Somers ATF_REQUIRE_EQ(udata, kq_returned.udata);
1697e3db627SAlan Somers }
1707e3db627SAlan Somers
1717e3db627SAlan Somers /*
1727e3db627SAlan Somers * With LIO_NOWAIT, an empty lio_listio should send completion notification
1737e3db627SAlan Somers * immediately
1747e3db627SAlan Somers */
1757e3db627SAlan Somers ATF_TC_WITHOUT_HEAD(lio_listio_empty_nowait_signal);
ATF_TC_BODY(lio_listio_empty_nowait_signal,tc)1767e3db627SAlan Somers ATF_TC_BODY(lio_listio_empty_nowait_signal, tc)
1777e3db627SAlan Somers {
1787e3db627SAlan Somers struct aiocb *list = NULL;
1797e3db627SAlan Somers struct sigevent sev;
1807e3db627SAlan Somers
1817e3db627SAlan Somers ATF_REQUIRE_EQ(0, sem_init(&completions, false, 0));
1827e3db627SAlan Somers sev.sigev_notify = SIGEV_SIGNAL;
1837e3db627SAlan Somers sev.sigev_signo = SIGUSR1;
1847e3db627SAlan Somers ATF_REQUIRE(SIG_ERR != signal(SIGUSR1, handler));
1857e3db627SAlan Somers ATF_REQUIRE_EQ(0, lio_listio(LIO_NOWAIT, &list, 0, &sev));
1867e3db627SAlan Somers ATF_REQUIRE_EQ(0, sem_wait(&completions));
1877e3db627SAlan Somers ATF_REQUIRE_EQ(0, sem_destroy(&completions));
1887e3db627SAlan Somers }
1897e3db627SAlan Somers
1907e3db627SAlan Somers /*
1917e3db627SAlan Somers * With LIO_NOWAIT, an empty lio_listio should send completion notification
1927e3db627SAlan Somers * immediately
1937e3db627SAlan Somers */
1947e3db627SAlan Somers ATF_TC_WITHOUT_HEAD(lio_listio_empty_nowait_thread);
ATF_TC_BODY(lio_listio_empty_nowait_thread,tc)1957e3db627SAlan Somers ATF_TC_BODY(lio_listio_empty_nowait_thread, tc)
1967e3db627SAlan Somers {
1977e3db627SAlan Somers struct aiocb *list = NULL;
1987e3db627SAlan Somers struct sigevent sev;
1997e3db627SAlan Somers
2007e3db627SAlan Somers ATF_REQUIRE_EQ(0, sem_init(&completions, false, 0));
2017e3db627SAlan Somers bzero(&sev, sizeof(sev));
2027e3db627SAlan Somers sev.sigev_notify = SIGEV_THREAD;
2037e3db627SAlan Somers sev.sigev_notify_function = thr_handler;
2047e3db627SAlan Somers sev.sigev_notify_attributes = NULL;
2057e3db627SAlan Somers ATF_REQUIRE_MSG(0 == lio_listio(LIO_NOWAIT, &list, 0, &sev),
2067e3db627SAlan Somers "lio_listio: %s", strerror(errno));
2077e3db627SAlan Somers ATF_REQUIRE_EQ(0, sem_wait(&completions));
2087e3db627SAlan Somers ATF_REQUIRE_EQ(0, sem_destroy(&completions));
2097e3db627SAlan Somers }
2107e3db627SAlan Somers
211ff1a3078SAlan Somers /*
212f30a1ae8SThomas Munro * A simple check that the allowed operations work.
213f30a1ae8SThomas Munro */
214f30a1ae8SThomas Munro ATF_TC_WITHOUT_HEAD(lio_listio_opcodes);
ATF_TC_BODY(lio_listio_opcodes,tc)215f30a1ae8SThomas Munro ATF_TC_BODY(lio_listio_opcodes, tc)
216f30a1ae8SThomas Munro {
217f30a1ae8SThomas Munro struct aiocb write_cb, read_cb, writev_cb, readv_cb;
218f30a1ae8SThomas Munro struct aiocb *list[] = {&write_cb, &read_cb, &writev_cb, &readv_cb};
219f30a1ae8SThomas Munro struct iovec writev_iov[2];
220f30a1ae8SThomas Munro struct iovec readv_iov[2];
221f30a1ae8SThomas Munro char buffer[6];
222f30a1ae8SThomas Munro int fd;
223f30a1ae8SThomas Munro
224*3a0976deSMark Johnston fd = open("testfile", O_CREAT | O_RDWR, 0666);
225f30a1ae8SThomas Munro ATF_REQUIRE_MSG(fd >= 0, "open: %s", strerror(errno));
226f30a1ae8SThomas Munro
227f30a1ae8SThomas Munro /* We start with numbers in a file and letters in memory... */
228f30a1ae8SThomas Munro ATF_CHECK_EQ(6, write(fd, "123456", 6));
229f30a1ae8SThomas Munro memcpy(buffer, "abcdef", 6);
230f30a1ae8SThomas Munro
231f30a1ae8SThomas Munro /* a -> 1 */
232f30a1ae8SThomas Munro bzero(&write_cb, sizeof(write_cb));
233f30a1ae8SThomas Munro write_cb.aio_sigevent.sigev_notify = SIGEV_NONE;
234f30a1ae8SThomas Munro write_cb.aio_fildes = fd;
235f30a1ae8SThomas Munro write_cb.aio_lio_opcode = LIO_WRITE;
236f30a1ae8SThomas Munro write_cb.aio_buf = &buffer[0];
237f30a1ae8SThomas Munro write_cb.aio_nbytes = 1;
238f30a1ae8SThomas Munro write_cb.aio_offset = 0;
239f30a1ae8SThomas Munro
240f30a1ae8SThomas Munro /* b <- 2 */
241f30a1ae8SThomas Munro bzero(&read_cb, sizeof(read_cb));
242f30a1ae8SThomas Munro read_cb.aio_sigevent.sigev_notify = SIGEV_NONE;
243f30a1ae8SThomas Munro read_cb.aio_fildes = fd;
244f30a1ae8SThomas Munro read_cb.aio_lio_opcode = LIO_READ;
245f30a1ae8SThomas Munro read_cb.aio_buf = &buffer[1];
246f30a1ae8SThomas Munro read_cb.aio_nbytes = 1;
247f30a1ae8SThomas Munro read_cb.aio_offset = 1;
248f30a1ae8SThomas Munro
249f30a1ae8SThomas Munro /* d -> 3, c -> 4 */
250f30a1ae8SThomas Munro writev_iov[0].iov_base = &buffer[3];
251f30a1ae8SThomas Munro writev_iov[0].iov_len = 1;
252f30a1ae8SThomas Munro writev_iov[1].iov_base = &buffer[2];
253f30a1ae8SThomas Munro writev_iov[1].iov_len = 1;
254f30a1ae8SThomas Munro bzero(&writev_cb, sizeof(writev_cb));
255f30a1ae8SThomas Munro writev_cb.aio_sigevent.sigev_notify = SIGEV_NONE;
256f30a1ae8SThomas Munro writev_cb.aio_fildes = fd;
257f30a1ae8SThomas Munro writev_cb.aio_lio_opcode = LIO_WRITEV;
258f30a1ae8SThomas Munro writev_cb.aio_iov = &writev_iov;
259f30a1ae8SThomas Munro writev_cb.aio_iovcnt = 2;
260f30a1ae8SThomas Munro writev_cb.aio_offset = 2;
261f30a1ae8SThomas Munro
262f30a1ae8SThomas Munro /* f <- 5, e <- 6 */
263f30a1ae8SThomas Munro readv_iov[0].iov_base = &buffer[5];
264f30a1ae8SThomas Munro readv_iov[0].iov_len = 1;
265f30a1ae8SThomas Munro readv_iov[1].iov_base = &buffer[4];
266f30a1ae8SThomas Munro readv_iov[1].iov_len = 1;
267f30a1ae8SThomas Munro bzero(&readv_cb, sizeof(readv_cb));
268f30a1ae8SThomas Munro readv_cb.aio_sigevent.sigev_notify = SIGEV_NONE;
269f30a1ae8SThomas Munro readv_cb.aio_fildes = fd;
270f30a1ae8SThomas Munro readv_cb.aio_lio_opcode = LIO_READV;
271f30a1ae8SThomas Munro readv_cb.aio_iov = &readv_iov;
272f30a1ae8SThomas Munro readv_cb.aio_iovcnt = 2;
273f30a1ae8SThomas Munro readv_cb.aio_offset = 4;
274f30a1ae8SThomas Munro
275f30a1ae8SThomas Munro ATF_CHECK_EQ(0, lio_listio(LIO_WAIT, list, nitems(list), NULL));
276f30a1ae8SThomas Munro ATF_CHECK_EQ(0, aio_error(&write_cb));
277f30a1ae8SThomas Munro ATF_CHECK_EQ(1, aio_return(&write_cb));
278f30a1ae8SThomas Munro ATF_CHECK_EQ(0, aio_error(&read_cb));
279f30a1ae8SThomas Munro ATF_CHECK_EQ(1, aio_return(&read_cb));
280f30a1ae8SThomas Munro ATF_CHECK_EQ(0, aio_error(&writev_cb));
281f30a1ae8SThomas Munro ATF_CHECK_EQ(2, aio_return(&writev_cb));
282f30a1ae8SThomas Munro ATF_CHECK_EQ(0, aio_error(&readv_cb));
283f30a1ae8SThomas Munro ATF_CHECK_EQ(2, aio_return(&readv_cb));
284f30a1ae8SThomas Munro
285f30a1ae8SThomas Munro ATF_CHECK_EQ(0, memcmp(buffer, "a2cd65", 6));
286f30a1ae8SThomas Munro ATF_CHECK_EQ(6, pread(fd, buffer, 6, 0));
287f30a1ae8SThomas Munro ATF_CHECK_EQ(0, memcmp(buffer, "a2dc56", 6));
288f30a1ae8SThomas Munro
289f30a1ae8SThomas Munro close(fd);
290f30a1ae8SThomas Munro }
291f30a1ae8SThomas Munro
292f30a1ae8SThomas Munro
293f30a1ae8SThomas Munro /*
294ff1a3078SAlan Somers * Only select opcodes are allowed with lio_listio
295ff1a3078SAlan Somers */
296ff1a3078SAlan Somers ATF_TC_WITHOUT_HEAD(lio_listio_invalid_opcode);
ATF_TC_BODY(lio_listio_invalid_opcode,tc)297ff1a3078SAlan Somers ATF_TC_BODY(lio_listio_invalid_opcode, tc)
298ff1a3078SAlan Somers {
299f30a1ae8SThomas Munro struct aiocb sync_cb, mlock_cb;
300f30a1ae8SThomas Munro struct aiocb *list[] = {&sync_cb, &mlock_cb};
301ff1a3078SAlan Somers int fd;
302ff1a3078SAlan Somers
303*3a0976deSMark Johnston fd = open("testfile", O_CREAT | O_RDWR, 0666);
304ff1a3078SAlan Somers ATF_REQUIRE_MSG(fd >= 0, "open: %s", strerror(errno));
305ff1a3078SAlan Somers
306ff1a3078SAlan Somers bzero(&sync_cb, sizeof(sync_cb));
307ff1a3078SAlan Somers sync_cb.aio_fildes = fd;
308ff1a3078SAlan Somers sync_cb.aio_lio_opcode = LIO_SYNC;
309ff1a3078SAlan Somers
310ff1a3078SAlan Somers bzero(&mlock_cb, sizeof(mlock_cb));
311ff1a3078SAlan Somers mlock_cb.aio_lio_opcode = LIO_MLOCK;
312ff1a3078SAlan Somers
313ff1a3078SAlan Somers ATF_CHECK_ERRNO(EIO, lio_listio(LIO_WAIT, list, nitems(list), NULL));
314ff1a3078SAlan Somers ATF_CHECK_EQ(EINVAL, aio_error(&sync_cb));
315ff1a3078SAlan Somers ATF_CHECK_ERRNO(EINVAL, aio_return(&sync_cb) < 0);
316ff1a3078SAlan Somers ATF_CHECK_EQ(EINVAL, aio_error(&mlock_cb));
317ff1a3078SAlan Somers ATF_CHECK_ERRNO(EINVAL, aio_return(&mlock_cb) < 0);
318f30a1ae8SThomas Munro
319f30a1ae8SThomas Munro close(fd);
320ff1a3078SAlan Somers }
321ff1a3078SAlan Somers
3227e3db627SAlan Somers
ATF_TP_ADD_TCS(tp)3237e3db627SAlan Somers ATF_TP_ADD_TCS(tp)
3247e3db627SAlan Somers {
3257e3db627SAlan Somers
32652c09831SAlan Somers ATF_TP_ADD_TC(tp, lio_listio_eagain_kevent);
3272e5f6152SMark Johnston ATF_TP_ADD_TC(tp, lio_listio_empty_nowait);
3287e3db627SAlan Somers ATF_TP_ADD_TC(tp, lio_listio_empty_nowait_kevent);
3297e3db627SAlan Somers ATF_TP_ADD_TC(tp, lio_listio_empty_nowait_signal);
3307e3db627SAlan Somers ATF_TP_ADD_TC(tp, lio_listio_empty_nowait_thread);
3317e3db627SAlan Somers ATF_TP_ADD_TC(tp, lio_listio_empty_wait);
332f30a1ae8SThomas Munro ATF_TP_ADD_TC(tp, lio_listio_opcodes);
333ff1a3078SAlan Somers ATF_TP_ADD_TC(tp, lio_listio_invalid_opcode);
3347e3db627SAlan Somers
3357e3db627SAlan Somers return (atf_no_error());
3367e3db627SAlan Somers }
337