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;
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