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
This commit is contained in:
Thomas Munro 2021-08-22 23:34:07 +12:00
parent f30a1ae8d5
commit 3904e7966e
4 changed files with 32 additions and 0 deletions

View File

@ -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;

View File

@ -31,6 +31,11 @@ FBSD_1.5 {
timer_oshandle_np;
};
FBSD_1.6 {
aio_readv;
aio_writev;
};
FBSDprivate_1.0 {
_mq_open;
_mq_close;

View File

@ -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);
@ -130,6 +134,13 @@ __aio_read(struct aiocb *iocb)
return aio_io(iocb, &__sys_aio_read);
}
int
__aio_readv(struct aiocb *iocb)
{
return aio_io(iocb, &__sys_aio_readv);
}
int
__aio_write(struct aiocb *iocb)
{
@ -137,6 +148,13 @@ __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)
{

View File

@ -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());
}