From 471f80601f7f74d0ec1df03a839c8aa55498ad36 Mon Sep 17 00:00:00 2001 From: KATO Takenori Date: Sun, 18 Jan 1998 08:17:48 +0000 Subject: [PATCH] Workarround for locking violation while recycling vnode which union fs used in freelist. --- sys/fs/unionfs/union_vnops.c | 18 ++++++++++++++---- sys/miscfs/union/union_vnops.c | 18 ++++++++++++++---- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/sys/fs/unionfs/union_vnops.c b/sys/fs/unionfs/union_vnops.c index 434b6a08a4d..1c6b124297a 100644 --- a/sys/fs/unionfs/union_vnops.c +++ b/sys/fs/unionfs/union_vnops.c @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * @(#)union_vnops.c 8.32 (Berkeley) 6/23/95 - * $Id: union_vnops.c,v 1.46 1997/10/26 20:55:26 phk Exp $ + * $Id: union_vnops.c,v 1.47 1998/01/18 07:56:41 kato Exp $ */ #include @@ -1611,9 +1611,19 @@ union_unlock(ap) un->un_flags &= ~UN_LOCKED; - if ((un->un_flags & (UN_ULOCK|UN_KLOCK)) == UN_ULOCK) - VOP_UNLOCK(un->un_uppervp, 0, p); - + if ((un->un_flags & (UN_ULOCK|UN_KLOCK)) == UN_ULOCK) { + /* + * XXX + * Workarround for lockmgr violation. Need to implement + * real lockmgr-style lock/unlock. + */ + if ((ap->a_vp->v_flag & VDOOMED) && + ((struct lock *)un->un_uppervp->v_data)->lk_lockholder + == LK_KERNPROC) + VOP_UNLOCK(un->un_uppervp, 0, 0); + else + VOP_UNLOCK(un->un_uppervp, 0, p); + } un->un_flags &= ~UN_ULOCK; if (un->un_flags & UN_WANT) { diff --git a/sys/miscfs/union/union_vnops.c b/sys/miscfs/union/union_vnops.c index 434b6a08a4d..1c6b124297a 100644 --- a/sys/miscfs/union/union_vnops.c +++ b/sys/miscfs/union/union_vnops.c @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * @(#)union_vnops.c 8.32 (Berkeley) 6/23/95 - * $Id: union_vnops.c,v 1.46 1997/10/26 20:55:26 phk Exp $ + * $Id: union_vnops.c,v 1.47 1998/01/18 07:56:41 kato Exp $ */ #include @@ -1611,9 +1611,19 @@ union_unlock(ap) un->un_flags &= ~UN_LOCKED; - if ((un->un_flags & (UN_ULOCK|UN_KLOCK)) == UN_ULOCK) - VOP_UNLOCK(un->un_uppervp, 0, p); - + if ((un->un_flags & (UN_ULOCK|UN_KLOCK)) == UN_ULOCK) { + /* + * XXX + * Workarround for lockmgr violation. Need to implement + * real lockmgr-style lock/unlock. + */ + if ((ap->a_vp->v_flag & VDOOMED) && + ((struct lock *)un->un_uppervp->v_data)->lk_lockholder + == LK_KERNPROC) + VOP_UNLOCK(un->un_uppervp, 0, 0); + else + VOP_UNLOCK(un->un_uppervp, 0, p); + } un->un_flags &= ~UN_ULOCK; if (un->un_flags & UN_WANT) {