From f3f1af390df6641903252d708bcece14903e89f5 Mon Sep 17 00:00:00 2001 From: Boris Popov Date: Wed, 31 Jan 2001 04:54:23 +0000 Subject: [PATCH] Properly lock new vnode. Reminded by: tegge --- sys/kern/vfs_export.c | 13 +++++++++---- sys/kern/vfs_subr.c | 13 +++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c index 6e2afda53f0..3d76f7ad0fb 100644 --- a/sys/kern/vfs_export.c +++ b/sys/kern/vfs_export.c @@ -1380,12 +1380,17 @@ addaliasu(nvp, nvp_rdev) ovp->v_data = nvp->v_data; ovp->v_tag = nvp->v_tag; nvp->v_data = NULL; - ops = nvp->v_op; - nvp->v_op = ovp->v_op; - ovp->v_op = ops; - lockinit(&ovp->v_lock, PVFS, "vnlock", 0, LK_NOPAUSE); + lockinit(&ovp->v_lock, PVFS, nvp->v_lock.lk_wmesg, + nvp->v_lock.lk_timo, nvp->v_lock.lk_flags & LK_EXTFLG_MASK); if (nvp->v_vnlock) ovp->v_vnlock = &ovp->v_lock; + ops = ovp->v_op; + ovp->v_op = nvp->v_op; + if (VOP_ISLOCKED(nvp, curproc)) { + VOP_UNLOCK(nvp, 0, curproc); + vn_lock(ovp, LK_EXCLUSIVE | LK_RETRY, curproc); + } + nvp->v_op = ops; insmntque(ovp, nvp->v_mount); vrele(nvp); vgone(nvp); diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 6e2afda53f0..3d76f7ad0fb 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -1380,12 +1380,17 @@ addaliasu(nvp, nvp_rdev) ovp->v_data = nvp->v_data; ovp->v_tag = nvp->v_tag; nvp->v_data = NULL; - ops = nvp->v_op; - nvp->v_op = ovp->v_op; - ovp->v_op = ops; - lockinit(&ovp->v_lock, PVFS, "vnlock", 0, LK_NOPAUSE); + lockinit(&ovp->v_lock, PVFS, nvp->v_lock.lk_wmesg, + nvp->v_lock.lk_timo, nvp->v_lock.lk_flags & LK_EXTFLG_MASK); if (nvp->v_vnlock) ovp->v_vnlock = &ovp->v_lock; + ops = ovp->v_op; + ovp->v_op = nvp->v_op; + if (VOP_ISLOCKED(nvp, curproc)) { + VOP_UNLOCK(nvp, 0, curproc); + vn_lock(ovp, LK_EXCLUSIVE | LK_RETRY, curproc); + } + nvp->v_op = ops; insmntque(ovp, nvp->v_mount); vrele(nvp); vgone(nvp);