From 7d6b68c4de9cfca092d612c67c9918ae02e824e4 Mon Sep 17 00:00:00 2001 From: Doug Rabson Date: Tue, 3 Jun 1997 17:22:47 +0000 Subject: [PATCH] Various fixes from NetBSD: Use u_int for rpc procedure numbers. Some fixes to NQNFS. A rare NULL pointer dereference. Ignore NFSMNT_NOCONN for TCP mounts. Obtained from: NetBSD --- sys/nfs/nfs.h | 6 +++--- sys/nfs/nfs_nqlease.c | 23 +++++++++++++---------- sys/nfs/nfs_socket.c | 5 +++-- sys/nfs/nfs_vfsops.c | 9 ++++++++- sys/nfs/nfsrtt.h | 6 +++--- sys/nfs/nfsrvcache.h | 4 ++-- sys/nfsclient/nfs.h | 6 +++--- sys/nfsclient/nfs_socket.c | 5 +++-- sys/nfsclient/nfs_vfsops.c | 9 ++++++++- sys/nfsclient/nfsargs.h | 6 +++--- sys/nfsclient/nfsstats.h | 6 +++--- sys/nfsserver/nfs.h | 6 +++--- sys/nfsserver/nfs_srvsock.c | 5 +++-- sys/nfsserver/nfsrvcache.h | 4 ++-- sys/nfsserver/nfsrvstats.h | 6 +++--- 15 files changed, 63 insertions(+), 43 deletions(-) diff --git a/sys/nfs/nfs.h b/sys/nfs/nfs.h index 2dc19c176136..3521dae9ac28 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.26 1997/05/13 17:25:44 dfr Exp $ + * $Id: nfs.h,v 1.27 1997/05/19 14:36:46 dfr Exp $ */ #ifndef _NFS_NFS_H_ @@ -333,7 +333,7 @@ struct nfsreq { int r_retry; /* max retransmission count */ int r_rexmit; /* current retrans count */ int r_timer; /* tick counter on reply */ - int r_procnum; /* NFS procedure number */ + u_int32_t r_procnum; /* NFS procedure number */ int r_rtt; /* RTT for rpc */ struct proc *r_procp; /* Proc that did I/O system call */ }; @@ -483,7 +483,7 @@ struct nfsrv_descript { struct mbuf *nd_nam; /* and socket addr */ struct mbuf *nd_nam2; /* return socket addr */ caddr_t nd_dpos; /* Current dissect pos */ - int nd_procnum; /* RPC # */ + u_int32_t nd_procnum; /* RPC # */ int nd_stable; /* storage type */ int nd_flag; /* nd_flag */ int nd_len; /* Length of this write */ diff --git a/sys/nfs/nfs_nqlease.c b/sys/nfs/nfs_nqlease.c index 9c76be44d648..821d391dfa19 100644 --- a/sys/nfs/nfs_nqlease.c +++ b/sys/nfs/nfs_nqlease.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs_nqlease.c 8.9 (Berkeley) 5/20/95 - * $Id$ + * $Id: nfs_nqlease.c,v 1.24 1997/02/22 09:42:37 peter Exp $ */ @@ -492,9 +492,10 @@ nqsrv_send_eviction(vp, lp, slp, nam, cred) struct mbuf *mreq, *mb, *mb2, *nam2, *mheadend; struct socket *so; struct sockaddr_in *saddr; + nfsfh_t nfh; fhandle_t *fhp; caddr_t bpos, cp; - u_long xid; + u_long xid, *tl; int len = 1, ok = 1, i = 0; int sotype, *solockp; @@ -525,12 +526,12 @@ nqsrv_send_eviction(vp, lp, slp, nam, cred) else solockp = (int *)0; nfsm_reqhead((struct vnode *)0, NQNFSPROC_EVICTED, - NFSX_V3FH); - nfsm_build(cp, caddr_t, NFSX_V3FH); - bzero(cp, NFSX_V3FH); - fhp = (fhandle_t *)cp; + NFSX_V3FH + NFSX_UNSIGNED); + fhp = &nfh.fh_generic; + bzero((caddr_t)fhp, sizeof(nfh)); fhp->fh_fsid = vp->v_mount->mnt_stat.f_fsid; VFS_VPTOFH(vp, &fhp->fh_fid); + nfsm_srvfhtom(fhp, 1); m = mreq; siz = 0; while (m) { @@ -918,7 +919,7 @@ nqnfs_vacated(vp, cred) nmp = VFSTONFS(vp->v_mount); nfsstats.rpccnt[NQNFSPROC_VACATED]++; - nfsm_reqhead(vp, NQNFSPROC_VACATED, NFSX_V3FH); + nfsm_reqhead(vp, NQNFSPROC_VACATED, NFSX_FH(1)); nfsm_fhtom(vp, 1); m = mreq; i = 0; @@ -1092,14 +1093,16 @@ nqnfs_clientd(nmp, cred, ncd, flag, argp, p) if (vpid == vp->v_id) { CIRCLEQ_REMOVE(&nmp->nm_timerhead, np, n_timer); np->n_timer.cqe_next = 0; - if ((np->n_flag & (NMODIFIED | NQNFSEVICTED)) - && vp->v_type == VREG) { + if (np->n_flag & (NMODIFIED | NQNFSEVICTED)) { if (np->n_flag & NQNFSEVICTED) { + if (vp->v_type == VDIR) + nfs_invaldir(vp); + cache_purge(vp); (void) nfs_vinvalbuf(vp, V_SAVE, cred, p, 0); np->n_flag &= ~NQNFSEVICTED; (void) nqnfs_vacated(vp, cred); - } else { + } else if (vp->v_type == VREG) { (void) VOP_FSYNC(vp, cred, MNT_WAIT, p); np->n_flag &= ~NMODIFIED; diff --git a/sys/nfs/nfs_socket.c b/sys/nfs/nfs_socket.c index c3e88e547994..0ea7f690f274 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.24 1997/04/27 20:01:21 wollman Exp $ + * $Id: nfs_socket.c,v 1.25 1997/05/13 17:25:44 dfr Exp $ */ /* @@ -1264,7 +1264,8 @@ nfs_rephead(siz, nd, slp, err, cache, frev, mrq, mbp, bposp) *tl = 0; } } - *mrq = mreq; + if (mrq != NULL) + *mrq = mreq; *mbp = mb; *bposp = bpos; if (err != 0 && err != NFSERR_RETVOID) diff --git a/sys/nfs/nfs_vfsops.c b/sys/nfs/nfs_vfsops.c index 207b1293c68f..9bcc0f7adafc 100644 --- a/sys/nfs/nfs_vfsops.c +++ b/sys/nfs/nfs_vfsops.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs_vfsops.c 8.12 (Berkeley) 5/20/95 - * $Id: nfs_vfsops.c,v 1.41 1997/05/11 18:05:38 tegge Exp $ + * $Id: nfs_vfsops.c,v 1.42 1997/05/12 19:02:56 tegge Exp $ */ #include @@ -706,6 +706,13 @@ mountnfs(argp, mp, nam, pth, hst, vpp) bcopy(pth, mp->mnt_stat.f_mntonname, MNAMELEN); nmp->nm_nam = nam; + /* + * Silently clear NFSMNT_NOCONN if it's a TCP mount, it makes + * no sense in that context. + */ + if (argp->sotype == SOCK_STREAM) + argp->flags &= ~NFSMNT_NOCONN; + if ((argp->flags & NFSMNT_TIMEO) && argp->timeo > 0) { nmp->nm_timeo = (argp->timeo * NFS_HZ + 5) / 10; if (nmp->nm_timeo < NFS_MINTIMEO) diff --git a/sys/nfs/nfsrtt.h b/sys/nfs/nfsrtt.h index f4fcaaff1ed6..7915ff05fd5d 100644 --- a/sys/nfs/nfsrtt.h +++ b/sys/nfs/nfsrtt.h @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfsrtt.h 8.2 (Berkeley) 3/30/95 - * $Id$ + * $Id: nfsrtt.h,v 1.7 1997/02/22 09:42:50 peter Exp $ */ @@ -58,7 +58,7 @@ struct nfsrtt { int pos; /* Position in array for next entry */ struct rttl { - int proc; /* NFS procedure number */ + u_int32_t proc; /* NFS procedure number */ int rtt; /* Measured round trip time */ int rto; /* Round Trip Timeout */ int sent; /* # rpcs in progress */ @@ -94,7 +94,7 @@ struct nfsdrt { int pos; /* Position of next log entry */ struct drt { int flag; /* Bits as defined above */ - int proc; /* NFS procedure number */ + u_int32_t proc; /* NFS procedure number */ u_long ipadr; /* IP address of client */ int resptime; /* Response time (usec) */ struct timeval tstamp; /* Timestamp of log entry */ diff --git a/sys/nfs/nfsrvcache.h b/sys/nfs/nfsrvcache.h index 7ed7e4488c7c..e7cf8290c13e 100644 --- a/sys/nfs/nfsrvcache.h +++ b/sys/nfs/nfsrvcache.h @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfsrvcache.h 8.3 (Berkeley) 3/30/95 - * $Id$ + * $Id: nfsrvcache.h,v 1.8 1997/02/22 09:42:51 peter Exp $ */ @@ -56,7 +56,7 @@ struct nfsrvcache { int ru_repstat; /* Reply status */ } rc_un; union nethostaddr rc_haddr; /* Host address */ - short rc_proc; /* rpc proc number */ + u_int32_t rc_proc; /* rpc proc number */ u_char rc_state; /* Current state of request */ u_char rc_flag; /* Flag bits */ }; diff --git a/sys/nfsclient/nfs.h b/sys/nfsclient/nfs.h index 2dc19c176136..3521dae9ac28 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.26 1997/05/13 17:25:44 dfr Exp $ + * $Id: nfs.h,v 1.27 1997/05/19 14:36:46 dfr Exp $ */ #ifndef _NFS_NFS_H_ @@ -333,7 +333,7 @@ struct nfsreq { int r_retry; /* max retransmission count */ int r_rexmit; /* current retrans count */ int r_timer; /* tick counter on reply */ - int r_procnum; /* NFS procedure number */ + u_int32_t r_procnum; /* NFS procedure number */ int r_rtt; /* RTT for rpc */ struct proc *r_procp; /* Proc that did I/O system call */ }; @@ -483,7 +483,7 @@ struct nfsrv_descript { struct mbuf *nd_nam; /* and socket addr */ struct mbuf *nd_nam2; /* return socket addr */ caddr_t nd_dpos; /* Current dissect pos */ - int nd_procnum; /* RPC # */ + u_int32_t nd_procnum; /* RPC # */ int nd_stable; /* storage type */ int nd_flag; /* nd_flag */ int nd_len; /* Length of this write */ diff --git a/sys/nfsclient/nfs_socket.c b/sys/nfsclient/nfs_socket.c index c3e88e547994..0ea7f690f274 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.24 1997/04/27 20:01:21 wollman Exp $ + * $Id: nfs_socket.c,v 1.25 1997/05/13 17:25:44 dfr Exp $ */ /* @@ -1264,7 +1264,8 @@ nfs_rephead(siz, nd, slp, err, cache, frev, mrq, mbp, bposp) *tl = 0; } } - *mrq = mreq; + if (mrq != NULL) + *mrq = mreq; *mbp = mb; *bposp = bpos; if (err != 0 && err != NFSERR_RETVOID) diff --git a/sys/nfsclient/nfs_vfsops.c b/sys/nfsclient/nfs_vfsops.c index 207b1293c68f..9bcc0f7adafc 100644 --- a/sys/nfsclient/nfs_vfsops.c +++ b/sys/nfsclient/nfs_vfsops.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs_vfsops.c 8.12 (Berkeley) 5/20/95 - * $Id: nfs_vfsops.c,v 1.41 1997/05/11 18:05:38 tegge Exp $ + * $Id: nfs_vfsops.c,v 1.42 1997/05/12 19:02:56 tegge Exp $ */ #include @@ -706,6 +706,13 @@ mountnfs(argp, mp, nam, pth, hst, vpp) bcopy(pth, mp->mnt_stat.f_mntonname, MNAMELEN); nmp->nm_nam = nam; + /* + * Silently clear NFSMNT_NOCONN if it's a TCP mount, it makes + * no sense in that context. + */ + if (argp->sotype == SOCK_STREAM) + argp->flags &= ~NFSMNT_NOCONN; + if ((argp->flags & NFSMNT_TIMEO) && argp->timeo > 0) { nmp->nm_timeo = (argp->timeo * NFS_HZ + 5) / 10; if (nmp->nm_timeo < NFS_MINTIMEO) diff --git a/sys/nfsclient/nfsargs.h b/sys/nfsclient/nfsargs.h index 2dc19c176136..3521dae9ac28 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.26 1997/05/13 17:25:44 dfr Exp $ + * $Id: nfs.h,v 1.27 1997/05/19 14:36:46 dfr Exp $ */ #ifndef _NFS_NFS_H_ @@ -333,7 +333,7 @@ struct nfsreq { int r_retry; /* max retransmission count */ int r_rexmit; /* current retrans count */ int r_timer; /* tick counter on reply */ - int r_procnum; /* NFS procedure number */ + u_int32_t r_procnum; /* NFS procedure number */ int r_rtt; /* RTT for rpc */ struct proc *r_procp; /* Proc that did I/O system call */ }; @@ -483,7 +483,7 @@ struct nfsrv_descript { struct mbuf *nd_nam; /* and socket addr */ struct mbuf *nd_nam2; /* return socket addr */ caddr_t nd_dpos; /* Current dissect pos */ - int nd_procnum; /* RPC # */ + u_int32_t nd_procnum; /* RPC # */ int nd_stable; /* storage type */ int nd_flag; /* nd_flag */ int nd_len; /* Length of this write */ diff --git a/sys/nfsclient/nfsstats.h b/sys/nfsclient/nfsstats.h index 2dc19c176136..3521dae9ac28 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.26 1997/05/13 17:25:44 dfr Exp $ + * $Id: nfs.h,v 1.27 1997/05/19 14:36:46 dfr Exp $ */ #ifndef _NFS_NFS_H_ @@ -333,7 +333,7 @@ struct nfsreq { int r_retry; /* max retransmission count */ int r_rexmit; /* current retrans count */ int r_timer; /* tick counter on reply */ - int r_procnum; /* NFS procedure number */ + u_int32_t r_procnum; /* NFS procedure number */ int r_rtt; /* RTT for rpc */ struct proc *r_procp; /* Proc that did I/O system call */ }; @@ -483,7 +483,7 @@ struct nfsrv_descript { struct mbuf *nd_nam; /* and socket addr */ struct mbuf *nd_nam2; /* return socket addr */ caddr_t nd_dpos; /* Current dissect pos */ - int nd_procnum; /* RPC # */ + u_int32_t nd_procnum; /* RPC # */ int nd_stable; /* storage type */ int nd_flag; /* nd_flag */ int nd_len; /* Length of this write */ diff --git a/sys/nfsserver/nfs.h b/sys/nfsserver/nfs.h index 2dc19c176136..3521dae9ac28 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.26 1997/05/13 17:25:44 dfr Exp $ + * $Id: nfs.h,v 1.27 1997/05/19 14:36:46 dfr Exp $ */ #ifndef _NFS_NFS_H_ @@ -333,7 +333,7 @@ struct nfsreq { int r_retry; /* max retransmission count */ int r_rexmit; /* current retrans count */ int r_timer; /* tick counter on reply */ - int r_procnum; /* NFS procedure number */ + u_int32_t r_procnum; /* NFS procedure number */ int r_rtt; /* RTT for rpc */ struct proc *r_procp; /* Proc that did I/O system call */ }; @@ -483,7 +483,7 @@ struct nfsrv_descript { struct mbuf *nd_nam; /* and socket addr */ struct mbuf *nd_nam2; /* return socket addr */ caddr_t nd_dpos; /* Current dissect pos */ - int nd_procnum; /* RPC # */ + u_int32_t nd_procnum; /* RPC # */ int nd_stable; /* storage type */ int nd_flag; /* nd_flag */ int nd_len; /* Length of this write */ diff --git a/sys/nfsserver/nfs_srvsock.c b/sys/nfsserver/nfs_srvsock.c index c3e88e547994..0ea7f690f274 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.24 1997/04/27 20:01:21 wollman Exp $ + * $Id: nfs_socket.c,v 1.25 1997/05/13 17:25:44 dfr Exp $ */ /* @@ -1264,7 +1264,8 @@ nfs_rephead(siz, nd, slp, err, cache, frev, mrq, mbp, bposp) *tl = 0; } } - *mrq = mreq; + if (mrq != NULL) + *mrq = mreq; *mbp = mb; *bposp = bpos; if (err != 0 && err != NFSERR_RETVOID) diff --git a/sys/nfsserver/nfsrvcache.h b/sys/nfsserver/nfsrvcache.h index 7ed7e4488c7c..e7cf8290c13e 100644 --- a/sys/nfsserver/nfsrvcache.h +++ b/sys/nfsserver/nfsrvcache.h @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfsrvcache.h 8.3 (Berkeley) 3/30/95 - * $Id$ + * $Id: nfsrvcache.h,v 1.8 1997/02/22 09:42:51 peter Exp $ */ @@ -56,7 +56,7 @@ struct nfsrvcache { int ru_repstat; /* Reply status */ } rc_un; union nethostaddr rc_haddr; /* Host address */ - short rc_proc; /* rpc proc number */ + u_int32_t rc_proc; /* rpc proc number */ u_char rc_state; /* Current state of request */ u_char rc_flag; /* Flag bits */ }; diff --git a/sys/nfsserver/nfsrvstats.h b/sys/nfsserver/nfsrvstats.h index 2dc19c176136..3521dae9ac28 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.26 1997/05/13 17:25:44 dfr Exp $ + * $Id: nfs.h,v 1.27 1997/05/19 14:36:46 dfr Exp $ */ #ifndef _NFS_NFS_H_ @@ -333,7 +333,7 @@ struct nfsreq { int r_retry; /* max retransmission count */ int r_rexmit; /* current retrans count */ int r_timer; /* tick counter on reply */ - int r_procnum; /* NFS procedure number */ + u_int32_t r_procnum; /* NFS procedure number */ int r_rtt; /* RTT for rpc */ struct proc *r_procp; /* Proc that did I/O system call */ }; @@ -483,7 +483,7 @@ struct nfsrv_descript { struct mbuf *nd_nam; /* and socket addr */ struct mbuf *nd_nam2; /* return socket addr */ caddr_t nd_dpos; /* Current dissect pos */ - int nd_procnum; /* RPC # */ + u_int32_t nd_procnum; /* RPC # */ int nd_stable; /* storage type */ int nd_flag; /* nd_flag */ int nd_len; /* Length of this write */