Pantek Library
Hosting Provided By
CybrHost
High Speed Hosting

vfs 8

From: Ted Unangst <tedu(at)Stanford.EDU>
Date: Sun Dec 29 2002 - 21:08:33 EST


This is patch 8. With a working genfs_lock, we can use it to replace ufs_lock. This takes the lock out of the inode and puts it into the vnode. Sets v_vnlock to v_lock as well, to help layerfs out. Affects ffs and ext2fs. Similar work can be done to most other filesystems as well.

diff -ruNX nodiff vfs7/ufs/ext2fs/ext2fs_vfsops.c vfs8/ufs/ext2fs/ext2fs_vfsops.c

--- vfs7/ufs/ext2fs/ext2fs_vfsops.c	Thu Dec 26 12:14:14 2002
+++ vfs8/ufs/ext2fs/ext2fs_vfsops.c	Thu Dec 26 12:21:27 2002
@@ -854,7 +854,7 @@
 	}
 	MALLOC(ip, struct inode *, sizeof(struct inode), M_EXT2FSNODE, M_WAITOK);
 	bzero((caddr_t)ip, sizeof(struct inode));

- lockinit(&ip->i_lock, PINOD, "inode", 0, 0);
+ vp->v_vnlock = &vp->v_lock; vp->v_data = ip; ip->i_vnode = vp; ip->i_e2fs = fs = ump->um_e2fs; diff -ruNX nodiff vfs7/ufs/ext2fs/ext2fs_vnops.c vfs8/ufs/ext2fs/ext2fs_vnops.c --- vfs7/ufs/ext2fs/ext2fs_vnops.c Thu Dec 26 12:14:14 2002 +++ vfs8/ufs/ext2fs/ext2fs_vnops.c Thu Dec 26 12:56:34 2002
@@ -63,6 +63,7 @@
 #include <uvm/uvm_extern.h>
 #include 
+#include 
 #include 

 #include <ufs/ufs/extattr.h>
diff -ruNX nodiff vfs7/ufs/ffs/ffs_vfsops.c vfs8/ufs/ffs/ffs_vfsops.c

--- vfs7/ufs/ffs/ffs_vfsops.c	Thu Dec 26 12:14:15 2002
+++ vfs8/ufs/ffs/ffs_vfsops.c	Thu Dec 26 12:20:52 2002
@@ -1155,7 +1155,7 @@
 	/* XXX - we use the same pool for ffs and mfs */
 	ip = pool_get(&ffs_ino_pool, PR_WAITOK);
 	bzero((caddr_t)ip, sizeof(struct inode));

- lockinit(&ip->i_lock, PINOD, "inode", 0, 0);
+ vp->v_vnlock = &vp->v_lock; vp->v_data = ip; ip->i_vnode = vp; ip->i_fs = fs = ump->um_fs; diff -ruNX nodiff vfs7/ufs/ffs/ffs_vnops.c vfs8/ufs/ffs/ffs_vnops.c --- vfs7/ufs/ffs/ffs_vnops.c Thu Dec 26 12:14:15 2002 +++ vfs8/ufs/ffs/ffs_vnops.c Thu Dec 26 12:29:58 2002
@@ -53,8 +53,9 @@

 #include <uvm/uvm_extern.h>

-#include 
 #include 
+#include 
+#include 

 #include <ufs/ufs/extattr.h>
 #include <ufs/ufs/quota.h>
diff -ruNX nodiff vfs7/ufs/ufs/inode.h vfs8/ufs/ufs/inode.h

--- vfs7/ufs/ufs/inode.h	Thu Dec 26 12:14:16 2002
+++ vfs8/ufs/ufs/inode.h	Thu Dec 26 12:17:34 2002
@@ -87,7 +87,6 @@
 	struct	 dquot *i_dquot[MAXQUOTAS]; /* Dquot structures. */
 	u_quad_t i_modrev;	/* Revision level for NFS lease. */
 	struct	 lockf *i_lockf;/* Head of byte-level lock list. */

- struct lock i_lock; /* Inode lock */
Do you need help?X

