git: 0cd8f3e958a5 - main - unionfs: fix assertion order in unionfs_lock()

From: Jason A. Harmening <jah_at_FreeBSD.org>
Date: Thu, 03 Feb 2022 02:58:20 UTC
The branch main has been updated by jah:

URL: https://cgit.FreeBSD.org/src/commit/?id=0cd8f3e958a514588af85f5aa6ef3d0526b4d4f0

commit 0cd8f3e958a514588af85f5aa6ef3d0526b4d4f0
Author:     Jason A. Harmening <jah@FreeBSD.org>
AuthorDate: 2022-01-30 20:43:19 +0000
Commit:     Jason A. Harmening <jah@FreeBSD.org>
CommitDate: 2022-02-03 03:08:17 +0000

    unionfs: fix assertion order in unionfs_lock()
    
    VOP_LOCK() may be handed a vnode that is concurrently reclaimed.
    unionfs_lock() accounts for this by checking for empty vnode private
    data under the interlock.  But it incorrectly asserts that the vnode
    is using the unionfs dispatch table before making this check.
    Reverse the order, and also update KASSERT_UNIONFS_VNODE() to provide
    more useful information.
    
    Reported by:    pho
    Reviewed by:    kib, markj, pho
    Differential Revision:  https://reviews.freebsd.org/D34109
---
 sys/fs/unionfs/union_vnops.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/sys/fs/unionfs/union_vnops.c b/sys/fs/unionfs/union_vnops.c
index c9d8aac12362..43378f709df7 100644
--- a/sys/fs/unionfs/union_vnops.c
+++ b/sys/fs/unionfs/union_vnops.c
@@ -76,8 +76,8 @@
 #endif
 
 #define KASSERT_UNIONFS_VNODE(vp) \
-	KASSERT(((vp)->v_op == &unionfs_vnodeops), \
-	    ("unionfs: it is not unionfs-vnode"))
+	VNASSERT(((vp)->v_op == &unionfs_vnodeops), vp, \
+	    ("%s: non-unionfs vnode", __func__))
 
 static int
 unionfs_lookup(struct vop_cachedlookup_args *ap)
@@ -1918,8 +1918,6 @@ unionfs_lock(struct vop_lock1_args *ap)
 	int		interlock;
 	int		uhold;
 
-	KASSERT_UNIONFS_VNODE(ap->a_vp);
-
 	/*
 	 * TODO: rework the unionfs locking scheme.
 	 * It's not guaranteed to be safe to blindly lock two vnodes on
@@ -1945,6 +1943,9 @@ unionfs_lock(struct vop_lock1_args *ap)
 	unp = VTOUNIONFS(vp);
 	if (unp == NULL)
 		goto unionfs_lock_null_vnode;
+
+	KASSERT_UNIONFS_VNODE(ap->a_vp);
+
 	lvp = unp->un_lowervp;
 	uvp = unp->un_uppervp;