From nobody Mon Feb 2 19:51:20 2026 X-Original-To: dev-commits-src-main@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 4f4cgX6tbvz6QR66 for ; Mon, 02 Feb 2026 19:51:20 +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 "R13" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4f4cgX65Tlz3vyD for ; Mon, 02 Feb 2026 19:51:20 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1770061880; 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=vcty59WImHchDj5nR1P5+GB/YhV7BsRHY8vSopQS9tA=; b=c/1fjL7m11fbbWrzA60XrcqSrLHO530Dw/U1e/hzKdTFMD4EQROHFCltgdEqAPiVftRNk1 NyphC+f8Rckka8P7FfGCq0Yp09hg1LDuOkYmFiL+S4O0+gdjUUJ/Ruvbi46EtnoONo73Sl xYbKFm+tEorumiTpDLNZ5AtMjLTzO7CrpW12c3Lx2UKbJWLo59gqyWq9QJxT+HD643bouw sv1jSmUFxVy+mj5FsvBFLXrrn2rglI4tIZHwF8KrJW5GCRru/5sMOhcI1ewgz981VUTlDR yFtm4XEyz14jZ3TdJc1TNNRWvx0HdEYR9a/F6uW/DFTO9yi6BTtworSSkkUP8g== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1770061880; a=rsa-sha256; cv=none; b=hBfwQUvDHd0ZvKa57UjbaWX3OnCOcw2IX+hMyMkNZr15GCGYB8dlvVpogZrwt7OrN5FkaO H6MU+v/4KBZtO6V8+XQ34N3mq1iYk32XEz6+ZGBUWFMXAOQqBPi9GugvQ+btMBem8YzIgN WK3EMx9W/fR8gEPB05wpYPJKQioaouEVh+tUWLv/huKwcRxxwtPknN7ZfQt89rKyLnN95h T6JhdJUGshL0GVRVMLBiT+zexPCgo6XK5dA3H1JLGW4BESY+/17yfBf83ZvUnwLmhV2ZJi gwC5Is87F7Dv7NBUXuO8FFLe9miuxHyqg6d6H3zP+RQQEQy+q2D83YCICgbzsQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1770061880; 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=vcty59WImHchDj5nR1P5+GB/YhV7BsRHY8vSopQS9tA=; b=XVnPOVFaglHMgvE/bTsqsHSNJ6GzEMZj85k1s5w0IRjbj2t52q4bnHwzbyT+MDfCFge00V xoEgixpWofoxqzm5HZGjlHT6skwKudHEltZIoGDA8xuTChUGrEHbDPREFXQNZCGU7IOxYg tl3BWKmcQB0MZYhq/Vq1N4P8qfPomuhPzbIbm/BROtr/Jjmnk6AAOOCeJriun4fDXnoUJO lNjneV4CmAP9TOaKrK8JrQBT0OrW4/4azbn3FNleENHB1AQANn341Dh9yiTuRwWjugiiSh 3TjorVns+QhyuXaS2pWlDVv/Z0wcKiXHZMdvfsfIOYcZt+VBg9/02R410hwscA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4f4cgX5Y0Jzgyb for ; Mon, 02 Feb 2026 19:51:20 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 38a1b by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 02 Feb 2026 19:51:20 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: a8e92198f854 - main - devfs: unlock the directory vnode around the call to dev_clone handler List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org 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/main X-Git-Reftype: branch X-Git-Commit: a8e92198f854c2766eedec5a2ea3cc23c64d7b12 Auto-Submitted: auto-generated Date: Mon, 02 Feb 2026 19:51:20 +0000 Message-Id: <69810038.38a1b.716c7132@gitrepo.freebsd.org> The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=a8e92198f854c2766eedec5a2ea3cc23c64d7b12 commit a8e92198f854c2766eedec5a2ea3cc23c64d7b12 Author: Konstantin Belousov AuthorDate: 2026-01-26 01:49:32 +0000 Commit: Konstantin Belousov CommitDate: 2026-02-02 19:48:25 +0000 devfs: unlock the directory vnode around the call to dev_clone handler The lock around dev_clone is unfortunate because cloner might need to take its own locks that establish the order with devfs vnodes, and then transiently participates in further VFS locks order. For instance, this way the proctree_lock or allproc_lock become involved. Unlock dvp, we can unwind if the vnode become doomed while cloner was called. Reported and tested by: pho Reviewed by: kevans, markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D55028 --- sys/fs/devfs/devfs_vnops.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c index 323f1e0fa961..d594b1584757 100644 --- a/sys/fs/devfs/devfs_vnops.c +++ b/sys/fs/devfs/devfs_vnops.c @@ -367,6 +367,9 @@ devfs_populate_vp(struct vnode *vp) ASSERT_VOP_LOCKED(vp, "devfs_populate_vp"); + if (VN_IS_DOOMED(vp)) + return (ENOENT); + dmp = VFSTODEVFS(vp->v_mount); if (!devfs_populate_needed(dmp)) { sx_xlock(&dmp->dm_lock); @@ -1128,8 +1131,25 @@ devfs_lookupx(struct vop_lookup_args *ap, int *dm_unlock) cdev = NULL; DEVFS_DMP_HOLD(dmp); sx_xunlock(&dmp->dm_lock); + dvplocked = VOP_ISLOCKED(dvp); + + /* + * Invoke the dev_clone handler. Unlock dvp around it + * to simplify the cloner operations. + * + * If dvp is reclaimed while we unlocked it, we return + * with ENOENT by some of the paths below. If cloner + * returned cdev, then devfs_populate_vp() notes the + * reclamation. Otherwise, note that either our devfs + * mount is being unmounted, then DEVFS_DMP_DROP() + * returns true, and we return ENOENT this way. Or, + * because de == NULL, the check for it after the loop + * returns ENOENT. + */ + VOP_UNLOCK(dvp); EVENTHANDLER_INVOKE(dev_clone, td->td_ucred, pname, strlen(pname), &cdev); + vn_lock(dvp, dvplocked | LK_RETRY); if (cdev == NULL) sx_xlock(&dmp->dm_lock);