From nobody Fri Jun 26 21:45:48 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 4gn8P83471z6j049 for ; Fri, 26 Jun 2026 21:45:48 +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 "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gn8P82S6pz3j4g for ; Fri, 26 Jun 2026 21:45:48 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1782510348; 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=XCUsiTw0vjfclEXdn88a7IBDCAjBO9J2qYfneqx/rw0=; b=DthhFVkzYZhVvKmxjo++4jAgdwlGwrPzyDPudD/72APoOj4WxxzfBDFrVqlefzy8duFVD5 nGGWn7IpcodCYQAO7Wy+6wFtr2SCdoduxVjfsbKYRhCBr1IaMFl4ksUspDUCE5r+Cq9JfA 29QGFnzaSSIr2pobaVOprl2+M+TxZdxgnv8o7gAKeCeZzGU+ZUUexkTDJAmrQmuAmQJ4Y9 gGFIephSDmkBIr3GKFFyZIazVfueuhHsESVS5Eb3YSBJBYZs9Jsgw0vjXBKOIzl+xsbMs8 Sf9WJdUfXTEtNHSXc2P/JV2t7Y04pPyHj8eb/+n0zbo6SjzbhpnE5hQagayUrA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1782510348; a=rsa-sha256; cv=none; b=knWLxWIcwhAbCzUdKlcQRxLmMQxskIWRPO2k/PnaRRFoG/vYfoAoQlyA9nEgYHUrO+V97s uNhH51lc7cGnJRQLTlybe5weiob7c3w7LU2GEHOhFk2FriWFzpShXM0Z1fyQLfhCIqV7Ru VwQ2DOwh7Azg/SZH4+Lk3riUcVi5c2rcFVxvdB+wRyhY72C0Fz6+KiXKpegglGtnPQQLar u0V8vw6RHX71/IELOI+vvqBxNqeUZPFiRtHKxwvudD3pkZotKpaW6K7w5eBP9dyCxD16vL CfHzE6Gt/snCvdKTU0GCo4H6DhJPqKUGKANSJrJ9mDEwuUgHgZ2qGJy2qGJZow== 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=1782510348; 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=XCUsiTw0vjfclEXdn88a7IBDCAjBO9J2qYfneqx/rw0=; b=X6N6DbAXmR+fnZcpDvDgqRnHDc910cFajiYAIlE/0BkWfaCjT6HS+SkD54cTMPwd4yywKg LZCLRA1Oo7MU96oP/sgqtk3q4nModU0Q8K9YJoUDXUVclwQz1kR4ysBXvgLjNDEpZMeDoF V0jDoPjTKmKTRR1DNw0p26T8rwaA9MtgSc36euQgz0JL8EXWydjs5lIwLziWSmH4o91HhC D+yDHNklePXgoBcke5hjZ3CjAJ77AGBAi1s/rhSKPheSLjKurDWO4Jm67mdr6usq68XGpA 3TGXk/9HLy6hA+rav7iv7BcPA/7gPha1IqGYskGGbOarNuTxw51jQaO4dOsMMw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gn8P80nTszwBP for ; Fri, 26 Jun 2026 21:45:48 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 24b6d by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Fri, 26 Jun 2026 21:45:48 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: be9295deedd1 - main - VOP_VPUT_PAIR(): handle the case when dvp == vp 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 List-Id: 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/main X-Git-Reftype: branch X-Git-Commit: be9295deedd1e837ee3645583d07e1dffbe1ead0 Auto-Submitted: auto-generated Date: Fri, 26 Jun 2026 21:45:48 +0000 Message-Id: <6a3ef30c.24b6d.57595017@gitrepo.freebsd.org> The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=be9295deedd1e837ee3645583d07e1dffbe1ead0 commit be9295deedd1e837ee3645583d07e1dffbe1ead0 Author: Konstantin Belousov AuthorDate: 2026-06-24 18:21:49 +0000 Commit: Konstantin Belousov CommitDate: 2026-06-26 21:45:30 +0000 VOP_VPUT_PAIR(): handle the case when dvp == vp Reviewed by: jah, markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D57824 --- sys/kern/vfs_default.c | 28 +++++++++++++++++++++++----- sys/sys/vnode.h | 1 + sys/ufs/ffs/ffs_vnops.c | 18 +++++++++++------- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c index 3151c69d1912..5d6203570a79 100644 --- a/sys/kern/vfs_default.c +++ b/sys/kern/vfs_default.c @@ -81,7 +81,6 @@ static int vop_stdfdatasync(struct vop_fdatasync_args *ap); static int vop_stdgetpages_async(struct vop_getpages_async_args *ap); static int vop_stdread_pgcache(struct vop_read_pgcache_args *ap); static int vop_stdstat(struct vop_stat_args *ap); -static int vop_stdvput_pair(struct vop_vput_pair_args *ap); static int vop_stdgetlowvnode(struct vop_getlowvnode_args *ap); /* @@ -1623,16 +1622,35 @@ vop_stdread_pgcache(struct vop_read_pgcache_args *ap __unused) return (EJUSTRETURN); } -static int +/* + * vput(dvp). If unlock_vp is true, vput(vp). Both dvp and vp must + * be locked. This is VOP because some filesystems might need to do + * additional actions on dvp when unlocked, and need to be aware of + * any other locked vnodes. Also as the consequence, vp might become + * doomed even if unlock_vp is false. + * + * Special case: dvp == vp. If unlock_vp is true, vunref(vp); + * vput(vp), else vunref(vp). In other words, the VOP assumes that + * there are two references on the vnode on entry, and releases only + * one of them in case of !unlock_vp. + */ +int vop_stdvput_pair(struct vop_vput_pair_args *ap) { struct vnode *dvp, *vp, **vpp; dvp = ap->a_dvp; vpp = ap->a_vpp; - vput(dvp); - if (vpp != NULL && ap->a_unlock_vp && (vp = *vpp) != NULL) - vput(vp); + vp = vpp != NULL ? *vpp : NULL; + if (dvp != vp) { + vput(dvp); + if (vp != NULL && ap->a_unlock_vp) + vput(vp); + } else { + vunref(vp); + if (ap->a_unlock_vp) + vput(vp); + } return (0); } diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 8077e7741ec3..9d17dde1e73d 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -907,6 +907,7 @@ int vop_stdpathconf(struct vop_pathconf_args *); int vop_stdpoll(struct vop_poll_args *); int vop_stdvptocnp(struct vop_vptocnp_args *ap); int vop_stdvptofh(struct vop_vptofh_args *ap); +int vop_stdvput_pair(struct vop_vput_pair_args *ap); int vop_stdunp_bind(struct vop_unp_bind_args *ap); int vop_stdunp_connect(struct vop_unp_connect_args *ap); int vop_stdunp_detach(struct vop_unp_detach_args *ap); diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c index c7e2b3f4b8e6..ee495fe3888c 100644 --- a/sys/ufs/ffs/ffs_vnops.c +++ b/sys/ufs/ffs/ffs_vnops.c @@ -2006,16 +2006,14 @@ ffs_vput_pair(struct vop_vput_pair_args *ap) vpp = ap->a_vpp; vp = vpp != NULL ? *vpp : NULL; - if ((dp->i_flag & (IN_NEEDSYNC | IN_ENDOFF)) == 0) { - vput(dvp); - if (vp != NULL && ap->a_unlock_vp) - vput(vp); - return (0); - } + if ((dp->i_flag & (IN_NEEDSYNC | IN_ENDOFF)) == 0) + return (vop_stdvput_pair(ap)); mp = dvp->v_mount; if (vp != NULL) { - if (ap->a_unlock_vp) { + if (dvp == vp) { + vunref(vp); + } else if (ap->a_unlock_vp) { vput(vp); } else { MPASS(vp->v_type != VNON); @@ -2055,6 +2053,12 @@ ffs_vput_pair(struct vop_vput_pair_args *ap) } while (error == ERELOOKUP); } + if (vp == dvp) { + if (ap->a_unlock_vp) + vput(dvp); + return (0); + } + vput(dvp); if (vp == NULL || ap->a_unlock_vp)