Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 25 Jul 2016 15:56:37 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r303306 - stable/11/lib/librt
Message-ID:  <201607251556.u6PFub3S077245@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Mon Jul 25 15:56:37 2016
New Revision: 303306
URL: https://svnweb.freebsd.org/changeset/base/303306

Log:
  MFC 302860: Fix aio system call wrappers in librt.
  
  - Update aio_return/waitcomplete wrappers for the ssize_t return type.
  - Fix the aio_return() wrapper to fail with EINVAL on a pending job.
    This matches the semantics of the in-kernel system call.  Also,
    aio_return() returns errors via errno, not via the return value.
  
  Approved by:	re (gjb)
  Sponsored by:	Chelsio Communications

Modified:
  stable/11/lib/librt/aio.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/lib/librt/aio.c
==============================================================================
--- stable/11/lib/librt/aio.c	Mon Jul 25 15:05:01 2016	(r303305)
+++ stable/11/lib/librt/aio.c	Mon Jul 25 15:56:37 2016	(r303306)
@@ -54,8 +54,8 @@ typedef void (*aio_func)(union sigval va
 
 extern int __sys_aio_read(struct aiocb *iocb);
 extern int __sys_aio_write(struct aiocb *iocb);
-extern int __sys_aio_waitcomplete(struct aiocb **iocbp, struct timespec *timeout);
-extern int __sys_aio_return(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);
 extern int __sys_aio_fsync(int op, struct aiocb *iocb);
 
@@ -136,12 +136,13 @@ __aio_write(struct aiocb *iocb)
 	return aio_io(iocb, &__sys_aio_write);
 }
 
-int
+ssize_t
 __aio_waitcomplete(struct aiocb **iocbp, struct timespec *timeout)
 {
+	ssize_t ret;
 	int err;
-	int ret = __sys_aio_waitcomplete(iocbp, timeout);
 
+	ret = __sys_aio_waitcomplete(iocbp, timeout);
 	if (*iocbp) {
 		if ((*iocbp)->aio_sigevent.sigev_notify == SIGEV_THREAD) {
 			err = errno;
@@ -155,13 +156,20 @@ __aio_waitcomplete(struct aiocb **iocbp,
 	return (ret);
 }
 
-int
+ssize_t
 __aio_return(struct aiocb *iocb)
 {
 
 	if (iocb->aio_sigevent.sigev_notify == SIGEV_THREAD) {
-		if (__sys_aio_error(iocb) == EINPROGRESS)
-			return (EINPROGRESS);
+		if (__sys_aio_error(iocb) == EINPROGRESS) {
+			/*
+			 * Fail with EINVAL to match the semantics of
+			 * __sys_aio_return() for an in-progress
+			 * request.
+			 */
+			errno = EINVAL;
+			return (-1);
+		}
 		__sigev_list_lock();
 		__sigev_delete(SI_ASYNCIO, (sigev_id_t)iocb);
 		__sigev_list_unlock();



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201607251556.u6PFub3S077245>