This is patch 5. genfs_lock, unlock, and islocked. This versions really
work, and use the v_lock in the vnode. Remove vop_generic_lock and replace
with genfs_nolock. All previous users of vop_generic_lock use genfs_nolock
now. kernfs and procfs use genfs_lock instead because they've had their
locking fixed. Has no side-effects, except on kernfs and procfs; nothing
else will notice.
Remaining: portal, fdesc, and nfs (nfs_lock is a nullop!) should use
genfs_lock, but until their locking is straightened out, it won't work.
diff -ruNX nodiff vfs4/conf/files vfs5/conf/files
--- vfs4/conf/files Wed Dec 25 22:07:05 2002
+++ vfs5/conf/files Wed Dec 25 22:24:23 2002
@@ -569,6 +569,7 @@
file kern/vfs_vnops.c
file kern/vnode_if.c
file miscfs/deadfs/dead_vnops.c
+file miscfs/genfs/genfs_vnops.c
file miscfs/fdesc/fdesc_vfsops.c fdesc
file miscfs/fdesc/fdesc_vnops.c fdesc
file miscfs/fifofs/fifo_vnops.c fifo
diff -ruNX nodiff vfs4/kern/vfs_default.c vfs5/kern/vfs_default.c
--- vfs4/kern/vfs_default.c Wed Dec 25 22:07:41 2002
+++ vfs5/kern/vfs_default.c Wed Dec 25 22:12:37 2002
@@ -146,116 +146,6 @@
return (0);
}
-/*
- * Stubs to use when there is no locking to be done on the underlying object.
- * A minimal shared lock is necessary to ensure that the underlying object
- * is not revoked while an operation is in progress. So, an active shared
- * count is maintained in an auxillary vnode lock structure.
- */
-int
-vop_generic_lock(v)
- void *v;
-{
- struct vop_lock_args /* {
- struct vnode *a_vp;
- int a_flags;
- struct proc *a_p;
- } */ *ap = v;
-
-#ifdef notyet
- /*
- * This code cannot be used until all the non-locking filesystems
- * (notably NFS) are converted to properly lock and release nodes.
- * Also, certain vnode operations change the locking state within
- * the operation (create, mknod, remove, link, rename, mkdir, rmdir,
- * and symlink). Ideally these operations should not change the
- * lock state, but should be changed to let the caller of the
- * function unlock them. Otherwise all intermediate vnode layers
- * (such as union, umapfs, etc) must catch these functions to do
- * the necessary locking at their layer. Note that the inactive
- * and lookup operations also change their lock state, but this
- * cannot be avoided, so these two operations will always need
- * to be handled in intermediate layers.
- */
- struct vnode *vp = ap->a_vp;
- int vnflags, flags = ap->a_flags;
-
- if (vp->v_vnlock == NULL) {
- if ((flags & LK_TYPE_MASK) == LK_DRAIN)
- return (0);
- MALLOC(vp->v_vnlock, struct lock *, sizeof(struct lock),
- M_VNODE, M_WAITOK);
- lockinit(vp->v_vnlock, PVFS, "vnlock", 0, 0);
- }
- switch (flags & LK_TYPE_MASK) {
- case LK_DRAIN:
- vnflags = LK_DRAIN;
- break;
- case LK_EXCLUSIVE:
- case LK_SHARED:
- vnflags = LK_SHARED;
- break;
- case LK_UPGRADE:
- case LK_EXCLUPGRADE:
- case LK_DOWNGRADE:
- return (0);
- case LK_RELEASE:
- default:
- panic("vop_generic_lock: bad operation %d", flags & LK_TYPE_MASK);
- }
- if (flags & LK_INTERLOCK)
- vnflags |= LK_INTERLOCK;
- return(lockmgr(vp->v_vnlock, vnflags, &vp->v_interlock, ap->a_p));
-#else /* for now */
- /*
- * Since we are not using the lock manager, we must clear
- * the interlock here.
- */
- if (ap->a_flags & LK_INTERLOCK)
- simple_unlock(&ap->a_vp->v_interlock);
- return (0);
-#endif
-}
-
-/*
- * Decrement the active use count.
- */
-
-int
-vop_generic_unlock(v)
- void *v;
-{
- struct vop_unlock_args /* {
- struct vnode *a_vp;
- int a_flags;
- struct proc *a_p;
- } */ *ap = v;
-
- struct vnode *vp = ap->a_vp;
-
- if (vp->v_vnlock == NULL)
- return (0);
- return (lockmgr(vp->v_vnlock, LK_RELEASE, NULL, ap->a_p));
-}
-
-/*
- * Return whether or not the node is in use.
- */
-int
-vop_generic_islocked(v)
- void *v;
-{
- struct vop_islocked_args /* {
- struct vnode *a_vp;
- } */ *ap = v;
-
- struct vnode *vp = ap->a_vp;
-
- if (vp->v_vnlock == NULL)
- return (0);
- return (lockstatus(vp->v_vnlock));
-}
-
struct filterops generic_filtops =
{ 1, NULL, filt_generic_detach, filt_generic_readwrite };
diff -ruNX nodiff vfs4/kern/vfs_sync.c vfs5/kern/vfs_sync.c
--- vfs4/kern/vfs_sync.c Wed Dec 25 22:07:41 2002
+++ vfs5/kern/vfs_sync.c Wed Dec 25 22:12:37 2002
@@ -52,9 +52,10 @@
#include
#include
#include
-
#include <sys/kernel.h>
+#include <miscfs/genfs/genfs.h>
+
#ifdef FFS_SOFTUPDATES
int softdep_process_worklist(struct mount *);
#endif
@@ -260,10 +261,10 @@
int sync_fsync(void *);
int sync_inactive(void *);
#define sync_reclaim nullop
-#define sync_lock vop_generic_lock
-#define sync_unlock vop_generic_unlock
+#define sync_lock genfs_nolock
+#define sync_unlock genfs_nounlock
int sync_print(void *);
-#define sync_islocked vop_generic_islocked
+#define sync_islocked genfs_noislocked
int (**sync_vnodeop_p)(void *);
struct vnodeopv_entry_desc sync_vnodeop_entries[] = {
diff -ruNX nodiff vfs4/miscfs/deadfs/dead_vnops.c vfs5/miscfs/deadfs/dead_vnops.c
--- vfs4/miscfs/deadfs/dead_vnops.c Wed Dec 25 22:07:47 2002
+++ vfs5/miscfs/deadfs/dead_vnops.c Wed Dec 25 22:12:37 2002
@@ -45,6 +45,8 @@
#include <sys/buf.h>
#include <sys/proc.h>
+#include <miscfs/genfs/genfs.h>
+
/*
* Prototypes for dead operations on vnodes.
*/
@@ -76,11 +78,11 @@
#define dead_inactive nullop
#define dead_reclaim nullop
int dead_lock(void *);
-#define dead_unlock vop_generic_unlock
+#define dead_unlock genfs_nounlock
int dead_bmap(void *);
int dead_strategy(void *);
int dead_print(void *);
-#define dead_islocked vop_generic_islocked
+#define dead_islocked genfs_noislocked
#define dead_pathconf dead_ebadf
#define dead_advlock dead_ebadf
#define dead_bwrite nullop
diff -ruNX nodiff vfs4/miscfs/fdesc/fdesc_vnops.c vfs5/miscfs/fdesc/fdesc_vnops.c
--- vfs4/miscfs/fdesc/fdesc_vnops.c Wed Dec 25 22:07:47 2002
+++ vfs5/miscfs/fdesc/fdesc_vnops.c Wed Dec 25 22:12:37 2002
@@ -66,6 +66,7 @@
#include <sys/tty.h>
#include <miscfs/fdesc/fdesc.h>
+#include <miscfs/genfs/genfs.h>
#include <uvm/uvm_extern.h>
@@ -114,13 +115,13 @@
int fdesc_readlink(void *);
int fdesc_inactive(void *);
int fdesc_reclaim(void *);
-#define fdesc_lock vop_generic_lock
-#define fdesc_unlock vop_generic_unlock
+#define fdesc_lock genfs_nolock
+#define fdesc_unlock genfs_nounlock
#define fdesc_bmap fdesc_badop
#define fdesc_strategy fdesc_badop
int fdesc_print(void *);
int fdesc_pathconf(void *);
-#define fdesc_islocked vop_generic_islocked
+#define fdesc_islocked genfs_noislocked
#define fdesc_advlock eopnotsupp
#define fdesc_bwrite eopnotsupp
diff -ruNX nodiff vfs4/miscfs/fifofs/fifo.h vfs5/miscfs/fifofs/fifo.h
--- vfs4/miscfs/fifofs/fifo.h Wed Dec 25 22:07:47 2002
+++ vfs5/miscfs/fifofs/fifo.h Wed Dec 25 22:12:37 2002
@@ -70,12 +70,12 @@
#define fifo_abortop fifo_badop
int fifo_inactive(void *);
#define fifo_reclaim nullop
-#define fifo_lock vop_generic_lock
-#define fifo_unlock vop_generic_unlock
+#define fifo_lock genfs_nolock
+#define fifo_unlock genfs_nounlock
int fifo_bmap(void *);
#define fifo_strategy fifo_badop
int fifo_print(void *);
-#define fifo_islocked vop_generic_islocked
+#define fifo_islocked genfs_noislocked
int fifo_pathconf(void *);
int fifo_advlock(void *);
#define fifo_reallocblks fifo_badop
diff -ruNX nodiff vfs4/miscfs/fifofs/fifo_vnops.c vfs5/miscfs/fifofs/fifo_vnops.c
--- vfs4/miscfs/fifofs/fifo_vnops.c Wed Dec 25 22:07:47 2002
+++ vfs5/miscfs/fifofs/fifo_vnops.c Wed Dec 25 22:12:37 2002
@@ -51,6 +51,8 @@
#include
#include <sys/malloc.h>
#include <sys/un.h>
+
+#include <miscfs/genfs/genfs.h>
#include <miscfs/fifofs/fifo.h>
/*
diff -ruNX nodiff vfs4/miscfs/genfs/genfs.h vfs5/miscfs/genfs/genfs.h
--- vfs4/miscfs/genfs/genfs.h Thu Jan 1 00:00:00 1970
+++ vfs5/miscfs/genfs/genfs.h Thu Dec 26 11:54:51 2002
@@ -0,0 +1,9 @@
+/* $OpenBSD */
+/* $NetBSD: genfs.h,v 1.16 2002/10/23 09:14:36 jdolecek Exp $ */
+
+int genfs_nolock(void *);
+int genfs_noislocked(void *);
+int genfs_nounlock(void *);
+int genfs_lock(void *);
+int genfs_islocked(void *);
+int genfs_unlock(void *);
diff -ruNX nodiff vfs4/miscfs/genfs/genfs_vnops.c vfs5/miscfs/genfs/genfs_vnops.c
--- vfs4/miscfs/genfs/genfs_vnops.c Thu Jan 1 00:00:00 1970
+++ vfs5/miscfs/genfs/genfs_vnops.c Thu Dec 26 11:44:41 2002
@@ -0,0 +1,145 @@
+/* $OpenBSD */
+/* $NetBSD: genfs_vnops.c,v 1.67 2002/10/25 05:44:41 yamt Exp $ */
+
+/*
+ * Copyright (c) 1982, 1986, 1989, 1993
diff -ruNX nodiff vfs4/miscfs/kernfs/kernfs_vnops.c vfs5/miscfs/kernfs/kernfs_vnops.c
--- vfs4/miscfs/kernfs/kernfs_vnops.c Wed Dec 25 22:07:47 2002
+++ vfs5/miscfs/kernfs/kernfs_vnops.c Wed Dec 25 22:12:38 2002
@@ -58,6 +58,8 @@
#include
#include <sys/dirent.h>
#include <sys/msgbuf.h>
+
+#include <miscfs/genfs/genfs.h>
#include <miscfs/kernfs/kernfs.h>
#include <uvm/uvm_extern.h>
@@ -145,12 +147,12 @@
#define kernfs_readlink eopnotsupp
int kernfs_inactive(void *);
int kernfs_reclaim(void *);
-#define kernfs_lock vop_generic_lock
-#define kernfs_unlock vop_generic_unlock
+#define kernfs_lock genfs_lock
+#define kernfs_unlock genfs_unlock
#define kernfs_bmap kernfs_badop
#define kernfs_strategy kernfs_badop
int kernfs_print(void *);
-#define kernfs_islocked vop_generic_islocked
+#define kernfs_islocked genfs_islocked
int kernfs_pathconf(void *);
#define kernfs_advlock eopnotsupp
#define kernfs_blkatoff eopnotsupp
diff -ruNX nodiff vfs4/miscfs/portal/portal_vnops.c vfs5/miscfs/portal/portal_vnops.c
--- vfs4/miscfs/portal/portal_vnops.c Wed Dec 25 22:07:47 2002
+++ vfs5/miscfs/portal/portal_vnops.c Wed Dec 25 22:12:38 2002
@@ -63,6 +63,8 @@
#include
#include
#include
+
+#include <miscfs/genfs/genfs.h>
#include <miscfs/portal/portal.h>
static int portal_fileid = PORTAL_ROOTFILEID+1;
@@ -97,12 +99,12 @@
#define portal_readlink eopnotsupp
int portal_inactive(void *);
int portal_reclaim(void *);
-#define portal_lock vop_generic_lock
-#define portal_unlock vop_generic_unlock
+#define portal_lock genfs_nolock
+#define portal_unlock genfs_nounlock
#define portal_bmap portal_badop
#define portal_strategy portal_badop
int portal_print(void *);
-#define portal_islocked vop_generic_islocked
+#define portal_islocked genfs_noislocked
int portal_pathconf(void *);
#define portal_advlock eopnotsupp
#define portal_bwrite eopnotsupp
diff -ruNX nodiff vfs4/miscfs/specfs/spec_vnops.c vfs5/miscfs/specfs/spec_vnops.c
--- vfs4/miscfs/specfs/spec_vnops.c Wed Dec 25 22:07:47 2002
+++ vfs5/miscfs/specfs/spec_vnops.c Wed Dec 25 22:12:38 2002
@@ -52,6 +52,7 @@
#include <sys/disklabel.h>
#include <sys/lockf.h>
+#include <miscfs/genfs/genfs.h>
#include <miscfs/specfs/specdev.h>
#define v_lastr v_specinfo->si_lastr
diff -ruNX nodiff vfs4/miscfs/specfs/specdev.h vfs5/miscfs/specfs/specdev.h
--- vfs4/miscfs/specfs/specdev.h Wed Dec 25 22:07:47 2002
+++ vfs5/miscfs/specfs/specdev.h Wed Dec 25 22:12:38 2002
@@ -110,9 +110,9 @@
#define spec_abortop spec_badop
int spec_inactive(void *);
#define spec_reclaim nullop
-#define spec_lock vop_generic_lock
-#define spec_unlock vop_generic_unlock
-#define spec_islocked vop_generic_islocked
+#define spec_lock genfs_nolock
+#define spec_unlock genfs_nounlock
+#define spec_islocked genfs_noislocked
int spec_bmap(void *);
int spec_strategy(void *);
int spec_print(void *);
diff -ruNX nodiff vfs4/miscfs/union/union_vnops.c vfs5/miscfs/union/union_vnops.c
--- vfs4/miscfs/union/union_vnops.c Wed Dec 25 22:07:48 2002
+++ vfs5/miscfs/union/union_vnops.c Wed Dec 25 22:13:46 2002
@@ -53,6 +53,8 @@
#include
#include
#include
+
+#include <miscfs/genfs/genfs.h>
#include <miscfs/union/union.h>
/*
@@ -1579,7 +1581,7 @@
int flags = ap->a_flags;
int error = 0;
- vop_generic_lock(ap);
+ genfs_nolock(ap);
/*
* Need to do real lockmgr-style locking here.
* in the mean time, draining won't work quite right,
@@ -1676,7 +1678,7 @@
un->un_pid = 0;
#endif
- vop_generic_unlock(v);
+ genfs_nounlock(v);
return (0);
}
diff -ruNX nodiff vfs4/nfs/nfs_vnops.c vfs5/nfs/nfs_vnops.c
--- vfs4/nfs/nfs_vnops.c Wed Dec 25 22:07:57 2002
+++ vfs5/nfs/nfs_vnops.c Wed Dec 25 22:12:38 2002
@@ -63,8 +63,9 @@
#include <uvm/uvm_extern.h>
-#include
#include
+#include <miscfs/genfs/genfs.h>
+#include <miscfs/specfs/specdev.h>
#include <nfs/rpcv2.h>
#include <nfs/nfsproto.h>
diff -ruNX nodiff vfs4/nfs/nfsnode.h vfs5/nfs/nfsnode.h
--- vfs4/nfs/nfsnode.h Wed Dec 25 22:07:57 2002
+++ vfs5/nfs/nfsnode.h Wed Dec 25 22:12:38 2002
@@ -187,9 +187,9 @@
int nfs_readlink(void *);
int nfs_inactive(void *);
int nfs_reclaim(void *);
-#define nfs_lock ((int (*)(void *))vop_generic_lock)
-#define nfs_unlock ((int (*)(void *))vop_generic_unlock)
-#define nfs_islocked ((int (*)(void *))vop_generic_islocked)
+#define nfs_lock genfs_nolock
+#define nfs_unlock genfs_nounlock
+#define nfs_islocked genfs_noislocked
int nfs_bmap(void *);
int nfs_strategy(void *);
int nfs_print(void *);
diff -ruNX nodiff vfs4/sys/vnode.h vfs5/sys/vnode.h
--- vfs4/sys/vnode.h Wed Dec 25 22:08:51 2002
+++ vfs5/sys/vnode.h Wed Dec 25 22:12:38 2002
@@ -458,9 +458,6 @@
int vn_lock(struct vnode *vp, int flags, struct proc *p);
int vop_generic_abortop(void *);
-int vop_generic_islocked(void *);
-int vop_generic_lock(void *);
-int vop_generic_unlock(void *);
int vop_generic_revoke(void *);
int vop_generic_kqfilter(void *);
diff -ruNX nodiff vfs4/ufs/mfs/mfs_vnops.c vfs5/ufs/mfs/mfs_vnops.c
--- vfs4/ufs/mfs/mfs_vnops.c Wed Dec 25 22:08:01 2002
+++ vfs5/ufs/mfs/mfs_vnops.c Wed Dec 25 22:12:38 2002
@@ -46,6 +46,7 @@
#include <sys/malloc.h>
#include <miscfs/specfs/specdev.h>
+#include <miscfs/genfs/genfs.h>
#include <machine/vmparam.h>
diff -ruNX nodiff vfs4/ufs/mfs/mfsnode.h vfs5/ufs/mfs/mfsnode.h
--- vfs4/ufs/mfs/mfsnode.h Wed Dec 25 22:08:01 2002
+++ vfs5/ufs/mfs/mfsnode.h Wed Dec 25 22:12:38 2002
@@ -76,9 +76,9 @@
#define mfs_readdir mfs_badop
#define mfs_readlink mfs_badop
#define mfs_abortop mfs_badop
-#define mfs_lock vop_generic_lock
-#define mfs_unlock vop_generic_unlock
-#define mfs_islocked vop_generic_islocked
+#define mfs_lock genfs_nolock
+#define mfs_unlock genfs_nounlock
+#define mfs_islocked genfs_noislocked
#define mfs_pathconf mfs_badop
#define mfs_advlock mfs_badop
#define mfs_blkatoff mfs_badop
diff -ruNX nodiff vfs4/xfs/xfs_vfsops-openbsd.c vfs5/xfs/xfs_vfsops-openbsd.c
--- vfs4/xfs/xfs_vfsops-openbsd.c Wed Dec 25 22:05:55 2002
+++ vfs5/xfs/xfs_vfsops-openbsd.c Wed Dec 25 22:12:38 2002
@@ -44,6 +44,8 @@
#include <xfs/xfs_vfsops-bsd.h>
#include <xfs/xfs_vnodeops.h>
+#include <miscfs/genfs/genfs.h>
+
static vop_t **xfs_dead_vnodeop_p;
int
@@ -59,9 +61,9 @@
{&vop_default_desc, (vop_t *) xfs_eopnotsupp},
{&vop_lookup_desc, (vop_t *) xfs_dead_lookup},
{&vop_reclaim_desc, (vop_t *) xfs_returnzero},
- {&vop_lock_desc, (vop_t *) vop_generic_lock},
- {&vop_unlock_desc, (vop_t *) vop_generic_unlock},
- {&vop_islocked_desc,(vop_t *) vop_generic_islocked},
+ {&vop_lock_desc, (vop_t *) genfs_nolock},
+ {&vop_unlock_desc, (vop_t *) genfs_nounlock},
+ {&vop_islocked_desc,(vop_t *) genfs_noislocked},
{NULL, NULL}};
static struct vnodeopv_desc xfs_dead_vnodeop_opv_desc =
--
"I promise you a police car on every sidewalk."
- M. Barry, Mayor of Washington, DC
Received on Sun Dec 29 21:53:29 2002