proc->thread stage 4: rework the VFS and DEVICE subsystems to take thread
[dragonfly.git] / sys / vfs / nfs / nfs_socket.c
index dc9ca09..81aee3f 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)nfs_socket.c        8.5 (Berkeley) 3/30/95
  * $FreeBSD: src/sys/nfs/nfs_socket.c,v 1.60.2.6 2003/03/26 01:44:46 alfred Exp $
- * $DragonFly: src/sys/vfs/nfs/nfs_socket.c,v 1.2 2003/06/17 04:28:54 dillon Exp $
+ * $DragonFly: src/sys/vfs/nfs/nfs_socket.c,v 1.3 2003/06/25 03:56:07 dillon Exp $
  */
 
 /*
@@ -149,7 +149,7 @@ int nfsrtton = 0;
 struct nfsrtt nfsrtt;
 struct callout_handle  nfs_timer_handle;
 
-static int     nfs_msg __P((struct proc *,char *,char *));
+static int     nfs_msg __P((struct thread *,char *,char *));
 static int     nfs_rcvlock __P((struct nfsreq *));
 static void    nfs_rcvunlock __P((struct nfsreq *));
 static void    nfs_realign __P((struct mbuf **pm, int hsiz));
@@ -162,7 +162,7 @@ static int  nfsrv_getstream __P((struct nfssvc_sock *,int));
 
 int (*nfsrv3_procs[NFS_NPROCS]) __P((struct nfsrv_descript *nd,
                                    struct nfssvc_sock *slp,
-                                   struct proc *procp,
+                                   struct thread *td,
                                    struct mbuf **mreqp)) = {
        nfsrv_null,
        nfsrv_getattr,
@@ -198,21 +198,19 @@ int (*nfsrv3_procs[NFS_NPROCS]) __P((struct nfsrv_descript *nd,
  * We do not free the sockaddr if error.
  */
 int
-nfs_connect(nmp, rep)
-       register struct nfsmount *nmp;
-       struct nfsreq *rep;
+nfs_connect(struct nfsmount *nmp, struct nfsreq *rep)
 {
-       register struct socket *so;
+       struct socket *so;
        int s, error, rcvreserve, sndreserve;
        int pktscale;
        struct sockaddr *saddr;
        struct sockaddr_in *sin;
-       struct proc *p = &proc0; /* only used for socreate and sobind */
+       struct thread *td = &thread0; /* only used for socreate and sobind */
 
        nmp->nm_so = (struct socket *)0;
        saddr = nmp->nm_nam;
        error = socreate(saddr->sa_family, &nmp->nm_so, nmp->nm_sotype,
-               nmp->nm_soproto, p);
+               nmp->nm_soproto, td);
        if (error)
                goto bad;
        so = nmp->nm_so;
@@ -233,7 +231,7 @@ nfs_connect(nmp, rep)
                sopt.sopt_name = IP_PORTRANGE;
                sopt.sopt_val = (void *)&ip;
                sopt.sopt_valsize = sizeof(ip);
-               sopt.sopt_p = NULL;
+               sopt.sopt_td = NULL;
                error = sosetopt(so, &sopt);
                if (error)
                        goto bad;
@@ -243,7 +241,7 @@ nfs_connect(nmp, rep)
                sin->sin_family = AF_INET;
                sin->sin_addr.s_addr = INADDR_ANY;
                sin->sin_port = htons(0);
-               error = sobind(so, (struct sockaddr *)sin, p);
+               error = sobind(so, (struct sockaddr *)sin, td);
                if (error)
                        goto bad;
                bzero(&sopt, sizeof sopt);
@@ -253,7 +251,7 @@ nfs_connect(nmp, rep)
                sopt.sopt_name = IP_PORTRANGE;
                sopt.sopt_val = (void *)&ip;
                sopt.sopt_valsize = sizeof(ip);
-               sopt.sopt_p = NULL;
+               sopt.sopt_td = NULL;
                error = sosetopt(so, &sopt);
                if (error)
                        goto bad;
