From nobody Sun Feb 18 15:18:20 2024 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 4Td8SX5TQfz59x71; Sun, 18 Feb 2024 15:18: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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Td8SX4xvwz45xg; Sun, 18 Feb 2024 15:18:20 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1708269500; 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=jwvhoR3qE4WsY6qPyTK0k8S0P3VF7S7W0rVtb5PVo2U=; b=P706yg5eb44eBJcIhAk54KV5WC0CKD7Uz//wjHvYH05g08KgzE3iuX/MXHYXfMglMy1hF6 ceHdyR3+EY8QM968dybUbiGLFsdMzCJG4y316RRSutyOBuMdUPq+lsNJxIdL7RkkO31Vkz I8Emy+wzaamOWsVysWIOz+umGo2MS5z0Svb/rj3fqxfp0eDPWAYWbwy8hdhP5wg5i1Hhwp 8HxKd8l7q9o7lDKcDS3JP/EAscCjbrIazp7YMjPZvhrtQlFeIYACj3P2UlZLIvvZDxvmFu YXN6s62ZDSir4AyzSrwSWaI2dZNrBWLLKdy070UiyfRhdACE1WV43XnCIOuhKA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1708269500; 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=jwvhoR3qE4WsY6qPyTK0k8S0P3VF7S7W0rVtb5PVo2U=; b=sQOptztVKxM15cTarAy3V2G7I3ItLvjhyWX9Yc8ikBsJEKswlQEzzwV39beSfo74uiZYqI krfhn7T7QNJ7HylOgSTfaLwNgsGTFMAQoQOOI36cz/cIYIkGJNhcOgHb7HTpA/hDgIYqbP t7T/lf+5iWT71qPd7VJJHl5deg2qxucjcUCTvvmBAqMHNg5mkIzvLVJ3Y4r9mgQQNZQ/Aa 5Fddv1Y46U0KnxcYaKvHXGbWSxBBBgwUiRWCgCOpOCHbC/OSIQxrcIv1aGKjYc7AFM8uAJ hLbLHtOrAtBijfJgRSLxW5MGQQlzB9VZ+aUl6wdOVqCwvRi3Z4zJfcOYlZ6qtw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1708269500; a=rsa-sha256; cv=none; b=k/RrgsVmf76PYwStb6jEyqaBQNRjJJsq+HPlgCtsDTRBt0/nO1VFgNP5t8LqQdnr456JM1 RCtSKnnP1HGgm1vqeu3cNPPGE78pBCaJj3VfR+WjGzJGeI+KGoHasxokNNP+MkE4/S1uC/ 9yLBh7UA493nUIOQFQVqGjkLQRIqX6PJORuugcIvdNydcJhgnAHm0l0ZzTHBtO0U+8Xwv9 ibP9KnFj+Kd6V/b0gXsfP5qE1j9nVY5dpam9vdsFzQaZ/lI4NDiTYYzmPcswhzn+cZJtas wZM0Wa2mUZUT+PfCFJAIwWOgbdOhMM+K1nn9JtKH2u9+wlhH7QeTqJoKt3UJwg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Td8SX40mgzwBk; Sun, 18 Feb 2024 15:18:20 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 41IFIKgK009297; Sun, 18 Feb 2024 15:18:20 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 41IFIKf4009294; Sun, 18 Feb 2024 15:18:20 GMT (envelope-from git) Date: Sun, 18 Feb 2024 15:18:20 GMT Message-Id: <202402181518.41IFIKf4009294@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: "Jason A. Harmening" Subject: git: 2656fc29be8b - main - unionfs: upgrade the vnode lock during fsync() if necessary 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: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jah X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 2656fc29be8b0fc1cd9e64ed52aa0a61fe87744c Auto-Submitted: auto-generated The branch main has been updated by jah: URL: https://cgit.FreeBSD.org/src/commit/?id=2656fc29be8b0fc1cd9e64ed52aa0a61fe87744c commit 2656fc29be8b0fc1cd9e64ed52aa0a61fe87744c Author: Jason A. Harmening AuthorDate: 2023-12-24 04:42:28 +0000 Commit: Jason A. Harmening CommitDate: 2024-02-18 15:18:07 +0000 unionfs: upgrade the vnode lock during fsync() if necessary If the underlying upper FS supports shared locking for write ops, as is the case with ZFS, VOP_FSYNC() may only be called with the vnode lock held shared. In this case, temporarily upgrade the lock for those unionfs maintenance operations which require exclusive locking. While here, make unionfs inherit the upper FS' support for shared write locking. Since the upper FS is the target of VOP_GETWRITEMOUNT() this is what will dictate the locking behavior of any unionfs caller that uses vn_start_write() + vn_lktype_write(), so unionfs must be prepared for the caller to only hold a shared vnode lock in these cases. Found in local testing of unionfs atop ZFS with DEBUG_VFS_LOCKS. MFC after: 2 weeks Reviewed by: kib, olce Differential Revision: https://reviews.freebsd.org/D43817 --- sys/fs/unionfs/union_vfsops.c | 3 ++- sys/fs/unionfs/union_vnops.c | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/sys/fs/unionfs/union_vfsops.c b/sys/fs/unionfs/union_vfsops.c index 8635600549b1..cb55c2dd6474 100644 --- a/sys/fs/unionfs/union_vfsops.c +++ b/sys/fs/unionfs/union_vfsops.c @@ -348,7 +348,8 @@ unionfs_domount(struct mount *mp) if ((ump->um_lowermp->mnt_flag & MNT_LOCAL) != 0 && (ump->um_uppermp->mnt_flag & MNT_LOCAL) != 0) mp->mnt_flag |= MNT_LOCAL; - mp->mnt_kern_flag |= MNTK_NOMSYNC | MNTK_UNIONFS; + mp->mnt_kern_flag |= MNTK_NOMSYNC | MNTK_UNIONFS | + (ump->um_uppermp->mnt_kern_flag & MNTK_SHARED_WRITES); MNT_IUNLOCK(mp); /* diff --git a/sys/fs/unionfs/union_vnops.c b/sys/fs/unionfs/union_vnops.c index cb2bed925399..3ea427b5b53c 100644 --- a/sys/fs/unionfs/union_vnops.c +++ b/sys/fs/unionfs/union_vnops.c @@ -998,14 +998,22 @@ unionfs_fsync(struct vop_fsync_args *ap) struct unionfs_node *unp; struct unionfs_node_status *unsp; struct vnode *ovp; + enum unionfs_lkupgrade lkstatus; KASSERT_UNIONFS_VNODE(ap->a_vp); unp = VTOUNIONFS(ap->a_vp); + lkstatus = unionfs_upgrade_lock(ap->a_vp); + if (lkstatus == UNIONFS_LKUPGRADE_DOOMED) { + unionfs_downgrade_lock(ap->a_vp, lkstatus); + return (ENOENT); + } unionfs_get_node_status(unp, ap->a_td, &unsp); ovp = (unsp->uns_upper_opencnt ? unp->un_uppervp : unp->un_lowervp); unionfs_tryrem_node_status(unp, unsp); + unionfs_downgrade_lock(ap->a_vp, lkstatus); + if (ovp == NULLVP) return (EBADF);