diff options
author | dfr <dfr@FreeBSD.org> | 1995-06-27 11:07:30 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 1995-06-27 11:07:30 +0000 |
commit | 666343f7f055c064375d48bb9a608730d7145beb (patch) | |
tree | 372bad41f8c547f40d0826ed596c53dc772ab986 /sys/nfs/nfs_nqlease.c | |
parent | 6da3ef32238f37b3b45cf709205fcff60bcbda7f (diff) | |
download | FreeBSD-src-666343f7f055c064375d48bb9a608730d7145beb.zip FreeBSD-src-666343f7f055c064375d48bb9a608730d7145beb.tar.gz |
Changes to support version 3 of the NFS protocol.
The version 2 support has been tested (client+server) against FreeBSD-2.0,
IRIX 5.3 and FreeBSD-current (using a loopback mount). The version 2 support
is stable AFAIK.
The version 3 support has been tested with a loopback mount and minimally
against an IRIX 5.3 server. It needs more testing and may have problems.
I have patched amd to support the new variable length filehandles although
it will still only use version 2 of the protocol.
Before booting a kernel with these changes, nfs clients will need to at least
build and install /usr/sbin/mount_nfs. Servers will need to build and
install /usr/sbin/mountd.
NFS diskless support is untested.
Obtained from: Rick Macklem <rick@snowhite.cis.uoguelph.ca>
Diffstat (limited to 'sys/nfs/nfs_nqlease.c')
-rw-r--r-- | sys/nfs/nfs_nqlease.c | 293 |
1 files changed, 179 insertions, 114 deletions
diff --git a/sys/nfs/nfs_nqlease.c b/sys/nfs/nfs_nqlease.c index 81571de..d953699 100644 --- a/sys/nfs/nfs_nqlease.c +++ b/sys/nfs/nfs_nqlease.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs_nqlease.c 8.3 (Berkeley) 1/4/94 - * $Id: nfs_nqlease.c,v 1.10 1995/02/15 03:39:58 davidg Exp $ + * $Id: nfs_nqlease.c,v 1.11 1995/05/30 08:12:36 rgrimes Exp $ */ /* @@ -66,7 +66,7 @@ #include <netinet/in.h> #include <nfs/rpcv2.h> -#include <nfs/nfsv2.h> +#include <nfs/nfsproto.h> #include <nfs/nfs.h> #include <nfs/nfsm_subs.h> #include <nfs/xdr_subs.h> @@ -75,7 +75,6 @@ #include <nfs/nfsmount.h> time_t nqnfsstarttime = (time_t)0; -u_long nqnfs_prog, nqnfs_vers; int nqsrv_clockskew = NQ_CLOCKSKEW; int nqsrv_writeslack = NQ_WRITESLACK; int nqsrv_maxlease = NQ_MAXLEASE; @@ -91,14 +90,13 @@ struct mbuf *nfsm_rpchead(); */ int nqnfs_piggy[NFS_NPROCS] = { 0, - NQL_READ, - NQL_WRITE, 0, - NQL_READ, - NQL_READ, - NQL_READ, + ND_WRITE, + ND_READ, 0, - NQL_WRITE, + ND_READ, + ND_READ, + ND_WRITE, 0, 0, 0, @@ -106,24 +104,30 @@ int nqnfs_piggy[NFS_NPROCS] = { 0, 0, 0, - NQL_READ, 0, - NQL_READ, + ND_READ, + ND_READ, + 0, + 0, + 0, + 0, 0, 0, 0, 0, }; -extern nfstype nfs_type[9]; +extern nfstype nfsv2_type[9]; +extern nfstype nfsv3_type[9]; extern struct nfssvc_sock *nfs_udpsock, *nfs_cltpsock; extern int nfsd_waiting; +extern struct nfsstats nfsstats; #define TRUE 1 #define FALSE 0 /* - * Get or check for a lease for "vp", based on NQL_CHECK flag. + * Get or check for a lease for "vp", based on ND_CHECK flag. * The rules are as follows: * - if a current non-caching lease, reply non-caching * - if a current lease for same host only, extend lease @@ -146,11 +150,12 @@ extern int nfsd_waiting; * queue yet. (Ditto for the splsoftclock() and splx(s) calls) */ int -nqsrv_getlease(vp, duration, flags, nd, nam, cachablep, frev, cred) +nqsrv_getlease(vp, duration, flags, slp, procp, nam, cachablep, frev, cred) struct vnode *vp; u_long *duration; int flags; - struct nfsd *nd; + struct nfssvc_sock *slp; + struct proc *procp; struct mbuf *nam; int *cachablep; u_quad_t *frev; @@ -169,13 +174,13 @@ nqsrv_getlease(vp, duration, flags, nd, nam, cachablep, frev, cred) return (0); if (*duration > nqsrv_maxlease) *duration = nqsrv_maxlease; - error = VOP_GETATTR(vp, &vattr, cred, nd->nd_procp); + error = VOP_GETATTR(vp, &vattr, cred, procp); if (error) return (error); *frev = vattr.va_filerev; s = splsoftclock(); tlp = vp->v_lease; - if ((flags & NQL_CHECK) == 0) + if ((flags & ND_CHECK) == 0) nfsstats.srvnqnfs_getleases++; if (tlp == (struct nqlease *)0) { @@ -205,12 +210,12 @@ nqsrv_getlease(vp, duration, flags, nd, nam, cachablep, frev, cred) if (lp) { if ((lp->lc_flag & LC_NONCACHABLE) || (lp->lc_morehosts == (struct nqm *)0 && - nqsrv_cmpnam(nd->nd_slp, nam, &lp->lc_host))) + nqsrv_cmpnam(slp, nam, &lp->lc_host))) goto doreply; - if ((flags & NQL_READ) && (lp->lc_flag & LC_WRITE) == 0) { - if (flags & NQL_CHECK) + if ((flags & ND_READ) && (lp->lc_flag & LC_WRITE) == 0) { + if (flags & ND_CHECK) goto doreply; - if (nqsrv_cmpnam(nd->nd_slp, nam, &lp->lc_host)) + if (nqsrv_cmpnam(slp, nam, &lp->lc_host)) goto doreply; i = 0; if (lp->lc_morehosts) { @@ -222,7 +227,7 @@ nqsrv_getlease(vp, duration, flags, nd, nam, cachablep, frev, cred) ok = 0; } while (ok && (lph->lph_flag & LC_VALID)) { - if (nqsrv_cmpnam(nd->nd_slp, nam, lph)) + if (nqsrv_cmpnam(slp, nam, lph)) goto doreply; if (++i == LC_MOREHOSTSIZ) { i = 0; @@ -242,12 +247,12 @@ nqsrv_getlease(vp, duration, flags, nd, nam, cachablep, frev, cred) bzero((caddr_t)*lphp, sizeof (struct nqm)); lph = (*lphp)->lpm_hosts; } - nqsrv_addhost(lph, nd->nd_slp, nam); + nqsrv_addhost(lph, slp, nam); nqsrv_unlocklease(lp); } else { lp->lc_flag |= LC_NONCACHABLE; nqsrv_locklease(lp); - nqsrv_send_eviction(vp, lp, nd->nd_slp, nam, cred); + nqsrv_send_eviction(vp, lp, slp, nam, cred); nqsrv_waitfor_expiry(lp); nqsrv_unlocklease(lp); } @@ -255,20 +260,20 @@ doreply: /* * Update the lease and return */ - if ((flags & NQL_CHECK) == 0) + if ((flags & ND_CHECK) == 0) nqsrv_instimeq(lp, *duration); if (lp->lc_flag & LC_NONCACHABLE) *cachablep = 0; else { *cachablep = 1; - if (flags & NQL_WRITE) + if (flags & ND_WRITE) lp->lc_flag |= LC_WRITTEN; } splx(s); return (0); } splx(s); - if (flags & NQL_CHECK) + if (flags & ND_CHECK) return (0); /* @@ -285,9 +290,9 @@ doreply: } MALLOC(lp, struct nqlease *, sizeof (struct nqlease), M_NQLEASE, M_WAITOK); bzero((caddr_t)lp, sizeof (struct nqlease)); - if (flags & NQL_WRITE) + if (flags & ND_WRITE) lp->lc_flag |= (LC_WRITE | LC_WRITTEN); - nqsrv_addhost(&lp->lc_host, nd->nd_slp, nam); + nqsrv_addhost(&lp->lc_host, slp, nam); lp->lc_vp = vp; lp->lc_fsid = fh.fh_fsid; bcopy(fh.fh_fid.fid_data, lp->lc_fiddata, @@ -308,9 +313,12 @@ doreply: /* * Local lease check for server syscalls. * Just set up args and let nqsrv_getlease() do the rest. + * nqnfs_vop_lease_check() is the VOP_LEASE() form of the same routine. + * Ifdef'd code in nfsnode.h renames these routines to whatever a particular + * OS needs. */ void -nfs_lease_check(vp, p, cred, flag) +nqnfs_lease_check(vp, p, cred, flag) struct vnode *vp; struct proc *p; struct ucred *cred; @@ -318,14 +326,31 @@ nfs_lease_check(vp, p, cred, flag) { u_long duration = 0; int cache; - struct nfsd nfsd; u_quad_t frev; - nfsd.nd_slp = NQLOCALSLP; - nfsd.nd_procp = p; - (void) nqsrv_getlease(vp, &duration, NQL_CHECK | flag, &nfsd, - (struct mbuf *)0, &cache, &frev, cred); + (void) nqsrv_getlease(vp, &duration, ND_CHECK | flag, NQLOCALSLP, + p, (struct mbuf *)0, &cache, &frev, cred); +} + +#ifdef HAS_VOPLEASE +int +nqnfs_vop_lease_check(ap) + struct vop_lease_args /* { + struct vnode *a_vp; + struct proc *a_p; + struct ucred *a_cred; + int a_flag; + } */ *ap; +{ + u_long duration = 0; + int cache; + u_quad_t frev; + + (void) nqsrv_getlease(ap->a_vp, &duration, ND_CHECK | ap->a_flag, + NQLOCALSLP, ap->a_p, (struct mbuf *)0, &cache, &frev, ap->a_cred); + return (0); } +#endif /* * Add a host to an nqhost structure for a lease. @@ -486,9 +511,9 @@ nqsrv_send_eviction(vp, lp, slp, nam, cred) else solockp = (int *)0; nfsm_reqhead((struct vnode *)0, NQNFSPROC_EVICTED, - NFSX_FH); - nfsm_build(cp, caddr_t, NFSX_FH); - bzero(cp, NFSX_FH); + NFSX_V3FH); + nfsm_build(cp, caddr_t, NFSX_V3FH); + bzero(cp, NFSX_V3FH); fhp = (fhandle_t *)cp; fhp->fh_fsid = vp->v_mount->mnt_stat.f_fsid; VFS_VPTOFH(vp, &fhp->fh_fid); @@ -502,8 +527,9 @@ nqsrv_send_eviction(vp, lp, slp, nam, cred) printf("mbuf siz=%d\n",siz); panic("Bad nfs svc reply"); } - m = nfsm_rpchead(cred, TRUE, NQNFSPROC_EVICTED, - RPCAUTH_UNIX, 5*NFSX_UNSIGNED, (char *)0, + m = nfsm_rpchead(cred, (NFSMNT_NFSV3 | NFSMNT_NQNFS), + NQNFSPROC_EVICTED, + RPCAUTH_UNIX, 5 * NFSX_UNSIGNED, (char *)0, mreq, siz, &mheadend, &xid); /* * For stream protocols, prepend a Sun RPC @@ -677,18 +703,21 @@ nqnfs_serverd() * do the real work. */ int -nqnfsrv_getlease(nfsd, mrep, md, dpos, cred, nam, mrq) - struct nfsd *nfsd; - struct mbuf *mrep, *md; - caddr_t dpos; - struct ucred *cred; - struct mbuf *nam, **mrq; +nqnfsrv_getlease(nfsd, slp, procp, mrq) + struct nfsrv_descript *nfsd; + struct nfssvc_sock *slp; + struct proc *procp; + struct mbuf **mrq; { - register struct nfsv2_fattr *fp; + struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md; + struct mbuf *nam = nfsd->nd_nam; + caddr_t dpos = nfsd->nd_dpos; + struct ucred *cred = &nfsd->nd_cr; + register struct nfs_fattr *fp; struct vattr va; register struct vattr *vap = &va; struct vnode *vp; - nfsv2fh_t nfh; + nfsfh_t nfh; fhandle_t *fhp; register u_long *tl; register long t1; @@ -701,29 +730,29 @@ nqnfsrv_getlease(nfsd, mrep, md, dpos, cred, nam, mrq) fhp = &nfh.fh_generic; nfsm_srvmtofh(fhp); - nfsm_dissect(tl, u_long *, 2*NFSX_UNSIGNED); + nfsm_dissect(tl, u_long *, 2 * NFSX_UNSIGNED); flags = fxdr_unsigned(int, *tl++); nfsd->nd_duration = fxdr_unsigned(int, *tl); - error = nfsrv_fhtovp(fhp, - TRUE, &vp, cred, nfsd->nd_slp, nam, &rdonly); + error = nfsrv_fhtovp(fhp, 1, &vp, cred, slp, nam, &rdonly, + (nfsd->nd_flag & ND_KERBAUTH)); if (error) nfsm_reply(0); - if (rdonly && flags == NQL_WRITE) { + if (rdonly && flags == ND_WRITE) { error = EROFS; nfsrv_vput(vp); nfsm_reply(0); } - (void) nqsrv_getlease(vp, &nfsd->nd_duration, flags, nfsd, + (void) nqsrv_getlease(vp, &nfsd->nd_duration, flags, slp, procp, nam, &cache, &frev, cred); - error = VOP_GETATTR(vp, vap, cred, nfsd->nd_procp); + error = VOP_GETATTR(vp, vap, cred, procp); nfsrv_vput(vp); - nfsm_reply(NFSX_NQFATTR + 4*NFSX_UNSIGNED); - nfsm_build(tl, u_long *, 4*NFSX_UNSIGNED); + nfsm_reply(NFSX_V3FATTR + 4 * NFSX_UNSIGNED); + nfsm_build(tl, u_long *, 4 * NFSX_UNSIGNED); *tl++ = txdr_unsigned(cache); *tl++ = txdr_unsigned(nfsd->nd_duration); txdr_hyper(&frev, tl); - nfsm_build(fp, struct nfsv2_fattr *, NFSX_NQFATTR); - nfsm_srvfillattr; + nfsm_build(fp, struct nfs_fattr *, NFSX_V3FATTR); + nfsm_srvfillattr(vap, fp); nfsm_srvdone; } @@ -732,23 +761,28 @@ nqnfsrv_getlease(nfsd, mrep, md, dpos, cred, nam, mrq) * client. Find the entry and expire it. */ int -nqnfsrv_vacated(nfsd, mrep, md, dpos, cred, nam, mrq) - struct nfsd *nfsd; - struct mbuf *mrep, *md; - caddr_t dpos; - struct ucred *cred; - struct mbuf *nam, **mrq; +nqnfsrv_vacated(nfsd, slp, procp, mrq) + struct nfsrv_descript *nfsd; + struct nfssvc_sock *slp; + struct proc *procp; + struct mbuf **mrq; { + struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md; + struct mbuf *nam = nfsd->nd_nam; + caddr_t dpos = nfsd->nd_dpos; + struct ucred *cred = &nfsd->nd_cr; register struct nqlease *lp; register struct nqhost *lph; struct nqlease *tlp = (struct nqlease *)0; - nfsv2fh_t nfh; + nfsfh_t nfh; fhandle_t *fhp; register u_long *tl; register long t1; struct nqm *lphnext; - int error = 0, i, len, ok, gotit = 0; - char *cp2; + struct mbuf *mreq, *mb; + int error = 0, i, len, ok, gotit = 0, cache = 0; + char *cp2, *bpos; + u_quad_t frev; fhp = &nfh.fh_generic; nfsm_srvmtofh(fhp); @@ -774,7 +808,7 @@ nqnfsrv_vacated(nfsd, mrep, md, dpos, cred, nam, mrq) lphnext = lp->lc_morehosts; ok = 1; while (ok && (lph->lph_flag & LC_VALID)) { - if (nqsrv_cmpnam(nfsd->nd_slp, nam, lph)) { + if (nqsrv_cmpnam(slp, nam, lph)) { lph->lph_flag |= LC_VACATED; gotit++; break; @@ -812,7 +846,7 @@ nqnfs_getlease(vp, rwflag, cred, p) { register u_long *tl; register caddr_t cp; - register long t1; + register long t1, t2; register struct nfsnode *np; struct nfsmount *nmp = VFSTONFS(vp->v_mount); caddr_t bpos, dpos, cp2; @@ -823,16 +857,16 @@ nqnfs_getlease(vp, rwflag, cred, p) u_quad_t frev; nfsstats.rpccnt[NQNFSPROC_GETLEASE]++; - mb = mreq = nfsm_reqh(vp, NQNFSPROC_GETLEASE, NFSX_FH+2*NFSX_UNSIGNED, + mb = mreq = nfsm_reqh(vp, NQNFSPROC_GETLEASE, NFSX_V3FH+2*NFSX_UNSIGNED, &bpos); - nfsm_fhtom(vp); - nfsm_build(tl, u_long *, 2*NFSX_UNSIGNED); + nfsm_fhtom(vp, 1); + nfsm_build(tl, u_long *, 2 * NFSX_UNSIGNED); *tl++ = txdr_unsigned(rwflag); *tl = txdr_unsigned(nmp->nm_leaseterm); reqtime = time.tv_sec; nfsm_request(vp, NQNFSPROC_GETLEASE, p, cred); np = VTONFS(vp); - nfsm_dissect(tl, u_long *, 4*NFSX_UNSIGNED); + nfsm_dissect(tl, u_long *, 4 * NFSX_UNSIGNED); cachable = fxdr_unsigned(int, *tl++); reqtime += fxdr_unsigned(int, *tl++); if (reqtime > time.tv_sec) { @@ -856,6 +890,8 @@ nqnfs_vacated(vp, cred) register caddr_t cp; register struct mbuf *m; register int i; + register u_long *tl; + register long t1, t2; caddr_t bpos; u_long xid; int error = 0; @@ -865,16 +901,16 @@ nqnfs_vacated(vp, cred) nmp = VFSTONFS(vp->v_mount); nfsstats.rpccnt[NQNFSPROC_VACATED]++; - nfsm_reqhead(vp, NQNFSPROC_VACATED, NFSX_FH); - nfsm_fhtom(vp); + nfsm_reqhead(vp, NQNFSPROC_VACATED, NFSX_V3FH); + nfsm_fhtom(vp, 1); m = mreq; i = 0; while (m) { i += m->m_len; m = m->m_next; } - m = nfsm_rpchead(cred, TRUE, NQNFSPROC_VACATED, - RPCAUTH_UNIX, 5*NFSX_UNSIGNED, (char *)0, + m = nfsm_rpchead(cred, nmp->nm_flag, NQNFSPROC_VACATED, + RPCAUTH_UNIX, 5 * NFSX_UNSIGNED, (char *)0, mreq, i, &mheadend, &xid); if (nmp->nm_sotype == SOCK_STREAM) { M_PREPEND(m, NFSX_UNSIGNED, M_WAIT); @@ -888,6 +924,7 @@ nqnfs_vacated(vp, cred) (void) nfs_send(nmp->nm_so, nmp->nm_nam, m, &myrep); if (nmp->nm_soflags & PR_CONNREQUIRED) nfs_sndunlock(&nmp->nm_flag); +nfsmout: return (error); } @@ -903,29 +940,37 @@ nqnfs_callback(nmp, mrep, md, dpos) register struct vnode *vp; register u_long *tl; register long t1; - nfsv2fh_t nfh; + nfsfh_t nfh; fhandle_t *fhp; struct nfsnode *np; - struct nfsd nd; - int error; - char *cp2; + struct nfsd tnfsd; + struct nfssvc_sock *slp; + struct nfsrv_descript ndesc; + register struct nfsrv_descript *nfsd = &ndesc; + struct mbuf **mrq = (struct mbuf **)0, *mb, *mreq; + int error = 0, cache = 0; + char *cp2, *bpos; + u_quad_t frev; - nd.nd_mrep = mrep; - nd.nd_md = md; - nd.nd_dpos = dpos; - error = nfs_getreq(&nd, FALSE); +#ifndef nolint + slp = NULL; +#endif + nfsd->nd_mrep = mrep; + nfsd->nd_md = md; + nfsd->nd_dpos = dpos; + error = nfs_getreq(nfsd, &tnfsd, FALSE); if (error) return (error); - md = nd.nd_md; - dpos = nd.nd_dpos; - if (nd.nd_procnum != NQNFSPROC_EVICTED) { + md = nfsd->nd_md; + dpos = nfsd->nd_dpos; + if (nfsd->nd_procnum != NQNFSPROC_EVICTED) { m_freem(mrep); return (EPERM); } fhp = &nfh.fh_generic; nfsm_srvmtofh(fhp); m_freem(mrep); - error = nfs_nget(nmp->nm_mountp, &nfh, &np); + error = nfs_nget(nmp->nm_mountp, (nfsfh_t *)fhp, NFSX_V3FH, &np); if (error) return (error); vp = NFSTOV(np); @@ -937,7 +982,7 @@ nqnfs_callback(nmp, mrep, md, dpos) CIRCLEQ_INSERT_HEAD(&nmp->nm_timerhead, np, n_timer); } } - vrele(vp); + vput(vp); nfsm_srvdone; } @@ -960,35 +1005,39 @@ nqnfs_clientd(nmp, cred, ncd, flag, argp, p) register struct nfsnode *np; struct vnode *vp; struct nfsreq myrep; + struct nfsuid *nuidp, *nnuidp; int error = 0, vpid; /* * First initialize some variables */ - nqnfs_prog = txdr_unsigned(NQNFS_PROG); - nqnfs_vers = txdr_unsigned(NQNFS_VER1); /* * If an authorization string is being passed in, get it. */ if ((flag & NFSSVC_GOTAUTH) && - (nmp->nm_flag & (NFSMNT_WAITAUTH | NFSMNT_DISMNT)) == 0) { - if (nmp->nm_flag & NFSMNT_HASAUTH) - panic("cld kerb"); - if ((flag & NFSSVC_AUTHINFAIL) == 0) { - if (ncd->ncd_authlen <= RPCAUTH_MAXSIZ && - copyin(ncd->ncd_authstr, nmp->nm_authstr, - ncd->ncd_authlen) == 0) { - nmp->nm_authtype = ncd->ncd_authtype; - nmp->nm_authlen = ncd->ncd_authlen; - } else - nmp->nm_flag |= NFSMNT_AUTHERR; + (nmp->nm_flag & (NFSMNT_WAITAUTH | NFSMNT_DISMNT)) == 0) { + if (nmp->nm_flag & NFSMNT_HASAUTH) + panic("cld kerb"); + if ((flag & NFSSVC_AUTHINFAIL) == 0) { + if (ncd->ncd_authlen <= nmp->nm_authlen && + ncd->ncd_verflen <= nmp->nm_verflen && + !copyin(ncd->ncd_authstr,nmp->nm_authstr,ncd->ncd_authlen)&& + !copyin(ncd->ncd_verfstr,nmp->nm_verfstr,ncd->ncd_verflen)){ + nmp->nm_authtype = ncd->ncd_authtype; + nmp->nm_authlen = ncd->ncd_authlen; + nmp->nm_verflen = ncd->ncd_verflen; +#ifdef NFSKERB + nmp->nm_key = ncd->ncd_key; +#endif } else - nmp->nm_flag |= NFSMNT_AUTHERR; - nmp->nm_flag |= NFSMNT_HASAUTH; - wakeup((caddr_t)&nmp->nm_authlen); + nmp->nm_flag |= NFSMNT_AUTHERR; + } else + nmp->nm_flag |= NFSMNT_AUTHERR; + nmp->nm_flag |= NFSMNT_HASAUTH; + wakeup((caddr_t)&nmp->nm_authlen); } else - nmp->nm_flag |= NFSMNT_WAITAUTH; + nmp->nm_flag |= NFSMNT_WAITAUTH; /* * Loop every second updating queue until there is a termination sig. @@ -1016,13 +1065,11 @@ nqnfs_clientd(nmp, cred, ncd, flag, argp, p) while (np != (void *)&nmp->nm_timerhead && (nmp->nm_flag & NFSMNT_DISMINPROG) == 0) { vp = NFSTOV(np); -if (vp->v_mount->mnt_stat.f_fsid.val[1] != MOUNT_NFS) panic("trash2"); vpid = vp->v_id; if (np->n_expiry < time.tv_sec) { if (vget(vp, 1) == 0) { nmp->nm_inprog = vp; if (vpid == vp->v_id) { -if (vp->v_mount->mnt_stat.f_fsid.val[1] != MOUNT_NFS) panic("trash3"); CIRCLEQ_REMOVE(&nmp->nm_timerhead, np, n_timer); np->n_timer.cqe_next = 0; if ((np->n_flag & (NMODIFIED | NQNFSEVICTED)) @@ -1047,9 +1094,8 @@ if (vp->v_mount->mnt_stat.f_fsid.val[1] != MOUNT_NFS) panic("trash3"); == NQNFSWRITE && vp->v_dirtyblkhd.lh_first && vget(vp, 1) == 0) { nmp->nm_inprog = vp; -if (vp->v_mount->mnt_stat.f_fsid.val[1] != MOUNT_NFS) panic("trash4"); if (vpid == vp->v_id && - nqnfs_getlease(vp, NQL_WRITE, cred, p)==0) + nqnfs_getlease(vp, ND_WRITE, cred, p)==0) np->n_brev = np->n_lrev; vrele(vp); nmp->nm_inprog = NULLVP; @@ -1084,6 +1130,16 @@ if (vp->v_mount->mnt_stat.f_fsid.val[1] != MOUNT_NFS) panic("trash4"); (void) dounmount(nmp->nm_mountp, 0, p); } } + + /* + * Finally, we can free up the mount structure. + */ + for (nuidp = nmp->nm_uidlruhead.tqh_first; nuidp != 0; nuidp = nnuidp) { + nnuidp = nuidp->nu_lru.tqe_next; + LIST_REMOVE(nuidp, nu_hash); + TAILQ_REMOVE(&nmp->nm_uidlruhead, nuidp, nu_lru); + free((caddr_t)nuidp, M_NFSUID); + } free((caddr_t)nmp, M_NFSMNT); if (error == EWOULDBLOCK) error = 0; @@ -1095,7 +1151,7 @@ if (vp->v_mount->mnt_stat.f_fsid.val[1] != MOUNT_NFS) panic("trash4"); * Called from the settimeofday() syscall. */ void -nfs_lease_updatetime(deltat) +nqnfs_lease_updatetime(deltat) register int deltat; { register struct nqlease *lp; @@ -1116,8 +1172,17 @@ nfs_lease_updatetime(deltat) * Search the mount list for all nqnfs mounts and do their timer * queues. */ +#if NetBSD >= 1994101 + for (mp = mountlist.cqh_first; mp != (void *)&mountlist; + mp = mp->mnt_list.cqe_next) { +#else for (mp = mountlist.tqh_first; mp != NULL; mp = mp->mnt_list.tqe_next) { +#endif +#ifdef __NetBSD__ + if (!strcmp(&mp->mnt_stat.f_fstypename[0], MOUNT_NFS)) { +#else if (mp->mnt_stat.f_fsid.val[1] == MOUNT_NFS) { +#endif nmp = VFSTONFS(mp); if (nmp->nm_flag & NFSMNT_NQNFS) { for (np = nmp->nm_timerhead.cqh_first; @@ -1174,9 +1239,9 @@ nqnfs_clientlease(nmp, np, rwflag, cachable, expiry, frev) if (np->n_timer.cqe_next != 0) { CIRCLEQ_REMOVE(&nmp->nm_timerhead, np, n_timer); - if (rwflag == NQL_WRITE) + if (rwflag == ND_WRITE) np->n_flag |= NQNFSWRITE; - } else if (rwflag == NQL_READ) + } else if (rwflag == ND_READ) np->n_flag &= ~NQNFSWRITE; else np->n_flag |= NQNFSWRITE; |