Pantek Library
Hosting Provided By
CybrHost
High Speed Hosting
From: Ted Unangst <tedu(at)Stanford.EDU>
Date: Sun Dec 29 2002 - 21:07:29 EST


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 *);
Do you need help?X
-#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>

Do you need more help?X

@@ -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 @@
Can we help you?X
#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 *);
Can't find what you're looking for?X
-#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 @@
Don't know where to look next?X

 #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 *);
Confused? Frustrated?X
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},
Call Pantek today for Open Source Technical Support at 1-877-546-8934 - 24/7/365X
{&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

This archive was generated by hypermail 2.1.8 : Wed Aug 23 2006 - 13:29:40 EDT

Do you need help?X

Contact Us  Legal Notices  Order Services Online 
Pantek Home  Privacy Policy  IT news  Site Map  Pantek Library