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 */
/*
* 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
--- 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