From nobody Tue Mar 10 12:46:14 2026 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 4fVYXQ5S3Zz6Vbg4 for ; Tue, 10 Mar 2026 12:46:14 +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" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4fVYXQ29sPz4QMQ for ; Tue, 10 Mar 2026 12:46:14 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1773146774; 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=H8ZsEKn97deeVRF/5CLH4Wkqr1bswpclqRUxxASCLro=; b=UOJQTPILZUu262ZPm3TX1q3k9YP6Z0zpj3PWZOwjRFLaE/ny7voP692fHabLtzNrCbH08+ JRp7KoIaqqzZilywLqLOG+6bvrLP29LE6XRKCW5hufOLDe+hbCcfMRuLBYQrlzZg0Jgk/t mPyycRLyi8TzrAJiNLClp69FZC1uFPpj6Pa2X+G5R29LUIdQ7U0QynPUNcLxiI5J3s2z8I ezVUgLJ70O1svHmKVXPJz3B0W28WYbu3mqGeWAFxm6eHDaq/XIi69/77g73gN+SGvQjcnU NFCm5He08kk5li7hct6iRa9Fk4h189HNKTt8cN2sflEmbffqtuqvI5epEGKjqw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1773146774; a=rsa-sha256; cv=none; b=SH9XDl8WB2t2NsljsJ+YKdUbN6kBiJQ5xeVCxPBopNwzAOcJxyd1OJ42lgs4OJ60iS43tf E20BPjqcCmFoeD80L26v61sIAvOtgWE18OQmCqFWpOcQFlYgzrqtgWXPvELLgu2Xja75cq pDVZop3RL8VpCrF5mF/Ri1SVO9iQfmm0jlob3bG+K5CiTUl/V7VDYxRmPT10T3pu/ki24v SY68hGBO6aUL62dN51FFUuZzJ1wowWWVCvcAFf9zt8NVaH23rGF9MouGWdTn0ZeU8TPIV3 KZCXh12Zw1diDPXM2rbWT1pRvnldO+Bn8jwHrlHagA/T5GLZM2F3qd5FfywBJg== 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=1773146774; 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=H8ZsEKn97deeVRF/5CLH4Wkqr1bswpclqRUxxASCLro=; b=X9YCbQhyyPi6rVE/jF+kGypz3GsyuRn1iGIX2DniRolGKfW/RsTlNxnmzlTQI3uRc5Uk0v p1/z29WIrSaJjf6Ieof53lKmeAk6e4d6XmRUt0e9blHuenqR3jRHrTG444peFkMFADqw8U +HKTof5NFcBy9evBS06Vs9swwxHi4EgS3FIll5JcWT3/GEQPixPHYl4w1chyrDCfDmiLiQ tnR2fW7/vDXTq5LapfNTb67MriEWkubBiPlbICfxAQcEb+2pipVqzOf84MZe/K44hCgrDb q3NCAoZSDhlGWQgHM1DWOw89qTJMvcFLHtYBgkiinHYdyWrkil2szQvBrjP1MA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fVYXQ15fRz1BvL for ; Tue, 10 Mar 2026 12:46:14 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 23915 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 10 Mar 2026 12:46:14 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: 2b256f00aaee - main - p9fs: locking improvements for p9fs_stat_vnode_dotl() 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: kib X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 2b256f00aaee4713b8e6f0e3c0f3493065f710c4 Auto-Submitted: auto-generated Date: Tue, 10 Mar 2026 12:46:14 +0000 Message-Id: <69b01296.23915.81ee5f2@gitrepo.freebsd.org> The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=2b256f00aaee4713b8e6f0e3c0f3493065f710c4 commit 2b256f00aaee4713b8e6f0e3c0f3493065f710c4 Author: Konstantin Belousov AuthorDate: 2026-03-05 12:35:43 +0000 Commit: Konstantin Belousov CommitDate: 2026-03-10 12:44:34 +0000 p9fs: locking improvements for p9fs_stat_vnode_dotl() If the vnode is share-locked: - Use vn_delayed_setsize() to avoid calling vnode_pager_setsize() with the vnode only shared locked. - Interlock the vnode to get exclusive mode for updating the node fields. Reciprocally, interlock the vnode in p9fs_getattr_dotl() to observe the consistent values on read. PR: 293492 Reviewed by: markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D55665 --- sys/fs/p9fs/p9fs_vnops.c | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/sys/fs/p9fs/p9fs_vnops.c b/sys/fs/p9fs/p9fs_vnops.c index e64d7840f7f9..c6d35548e9ed 100644 --- a/sys/fs/p9fs/p9fs_vnops.c +++ b/sys/fs/p9fs/p9fs_vnops.c @@ -896,6 +896,7 @@ p9fs_getattr_dotl(struct vop_getattr_args *ap) /* Basic info */ VATTR_NULL(vap); + VI_LOCK(vp); vap->va_atime.tv_sec = inode->i_atime; vap->va_mtime.tv_sec = inode->i_mtime; vap->va_ctime.tv_sec = inode->i_ctime; @@ -916,6 +917,7 @@ p9fs_getattr_dotl(struct vop_getattr_args *ap) vap->va_filerev = inode->data_version; vap->va_vaflags = 0; vap->va_bytes = inode->blocks * P9PROTO_TGETATTR_BLK; + VI_UNLOCK(vp); return (0); } @@ -951,16 +953,36 @@ p9fs_stat_vnode_dotl(struct p9_stat_dotl *stat, struct vnode *vp) { struct p9fs_node *np; struct p9fs_inode *inode; + bool excl_locked; np = P9FS_VTON(vp); inode = &np->inode; + /* + * This function might be called with the vnode only shared + * locked. Then, interlock the vnode to ensure the exclusive + * access to the inode fields: the thread either owns + * exclusive vnode lock, or shared vnode lock plus interlock. + * + * If the vnode is locked exclusive, do not take the + * interlock. We directly call vnode_pager_setsize(), which + * needs the vm_object lock, and that lock is before vnode + * interlock in the lock order. + */ ASSERT_VOP_LOCKED(vp, __func__); + excl_locked = VOP_ISLOCKED(vp) == LK_EXCLUSIVE; + if (!excl_locked) + VI_LOCK(vp); + /* Update the pager size if file size changes on host */ if (inode->i_size != stat->st_size) { inode->i_size = stat->st_size; - if (vp->v_type == VREG) - vnode_pager_setsize(vp, inode->i_size); + if (vp->v_type == VREG) { + if (excl_locked) + vnode_pager_setsize(vp, inode->i_size); + else + vn_delayed_setsize_locked(vp); + } } inode->i_mtime = stat->st_mtime_sec; @@ -979,11 +1001,12 @@ p9fs_stat_vnode_dotl(struct p9_stat_dotl *stat, struct vnode *vp) inode->gen = stat->st_gen; inode->data_version = stat->st_data_version; - ASSERT_VOP_LOCKED(vp, __func__); /* Setting a flag if file changes based on qid version */ if (np->vqid.qid_version != stat->qid.version) np->flags |= P9FS_NODE_MODIFIED; memcpy(&np->vqid, &stat->qid, sizeof(stat->qid)); + if (!excl_locked) + VI_UNLOCK(vp); return (0); } @@ -2213,12 +2236,25 @@ p9fs_putpages(struct vop_putpages_args *ap) return (rtvals[0]); } +static int +p9fs_delayed_setsize(struct vop_delayed_setsize_args *ap) +{ + struct vnode *vp; + struct p9fs_node *np; + + vp = ap->a_vp; + np = P9FS_VTON(vp); + vnode_pager_setsize(vp, np->inode.i_size); + return (0); +} + struct vop_vector p9fs_vnops = { .vop_default = &default_vnodeops, .vop_lookup = p9fs_lookup, .vop_open = p9fs_open, .vop_close = p9fs_close, .vop_access = p9fs_access, + .vop_delayed_setsize = p9fs_delayed_setsize, .vop_getattr = p9fs_getattr_dotl, .vop_setattr = p9fs_setattr_dotl, .vop_reclaim = p9fs_reclaim,