From 0ba97092680c4808043fa1343bdae20bee46f511 Mon Sep 17 00:00:00 2001 From: dfr Date: Tue, 13 May 1997 17:25:44 +0000 Subject: Don't keep addresses in mbuf chains. This should simplify the next round of network changes from Garret. Reviewed by: Garrett Wollman --- sys/nfs/nfs.h | 11 ++++++-- sys/nfs/nfs_socket.c | 66 ++++++++++++++++++++++---------------------- sys/nfs/nfs_syscalls.c | 14 ++++++++-- sys/nfsclient/nfs.h | 11 ++++++-- sys/nfsclient/nfs_nfsiod.c | 14 ++++++++-- sys/nfsclient/nfs_socket.c | 66 ++++++++++++++++++++++---------------------- sys/nfsclient/nfsargs.h | 11 ++++++-- sys/nfsclient/nfsstats.h | 11 ++++++-- sys/nfsserver/nfs.h | 11 ++++++-- sys/nfsserver/nfs_srvsock.c | 66 ++++++++++++++++++++++---------------------- sys/nfsserver/nfs_syscalls.c | 14 ++++++++-- sys/nfsserver/nfsrvstats.h | 11 ++++++-- 12 files changed, 183 insertions(+), 123 deletions(-) diff --git a/sys/nfs/nfs.h b/sys/nfs/nfs.h index a3c45bd..406024e 100644 --- a/sys/nfs/nfs.h +++ b/sys/nfs/nfs.h @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs.h 8.4 (Berkeley) 5/1/95 - * $Id: nfs.h,v 1.24 1997/03/29 12:34:33 bde Exp $ + * $Id: nfs.h,v 1.25 1997/05/10 16:12:02 dfr Exp $ */ #ifndef _NFS_NFS_H_ @@ -404,6 +404,12 @@ struct nfsuid { #define NU_NAM 0x2 #define NU_NETFAM(u) (((u)->nu_flag & NU_INETADDR) ? AF_INET : AF_ISO) +struct nfsrv_rec { + STAILQ_ENTRY(nfsrv_rec) nr_link; + struct mbuf *nr_address; + struct mbuf *nr_packet; +}; + struct nfssvc_sock { TAILQ_ENTRY(nfssvc_sock) ns_chain; /* List of all nfssvc_sock's */ TAILQ_HEAD(, nfsuid) ns_uidlruhead; @@ -412,8 +418,7 @@ struct nfssvc_sock { struct mbuf *ns_nam; struct mbuf *ns_raw; struct mbuf *ns_rawend; - struct mbuf *ns_rec; - struct mbuf *ns_recend; + STAILQ_HEAD(, nfsrv_rec) ns_rec; struct mbuf *ns_frag; int ns_flag; int ns_solock; diff --git a/sys/nfs/nfs_socket.c b/sys/nfs/nfs_socket.c index 78a5773..c3e88e5 100644 --- a/sys/nfs/nfs_socket.c +++ b/sys/nfs/nfs_socket.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs_socket.c 8.5 (Berkeley) 3/30/95 - * $Id: nfs_socket.c,v 1.23 1997/04/22 17:38:01 dfr Exp $ + * $Id: nfs_socket.c,v 1.24 1997/04/27 20:01:21 wollman Exp $ */ /* @@ -1662,7 +1662,7 @@ nfsrv_rcv(so, arg, waitflag) * to an nfsd so that there is feedback to the TCP layer that * the nfs servers are heavily loaded. */ - if (slp->ns_rec && waitflag == M_DONTWAIT) { + if (STAILQ_FIRST(&slp->ns_rec) && waitflag == M_DONTWAIT) { slp->ns_flag |= SLP_NEEDQ; goto dorecs; } @@ -1711,18 +1711,19 @@ nfsrv_rcv(so, arg, waitflag) (so, &nam, &auio, &mp, (struct mbuf **)0, &flags); if (mp) { + struct nfsrv_rec *rec; + rec = malloc(sizeof(struct nfsrv_rec), + M_NFSRVDESC, waitflag); + if (!rec) { + if (nam) + m_freem(nam); + m_freem(mp); + continue; + } nfs_realign(mp, 10 * NFSX_UNSIGNED); - if (nam) { - m = nam; - m->m_next = mp; - } else - m = mp; - if (slp->ns_recend) - slp->ns_recend->m_nextpkt = m; - else - slp->ns_rec = m; - slp->ns_recend = m; - m->m_nextpkt = (struct mbuf *)0; + rec->nr_address = nam; + rec->nr_packet = mp; + STAILQ_INSERT_TAIL(&slp->ns_rec, rec, nr_link); } if (error) { if ((so->so_proto->pr_flags & PR_CONNREQUIRED) @@ -1739,7 +1740,8 @@ nfsrv_rcv(so, arg, waitflag) */ dorecs: if (waitflag == M_DONTWAIT && - (slp->ns_rec || (slp->ns_flag & (SLP_NEEDQ | SLP_DISCONN)))) + (STAILQ_FIRST(&slp->ns_rec) + || (slp->ns_flag & (SLP_NEEDQ | SLP_DISCONN)))) nfsrv_wakenfsd(slp); } @@ -1855,12 +1857,16 @@ nfsrv_getstream(slp, waitflag) mpp = &((*mpp)->m_next); *mpp = recm; if (slp->ns_flag & SLP_LASTFRAG) { - nfs_realign(slp->ns_frag, 10 * NFSX_UNSIGNED); - if (slp->ns_recend) - slp->ns_recend->m_nextpkt = slp->ns_frag; - else - slp->ns_rec = slp->ns_frag; - slp->ns_recend = slp->ns_frag; + struct nfsrv_rec *rec; + rec = malloc(sizeof(struct nfsrv_rec), M_NFSRVDESC, waitflag); + if (!rec) { + m_freem(slp->ns_frag); + } else { + nfs_realign(slp->ns_frag, 10 * NFSX_UNSIGNED); + rec->nr_address = (struct mbuf*)0; + rec->nr_packet = slp->ns_frag; + STAILQ_INSERT_TAIL(&slp->ns_rec, rec, nr_link); + } slp->ns_frag = (struct mbuf *)0; } } @@ -1875,25 +1881,19 @@ nfsrv_dorec(slp, nfsd, ndp) struct nfsd *nfsd; struct nfsrv_descript **ndp; { + struct nfsrv_rec *rec; register struct mbuf *m, *nam; register struct nfsrv_descript *nd; int error; *ndp = NULL; - if ((slp->ns_flag & SLP_VALID) == 0 || - (m = slp->ns_rec) == (struct mbuf *)0) + if ((slp->ns_flag & SLP_VALID) == 0 || !STAILQ_FIRST(&slp->ns_rec)) return (ENOBUFS); - slp->ns_rec = m->m_nextpkt; - if (slp->ns_rec) - m->m_nextpkt = (struct mbuf *)0; - else - slp->ns_recend = (struct mbuf *)0; - if (m->m_type == MT_SONAME) { - nam = m; - m = m->m_next; - nam->m_next = NULL; - } else - nam = NULL; + rec = STAILQ_FIRST(&slp->ns_rec); + STAILQ_REMOVE_HEAD(&slp->ns_rec, nr_link); + nam = rec->nr_address; + m = rec->nr_packet; + free(rec, M_NFSRVDESC); MALLOC(nd, struct nfsrv_descript *, sizeof (struct nfsrv_descript), M_NFSRVDESC, M_WAITOK); nd->nd_md = nd->nd_mrep = m; diff --git a/sys/nfs/nfs_syscalls.c b/sys/nfs/nfs_syscalls.c index 83cfa95..8f2466d 100644 --- a/sys/nfs/nfs_syscalls.c +++ b/sys/nfs/nfs_syscalls.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs_syscalls.c 8.5 (Berkeley) 3/30/95 - * $Id: nfs_syscalls.c,v 1.22 1997/04/30 09:51:37 dfr Exp $ + * $Id: nfs_syscalls.c,v 1.23 1997/05/10 16:59:36 dfr Exp $ */ #include @@ -424,6 +424,7 @@ nfssvc_addsock(fp, mynam, p) slp = (struct nfssvc_sock *) malloc(sizeof (struct nfssvc_sock), M_NFSSVC, M_WAITOK); bzero((caddr_t)slp, sizeof (struct nfssvc_sock)); + STAILQ_INIT(&slp->ns_rec); TAILQ_INIT(&slp->ns_uidlruhead); TAILQ_INSERT_TAIL(&nfssvc_sockhead, slp, ns_chain); } @@ -843,6 +844,7 @@ nfsrv_zapsock(slp) struct socket *so; struct file *fp; struct mbuf *m; + struct nfsrv_rec *rec; int s; slp->ns_flag &= ~SLP_ALLFLAGS; @@ -856,7 +858,13 @@ nfsrv_zapsock(slp) if (slp->ns_nam) MFREE(slp->ns_nam, m); m_freem(slp->ns_raw); - m_freem(slp->ns_rec); + while (rec = STAILQ_FIRST(&slp->ns_rec)) { + STAILQ_REMOVE_HEAD(&slp->ns_rec, nr_link); + if (rec->nr_address) + m_freem(rec->nr_address); + m_freem(rec->nr_packet); + free(rec, M_NFSRVDESC); + } for (nuidp = slp->ns_uidlruhead.tqh_first; nuidp != 0; nuidp = nnuidp) { nnuidp = nuidp->nu_lru.tqe_next; @@ -1135,12 +1143,14 @@ nfsrv_init(terminating) nfs_udpsock = (struct nfssvc_sock *) malloc(sizeof (struct nfssvc_sock), M_NFSSVC, M_WAITOK); bzero((caddr_t)nfs_udpsock, sizeof (struct nfssvc_sock)); + STAILQ_INIT(&nfs_udpsock->ns_rec); TAILQ_INIT(&nfs_udpsock->ns_uidlruhead); TAILQ_INSERT_HEAD(&nfssvc_sockhead, nfs_udpsock, ns_chain); nfs_cltpsock = (struct nfssvc_sock *) malloc(sizeof (struct nfssvc_sock), M_NFSSVC, M_WAITOK); bzero((caddr_t)nfs_cltpsock, sizeof (struct nfssvc_sock)); + STAILQ_INIT(&nfs_cltpsock->ns_rec); TAILQ_INIT(&nfs_cltpsock->ns_uidlruhead); TAILQ_INSERT_TAIL(&nfssvc_sockhead, nfs_cltpsock, ns_chain); } diff --git a/sys/nfsclient/nfs.h b/sys/nfsclient/nfs.h index a3c45bd..406024e 100644 --- a/sys/nfsclient/nfs.h +++ b/sys/nfsclient/nfs.h @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs.h 8.4 (Berkeley) 5/1/95 - * $Id: nfs.h,v 1.24 1997/03/29 12:34:33 bde Exp $ + * $Id: nfs.h,v 1.25 1997/05/10 16:12:02 dfr Exp $ */ #ifndef _NFS_NFS_H_ @@ -404,6 +404,12 @@ struct nfsuid { #define NU_NAM 0x2 #define NU_NETFAM(u) (((u)->nu_flag & NU_INETADDR) ? AF_INET : AF_ISO) +struct nfsrv_rec { + STAILQ_ENTRY(nfsrv_rec) nr_link; + struct mbuf *nr_address; + struct mbuf *nr_packet; +}; + struct nfssvc_sock { TAILQ_ENTRY(nfssvc_sock) ns_chain; /* List of all nfssvc_sock's */ TAILQ_HEAD(, nfsuid) ns_uidlruhead; @@ -412,8 +418,7 @@ struct nfssvc_sock { struct mbuf *ns_nam; struct mbuf *ns_raw; struct mbuf *ns_rawend; - struct mbuf *ns_rec; - struct mbuf *ns_recend; + STAILQ_HEAD(, nfsrv_rec) ns_rec; struct mbuf *ns_frag; int ns_flag; int ns_solock; diff --git a/sys/nfsclient/nfs_nfsiod.c b/sys/nfsclient/nfs_nfsiod.c index 83cfa95..8f2466d 100644 --- a/sys/nfsclient/nfs_nfsiod.c +++ b/sys/nfsclient/nfs_nfsiod.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs_syscalls.c 8.5 (Berkeley) 3/30/95 - * $Id: nfs_syscalls.c,v 1.22 1997/04/30 09:51:37 dfr Exp $ + * $Id: nfs_syscalls.c,v 1.23 1997/05/10 16:59:36 dfr Exp $ */ #include @@ -424,6 +424,7 @@ nfssvc_addsock(fp, mynam, p) slp = (struct nfssvc_sock *) malloc(sizeof (struct nfssvc_sock), M_NFSSVC, M_WAITOK); bzero((caddr_t)slp, sizeof (struct nfssvc_sock)); + STAILQ_INIT(&slp->ns_rec); TAILQ_INIT(&slp->ns_uidlruhead); TAILQ_INSERT_TAIL(&nfssvc_sockhead, slp, ns_chain); } @@ -843,6 +844,7 @@ nfsrv_zapsock(slp) struct socket *so; struct file *fp; struct mbuf *m; + struct nfsrv_rec *rec; int s; slp->ns_flag &= ~SLP_ALLFLAGS; @@ -856,7 +858,13 @@ nfsrv_zapsock(slp) if (slp->ns_nam) MFREE(slp->ns_nam, m); m_freem(slp->ns_raw); - m_freem(slp->ns_rec); + while (rec = STAILQ_FIRST(&slp->ns_rec)) { + STAILQ_REMOVE_HEAD(&slp->ns_rec, nr_link); + if (rec->nr_address) + m_freem(rec->nr_address); + m_freem(rec->nr_packet); + free(rec, M_NFSRVDESC); + } for (nuidp = slp->ns_uidlruhead.tqh_first; nuidp != 0; nuidp = nnuidp) { nnuidp = nuidp->nu_lru.tqe_next; @@ -1135,12 +1143,14 @@ nfsrv_init(terminating) nfs_udpsock = (struct nfssvc_sock *) malloc(sizeof (struct nfssvc_sock), M_NFSSVC, M_WAITOK); bzero((caddr_t)nfs_udpsock, sizeof (struct nfssvc_sock)); + STAILQ_INIT(&nfs_udpsock->ns_rec); TAILQ_INIT(&nfs_udpsock->ns_uidlruhead); TAILQ_INSERT_HEAD(&nfssvc_sockhead, nfs_udpsock, ns_chain); nfs_cltpsock = (struct nfssvc_sock *) malloc(sizeof (struct nfssvc_sock), M_NFSSVC, M_WAITOK); bzero((caddr_t)nfs_cltpsock, sizeof (struct nfssvc_sock)); + STAILQ_INIT(&nfs_cltpsock->ns_rec); TAILQ_INIT(&nfs_cltpsock->ns_uidlruhead); TAILQ_INSERT_TAIL(&nfssvc_sockhead, nfs_cltpsock, ns_chain); } diff --git a/sys/nfsclient/nfs_socket.c b/sys/nfsclient/nfs_socket.c index 78a5773..c3e88e5 100644 --- a/sys/nfsclient/nfs_socket.c +++ b/sys/nfsclient/nfs_socket.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs_socket.c 8.5 (Berkeley) 3/30/95 - * $Id: nfs_socket.c,v 1.23 1997/04/22 17:38:01 dfr Exp $ + * $Id: nfs_socket.c,v 1.24 1997/04/27 20:01:21 wollman Exp $ */ /* @@ -1662,7 +1662,7 @@ nfsrv_rcv(so, arg, waitflag) * to an nfsd so that there is feedback to the TCP layer that * the nfs servers are heavily loaded. */ - if (slp->ns_rec && waitflag == M_DONTWAIT) { + if (STAILQ_FIRST(&slp->ns_rec) && waitflag == M_DONTWAIT) { slp->ns_flag |= SLP_NEEDQ; goto dorecs; } @@ -1711,18 +1711,19 @@ nfsrv_rcv(so, arg, waitflag) (so, &nam, &auio, &mp, (struct mbuf **)0, &flags); if (mp) { + struct nfsrv_rec *rec; + rec = malloc(sizeof(struct nfsrv_rec), + M_NFSRVDESC, waitflag); + if (!rec) { + if (nam) + m_freem(nam); + m_freem(mp); + continue; + } nfs_realign(mp, 10 * NFSX_UNSIGNED); - if (nam) { - m = nam; - m->m_next = mp; - } else - m = mp; - if (slp->ns_recend) - slp->ns_recend->m_nextpkt = m; - else - slp->ns_rec = m; - slp->ns_recend = m; - m->m_nextpkt = (struct mbuf *)0; + rec->nr_address = nam; + rec->nr_packet = mp; + STAILQ_INSERT_TAIL(&slp->ns_rec, rec, nr_link); } if (error) { if ((so->so_proto->pr_flags & PR_CONNREQUIRED) @@ -1739,7 +1740,8 @@ nfsrv_rcv(so, arg, waitflag) */ dorecs: if (waitflag == M_DONTWAIT && - (slp->ns_rec || (slp->ns_flag & (SLP_NEEDQ | SLP_DISCONN)))) + (STAILQ_FIRST(&slp->ns_rec) + || (slp->ns_flag & (SLP_NEEDQ | SLP_DISCONN)))) nfsrv_wakenfsd(slp); } @@ -1855,12 +1857,16 @@ nfsrv_getstream(slp, waitflag) mpp = &((*mpp)->m_next); *mpp = recm; if (slp->ns_flag & SLP_LASTFRAG) { - nfs_realign(slp->ns_frag, 10 * NFSX_UNSIGNED); - if (slp->ns_recend) - slp->ns_recend->m_nextpkt = slp->ns_frag; - else - slp->ns_rec = slp->ns_frag; - slp->ns_recend = slp->ns_frag; + struct nfsrv_rec *rec; + rec = malloc(sizeof(struct nfsrv_rec), M_NFSRVDESC, waitflag); + if (!rec) { + m_freem(slp->ns_frag); + } else { + nfs_realign(slp->ns_frag, 10 * NFSX_UNSIGNED); + rec->nr_address = (struct mbuf*)0; + rec->nr_packet = slp->ns_frag; + STAILQ_INSERT_TAIL(&slp->ns_rec, rec, nr_link); + } slp->ns_frag = (struct mbuf *)0; } } @@ -1875,25 +1881,19 @@ nfsrv_dorec(slp, nfsd, ndp) struct nfsd *nfsd; struct nfsrv_descript **ndp; { + struct nfsrv_rec *rec; register struct mbuf *m, *nam; register struct nfsrv_descript *nd; int error; *ndp = NULL; - if ((slp->ns_flag & SLP_VALID) == 0 || - (m = slp->ns_rec) == (struct mbuf *)0) + if ((slp->ns_flag & SLP_VALID) == 0 || !STAILQ_FIRST(&slp->ns_rec)) return (ENOBUFS); - slp->ns_rec = m->m_nextpkt; - if (slp->ns_rec) - m->m_nextpkt = (struct mbuf *)0; - else - slp->ns_recend = (struct mbuf *)0; - if (m->m_type == MT_SONAME) { - nam = m; - m = m->m_next; - nam->m_next = NULL; - } else - nam = NULL; + rec = STAILQ_FIRST(&slp->ns_rec); + STAILQ_REMOVE_HEAD(&slp->ns_rec, nr_link); + nam = rec->nr_address; + m = rec->nr_packet; + free(rec, M_NFSRVDESC); MALLOC(nd, struct nfsrv_descript *, sizeof (struct nfsrv_descript), M_NFSRVDESC, M_WAITOK); nd->nd_md = nd->nd_mrep = m; diff --git a/sys/nfsclient/nfsargs.h b/sys/nfsclient/nfsargs.h index a3c45bd..406024e 100644 --- a/sys/nfsclient/nfsargs.h +++ b/sys/nfsclient/nfsargs.h @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs.h 8.4 (Berkeley) 5/1/95 - * $Id: nfs.h,v 1.24 1997/03/29 12:34:33 bde Exp $ + * $Id: nfs.h,v 1.25 1997/05/10 16:12:02 dfr Exp $ */ #ifndef _NFS_NFS_H_ @@ -404,6 +404,12 @@ struct nfsuid { #define NU_NAM 0x2 #define NU_NETFAM(u) (((u)->nu_flag & NU_INETADDR) ? AF_INET : AF_ISO) +struct nfsrv_rec { + STAILQ_ENTRY(nfsrv_rec) nr_link; + struct mbuf *nr_address; + struct mbuf *nr_packet; +}; + struct nfssvc_sock { TAILQ_ENTRY(nfssvc_sock) ns_chain; /* List of all nfssvc_sock's */ TAILQ_HEAD(, nfsuid) ns_uidlruhead; @@ -412,8 +418,7 @@ struct nfssvc_sock { struct mbuf *ns_nam; struct mbuf *ns_raw; struct mbuf *ns_rawend; - struct mbuf *ns_rec; - struct mbuf *ns_recend; + STAILQ_HEAD(, nfsrv_rec) ns_rec; struct mbuf *ns_frag; int ns_flag; int ns_solock; diff --git a/sys/nfsclient/nfsstats.h b/sys/nfsclient/nfsstats.h index a3c45bd..406024e 100644 --- a/sys/nfsclient/nfsstats.h +++ b/sys/nfsclient/nfsstats.h @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs.h 8.4 (Berkeley) 5/1/95 - * $Id: nfs.h,v 1.24 1997/03/29 12:34:33 bde Exp $ + * $Id: nfs.h,v 1.25 1997/05/10 16:12:02 dfr Exp $ */ #ifndef _NFS_NFS_H_ @@ -404,6 +404,12 @@ struct nfsuid { #define NU_NAM 0x2 #define NU_NETFAM(u) (((u)->nu_flag & NU_INETADDR) ? AF_INET : AF_ISO) +struct nfsrv_rec { + STAILQ_ENTRY(nfsrv_rec) nr_link; + struct mbuf *nr_address; + struct mbuf *nr_packet; +}; + struct nfssvc_sock { TAILQ_ENTRY(nfssvc_sock) ns_chain; /* List of all nfssvc_sock's */ TAILQ_HEAD(, nfsuid) ns_uidlruhead; @@ -412,8 +418,7 @@ struct nfssvc_sock { struct mbuf *ns_nam; struct mbuf *ns_raw; struct mbuf *ns_rawend; - struct mbuf *ns_rec; - struct mbuf *ns_recend; + STAILQ_HEAD(, nfsrv_rec) ns_rec; struct mbuf *ns_frag; int ns_flag; int ns_solock; diff --git a/sys/nfsserver/nfs.h b/sys/nfsserver/nfs.h index a3c45bd..406024e 100644 --- a/sys/nfsserver/nfs.h +++ b/sys/nfsserver/nfs.h @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs.h 8.4 (Berkeley) 5/1/95 - * $Id: nfs.h,v 1.24 1997/03/29 12:34:33 bde Exp $ + * $Id: nfs.h,v 1.25 1997/05/10 16:12:02 dfr Exp $ */ #ifndef _NFS_NFS_H_ @@ -404,6 +404,12 @@ struct nfsuid { #define NU_NAM 0x2 #define NU_NETFAM(u) (((u)->nu_flag & NU_INETADDR) ? AF_INET : AF_ISO) +struct nfsrv_rec { + STAILQ_ENTRY(nfsrv_rec) nr_link; + struct mbuf *nr_address; + struct mbuf *nr_packet; +}; + struct nfssvc_sock { TAILQ_ENTRY(nfssvc_sock) ns_chain; /* List of all nfssvc_sock's */ TAILQ_HEAD(, nfsuid) ns_uidlruhead; @@ -412,8 +418,7 @@ struct nfssvc_sock { struct mbuf *ns_nam; struct mbuf *ns_raw; struct mbuf *ns_rawend; - struct mbuf *ns_rec; - struct mbuf *ns_recend; + STAILQ_HEAD(, nfsrv_rec) ns_rec; struct mbuf *ns_frag; int ns_flag; int ns_solock; diff --git a/sys/nfsserver/nfs_srvsock.c b/sys/nfsserver/nfs_srvsock.c index 78a5773..c3e88e5 100644 --- a/sys/nfsserver/nfs_srvsock.c +++ b/sys/nfsserver/nfs_srvsock.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs_socket.c 8.5 (Berkeley) 3/30/95 - * $Id: nfs_socket.c,v 1.23 1997/04/22 17:38:01 dfr Exp $ + * $Id: nfs_socket.c,v 1.24 1997/04/27 20:01:21 wollman Exp $ */ /* @@ -1662,7 +1662,7 @@ nfsrv_rcv(so, arg, waitflag) * to an nfsd so that there is feedback to the TCP layer that * the nfs servers are heavily loaded. */ - if (slp->ns_rec && waitflag == M_DONTWAIT) { + if (STAILQ_FIRST(&slp->ns_rec) && waitflag == M_DONTWAIT) { slp->ns_flag |= SLP_NEEDQ; goto dorecs; } @@ -1711,18 +1711,19 @@ nfsrv_rcv(so, arg, waitflag) (so, &nam, &auio, &mp, (struct mbuf **)0, &flags); if (mp) { + struct nfsrv_rec *rec; + rec = malloc(sizeof(struct nfsrv_rec), + M_NFSRVDESC, waitflag); + if (!rec) { + if (nam) + m_freem(nam); + m_freem(mp); + continue; + } nfs_realign(mp, 10 * NFSX_UNSIGNED); - if (nam) { - m = nam; - m->m_next = mp; - } else - m = mp; - if (slp->ns_recend) - slp->ns_recend->m_nextpkt = m; - else - slp->ns_rec = m; - slp->ns_recend = m; - m->m_nextpkt = (struct mbuf *)0; + rec->nr_address = nam; + rec->nr_packet = mp; + STAILQ_INSERT_TAIL(&slp->ns_rec, rec, nr_link); } if (error) { if ((so->so_proto->pr_flags & PR_CONNREQUIRED) @@ -1739,7 +1740,8 @@ nfsrv_rcv(so, arg, waitflag) */ dorecs: if (waitflag == M_DONTWAIT && - (slp->ns_rec || (slp->ns_flag & (SLP_NEEDQ | SLP_DISCONN)))) + (STAILQ_FIRST(&slp->ns_rec) + || (slp->ns_flag & (SLP_NEEDQ | SLP_DISCONN)))) nfsrv_wakenfsd(slp); } @@ -1855,12 +1857,16 @@ nfsrv_getstream(slp, waitflag) mpp = &((*mpp)->m_next); *mpp = recm; if (slp->ns_flag & SLP_LASTFRAG) { - nfs_realign(slp->ns_frag, 10 * NFSX_UNSIGNED); - if (slp->ns_recend) - slp->ns_recend->m_nextpkt = slp->ns_frag; - else - slp->ns_rec = slp->ns_frag; - slp->ns_recend = slp->ns_frag; + struct nfsrv_rec *rec; + rec = malloc(sizeof(struct nfsrv_rec), M_NFSRVDESC, waitflag); + if (!rec) { + m_freem(slp->ns_frag); + } else { + nfs_realign(slp->ns_frag, 10 * NFSX_UNSIGNED); + rec->nr_address = (struct mbuf*)0; + rec->nr_packet = slp->ns_frag; + STAILQ_INSERT_TAIL(&slp->ns_rec, rec, nr_link); + } slp->ns_frag = (struct mbuf *)0; } } @@ -1875,25 +1881,19 @@ nfsrv_dorec(slp, nfsd, ndp) struct nfsd *nfsd; struct nfsrv_descript **ndp; { + struct nfsrv_rec *rec; register struct mbuf *m, *nam; register struct nfsrv_descript *nd; int error; *ndp = NULL; - if ((slp->ns_flag & SLP_VALID) == 0 || - (m = slp->ns_rec) == (struct mbuf *)0) + if ((slp->ns_flag & SLP_VALID) == 0 || !STAILQ_FIRST(&slp->ns_rec)) return (ENOBUFS); - slp->ns_rec = m->m_nextpkt; - if (slp->ns_rec) - m->m_nextpkt = (struct mbuf *)0; - else - slp->ns_recend = (struct mbuf *)0; - if (m->m_type == MT_SONAME) { - nam = m; - m = m->m_next; - nam->m_next = NULL; - } else - nam = NULL; + rec = STAILQ_FIRST(&slp->ns_rec); + STAILQ_REMOVE_HEAD(&slp->ns_rec, nr_link); + nam = rec->nr_address; + m = rec->nr_packet; + free(rec, M_NFSRVDESC); MALLOC(nd, struct nfsrv_descript *, sizeof (struct nfsrv_descript), M_NFSRVDESC, M_WAITOK); nd->nd_md = nd->nd_mrep = m; diff --git a/sys/nfsserver/nfs_syscalls.c b/sys/nfsserver/nfs_syscalls.c index 83cfa95..8f2466d 100644 --- a/sys/nfsserver/nfs_syscalls.c +++ b/sys/nfsserver/nfs_syscalls.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs_syscalls.c 8.5 (Berkeley) 3/30/95 - * $Id: nfs_syscalls.c,v 1.22 1997/04/30 09:51:37 dfr Exp $ + * $Id: nfs_syscalls.c,v 1.23 1997/05/10 16:59:36 dfr Exp $ */ #include @@ -424,6 +424,7 @@ nfssvc_addsock(fp, mynam, p) slp = (struct nfssvc_sock *) malloc(sizeof (struct nfssvc_sock), M_NFSSVC, M_WAITOK); bzero((caddr_t)slp, sizeof (struct nfssvc_sock)); + STAILQ_INIT(&slp->ns_rec); TAILQ_INIT(&slp->ns_uidlruhead); TAILQ_INSERT_TAIL(&nfssvc_sockhead, slp, ns_chain); } @@ -843,6 +844,7 @@ nfsrv_zapsock(slp) struct socket *so; struct file *fp; struct mbuf *m; + struct nfsrv_rec *rec; int s; slp->ns_flag &= ~SLP_ALLFLAGS; @@ -856,7 +858,13 @@ nfsrv_zapsock(slp) if (slp->ns_nam) MFREE(slp->ns_nam, m); m_freem(slp->ns_raw); - m_freem(slp->ns_rec); + while (rec = STAILQ_FIRST(&slp->ns_rec)) { + STAILQ_REMOVE_HEAD(&slp->ns_rec, nr_link); + if (rec->nr_address) + m_freem(rec->nr_address); + m_freem(rec->nr_packet); + free(rec, M_NFSRVDESC); + } for (nuidp = slp->ns_uidlruhead.tqh_first; nuidp != 0; nuidp = nnuidp) { nnuidp = nuidp->nu_lru.tqe_next; @@ -1135,12 +1143,14 @@ nfsrv_init(terminating) nfs_udpsock = (struct nfssvc_sock *) malloc(sizeof (struct nfssvc_sock), M_NFSSVC, M_WAITOK); bzero((caddr_t)nfs_udpsock, sizeof (struct nfssvc_sock)); + STAILQ_INIT(&nfs_udpsock->ns_rec); TAILQ_INIT(&nfs_udpsock->ns_uidlruhead); TAILQ_INSERT_HEAD(&nfssvc_sockhead, nfs_udpsock, ns_chain); nfs_cltpsock = (struct nfssvc_sock *) malloc(sizeof (struct nfssvc_sock), M_NFSSVC, M_WAITOK); bzero((caddr_t)nfs_cltpsock, sizeof (struct nfssvc_sock)); + STAILQ_INIT(&nfs_cltpsock->ns_rec); TAILQ_INIT(&nfs_cltpsock->ns_uidlruhead); TAILQ_INSERT_TAIL(&nfssvc_sockhead, nfs_cltpsock, ns_chain); } diff --git a/sys/nfsserver/nfsrvstats.h b/sys/nfsserver/nfsrvstats.h index a3c45bd..406024e 100644 --- a/sys/nfsserver/nfsrvstats.h +++ b/sys/nfsserver/nfsrvstats.h @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs.h 8.4 (Berkeley) 5/1/95 - * $Id: nfs.h,v 1.24 1997/03/29 12:34:33 bde Exp $ + * $Id: nfs.h,v 1.25 1997/05/10 16:12:02 dfr Exp $ */ #ifndef _NFS_NFS_H_ @@ -404,6 +404,12 @@ struct nfsuid { #define NU_NAM 0x2 #define NU_NETFAM(u) (((u)->nu_flag & NU_INETADDR) ? AF_INET : AF_ISO) +struct nfsrv_rec { + STAILQ_ENTRY(nfsrv_rec) nr_link; + struct mbuf *nr_address; + struct mbuf *nr_packet; +}; + struct nfssvc_sock { TAILQ_ENTRY(nfssvc_sock) ns_chain; /* List of all nfssvc_sock's */ TAILQ_HEAD(, nfsuid) ns_uidlruhead; @@ -412,8 +418,7 @@ struct nfssvc_sock { struct mbuf *ns_nam; struct mbuf *ns_raw; struct mbuf *ns_rawend; - struct mbuf *ns_rec; - struct mbuf *ns_recend; + STAILQ_HEAD(, nfsrv_rec) ns_rec; struct mbuf *ns_frag; int ns_flag; int ns_solock; -- cgit v1.1