Module Name: src
Committed By: hannken
Date: Mon Nov 14 18:42:57 UTC 2011
Modified Files:
src/sys/fs/union: union_vnops.c
Log Message:
VOP_ABORTOP() has no specific lock requirements so there is no need
to force locked vnodes here. It should be impossible to come here
with a nil upper node.
Relock the directory vnode after copyup. A locked union node with an
unlocked upper vnode can no longer exist so make FIXUP() an assertion.
To generate a diff of this commit:
cvs rdiff -u -r1.47 -r1.48 src/sys/fs/union/union_vnops.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/fs/union/union_vnops.c
diff -u src/sys/fs/union/union_vnops.c:1.47 src/sys/fs/union/union_vnops.c:1.48
--- src/sys/fs/union/union_vnops.c:1.47 Tue Oct 18 09:22:53 2011
+++ src/sys/fs/union/union_vnops.c Mon Nov 14 18:42:57 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: union_vnops.c,v 1.47 2011/10/18 09:22:53 hannken Exp $ */
+/* $NetBSD: union_vnops.c,v 1.48 2011/11/14 18:42:57 hannken Exp $ */
/*
* Copyright (c) 1992, 1993, 1994, 1995
@@ -72,7 +72,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: union_vnops.c,v 1.47 2011/10/18 09:22:53 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: union_vnops.c,v 1.48 2011/11/14 18:42:57 hannken Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -134,7 +134,6 @@ int union_getpages(void *);
int union_putpages(void *);
int union_kqfilter(void *);
-static void union_fixup(struct union_node *);
static int union_lookup1(struct vnode *, struct vnode **,
struct vnode **, struct componentname *);
@@ -190,23 +189,12 @@ const struct vnodeopv_entry_desc union_v
const struct vnodeopv_desc union_vnodeop_opv_desc =
{ &union_vnodeop_p, union_vnodeop_entries };
-#define FIXUP(un) { \
- if (((un)->un_flags & UN_ULOCK) == 0) { \
- union_fixup(un); \
- } \
-}
+#define FIXUP(un) \
+ KASSERT(((un)->un_flags & UN_ULOCK) == UN_ULOCK)
#define NODE_IS_SPECIAL(vp) \
((vp)->v_type == VBLK || (vp)->v_type == VCHR || \
(vp)->v_type == VSOCK || (vp)->v_type == VFIFO)
-static void
-union_fixup(struct union_node *un)
-{
-
- vn_lock(un->un_uppervp, LK_EXCLUSIVE | LK_RETRY);
- un->un_flags |= UN_ULOCK;
-}
-
static int
union_lookup1(struct vnode *udvp, struct vnode **dvpp, struct vnode **vpp,
struct componentname *cnp)
@@ -1248,6 +1236,9 @@ union_link(void *v)
}
error = union_copyup(un, 1, cnp->cn_cred, curlwp);
if (dun->un_uppervp == un->un_dirvp) {
+ vn_lock(dun->un_uppervp,
+ LK_EXCLUSIVE | LK_RETRY);
+ dun->un_flags |= UN_ULOCK;
/*
* During copyup, we dropped the lock on the
* dir and invalidated any saved namei lookup
@@ -1583,24 +1574,11 @@ union_abortop(void *v)
struct vnode *a_dvp;
struct componentname *a_cnp;
} */ *ap = v;
- int error;
- struct vnode *vp = OTHERVP(ap->a_dvp);
- struct union_node *un = VTOUNION(ap->a_dvp);
- int islocked = un->un_flags & UN_LOCKED;
- int dolock = (vp == LOWERVP(ap->a_dvp));
- if (islocked) {
- if (dolock)
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
- else
- FIXUP(VTOUNION(ap->a_dvp));
- }
- ap->a_dvp = vp;
- error = VCALL(vp, VOFFSET(vop_abortop), ap);
- if (islocked && dolock)
- VOP_UNLOCK(vp);
+ KASSERT(UPPERVP(ap->a_dvp) != NULL);
- return (error);
+ ap->a_dvp = UPPERVP(ap->a_dvp);
+ return VCALL(ap->a_dvp, VOFFSET(vop_abortop), ap);
}
int