/* * Side effects; used during directory lookup. diff -ruNX nodiff vfs7/ufs/ufs/ufs_extern.h vfs8/ufs/ufs/ufs_extern.h --- vfs7/ufs/ufs/ufs_extern.h Thu Dec 26 12:14:16 2002 +++ vfs8/ufs/ufs/ufs_extern.h Thu Dec 26 12:18:44 2002 @@ -66,7 +66,7 @@ int ufs_getattr(void *); int ufs_inactive(void *); int ufs_ioctl(void *); -int ufs_islocked(void *); +#define ufs_islocked genfs_islocked #ifdef NFSSERVER int lease_check(void *); #define ufs_lease_check lease_check @@ -74,7 +74,7 @@ #define ufs_lease_check ((int (*)(void *))nullop) #endif int ufs_link(void *); -int ufs_lock(void *); +#define ufs_lock genfs_lock int ufs_lookup(void *); int ufs_mkdir(void *); int ufs_mknod(void *); @@ -94,7 +94,7 @@ int ufs_setattr(void *); int ufs_strategy(void *); int ufs_symlink(void *); -int ufs_unlock(void *); +#define ufs_unlock genfs_unlock int ufs_whiteout(void *); int ufsspec_close(void *); int ufsspec_read(void *); diff -ruNX nodiff vfs7/ufs/ufs/ufs_ihash.c vfs8/ufs/ufs/ufs_ihash.c --- vfs7/ufs/ufs/ufs_ihash.c Thu Dec 26 12:14:16 2002 +++ vfs8/ufs/ufs/ufs_ihash.c Thu Dec 26 12:23:38 2002 @@ -130,7 +130,7 @@ ino_t inum = ip->i_number; /* lock the inode, then put it on the appropriate hash list */
- lockmgr(&ip->i_lock, LK_EXCLUSIVE, (struct simplelock *)0, p);
+ lockmgr(&ITOV(ip)->v_lock, LK_EXCLUSIVE, (struct simplelock *)0, p); simple_lock(&ufs_ihash_slock); @@ -138,7 +138,7 @@ curip = curip->i_hash.le_next) { if (inum == curip->i_number && dev == curip->i_dev) { simple_unlock(&ufs_ihash_slock);
- lockmgr(&ip->i_lock, LK_RELEASE, (struct simplelock *)0, p);
+ lockmgr(&ITOV(ip)->v_lock, LK_RELEASE, (struct simplelock *)0, p); return (EEXIST); } } diff -ruNX nodiff vfs7/ufs/ufs/ufs_vnops.c vfs8/ufs/ufs/ufs_vnops.c
Do you need more help?X
--- vfs7/ufs/ufs/ufs_vnops.c Thu Dec 26 12:14:16 2002 +++ vfs8/ufs/ufs/ufs_vnops.c Thu Dec 26 12:48:22 2002
@@ -1674,56 +1674,6 @@
 }
 /*
- * Lock an inode. If its already locked, set the WANT bit and sleep.
- */
-int
-ufs_lock(v)

- void *v;
-{
- struct vop_lock_args /* {
- struct vnode *a_vp;
- int a_flags;
- sturct proc *a_p;
- } */ *ap = v;
-
- return (lockmgr(&VTOI(vp)->i_lock, ap->a_flags, &vp->v_interlock,
- ap->a_p));
-} - -/* - * Unlock an inode. If WANT bit is on, wakeup. - */ -int -ufs_unlock(v)
- void *v;
-{
- struct vop_unlock_args /* {
- struct vnode *a_vp;
- int a_flags;
- struct proc *a_p;
- } */ *ap = v;
-
- return (lockmgr(&VTOI(vp)->i_lock, ap->a_flags | LK_RELEASE,
- &vp->v_interlock, ap->a_p));
-} - -/* - * Check for a locked inode. - */ -int -ufs_islocked(v)
- void *v;
-{
- struct vop_islocked_args /* {
- struct vnode *a_vp;
-
- return (lockstatus(&VTOI(ap->a_vp)->i_lock));
-}

-
-/*
  * Calculate the logical to physical mapping if not done already,
  * then call the device strategy routine.
  */
@@ -1793,7 +1743,7 @@
 	if (vp->v_type == VFIFO)
 		fifo_printinfo(vp);
 #endif /* FIFO */

- lockmgr_printinfo(&ip->i_lock);
+ lockmgr_printinfo(&ITOV(ip)->v_lock); printf("\n"); return (0);

 }
@@ -2008,6 +1958,7 @@
 {
 	struct inode *ip;
 	struct vnode *vp, *nvp;
+	struct proc *p = curproc;

 	vp = *vpp;
 	ip = VTOI(vp);
@@ -2018,17 +1969,17 @@
 		if ((nvp = checkalias(vp, ip->i_ffs_rdev, mntp)) != NULL) {
 			/*
 			 * Discard unneeded vnode, but save its inode.

- * Note that the lock is carried over in the inode
- * to the replacement vnode.
*/ nvp->v_data = vp->v_data; vp->v_data = NULL; + VOP_UNLOCK(vp, 0, p); vp->v_op = spec_vnodeop_p; #ifdef DIAGNOSTIC vp->v_flag &= ~VLOCKSWORK; #endif vrele(vp); vgone(vp); + lockmgr(&nvp->v_lock, LK_EXCLUSIVE, &nvp->v_interlock, p); /* * Reinitialize aliased inode. */
--
"I promise you a police car on every sidewalk."
      - M. Barry, Mayor of Washington, DC
Received on Sun Dec 29 21:53:05 2002

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


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