From nobody Thu Dec 18 18:22:52 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4dXJtj26Dvz6LV79 for ; Thu, 18 Dec 2025 18:22:53 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R12" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4dXJth6dsdz46rj for ; Thu, 18 Dec 2025 18:22:52 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1766082172; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=cdVd7RTYD4A/K+FaQRjEXLxSNoa4hczTlLlW3RYWp4Q=; b=Ot10qE2xrgpfTyY2ep3gACrY26DCg5uH7NhJBA8nqk1EApTDyYkmjFzHN7jjxaw6F2bCss 3zlaCmfqduaafzqUxhyCl8ryTeH7bXwYtEdkGMkA0phKL4rWsAsd82CaLEJtuphEXdglpo z+mWq4wNkvUbawHbljeUHTYXJ6ZV+/YqV1xBwwEjL1YIKWKsX8n2XEJkrL1l7gepHKV/Qm PscWgjTEOqLnikee97GWR4Zqjxcy6PqcEyHNfrFIrVDRH8aTNBObgPcEpWK9uMBirsSj3z Xh7aNb+5RxY1Yxk1aIyoTtbsCumF9VcWHcNcnDmMPX5qsmK/oI8EWRWKvNAADQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1766082172; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=cdVd7RTYD4A/K+FaQRjEXLxSNoa4hczTlLlW3RYWp4Q=; b=H9c5fj7hD1qyp6GCOxXT9wx+8vy6WYMPVVdgnl6cGmzNuV/1mk+KCcPiBuLg7yKuMYAwMc zI5eO6AcHo5p7eDZJDyLumklw4JWYuNirXolzF0DzRike/vTiLmWMEl1bZfUzWEnQuDq7R 8fAnjzbk5/Ib1eQ2fRj1DjoGa4S8HL5i/KUQJjZPKkxmYlgN1b62KTkYqZJ7V/+47XCkxf SDQCpv2mzcnC2q37Gk/+lVF8aeByGDnAyNhpuuulrBGBb5poZo5CLtIUuYU6CU9RTgX823 TnlfPmvDYGU/QTtmmtFNWeqBkSr7a8Up6vgiLV8yHaASEYGe3crkiKZx1otiiA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1766082172; a=rsa-sha256; cv=none; b=DuXKJIZrUNbmnabqdwaJ80+8Bb2mgedffBtsIrf4Tk+rYRfT6DQnBFJkh77hwOrqcWDNXU OMonVCBHU50QyIyC6EaugKiR8uSLAXsiDEPJ/c+Tfa8fxX/kVHs4UtHsJcPah7uqHCnwIc 80rfAz0Zeu1T+RTqheR42tH2rHcuKaiAXt84hEAffb0t4bLHGmOt/2pKeUb9UFZYTbCcx1 ua+3WbMo/WDs/0WmEcqeFqQ2Ha+wv/U8RqK7/CjHcqKkqOCclP9z7Vb0dRXAztC/hrfIsc 3qcRsp1mtltYjvMlxhD80Hb+N9o1IP10ZpWv7VEG0DXvE+oMpXJ2h9t6iwA2Rw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4dXJth602Rzq4h for ; Thu, 18 Dec 2025 18:22:52 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 26fdb by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 18 Dec 2025 18:22:52 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: John Baldwin Subject: git: 313616c4504a - stable/15 - fcntl(F_SETFL): Don't unconditionally invoke FIONBIO and FIOASYNC List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: 313616c4504a1b97f1c0b773fa92ba8f54b7f97c Auto-Submitted: auto-generated Date: Thu, 18 Dec 2025 18:22:52 +0000 Message-Id: <6944467c.26fdb.761eebd7@gitrepo.freebsd.org> The branch stable/15 has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=313616c4504a1b97f1c0b773fa92ba8f54b7f97c commit 313616c4504a1b97f1c0b773fa92ba8f54b7f97c Author: John Baldwin AuthorDate: 2025-09-10 14:22:19 +0000 Commit: John Baldwin CommitDate: 2025-12-18 17:01:55 +0000 fcntl(F_SETFL): Don't unconditionally invoke FIONBIO and FIOASYNC Currently, F_SETFL always invokes FIONBIO and FIOASYNC ioctls on the file descriptor even if the state of the associated flag has not changed. This means that a character device driver that implements non-blocking I/O but not async I/O needs a handler for FIOASYNC that permits setting the value to 0. This also means that fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)) can fail for a character device driver that does not handle both FIONBIO and FIOASYNC. These requirements are not obvious nor well documented. Instead, only invoke FIONBIO and FIOASYNC if the relevant flag changes state. This only requires a device driver to implement support for FIONBIO or FIOASYNC if it supports the corresponding flag. While here, if a request aims to toggle both F_NOBLOCK and F_ASYNC and FIOASYNC fails, pass the previous state of F_NONBLOCK to FIONBIO instead of always disabling non-blocking I/O and then possibly reverting the flag back to on in f_flags. Reviewed by: mckusick, imp, kib, emaste Differential Revision: https://reviews.freebsd.org/D52403 (cherry picked from commit 3c152a3de42a7d077e8d19159b679c3fb7572820) --- sys/kern/kern_descrip.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index ebc82b8dc427..2e43b5ca3b97 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -664,20 +664,26 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) } while (atomic_cmpset_int(&fp->f_flag, flg, tmp) == 0); got_set = tmp & ~flg; got_cleared = flg & ~tmp; - tmp = fp->f_flag & FNONBLOCK; - error = fo_ioctl(fp, FIONBIO, &tmp, td->td_ucred, td); - if (error != 0) - goto revert_f_setfl; - tmp = fp->f_flag & FASYNC; - error = fo_ioctl(fp, FIOASYNC, &tmp, td->td_ucred, td); - if (error == 0) { - fdrop(fp, td); - break; + if (((got_set | got_cleared) & FNONBLOCK) != 0) { + tmp = fp->f_flag & FNONBLOCK; + error = fo_ioctl(fp, FIONBIO, &tmp, td->td_ucred, td); + if (error != 0) + goto revert_flags; + } + if (((got_set | got_cleared) & FASYNC) != 0) { + tmp = fp->f_flag & FASYNC; + error = fo_ioctl(fp, FIOASYNC, &tmp, td->td_ucred, td); + if (error != 0) + goto revert_nonblock; + } + fdrop(fp, td); + break; +revert_nonblock: + if (((got_set | got_cleared) & FNONBLOCK) != 0) { + tmp = ~fp->f_flag & FNONBLOCK; + (void)fo_ioctl(fp, FIONBIO, &tmp, td->td_ucred, td); } - atomic_clear_int(&fp->f_flag, FNONBLOCK); - tmp = 0; - (void)fo_ioctl(fp, FIONBIO, &tmp, td->td_ucred, td); -revert_f_setfl: +revert_flags: do { tmp = flg = fp->f_flag; tmp &= ~FCNTLFLAGS;