proc->thread stage 4: rework the VFS and DEVICE subsystems to take thread
[dragonfly.git] / sys / vfs / union / union_vfsops.c
index 963939c..579a808 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     @(#)union_vfsops.c      8.20 (Berkeley) 5/20/95
  * $FreeBSD: src/sys/miscfs/union/union_vfsops.c,v 1.39.2.2 2001/10/25 19:18:53 dillon Exp $
- * $DragonFly: src/sys/vfs/union/union_vfsops.c,v 1.2 2003/06/17 04:28:43 dillon Exp $
+ * $DragonFly: src/sys/vfs/union/union_vfsops.c,v 1.3 2003/06/25 03:56:01 dillon Exp $
  */
 
 /*
@@ -59,23 +59,23 @@ static MALLOC_DEFINE(M_UNIONFSMNT, "UNION mount", "UNION mount structure");
 
 extern int     union_init __P((struct vfsconf *));
 static int     union_mount __P((struct mount *mp, char *path, caddr_t data,
-                                struct nameidata *ndp, struct proc *p));
+                                struct nameidata *ndp, struct thread *td));
 static int     union_root __P((struct mount *mp, struct vnode **vpp));
 static int     union_statfs __P((struct mount *mp, struct statfs *sbp,
-                                 struct proc *p));
+                                 struct thread *td));
 static int     union_unmount __P((struct mount *mp, int mntflags,
-                                  struct proc *p));
+                                  struct thread *td));
 
 /*
  * Mount union filesystem
  */
 static int
-union_mount(mp, path, data, ndp, p)
+union_mount(mp, path, data, ndp, td)
        struct mount *mp;
        char *path;
        caddr_t data;
        struct nameidata *ndp;
-       struct proc *p;
+       struct thread *td;
 {
        int error = 0;
        struct union_args args;
@@ -89,6 +89,8 @@ union_mount(mp, path, data, ndp, p)
 
        UDEBUG(("union_mount(mp = %p)\n", (void *)mp));
 
+       KKASSERT(td->td_proc);
+
        /*
         * Disable clustered write, otherwise system becomes unstable.
         */
@@ -127,21 +129,20 @@ union_mount(mp, path, data, ndp, p)
         * Unlock lower node to avoid deadlock.
         */
        if (lowerrootvp->v_op == union_vnodeop_p)
-               VOP_UNLOCK(lowerrootvp, 0, p);
+               VOP_UNLOCK(lowerrootvp, 0, td);
 #endif
 
        /*
         * Obtain upper vnode by calling namei() on the path.  The
         * upperrootvp will be turned referenced but not locked.
         */
-       NDINIT(ndp, LOOKUP, FOLLOW|WANTPARENT,
-              UIO_USERSPACE, args.target, p);
+       NDINIT(ndp, LOOKUP, FOLLOW|WANTPARENT, UIO_USERSPACE, args.target, td);
 
        error = namei(ndp);
 
 #if 0
        if (lowerrootvp->v_op == union_vnodeop_p)
-               vn_lock(lowerrootvp, LK_EXCLUSIVE | LK_RETRY, p);
+               vn_lock(lowerrootvp, LK_EXCLUSIVE | LK_RETRY, td);
 #endif
        if (error)
                goto bad;
@@ -225,9 +226,8 @@ union_mount(mp, path, data, ndp, p)
                        goto bad;
        }
 
-       um->um_cred = p->p_ucred;
-       crhold(um->um_cred);
-       um->um_cmode = UN_DIRMODE &~ p->p_fd->fd_cmask;
+       um->um_cred = crhold(td->td_proc->p_ucred);
+       um->um_cmode = UN_DIRMODE & ~td->td_proc->p_fd->fd_cmask;
 
        /*
         * Depending on what you think the MNT_LOCAL flag might mean,
@@ -280,7 +280,7 @@ union_mount(mp, path, data, ndp, p)
        (void) copyinstr(args.target, cp, len - 1, &size);
        bzero(cp + size, len - size);
 
-       (void)union_statfs(mp, &mp->mnt_stat, p);
+       (void)union_statfs(mp, &mp->mnt_stat, td);
 
        UDEBUG(("union_mount: from %s, on %s\n",
                mp->mnt_stat.f_mntfromname, mp->mnt_stat.f_mntonname));
@@ -308,10 +308,10 @@ bad:
  * Free reference to union layer
  */
 static int
-union_unmount(mp, mntflags, p)
+union_unmount(mp, mntflags, td)
        struct mount *mp;
        int mntflags;
-       struct proc *p;
+       struct thread *td;
 {
        struct union_mount *um = MOUNTTOUNIONMOUNT(mp);
        int error;
@@ -401,10 +401,10 @@ union_root(mp, vpp)
 }
 
 static int
-union_statfs(mp, sbp, p)
+union_statfs(mp, sbp, td)
        struct mount *mp;
        struct statfs *sbp;
-       struct proc *p;
+       struct thread *td;
 {
        int error;
        struct union_mount *um = MOUNTTOUNIONMOUNT(mp);
@@ -417,7 +417,7 @@ union_statfs(mp, sbp, p)
        bzero(&mstat, sizeof(mstat));
 
        if (um->um_lowervp) {
-               error = VFS_STATFS(um->um_lowervp->v_mount, &mstat, p);
+               error = VFS_STATFS(um->um_lowervp->v_mount, &mstat, td);
                if (error)
                        return (error);
        }
@@ -436,7 +436,7 @@ union_statfs(mp, sbp, p)
        sbp->f_files = mstat.f_files;
        sbp->f_ffree = mstat.f_ffree;
 
-       error = VFS_STATFS(um->um_uppervp->v_mount, &mstat, p);
+       error = VFS_STATFS(um->um_uppervp->v_mount, &mstat, td);
        if (error)
                return (error);