Pantek Library
Hosting Provided By
CybrHost
High Speed Hosting

vfs 3

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


This is patch 3. Fix locking for root vnode in kernfs and procfs. Remove a bogus VOP_UNLOCK from kernfs. This is meaningless without real locks, but it's less painful to fix this first. It also fixes a memory leak in procfs_umount. Only affects kernfs and procfs.

diff -ruNX nodiff vfs2/miscfs/kernfs/kernfs_vfsops.c vfs3/miscfs/kernfs/kernfs_vfsops.c
--- vfs2/miscfs/kernfs/kernfs_vfsops.c	Wed Dec 25 09:14:09 2002

+++ vfs3/miscfs/kernfs/kernfs_vfsops.c Thu Dec 26 08:37:09 2002
@@ -102,7 +102,10 @@ struct nameidata *ndp; struct proc *p; {
+ int error = 0;
size_t size;
+ struct vnode *rvp;
+ struct kern_target *kt;
#ifdef KERNFS_DIAGNOSTIC printf("kernfs_mount(mp = %p)\n", mp); @@ -114,7 +117,17 @@ if (mp->mnt_flag & MNT_UPDATE) return (EOPNOTSUPP);
+ kt = kernfs_findtarget(".", 1);
+ error = kernfs_allocvp(kt, mp, &rvp);
+ if (error)
+ return (error);
+
+ rvp->v_type = VDIR;
+ rvp->v_flag |= VROOT;
mp->mnt_flag |= MNT_LOCAL;
+ mp->mnt_data = (qaddr_t)rvp;
+ vrele(rvp);
vfs_getnewfsid(mp); (void) copyinstr(path, mp->mnt_stat.f_mntonname, MNAMELEN - 1, &size);
@@ -158,8 +171,12 @@
 #ifdef KERNFS_DIAGNOSTIC

         printf("kernfs_unmount: calling vflush\n");  #endif
- if ((error = vflush(mp, 0, flags)) != 0)
+
+ if ((error = vflush(mp, 0, flags)) != 0) {

 		return (error);

+ }
+
+ mp->mnt_data = 0;
return (0);

 }
@@ -169,24 +186,16 @@
 	struct mount *mp;
 	struct vnode **vpp;
 {
-	struct kern_target *kt;
-	int error;

+ struct vnode *vp = (struct vnode *)mp->mnt_data;
#ifdef KERNFS_DIAGNOSTIC printf("kernfs_root(mp = %p)\n", mp); #endif - kt = kernfs_findtarget(".", 1); - /* this should never happen */ - if (kt == NULL) - panic("kernfs_root: findtarget returned NULL"); - - error = kernfs_allocvp(kt, mp, vpp); - /* this should never happen */ - if (error) - panic("kernfs_root: couldn't find root"); - return(0); -
+ vget(vp, LK_EXCLUSIVE | LK_RETRY, curproc);
+ *vpp = vp;
 }

 int

diff -ruNX nodiff vfs2/miscfs/kernfs/kernfs_vnops.c vfs3/miscfs/kernfs/kernfs_vnops.c
--- vfs2/miscfs/kernfs/kernfs_vnops.c	Wed Dec 25 09:43:26 2002

+++ vfs3/miscfs/kernfs/kernfs_vnops.c Wed Dec 25 21:50:59 2002
@@ -287,7 +287,6 @@ struct kernfs_node *kf = VTOKERN(vp); TAILQ_REMOVE(&kfshead, kf, list); - VOP_UNLOCK(vp, 0, p); FREE(vp->v_data, M_TEMP); vp->v_data = 0; return(0); diff -ruNX nodiff vfs2/miscfs/procfs/procfs.h vfs3/miscfs/procfs/procfs.h --- vfs2/miscfs/procfs/procfs.h Wed Dec 25 09:14:09 2002
+++ vfs3/miscfs/procfs/procfs.h Wed Dec 25 21:57:52 2002
@@ -104,6 +104,7 @@
 struct procfsmount {
 	void *pmnt_exechook;
 	int pmnt_flags;

+ struct vnode *rvp;

 };

 #define VFSTOPROC(mp) ((struct procfsmount *)(mp)->mnt_data)

diff -ruNX nodiff vfs2/miscfs/procfs/procfs_vfsops.c vfs3/miscfs/procfs/procfs_vfsops.c
--- vfs2/miscfs/procfs/procfs_vfsops.c	Wed Dec 25 09:14:09 2002

+++ vfs3/miscfs/procfs/procfs_vfsops.c Thu Dec 26 08:32:54 2002
@@ -82,6 +82,7 @@ size_t size; struct procfsmount *pmnt; struct procfs_args args;
+ struct vnode *rvp;
int error; if (UIO_MX & (UIO_MX-1)) { @@ -102,10 +103,18 @@ } else args.flags = 0;
+ error = procfs_allocvp(mp, &rvp, 0, Proot);
+ if (error)
+ return (error);
+ rvp->v_type = VDIR;
+ rvp->v_flag |= VROOT;
mp->mnt_flag |= MNT_LOCAL;
Do you need help?X
pmnt = (struct procfsmount *) malloc(sizeof(struct procfsmount), M_UFSMNT, M_WAITOK); /* XXX need new malloc type */
+ pmnt->rvp = rvp;
+
mp->mnt_data = (qaddr_t)pmnt; vfs_getnewfsid(mp); @@ -134,6 +143,7 @@ int error; extern int doforce; int flags = 0;
+ struct vnode *rvp = VFSTOPROC(mp)->rvp;
if (mntflags & MNT_FORCE) { /* procfs can never be rootfs so don't check for it */ @@ -142,8 +152,15 @@ flags |= FORCECLOSE; } - if ((error = vflush(mp, 0, flags)) != 0)
+ vrele(rvp);
+
+ if ((error = vflush(mp, 0, flags)) != 0) {
+ vget(rvp, 0, curproc);
return (error);
+ }
+
+ free(VFSTOPROC(mp), M_UFSMNT);
+ mp->mnt_data = 0;
return (0);

 }
@@ -153,8 +170,13 @@
 	struct mount *mp;
 	struct vnode **vpp;
 {

+ struct vnode *vp = VFSTOPROC(mp)->rvp;
- return (procfs_allocvp(mp, vpp, 0, Proot));
+ VREF(vp);
+ vn_lock(vp, LK_EXCLUSIVE, curproc);
+ *vpp = vp;
 }

 /* ARGSUSED */

--
"I promise you a police car on every sidewalk."
      - M. Barry, Mayor of Washington, DC
Received on Sun Dec 29 21:59:17 2002

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


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