From nobody Sun Jan 30 04:28:26 2022 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 4AEFA198A01D; Sun, 30 Jan 2022 04:28:27 +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 4JmdVM1bDZz4RSD; Sun, 30 Jan 2022 04:28:27 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1643516907; 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=A048zmYSC/ZrfboKI9o/HRtU3fzlWSyiezivuEn1F7M=; b=ui7uTMaFvVYi7yZseCX5ZWuZwXA716mAElSwygbW9potGabd0ShJxEZ2GgG8Zx6zG3W/6x slaWmcy+DaC1xVFStcNhI2ne6+b9d1Vu09PIa48Bn0bFw34QAP6uTfLmE7lv4zvRWBtGjx Bv4snIYniQ8EgSd9HgspWdGXAAwp7Dgaso9bSTXvrU3zdN6lvawW/ohpO2bsR9nX/uRy/3 I3z6KXSxh1lSWqQrhbg4tCcAHfvwvVL0hCaQsRHjjI/spSav4tkXCRwBkY9hC+KRXTTZ2i LhtZQahYrGRruncpKS6IUPmzRwtICj94xKExk427YVRIabwfwbdTgcxBxaedzQ== 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 162B822A03; Sun, 30 Jan 2022 04:28:27 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 20U4SQ5k022963; Sun, 30 Jan 2022 04:28:26 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 20U4SQeL022962; Sun, 30 Jan 2022 04:28:26 GMT (envelope-from git) Date: Sun, 30 Jan 2022 04:28:26 GMT Message-Id: <202201300428.20U4SQeL022962@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: a01ca46b9b86 - main - unionfs: use VV_ROOT to check for root vnode in unionfs_lock() 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: a01ca46b9b86608bfa080a4d86d586beb9e756c9 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1643516907; 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=A048zmYSC/ZrfboKI9o/HRtU3fzlWSyiezivuEn1F7M=; b=KD4RBsDwFAptKrS8pP810qHMZs+qmLfFPC/V1gKfLzWI4hdwTUpYDhYkQ247GD1bPFjx8V p1VGGJ4mu9v8u0OPWdFG2iSj5XgH54GuQGUc5/+tugJosU4B0YBCfD66W/aeQuRzZKLwWp 2y3LECoo2Tm7Ixflak72ulZVLyA30Thh3K9VZy57ZI/duGxPCJWTwu7fVEq2xvy5r76I3v MkxbSsnAJFENB1+f4VCuanRruwNFb/Nwe1KztO+KRpuOx9fzTk5FpQsD1bliwrhap+dXhp dvVhfVrK2nRrT7NngReS8UssRSXX+NMDC1j622GfCBWgaNtmGlbL1bnoZLMv4A== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1643516907; a=rsa-sha256; cv=none; b=fL9gH2D7JVkmkCMgw70ivqWt/E9ER4/S/v2elUw2PTmLa29pAn+t0ZECxFRFzX1GSvRsNK iqtY1RnWjtgRSCIvKDiMu7sMLj/TFS4vdaCBR2G4t0Y+CK7oT/VmD6XeuGCR9LmDg36BQC w3/QnD8JnjER/8i3mWdbd+G4zj/9WgyhncEw+SaK1hMeQbXNxhS/n0/LrEig5LnubTu5RO gwp/suH3C8hcZuj25Ghxg+mthLjFJLeO31xGG9INitmq9STK793xkJcFjg1KLyf4PNCO+q j/2/2L7OJGDeUXMIFXC0Mr1mDUwXVCk8/4BdadA1WFugU3oD87udJYx1SQpSgA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by jah: URL: https://cgit.FreeBSD.org/src/commit/?id=a01ca46b9b86608bfa080a4d86d586beb9e756c9 commit a01ca46b9b86608bfa080a4d86d586beb9e756c9 Author: Jason A. Harmening AuthorDate: 2022-01-17 01:03:54 +0000 Commit: Jason A. Harmening CommitDate: 2022-01-30 04:38:44 +0000 unionfs: use VV_ROOT to check for root vnode in unionfs_lock() This avoids a potentially wild reference to the mount object. Additionally, simplify some of the checks around VV_ROOT in unionfs_nodeget(). Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D33914 --- sys/fs/unionfs/union_subr.c | 19 +++++++++++-------- sys/fs/unionfs/union_vfsops.c | 5 +++++ sys/fs/unionfs/union_vnops.c | 11 ++--------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/sys/fs/unionfs/union_subr.c b/sys/fs/unionfs/union_subr.c index e051d42c07cc..2b5754a560c7 100644 --- a/sys/fs/unionfs/union_subr.c +++ b/sys/fs/unionfs/union_subr.c @@ -334,12 +334,6 @@ unionfs_nodeget(struct mount *mp, struct vnode *uppervp, } } - if ((uppervp == NULLVP || ump->um_uppervp != uppervp) || - (lowervp == NULLVP || ump->um_lowervp != lowervp)) { - /* dvp will be NULLVP only in case of root vnode. */ - if (dvp == NULLVP) - return (EINVAL); - } unp = malloc(sizeof(struct unionfs_node), M_UNIONFSNODE, M_WAITOK | M_ZERO); @@ -381,9 +375,18 @@ unionfs_nodeget(struct mount *mp, struct vnode *uppervp, vp->v_type = vt; vp->v_data = unp; - if ((uppervp != NULLVP && ump->um_uppervp == uppervp) && - (lowervp != NULLVP && ump->um_lowervp == lowervp)) + /* + * TODO: This is an imperfect check, as there's no guarantee that + * the underlying filesystems will always return vnode pointers + * for the root inodes that match our cached values. To reduce + * the likelihood of failure, for example in the case where either + * vnode has been forcibly doomed, we check both pointers and set + * VV_ROOT if either matches. + */ + if (ump->um_uppervp == uppervp || ump->um_lowervp == lowervp) vp->v_vflag |= VV_ROOT; + KASSERT(dvp != NULL || (vp->v_vflag & VV_ROOT) != 0, + ("%s: NULL dvp for non-root vp %p", __func__, vp)); vn_lock_pair(lowervp, false, uppervp, false); error = insmntque1(vp, mp, NULL, NULL); diff --git a/sys/fs/unionfs/union_vfsops.c b/sys/fs/unionfs/union_vfsops.c index ea49d1e189da..dd6e7084ebc1 100644 --- a/sys/fs/unionfs/union_vfsops.c +++ b/sys/fs/unionfs/union_vfsops.c @@ -241,6 +241,8 @@ unionfs_domount(struct mount *mp) /* get root vnodes */ lowerrootvp = mp->mnt_vnodecovered; upperrootvp = ndp->ni_vp; + KASSERT(lowerrootvp != NULL, ("%s: NULL lower root vp", __func__)); + KASSERT(upperrootvp != NULL, ("%s: NULL upper root vp", __func__)); /* create unionfs_mount */ ump = malloc(sizeof(struct unionfs_mount), M_UNIONFSMNT, @@ -289,6 +291,9 @@ unionfs_domount(struct mount *mp) mp->mnt_data = NULL; return (error); } + KASSERT(ump->um_rootvp != NULL, ("rootvp cannot be NULL")); + KASSERT((ump->um_rootvp->v_vflag & VV_ROOT) != 0, + ("%s: rootvp without VV_ROOT", __func__)); lowermp = vfs_register_upper_from_vp(ump->um_lowervp, mp, &ump->um_lower_link); diff --git a/sys/fs/unionfs/union_vnops.c b/sys/fs/unionfs/union_vnops.c index 19779112941e..c9d8aac12362 100644 --- a/sys/fs/unionfs/union_vnops.c +++ b/sys/fs/unionfs/union_vnops.c @@ -1908,8 +1908,6 @@ unionfs_revlock(struct vnode *vp, int flags) static int unionfs_lock(struct vop_lock1_args *ap) { - struct mount *mp; - struct unionfs_mount *ump; struct unionfs_node *unp; struct vnode *vp; struct vnode *uvp; @@ -1944,13 +1942,8 @@ unionfs_lock(struct vop_lock1_args *ap) if ((flags & LK_INTERLOCK) == 0) VI_LOCK(vp); - mp = vp->v_mount; - if (mp == NULL) - goto unionfs_lock_null_vnode; - - ump = MOUNTTOUNIONFSMOUNT(mp); unp = VTOUNIONFS(vp); - if (ump == NULL || unp == NULL) + if (unp == NULL) goto unionfs_lock_null_vnode; lvp = unp->un_lowervp; uvp = unp->un_uppervp; @@ -1967,7 +1960,7 @@ unionfs_lock(struct vop_lock1_args *ap) * (ex. vfs_domount: mounted vnode is already locked.) */ if ((flags & LK_TYPE_MASK) == LK_EXCLUSIVE && - vp == ump->um_rootvp) + (vp->v_vflag & VV_ROOT) != 0) flags |= LK_CANRECURSE; if (lvp != NULLVP) {