summaryrefslogtreecommitdiffstats
path: root/sys/nfs/nfs_nqlease.c
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>1995-06-27 11:07:30 +0000
committerdfr <dfr@FreeBSD.org>1995-06-27 11:07:30 +0000
commit666343f7f055c064375d48bb9a608730d7145beb (patch)
tree372bad41f8c547f40d0826ed596c53dc772ab986 /sys/nfs/nfs_nqlease.c
parent6da3ef32238f37b3b45cf709205fcff60bcbda7f (diff)
downloadFreeBSD-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.c293
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;
OpenPOWER on IntegriCloud