From nobody Mon Oct 26 03:40:15 2026 X-Original-To: dev-commits-src-branches@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 4jCfXH6R4xz6wkn4 for ; Mon, 26 Oct 2026 03:40:15 +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) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4jCfXH4Bdgz4JKy for ; Mon, 26 Oct 2026 03:40:15 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792986015; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=f/yde05+8NmC/FGsu1jczmz+gTzuTwNMUFg2VID+Xw4=; b=FuNk0oQAdssvyHeVctylqW3TEhOfNXQEare27HC/bGai+8QT6rTFd0Z82IemoMfexZ3vHc V2eRapkS1Heq75GIlpPYfbwAl/WAN2kxLZZBYxnYS72BdWdLy8VALCljfHkts2Xrokidgb cbtJONPt9Ix9wVqJCx47EZYos7Vrb31XG7xdklrMxcic2C5+MK2Ex7CjwtNF0SkiaRjhyF MAt5+FjQBIREIyT2B/kc/2f5wmxTRv9ETEFo8ZkYtLyjne6eODomICg0NrXsWxs9y8ljOZ Clw9gzRChY5cY86wgL3c3xZukfWVby1MwGgZ7e43AFvajiUvq809wk616GfbVQ== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1792986015; b=kxgWWH0fqZ2PSK1IlroDUz0B1cxLVQFYOp4BOrWEI34mCuDKE3XZf2PuMb/EHbAlWPyFqt /rct/yCG7sJXAqZ5O8cKtZHquXLqio/pdl3hbbBEcd6JKbcq0C/XYYAKIcsQGYO/8IPX90 AmIQotCK8xBb7tncVdwTIQ+1V3wHpKT0HYMHGhbYGXMwQDQccUY/W4CuZgiNKsl3o2eDUf N+DMyvS56uYLxkN7ZMYHBtukoMln8Z8SMUCNq7Wm+V3J9QQa6YzsWwtZydxyz3UGGzQ3l5 +Mameww5bi035YyZ/WXo9R/B6J1FstjRk8FewC5UZ9qUB/9/66eQrwq4NG2KBA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792986015; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=f/yde05+8NmC/FGsu1jczmz+gTzuTwNMUFg2VID+Xw4=; b=TFRy+vbFcztNs6f6dimQTrDiezlVpyyU9gVlGfe6gvy2Sz626OnzlGynvqFvPiIHJDh07r SP3zh/eDnJIuBzTUzaA1v8NfoRpqLQfFsywXVCXZaKa78JYlFffI6J9XfvaO/fSD/UnbHT 8NP6Ox6c5ZxLeSb/Oz/e7BE5Ia+cHt7VnjlgEOvHLAYtrhMlYOIjo0vGe9GFsOgXV3DdR9 SVOdsqFPOeRaTetvyEc87CBAoPgRizobpFlQvm01d1cVVoHXdvIrXaY/MGCVB4GAAX3Fb1 PpTyOFUCiE6qb4rqPj3rF3iXT9OTJNXrH8zVztb8aRpwBVkp2fwl3gI98ESihw== 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 4jCfXH3FbBzGVh for ; Mon, 26 Oct 2026 03:40:15 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 41238 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 26 Oct 2026 03:40:15 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Cc: Vladimir Grebenshchikov From: Konstantin Belousov Subject: git: 9dcc20504c8b - stable/15 - devfs: make persistent controlling terminal an ABI property List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org List-Id: Commits to the stable branches of the FreeBSD src repository List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: 9dcc20504c8bee707bcd8cb01a0b1ef07e41c3c0 Auto-Submitted: auto-generated Date: Mon, 26 Oct 2026 03:40:15 +0000 Message-Id: <6adecb9f.41238.417a4e9d@gitrepo.freebsd.org> The branch stable/15 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=9dcc20504c8bee707bcd8cb01a0b1ef07e41c3c0 commit 9dcc20504c8bee707bcd8cb01a0b1ef07e41c3c0 Author: Vladimir Grebenshchikov AuthorDate: 2026-10-13 23:04:27 +0000 Commit: Konstantin Belousov CommitDate: 2026-10-26 03:38:18 +0000 devfs: make persistent controlling terminal an ABI property (cherry picked from commit e8923c7346a882418352683f72e7c4f8e68d6907) --- sys/amd64/linux/linux_sysvec.c | 2 +- sys/amd64/linux32/linux32_sysvec.c | 3 ++- sys/arm64/linux/linux_sysvec.c | 2 +- sys/fs/devfs/devfs_vnops.c | 8 +++++++- sys/i386/linux/linux_sysvec.c | 5 +++-- sys/sys/sysent.h | 1 + 6 files changed, 15 insertions(+), 6 deletions(-) diff --git a/sys/amd64/linux/linux_sysvec.c b/sys/amd64/linux/linux_sysvec.c index 210c3e127de3..8ba0673a2cc2 100644 --- a/sys/amd64/linux/linux_sysvec.c +++ b/sys/amd64/linux/linux_sysvec.c @@ -701,7 +701,7 @@ struct sysentvec elf_linux_sysvec = { .sv_fixlimit = NULL, .sv_maxssiz = NULL, .sv_flags = SV_ABI_LINUX | SV_LP64 | SV_SHP | SV_SIG_DISCIGN | - SV_SIG_WAITNDQ | SV_TIMEKEEP, + SV_SIG_WAITNDQ | SV_TIMEKEEP | SV_PERSISTENT_CTTY, .sv_set_syscall_retval = linux_set_syscall_retval, .sv_fetch_syscall_args = linux_fetch_syscall_args, .sv_syscallnames = linux_syscallnames, diff --git a/sys/amd64/linux32/linux32_sysvec.c b/sys/amd64/linux32/linux32_sysvec.c index a61039a2dc16..5934aaee9a80 100644 --- a/sys/amd64/linux32/linux32_sysvec.c +++ b/sys/amd64/linux32/linux32_sysvec.c @@ -801,7 +801,8 @@ struct sysentvec elf_linux_sysvec = { .sv_fixlimit = linux32_fixlimit, .sv_maxssiz = &linux32_maxssiz, .sv_flags = SV_ABI_LINUX | SV_ILP32 | SV_SHP | - SV_SIG_DISCIGN | SV_SIG_WAITNDQ | SV_TIMEKEEP, + SV_SIG_DISCIGN | SV_SIG_WAITNDQ | SV_TIMEKEEP | + SV_PERSISTENT_CTTY, .sv_set_syscall_retval = linux32_set_syscall_retval, .sv_fetch_syscall_args = linux32_fetch_syscall_args, .sv_syscallnames = linux32_syscallnames, diff --git a/sys/arm64/linux/linux_sysvec.c b/sys/arm64/linux/linux_sysvec.c index ac05820f89bc..03e86307dc34 100644 --- a/sys/arm64/linux/linux_sysvec.c +++ b/sys/arm64/linux/linux_sysvec.c @@ -449,7 +449,7 @@ struct sysentvec elf_linux_sysvec = { .sv_fixlimit = NULL, .sv_maxssiz = NULL, .sv_flags = SV_ABI_LINUX | SV_LP64 | SV_SHP | SV_SIG_DISCIGN | - SV_SIG_WAITNDQ | SV_TIMEKEEP, + SV_SIG_WAITNDQ | SV_TIMEKEEP | SV_PERSISTENT_CTTY, .sv_set_syscall_retval = linux_set_syscall_retval, .sv_fetch_syscall_args = linux_fetch_syscall_args, .sv_syscallnames = linux_syscallnames, diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c index bb708afad103..643a966a08a5 100644 --- a/sys/fs/devfs/devfs_vnops.c +++ b/sys/fs/devfs/devfs_vnops.c @@ -59,6 +59,7 @@ #include #include #include +#include #include #include #include @@ -716,8 +717,13 @@ devfs_close(struct vop_close_args *ap) * process' controlling terminal. In that case, * if the reference count is 2 (this last descriptor * plus the session), release the reference from the session. + * + * Some ABIs keep the controlling terminal after the last + * slave descriptor is closed. A closer with SV_PERSISTENT_CTTY + * leaves the session reference in place. */ - if (de->de_usecount == 2 && td != NULL) { + if (!SV_PROC_FLAG(curproc, SV_PERSISTENT_CTTY) && + de->de_usecount == 2 && td != NULL) { p = td->td_proc; PROC_LOCK(p); if (vp == p->p_session->s_ttyvp) { diff --git a/sys/i386/linux/linux_sysvec.c b/sys/i386/linux/linux_sysvec.c index 14b5f64388d2..333f8d21cdb3 100644 --- a/sys/i386/linux/linux_sysvec.c +++ b/sys/i386/linux/linux_sysvec.c @@ -597,7 +597,7 @@ struct sysentvec linux_sysvec = { .sv_fixlimit = NULL, .sv_maxssiz = NULL, .sv_flags = SV_ABI_LINUX | SV_AOUT | SV_ILP32 | - SV_SIG_DISCIGN | SV_SIG_WAITNDQ, + SV_SIG_DISCIGN | SV_SIG_WAITNDQ | SV_PERSISTENT_CTTY, .sv_set_syscall_retval = linux_set_syscall_retval, .sv_fetch_syscall_args = linux_fetch_syscall_args, .sv_syscallnames = linux_syscallnames, @@ -641,7 +641,8 @@ struct sysentvec elf_linux_sysvec = { .sv_fixlimit = NULL, .sv_maxssiz = NULL, .sv_flags = SV_ABI_LINUX | SV_ILP32 | SV_SHP | - SV_SIG_DISCIGN | SV_SIG_WAITNDQ | SV_TIMEKEEP, + SV_SIG_DISCIGN | SV_SIG_WAITNDQ | SV_TIMEKEEP | + SV_PERSISTENT_CTTY, .sv_set_syscall_retval = linux_set_syscall_retval, .sv_fetch_syscall_args = linux_fetch_syscall_args, .sv_syscallnames = NULL, diff --git a/sys/sys/sysent.h b/sys/sys/sysent.h index b2a559da7844..8b45d0cb4dff 100644 --- a/sys/sys/sysent.h +++ b/sys/sys/sysent.h @@ -175,6 +175,7 @@ struct sysentvec { #define SV_SIG_DISCIGN 0x200000 /* Do not discard ignored signals */ #define SV_SIG_WAITNDQ 0x400000 /* Wait does not dequeue SIGCHLD */ #define SV_DSO_SIG 0x800000 /* Signal trampoline packed in dso */ +#define SV_PERSISTENT_CTTY 0x1000000 /* Keep ctty after the last close */ #define SV_ABI_MASK 0xff #define SV_PROC_FLAG(p, x) ((p)->p_sysent->sv_flags & (x))