@@ -269,7 +267,7 @@ nfs_connect(nmp, rep)
                        goto bad;
                }
        } else {
-               error = soconnect(so, nmp->nm_nam, p);
+               error = soconnect(so, nmp->nm_nam, td);
                if (error)
                        goto bad;
 
@@ -284,7 +282,7 @@ nfs_connect(nmp, rep)
                                "nfscon", 2 * hz);
                        if ((so->so_state & SS_ISCONNECTING) &&
                            so->so_error == 0 && rep &&
-                           (error = nfs_sigintr(nmp, rep, rep->r_procp)) != 0){
+                           (error = nfs_sigintr(nmp, rep, rep->r_td)) != 0){
                                so->so_state &= ~SS_ISCONNECTING;
                                splx(s);
                                goto bad;
@@ -483,8 +481,8 @@ nfs_send(so, nam, top, rep)
        else
                flags = 0;
 
-       error = so->so_proto->pr_usrreqs->pru_sosend(so, sendnam, 0, top, 0,
-                                                    flags, curproc /*XXX*/);
+       error = so->so_proto->pr_usrreqs->pru_sosend
+                   (so, sendnam, 0, top, 0, flags, curthread /*XXX*/);
        /*
         * ENOBUFS for dgram sockets is transient and non fatal.
         * No need to log, and no need to break a soft mount.
@@ -529,10 +527,7 @@ nfs_send(so, nam, top, rep)
  * we have read any of it, even if the system call has been interrupted.
  */
 static int
-nfs_receive(rep, aname, mp)
-       register struct nfsreq *rep;
-       struct sockaddr **aname;
-       struct mbuf **mp;
+nfs_receive(struct nfsreq *rep, struct sockaddr **aname, struct mbuf **mp)
 {
        register struct socket *so;
        struct uio auio;
@@ -542,7 +537,7 @@ nfs_receive(rep, aname, mp)
        u_int32_t len;
        struct sockaddr **getnam;
        int error, sotype, rcvflg;
-       struct proc *p = curproc;       /* XXX */
+       struct thread *td = curthread;  /* XXX */
 
        /*
         * Set up arguments for soreceive()
@@ -609,7 +604,7 @@ tryagain:
                        auio.uio_rw = UIO_READ;
                        auio.uio_offset = 0;
                        auio.uio_resid = sizeof(u_int32_t);
-                       auio.uio_procp = p;
+                       auio.uio_td = td;
                        do {
                           rcvflg = MSG_WAITALL;
                           error = so->so_proto->pr_usrreqs->pru_soreceive
@@ -677,7 +672,7 @@ tryagain:
                         * on.
                         */
                        auio.uio_resid = len = 100000000; /* Anything Big */
-                       auio.uio_procp = p;
+                       auio.uio_td = td;
                        do {
                            rcvflg = 0;
                            error =  so->so_proto->pr_usrreqs->pru_soreceive
@@ -723,7 +718,7 @@ errout:
                else
                        getnam = aname;
                auio.uio_resid = len = 1000000;
-               auio.uio_procp = p;
+               auio.uio_td = td;
                do {
                        rcvflg = 0;
                        error =  so->so_proto->pr_usrreqs->pru_soreceive
@@ -933,11 +928,11 @@ nfsmout:
  * nb: always frees up mreq mbuf list
  */
 int
-nfs_request(vp, mrest, procnum, procp, cred, mrp, mdp, dposp)
+nfs_request(vp, mrest, procnum, td, cred, mrp, mdp, dposp)
        struct vnode *vp;
        struct mbuf *mrest;
        int procnum;
-       struct proc *procp;
+       struct thread *td;
        struct ucred *cred;
        struct mbuf **mrp;
        struct mbuf **mdp;
@@ -970,7 +965,7 @@ nfs_request(vp, mrest, procnum, procp, cred, mrp, mdp, dposp)
        MALLOC(rep, struct nfsreq *, sizeof(struct nfsreq), M_NFSREQ, M_WAITOK);
        rep->r_nmp = nmp;
        rep->r_vp = vp;
-       rep->r_procp = procp;
+       rep->r_td = td;
        rep->r_procnum = procnum;
        i = 0;
        m = mrest;
@@ -1101,7 +1096,7 @@ tryagain:
         * tprintf a response.
         */
        if (!error && (rep->r_flags & R_TPRINTFMSG))
-               nfs_msg(rep->r_procp, nmp->nm_mountp->mnt_stat.f_mntfromname,
+               nfs_msg(rep->r_td, nmp->nm_mountp->mnt_stat.f_mntfromname,
                    "is alive again");
        mrep = rep->r_mrep;
        md = rep->r_md;
@@ -1395,14 +1390,14 @@ nfs_timer(arg)
        register struct nfssvc_sock *slp;
        u_quad_t cur_usec;
 #endif /* NFS_NOSERVER */
-       struct proc *p = &proc0; /* XXX for credentials, will break if sleep */
+       struct thread *td = &thread0; /* XXX for credentials, will break if sleep */
 
        s = splnet();
        for (rep = nfs_reqq.tqh_first; rep != 0; rep = rep->r_chain.tqe_next) {
                nmp = rep->r_nmp;
                if (rep->r_mrep || (rep->r_flags & R_SOFTTERM))
                        continue;
-               if (nfs_sigintr(nmp, rep, rep->r_procp)) {
+               if (nfs_sigintr(nmp, rep, rep->r_td)) {
                        nfs_softterm(rep);
                        continue;
                }
@@ -1424,7 +1419,7 @@ nfs_timer(arg)
                 */
                if ((rep->r_flags & R_TPRINTFMSG) == 0 &&
                     rep->r_rexmit > nmp->nm_deadthresh) {
-                       nfs_msg(rep->r_procp,
+                       nfs_msg(rep->r_td,
                            nmp->nm_mountp->mnt_stat.f_mntfromname,
                            "not responding");
                        rep->r_flags |= R_TPRINTFMSG;
@@ -1456,11 +1451,11 @@ nfs_timer(arg)
                        if ((nmp->nm_flag & NFSMNT_NOCONN) == 0)
                            error = (*so->so_proto->pr_usrreqs->pru_send)
                                    (so, 0, m, (struct sockaddr *)0,
-                                    (struct mbuf *)0, p);
+                                    (struct mbuf *)0, td);
                        else
                            error = (*so->so_proto->pr_usrreqs->pru_send)
                                    (so, 0, m, nmp->nm_nam, (struct mbuf *)0,
-                                    p);
+                                    td);
                        if (error) {
                                if (NFSIGNORE_SOERROR(nmp->nm_soflags, error))
                                        so->so_error = 0;
@@ -1568,12 +1563,10 @@ nfs_softterm(rep)
  * This is used for NFSMNT_INT mounts.
  */
 int
-nfs_sigintr(nmp, rep, p)
-       struct nfsmount *nmp;
-       struct nfsreq *rep;
-       register struct proc *p;
+nfs_sigintr(struct nfsmount *nmp, struct nfsreq *rep, struct thread *td)
 {
        sigset_t tmpset;
+       struct proc *p;
 
        if (rep && (rep->r_flags & R_SOFTTERM))
                return (EINTR);
@@ -1582,7 +1575,8 @@ nfs_sigintr(nmp, rep, p)
                return (EINTR);
        if (!(nmp->nm_flag & NFSMNT_INT))
                return (0);
-       if (p == NULL)
+       KKASSERT(td);
+       if ((p = td->td_proc) == NULL)
                return (0);
 
        tmpset = p->p_siglist;
@@ -1601,18 +1595,17 @@ nfs_sigintr(nmp, rep, p)
  * in progress when a reconnect is necessary.
  */
 int
-nfs_sndlock(rep)
-       struct nfsreq *rep;
+nfs_sndlock(struct nfsreq *rep)
 {
-       register int *statep = &rep->r_nmp->nm_state;
-       struct proc *p;
+       int *statep = &rep->r_nmp->nm_state;
+       struct thread *td;
        int slpflag = 0, slptimeo = 0;
 
-       p = rep->r_procp;
+       td = rep->r_td;
        if (rep->r_nmp->nm_flag & NFSMNT_INT)
                slpflag = PCATCH;
        while (*statep & NFSSTA_SNDLOCK) {
-               if (nfs_sigintr(rep->r_nmp, rep, p))
+               if (nfs_sigintr(rep->r_nmp, rep, td))
                        return (EINTR);
                *statep |= NFSSTA_WANTSND;
                (void) tsleep((caddr_t)statep, slpflag | (PZERO - 1),
@@ -1659,7 +1652,7 @@ nfs_rcvlock(rep)
        else
                slpflag = 0;
        while (*statep & NFSSTA_RCVLOCK) {
-               if (nfs_sigintr(rep->r_nmp, rep, rep->r_procp))
+               if (nfs_sigintr(rep->r_nmp, rep, rep->r_td))
                        return (EINTR);
                *statep |= NFSSTA_WANTRCV;
                (void) tsleep((caddr_t)statep, slpflag | (PZERO - 1), "nfsrcvlk",
@@ -2005,14 +1998,12 @@ nfsmout:
 #endif
 
 static int
-nfs_msg(p, server, msg)
-       struct proc *p;
-       char *server, *msg;
+nfs_msg(struct thread *td, char *server, char *msg)
 {
        tpr_t tpr;
 
-       if (p)
-               tpr = tprintf_open(p);
+       if (td->td_proc)
+               tpr = tprintf_open(td->td_proc);
        else
                tpr = NULL;
        tprintf(tpr, "nfs server %s: %s\n", server, msg);
@@ -2050,7 +2041,7 @@ nfsrv_rcv(so, arg, waitflag)
                slp->ns_flag |= SLP_NEEDQ; goto dorecs;
        }
 #endif
-       auio.uio_procp = NULL;
+       auio.uio_td = NULL;
        if (so->so_type == SOCK_STREAM) {
                /*
                 * If there are already records on the queue, defer soreceive()