Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 30 Mar 2017 20:09:49 +0000 (UTC)
From:      Dmitry Chagin <dchagin@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: r316298 - stable/11/sys/compat/linux
Message-ID:  <201703302009.v2UK9nGp046494@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dchagin
Date: Thu Mar 30 20:09:49 2017
New Revision: 316298
URL: https://svnweb.freebsd.org/changeset/base/316298

Log:
  MFC r314343:
  
  Unify eventfd ioctl method and use it for other similar interfaces.

Modified:
  stable/11/sys/compat/linux/linux_event.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/compat/linux/linux_event.c
==============================================================================
--- stable/11/sys/compat/linux/linux_event.c	Thu Mar 30 20:08:25 2017	(r316297)
+++ stable/11/sys/compat/linux/linux_event.c	Thu Mar 30 20:09:49 2017	(r316298)
@@ -177,7 +177,7 @@ static struct fileops timerfdops = {
 	.fo_read = timerfd_read,
 	.fo_write = invfo_rdwr,
 	.fo_truncate = invfo_truncate,
-	.fo_ioctl = invfo_ioctl,
+	.fo_ioctl = eventfd_ioctl,
 	.fo_poll = timerfd_poll,
 	.fo_kqfilter = timerfd_kqfilter,
 	.fo_stat = timerfd_stat,
@@ -760,7 +760,7 @@ eventfd_read(struct file *fp, struct uio
 	mtx_lock(&efd->efd_lock);
 retry:
 	if (efd->efd_count == 0) {
-		if ((efd->efd_flags & LINUX_O_NONBLOCK) != 0) {
+		if ((fp->f_flag & FNONBLOCK) != 0) {
 			mtx_unlock(&efd->efd_lock);
 			return (EAGAIN);
 		}
@@ -811,7 +811,7 @@ eventfd_write(struct file *fp, struct ui
 	mtx_lock(&efd->efd_lock);
 retry:
 	if (UINT64_MAX - efd->efd_count <= count) {
-		if ((efd->efd_flags & LINUX_O_NONBLOCK) != 0) {
+		if ((fp->f_flag & FNONBLOCK) != 0) {
 			mtx_unlock(&efd->efd_lock);
 			/* Do not not return the number of bytes written */
 			uio->uio_resid += sizeof(eventfd_t);
@@ -927,19 +927,18 @@ static int
 eventfd_ioctl(struct file *fp, u_long cmd, void *data,
     struct ucred *active_cred, struct thread *td)
 {
-	struct eventfd *efd;
 
-	efd = fp->f_data;
-	if (fp->f_type != DTYPE_LINUXEFD || efd == NULL)
+	if (fp->f_data == NULL || (fp->f_type != DTYPE_LINUXEFD &&
+	    fp->f_type != DTYPE_LINUXTFD))
 		return (EINVAL);
 
 	switch (cmd)
 	{
 	case FIONBIO:
-		if (*(int *)data)
-			efd->efd_flags |= LINUX_O_NONBLOCK;
+		if ((*(int *)data))
+			atomic_set_int(&fp->f_flag, FNONBLOCK);
 		else
-			efd->efd_flags &= ~LINUX_O_NONBLOCK;
+			atomic_clear_int(&fp->f_flag, FNONBLOCK);
 	case FIOASYNC:
 		return (0);
 	default:



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