[Bug 289441] /dev/dsp O_NONBLOCK flag effective when set by fctnl(), ineffective when set by open()
Date: Wed, 10 Sep 2025 18:04:48 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=289441
--- Comment #1 from Damjan Jovanovic <damjan.jov@gmail.com> ---
I think it's because:
In /usr/src/sys/dev/sound/pcm/dsp.c dsp_open() calls dsp_chn_alloc(), which
sets CHN_F_NBIO if O_NONBLOCK was set, then later calls chn_reset():
---snip---
(*ch)->flags |= CHN_F_BUSY;
if (flags & O_NONBLOCK)
(*ch)->flags |= CHN_F_NBIO;
if (flags & O_EXCL)
(*ch)->flags |= CHN_F_EXCLUSIVE;
(*ch)->pid = pid;
strlcpy((*ch)->comm, (comm != NULL) ? comm : CHN_COMM_UNKNOWN,
sizeof((*ch)->comm));
if ((err = chn_reset(*ch, (*ch)->format, (*ch)->speed)) != 0)
return (err);
---snip---
but chn_reset() in /usr/src/sys/dev/sound/pcm/channel.c clears all "flags"
except CHN_F_RESET, then selectively sets CHN_F_BITPERFECT:
---snip---
c->flags &= CHN_F_RESET;
c->interrupts = 0;
c->timeout = 1;
c->xruns = 0;
c->flags |= (pcm_getflags(c->dev) & SD_F_BITPERFECT) ?
CHN_F_BITPERFECT : 0;
---snip---
CHN_F_RESET is defined in channel.h (same directory) as:
---snip---
#define CHN_F_RESET (CHN_F_BUSY | CHN_F_DEAD | \
CHN_F_VIRTUAL | CHN_F_HAS_VCHAN | \
CHN_F_VCHAN_DYNAMIC | \
CHN_F_PASSTHROUGH | CHN_F_EXCLUSIVE)
---snip---
These flags lack CHK_F_NBIO, and would definitely clear it in chn_reset().
Maybe this is where the CHN_F_NBIO flag gets lost on open()?
--
You are receiving this mail because:
You are the assignee for the bug.