Date: 8 Jun 2003 00:04:55 -0000 From: Yeasah Pell <yeasah@apocalypse.org> To: FreeBSD-gnats-submit@FreeBSD.org Subject: kern/53025: [PATCH] ugen does not allow O_NONBLOCK for interrupt endpts. Message-ID: <20030608000455.35214.qmail@turing.schwide.com> Resent-Message-ID: <200306080010.h580AELF095877@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 53025 >Category: kern >Synopsis: [PATCH] ugen does not allow O_NONBLOCK for interrupt endpts. >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sat Jun 07 17:10:14 PDT 2003 >Closed-Date: >Last-Modified: >Originator: Yeasah Pell >Release: FreeBSD 5.1-RELEASE i386 >Organization: Venture Technologies, Inc. >Environment: System: FreeBSD turing.schwide.net 5.1-RELEASE FreeBSD 5.1-RELEASE #27: Sat Jun\ 7 14:08:43 EDT 2003 root@turing.schwide.net:/usr/obj/usr/src/sys/SCHWIDE i386 >Description: The ugen driver currently does not allow the user to set an interrupt endpoint into nonblocking I/O mode. Although it does handle the FIONBIO command, it returns EINVAL for the FIOASYNC command even if it requested to be turned off. Unfortunately, fcntl and open set FIONBIO and FIOASYNC together, so any attempt to set nonblocking mode through the usual mechanisms will fail. The included patch simply accepts the FIOASYNC command when it is not enabling async. This patch was made against 4.8-RELEASE, but it seems to be pretty general (there's not much to it) -- it also applies cleanly to this 5.1 box. >How-To-Repeat: Open an interrupt endpoint ugen device with the O_NONBLOCK flag, attempt to read when no data is available. Watch the fd block. >Fix: --- ugen.c.orig Tue May 13 20:07:04 2003 +++ ugen.c Tue May 13 20:18:56 2003 @@ -1100,6 +1100,14 @@ case FIONBIO: /* All handled in the upper FS layer. */ return (0); + case FIOASYNC: + /* YGP: fcntl(F_SETFL) will set both FIONBIO and FIOASYNC + together, even if O_ASYNC is not set. This will allow + non-blocking I/O to work (for interrupt endpoints.) */ + if (*(int *)addr) + return (0); + else + return (EINVAL); case USB_SET_SHORT_XFER: /* This flag only affects read */ if (endpt == USB_CONTROL_ENDPOINT) >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030608000455.35214.qmail>