diff options
author | Thomas Munro <tmunro@FreeBSD.org> | 2021-08-22 11:34:07 +0000 |
---|---|---|
committer | Thomas Munro <tmunro@FreeBSD.org> | 2021-08-22 11:49:23 +0000 |
commit | 3904e7966eb353c636c6aa638a6fdf1489ee514c (patch) | |
tree | 04a6d979dcd6c37e7edef2725e7fda0928fb2df3 | |
parent | f30a1ae8d5290a52e898279bafc38556bf16bed8 (diff) | |
download | src-3904e7966eb353c636c6aa638a6fdf1489ee514c.tar.gz src-3904e7966eb353c636c6aa638a6fdf1489ee514c.zip |
Fix aio_readv(2), aio_writev(2) with SIGEV_THREAD.
Add missing wrapper code to librt for these new functions so that
SIGEV_THREAD works. Without machinery to convert it to SIGEV_THREAD_ID,
you got EINVAL.
Reviewed by: asomers
MFC after: 2 weeks
Differential Revision: https://reviews.freebsd.org/D31618
-rw-r--r-- | lib/libc/sys/Symbol.map | 2 | ||||
-rw-r--r-- | lib/librt/Symbol.map | 5 | ||||
-rw-r--r-- | lib/librt/aio.c | 18 | ||||
-rw-r--r-- | tests/sys/aio/aio_test.c | 7 |
4 files changed, 32 insertions, 0 deletions
diff --git a/lib/libc/sys/Symbol.map b/lib/libc/sys/Symbol.map index 93fbc947a7e1..764d712958be 100644 --- a/lib/libc/sys/Symbol.map +++ b/lib/libc/sys/Symbol.map @@ -495,10 +495,12 @@ FBSDprivate_1.0 { __sys_aio_error; __sys_aio_fsync; __sys_aio_read; + __sys_aio_readv; __sys_aio_return; __sys_aio_suspend; __sys_aio_waitcomplete; __sys_aio_write; + __sys_aio_writev; _audit; __sys_audit; _auditctl; diff --git a/lib/librt/Symbol.map b/lib/librt/Symbol.map index c11b88397afd..b8fde3dd33b8 100644 --- a/lib/librt/Symbol.map +++ b/lib/librt/Symbol.map @@ -31,6 +31,11 @@ FBSD_1.5 { timer_oshandle_np; }; +FBSD_1.6 { + aio_readv; + aio_writev; +}; + FBSDprivate_1.0 { _mq_open; _mq_close; diff --git a/lib/librt/aio.c b/lib/librt/aio.c index 9c35644ecf3d..8e819a002613 100644 --- a/lib/librt/aio.c +++ b/lib/librt/aio.c @@ -42,7 +42,9 @@ #include "un-namespace.h" __weak_reference(__aio_read, aio_read); +__weak_reference(__aio_readv, aio_readv); __weak_reference(__aio_write, aio_write); +__weak_reference(__aio_writev, aio_writev); __weak_reference(__aio_return, aio_return); __weak_reference(__aio_waitcomplete, aio_waitcomplete); __weak_reference(__aio_fsync, aio_fsync); @@ -51,7 +53,9 @@ __weak_reference(__lio_listio, lio_listio); typedef void (*aio_func)(union sigval val, struct aiocb *iocb); extern int __sys_aio_read(struct aiocb *iocb); +extern int __sys_aio_readv(struct aiocb *iocb); extern int __sys_aio_write(struct aiocb *iocb); +extern int __sys_aio_writev(struct aiocb *iocb); extern ssize_t __sys_aio_waitcomplete(struct aiocb **iocbp, struct timespec *timeout); extern ssize_t __sys_aio_return(struct aiocb *iocb); extern int __sys_aio_error(struct aiocb *iocb); @@ -131,12 +135,26 @@ __aio_read(struct aiocb *iocb) } int +__aio_readv(struct aiocb *iocb) +{ + + return aio_io(iocb, &__sys_aio_readv); +} + +int __aio_write(struct aiocb *iocb) { return aio_io(iocb, &__sys_aio_write); } +int +__aio_writev(struct aiocb *iocb) +{ + + return aio_io(iocb, &__sys_aio_writev); +} + ssize_t __aio_waitcomplete(struct aiocb **iocbp, struct timespec *timeout) { diff --git a/tests/sys/aio/aio_test.c b/tests/sys/aio/aio_test.c index 35bd5dc1264b..1c694ad0c18b 100644 --- a/tests/sys/aio/aio_test.c +++ b/tests/sys/aio/aio_test.c @@ -1627,6 +1627,12 @@ ATF_TC_BODY(vectored_file_poll, tc) aio_file_test(poll, NULL, true); } +ATF_TC_WITHOUT_HEAD(vectored_thread); +ATF_TC_BODY(vectored_thread, tc) +{ + aio_file_test(poll_signaled, setup_thread(), true); +} + ATF_TC_WITH_CLEANUP(vectored_md_poll); ATF_TC_HEAD(vectored_md_poll, tc) { @@ -1814,6 +1820,7 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, vectored_zvol_poll); ATF_TP_ADD_TC(tp, vectored_unaligned); ATF_TP_ADD_TC(tp, vectored_socket_poll); + ATF_TP_ADD_TC(tp, vectored_thread); return (atf_no_error()); } |