svn commit: r335130 - in head/sys/fs: nfs nfsclient
Rick Macklem
rmacklem at FreeBSD.org
Thu Jun 14 10:00:21 UTC 2018
Author: rmacklem
Date: Thu Jun 14 10:00:19 2018
New Revision: 335130
URL: https://svnweb.freebsd.org/changeset/base/335130
Log:
Move four functions in nfscl.ko to nfscommon.ko.
Four functions nfscl_reqstart(), nfscl_fillsattr(), nfsm_stateidtom()
and nfsmnt_mdssession() are now called from within the nfsd.
As such, they needed to be moved from nfscl.ko to nfscommon.ko so that
nfsd.ko would load when nfscl.ko wasn't loaded.
Reported by: herbert at gojira.at
Modified:
head/sys/fs/nfs/nfs_commonsubs.c
head/sys/fs/nfs/nfs_var.h
head/sys/fs/nfs/nfsport.h
head/sys/fs/nfsclient/nfs_clcomsubs.c
head/sys/fs/nfsclient/nfs_clport.c
head/sys/fs/nfsclient/nfsmount.h
Modified: head/sys/fs/nfs/nfs_commonsubs.c
==============================================================================
--- head/sys/fs/nfs/nfs_commonsubs.c Thu Jun 14 09:36:25 2018 (r335129)
+++ head/sys/fs/nfs/nfs_commonsubs.c Thu Jun 14 10:00:19 2018 (r335130)
@@ -79,6 +79,7 @@ extern struct mtx nfsrv_dslock_mtx;
extern volatile int nfsrv_devidcnt;
extern int nfscl_debuglevel;
extern struct nfsdevicehead nfsrv_devidhead;
+extern struct nfsstatsv1 nfsstatsv1;
SYSCTL_DECL(_vfs_nfs);
SYSCTL_INT(_vfs_nfs, OID_AUTO, enable_uidtostring, CTLFLAG_RW,
@@ -189,7 +190,7 @@ static struct nfsrv_lughash *nfsgroupnamehash;
* marked 0 in this array, the code will still work, just not quite as
* efficiently.)
*/
-int nfs_bigreply[NFSV41_NPROCS] = { 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0,
+static int nfs_bigreply[NFSV41_NPROCS] = { 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 };
@@ -204,6 +205,362 @@ static int nfsrv_getrefstr(struct nfsrv_descript *, u_
int *, int *);
static void nfsrv_refstrbigenough(int, u_char **, u_char **, int *);
+static struct {
+ int op;
+ int opcnt;
+ const u_char *tag;
+ int taglen;
+} nfsv4_opmap[NFSV41_NPROCS] = {
+ { 0, 1, "Null", 4 },
+ { NFSV4OP_GETATTR, 1, "Getattr", 7, },
+ { NFSV4OP_SETATTR, 2, "Setattr", 7, },
+ { NFSV4OP_LOOKUP, 3, "Lookup", 6, },
+ { NFSV4OP_ACCESS, 2, "Access", 6, },
+ { NFSV4OP_READLINK, 2, "Readlink", 8, },
+ { NFSV4OP_READ, 1, "Read", 4, },
+ { NFSV4OP_WRITE, 2, "Write", 5, },
+ { NFSV4OP_OPEN, 5, "Open", 4, },
+ { NFSV4OP_CREATE, 5, "Create", 6, },
+ { NFSV4OP_CREATE, 1, "Create", 6, },
+ { NFSV4OP_CREATE, 3, "Create", 6, },
+ { NFSV4OP_REMOVE, 1, "Remove", 6, },
+ { NFSV4OP_REMOVE, 1, "Remove", 6, },
+ { NFSV4OP_SAVEFH, 5, "Rename", 6, },
+ { NFSV4OP_SAVEFH, 4, "Link", 4, },
+ { NFSV4OP_READDIR, 2, "Readdir", 7, },
+ { NFSV4OP_READDIR, 2, "Readdir", 7, },
+ { NFSV4OP_GETATTR, 1, "Getattr", 7, },
+ { NFSV4OP_GETATTR, 1, "Getattr", 7, },
+ { NFSV4OP_GETATTR, 1, "Getattr", 7, },
+ { NFSV4OP_COMMIT, 2, "Commit", 6, },
+ { NFSV4OP_LOOKUPP, 3, "Lookupp", 7, },
+ { NFSV4OP_SETCLIENTID, 1, "SetClientID", 11, },
+ { NFSV4OP_SETCLIENTIDCFRM, 1, "SetClientIDConfirm", 18, },
+ { NFSV4OP_LOCK, 1, "Lock", 4, },
+ { NFSV4OP_LOCKU, 1, "LockU", 5, },
+ { NFSV4OP_OPEN, 2, "Open", 4, },
+ { NFSV4OP_CLOSE, 1, "Close", 5, },
+ { NFSV4OP_OPENCONFIRM, 1, "Openconfirm", 11, },
+ { NFSV4OP_LOCKT, 1, "LockT", 5, },
+ { NFSV4OP_OPENDOWNGRADE, 1, "Opendowngrade", 13, },
+ { NFSV4OP_RENEW, 1, "Renew", 5, },
+ { NFSV4OP_PUTROOTFH, 1, "Dirpath", 7, },
+ { NFSV4OP_RELEASELCKOWN, 1, "Rellckown", 9, },
+ { NFSV4OP_DELEGRETURN, 1, "Delegret", 8, },
+ { NFSV4OP_DELEGRETURN, 3, "DelegRemove", 11, },
+ { NFSV4OP_DELEGRETURN, 7, "DelegRename1", 12, },
+ { NFSV4OP_DELEGRETURN, 9, "DelegRename2", 12, },
+ { NFSV4OP_GETATTR, 1, "Getacl", 6, },
+ { NFSV4OP_SETATTR, 1, "Setacl", 6, },
+ { NFSV4OP_EXCHANGEID, 1, "ExchangeID", 10, },
+ { NFSV4OP_CREATESESSION, 1, "CreateSession", 13, },
+ { NFSV4OP_DESTROYSESSION, 1, "DestroySession", 14, },
+ { NFSV4OP_DESTROYCLIENTID, 1, "DestroyClient", 13, },
+ { NFSV4OP_FREESTATEID, 1, "FreeStateID", 11, },
+ { NFSV4OP_LAYOUTGET, 1, "LayoutGet", 9, },
+ { NFSV4OP_GETDEVINFO, 1, "GetDeviceInfo", 13, },
+ { NFSV4OP_LAYOUTCOMMIT, 1, "LayoutCommit", 12, },
+ { NFSV4OP_LAYOUTRETURN, 1, "LayoutReturn", 12, },
+ { NFSV4OP_RECLAIMCOMPL, 1, "ReclaimComplete", 15, },
+ { NFSV4OP_WRITE, 1, "WriteDS", 7, },
+ { NFSV4OP_READ, 1, "ReadDS", 6, },
+ { NFSV4OP_COMMIT, 1, "CommitDS", 8, },
+ { NFSV4OP_OPEN, 3, "OpenLayoutGet", 13, },
+ { NFSV4OP_OPEN, 8, "CreateLayGet", 12, },
+};
+
+/*
+ * NFS RPCS that have large request message size.
+ */
+static int nfs_bigrequest[NFSV41_NPROCS] = {
+ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0
+};
+
+/*
+ * Start building a request. Mostly just put the first file handle in
+ * place.
+ */
+APPLESTATIC void
+nfscl_reqstart(struct nfsrv_descript *nd, int procnum, struct nfsmount *nmp,
+ u_int8_t *nfhp, int fhlen, u_int32_t **opcntpp, struct nfsclsession *sep,
+ int vers, int minorvers)
+{
+ struct mbuf *mb;
+ u_int32_t *tl;
+ int opcnt;
+ nfsattrbit_t attrbits;
+
+ /*
+ * First, fill in some of the fields of nd.
+ */
+ nd->nd_slotseq = NULL;
+ if (vers == NFS_VER4) {
+ nd->nd_flag = ND_NFSV4 | ND_NFSCL;
+ if (minorvers == NFSV41_MINORVERSION)
+ nd->nd_flag |= ND_NFSV41;
+ } else if (vers == NFS_VER3)
+ nd->nd_flag = ND_NFSV3 | ND_NFSCL;
+ else {
+ if (NFSHASNFSV4(nmp)) {
+ nd->nd_flag = ND_NFSV4 | ND_NFSCL;
+ if (NFSHASNFSV4N(nmp))
+ nd->nd_flag |= ND_NFSV41;
+ } else if (NFSHASNFSV3(nmp))
+ nd->nd_flag = ND_NFSV3 | ND_NFSCL;
+ else
+ nd->nd_flag = ND_NFSV2 | ND_NFSCL;
+ }
+ nd->nd_procnum = procnum;
+ nd->nd_repstat = 0;
+
+ /*
+ * Get the first mbuf for the request.
+ */
+ if (nfs_bigrequest[procnum])
+ NFSMCLGET(mb, M_WAITOK);
+ else
+ NFSMGET(mb);
+ mbuf_setlen(mb, 0);
+ nd->nd_mreq = nd->nd_mb = mb;
+ nd->nd_bpos = NFSMTOD(mb, caddr_t);
+
+ /*
+ * And fill the first file handle into the request.
+ */
+ if (nd->nd_flag & ND_NFSV4) {
+ opcnt = nfsv4_opmap[procnum].opcnt +
+ nfsv4_opflag[nfsv4_opmap[procnum].op].needscfh;
+ if ((nd->nd_flag & ND_NFSV41) != 0) {
+ opcnt += nfsv4_opflag[nfsv4_opmap[procnum].op].needsseq;
+ if (procnum == NFSPROC_RENEW)
+ /*
+ * For the special case of Renew, just do a
+ * Sequence Op.
+ */
+ opcnt = 1;
+ else if (procnum == NFSPROC_WRITEDS ||
+ procnum == NFSPROC_COMMITDS)
+ /*
+ * For the special case of a Writeor Commit to
+ * a DS, the opcnt == 3, for Sequence, PutFH,
+ * Write/Commit.
+ */
+ opcnt = 3;
+ }
+ /*
+ * What should the tag really be?
+ */
+ (void) nfsm_strtom(nd, nfsv4_opmap[procnum].tag,
+ nfsv4_opmap[procnum].taglen);
+ NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
+ if ((nd->nd_flag & ND_NFSV41) != 0)
+ *tl++ = txdr_unsigned(NFSV41_MINORVERSION);
+ else
+ *tl++ = txdr_unsigned(NFSV4_MINORVERSION);
+ if (opcntpp != NULL)
+ *opcntpp = tl;
+ *tl = txdr_unsigned(opcnt);
+ if ((nd->nd_flag & ND_NFSV41) != 0 &&
+ nfsv4_opflag[nfsv4_opmap[procnum].op].needsseq > 0) {
+ if (nfsv4_opflag[nfsv4_opmap[procnum].op].loopbadsess >
+ 0)
+ nd->nd_flag |= ND_LOOPBADSESS;
+ NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+ *tl = txdr_unsigned(NFSV4OP_SEQUENCE);
+ if (sep == NULL) {
+ sep = nfsmnt_mdssession(nmp);
+ nfsv4_setsequence(nmp, nd, sep,
+ nfs_bigreply[procnum]);
+ } else
+ nfsv4_setsequence(nmp, nd, sep,
+ nfs_bigreply[procnum]);
+ }
+ if (nfsv4_opflag[nfsv4_opmap[procnum].op].needscfh > 0) {
+ NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+ *tl = txdr_unsigned(NFSV4OP_PUTFH);
+ (void) nfsm_fhtom(nd, nfhp, fhlen, 0);
+ if (nfsv4_opflag[nfsv4_opmap[procnum].op].needscfh
+ == 2 && procnum != NFSPROC_WRITEDS &&
+ procnum != NFSPROC_COMMITDS) {
+ NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+ *tl = txdr_unsigned(NFSV4OP_GETATTR);
+ /*
+ * For Lookup Ops, we want all the directory
+ * attributes, so we can load the name cache.
+ */
+ if (procnum == NFSPROC_LOOKUP ||
+ procnum == NFSPROC_LOOKUPP)
+ NFSGETATTR_ATTRBIT(&attrbits);
+ else {
+ NFSWCCATTR_ATTRBIT(&attrbits);
+ nd->nd_flag |= ND_V4WCCATTR;
+ }
+ (void) nfsrv_putattrbit(nd, &attrbits);
+ }
+ }
+ if (procnum != NFSPROC_RENEW ||
+ (nd->nd_flag & ND_NFSV41) == 0) {
+ NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+ *tl = txdr_unsigned(nfsv4_opmap[procnum].op);
+ }
+ } else {
+ (void) nfsm_fhtom(nd, nfhp, fhlen, 0);
+ }
+ if (procnum < NFSV41_NPROCS)
+ NFSINCRGLOBAL(nfsstatsv1.rpccnt[procnum]);
+}
+
+/*
+ * Put a state Id in the mbuf list.
+ */
+APPLESTATIC void
+nfsm_stateidtom(struct nfsrv_descript *nd, nfsv4stateid_t *stateidp, int flag)
+{
+ nfsv4stateid_t *st;
+
+ NFSM_BUILD(st, nfsv4stateid_t *, NFSX_STATEID);
+ if (flag == NFSSTATEID_PUTALLZERO) {
+ st->seqid = 0;
+ st->other[0] = 0;
+ st->other[1] = 0;
+ st->other[2] = 0;
+ } else if (flag == NFSSTATEID_PUTALLONE) {
+ st->seqid = 0xffffffff;
+ st->other[0] = 0xffffffff;
+ st->other[1] = 0xffffffff;
+ st->other[2] = 0xffffffff;
+ } else if (flag == NFSSTATEID_PUTSEQIDZERO) {
+ st->seqid = 0;
+ st->other[0] = stateidp->other[0];
+ st->other[1] = stateidp->other[1];
+ st->other[2] = stateidp->other[2];
+ } else {
+ st->seqid = stateidp->seqid;
+ st->other[0] = stateidp->other[0];
+ st->other[1] = stateidp->other[1];
+ st->other[2] = stateidp->other[2];
+ }
+}
+
+/*
+ * Fill in the setable attributes. The full argument indicates whether
+ * to fill in them all or just mode and time.
+ */
+void
+nfscl_fillsattr(struct nfsrv_descript *nd, struct vattr *vap,
+ struct vnode *vp, int flags, u_int32_t rdev)
+{
+ u_int32_t *tl;
+ struct nfsv2_sattr *sp;
+ nfsattrbit_t attrbits;
+
+ switch (nd->nd_flag & (ND_NFSV2 | ND_NFSV3 | ND_NFSV4)) {
+ case ND_NFSV2:
+ NFSM_BUILD(sp, struct nfsv2_sattr *, NFSX_V2SATTR);
+ if (vap->va_mode == (mode_t)VNOVAL)
+ sp->sa_mode = newnfs_xdrneg1;
+ else
+ sp->sa_mode = vtonfsv2_mode(vap->va_type, vap->va_mode);
+ if (vap->va_uid == (uid_t)VNOVAL)
+ sp->sa_uid = newnfs_xdrneg1;
+ else
+ sp->sa_uid = txdr_unsigned(vap->va_uid);
+ if (vap->va_gid == (gid_t)VNOVAL)
+ sp->sa_gid = newnfs_xdrneg1;
+ else
+ sp->sa_gid = txdr_unsigned(vap->va_gid);
+ if (flags & NFSSATTR_SIZE0)
+ sp->sa_size = 0;
+ else if (flags & NFSSATTR_SIZENEG1)
+ sp->sa_size = newnfs_xdrneg1;
+ else if (flags & NFSSATTR_SIZERDEV)
+ sp->sa_size = txdr_unsigned(rdev);
+ else
+ sp->sa_size = txdr_unsigned(vap->va_size);
+ txdr_nfsv2time(&vap->va_atime, &sp->sa_atime);
+ txdr_nfsv2time(&vap->va_mtime, &sp->sa_mtime);
+ break;
+ case ND_NFSV3:
+ if (vap->va_mode != (mode_t)VNOVAL) {
+ NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
+ *tl++ = newnfs_true;
+ *tl = txdr_unsigned(vap->va_mode);
+ } else {
+ NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+ *tl = newnfs_false;
+ }
+ if ((flags & NFSSATTR_FULL) && vap->va_uid != (uid_t)VNOVAL) {
+ NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
+ *tl++ = newnfs_true;
+ *tl = txdr_unsigned(vap->va_uid);
+ } else {
+ NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+ *tl = newnfs_false;
+ }
+ if ((flags & NFSSATTR_FULL) && vap->va_gid != (gid_t)VNOVAL) {
+ NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
+ *tl++ = newnfs_true;
+ *tl = txdr_unsigned(vap->va_gid);
+ } else {
+ NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+ *tl = newnfs_false;
+ }
+ if ((flags & NFSSATTR_FULL) && vap->va_size != VNOVAL) {
+ NFSM_BUILD(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
+ *tl++ = newnfs_true;
+ txdr_hyper(vap->va_size, tl);
+ } else {
+ NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+ *tl = newnfs_false;
+ }
+ if (vap->va_atime.tv_sec != VNOVAL) {
+ if ((vap->va_vaflags & VA_UTIMES_NULL) == 0) {
+ NFSM_BUILD(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
+ *tl++ = txdr_unsigned(NFSV3SATTRTIME_TOCLIENT);
+ txdr_nfsv3time(&vap->va_atime, tl);
+ } else {
+ NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+ *tl = txdr_unsigned(NFSV3SATTRTIME_TOSERVER);
+ }
+ } else {
+ NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+ *tl = txdr_unsigned(NFSV3SATTRTIME_DONTCHANGE);
+ }
+ if (vap->va_mtime.tv_sec != VNOVAL) {
+ if ((vap->va_vaflags & VA_UTIMES_NULL) == 0) {
+ NFSM_BUILD(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
+ *tl++ = txdr_unsigned(NFSV3SATTRTIME_TOCLIENT);
+ txdr_nfsv3time(&vap->va_mtime, tl);
+ } else {
+ NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+ *tl = txdr_unsigned(NFSV3SATTRTIME_TOSERVER);
+ }
+ } else {
+ NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
+ *tl = txdr_unsigned(NFSV3SATTRTIME_DONTCHANGE);
+ }
+ break;
+ case ND_NFSV4:
+ NFSZERO_ATTRBIT(&attrbits);
+ if (vap->va_mode != (mode_t)VNOVAL)
+ NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_MODE);
+ if ((flags & NFSSATTR_FULL) && vap->va_uid != (uid_t)VNOVAL)
+ NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_OWNER);
+ if ((flags & NFSSATTR_FULL) && vap->va_gid != (gid_t)VNOVAL)
+ NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_OWNERGROUP);
+ if ((flags & NFSSATTR_FULL) && vap->va_size != VNOVAL)
+ NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_SIZE);
+ if (vap->va_atime.tv_sec != VNOVAL)
+ NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEACCESSSET);
+ if (vap->va_mtime.tv_sec != VNOVAL)
+ NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEMODIFYSET);
+ (void) nfsv4_fillattr(nd, vp->v_mount, vp, NULL, vap, NULL, 0,
+ &attrbits, NULL, NULL, 0, 0, 0, 0, (uint64_t)0, NULL);
+ break;
+ }
+}
#ifndef APPLE
/*
Modified: head/sys/fs/nfs/nfs_var.h
==============================================================================
--- head/sys/fs/nfs/nfs_var.h Thu Jun 14 09:36:25 2018 (r335129)
+++ head/sys/fs/nfs/nfs_var.h Thu Jun 14 10:00:19 2018 (r335130)
@@ -298,6 +298,11 @@ void nfsrvd_delcache(struct nfsrvcache *);
void nfsrc_trimcache(uint64_t, uint32_t, int);
/* nfs_commonsubs.c */
+void nfscl_reqstart(struct nfsrv_descript *, int, struct nfsmount *,
+ u_int8_t *, int, u_int32_t **, struct nfsclsession *, int, int);
+void nfsm_stateidtom(struct nfsrv_descript *, nfsv4stateid_t *, int);
+void nfscl_fillsattr(struct nfsrv_descript *, struct vattr *,
+ vnode_t, int, u_int32_t);
void newnfs_init(void);
int nfsaddr_match(int, union nethostaddr *, NFSSOCKADDR_T);
int nfsaddr2_match(NFSSOCKADDR_T, NFSSOCKADDR_T);
@@ -347,11 +352,7 @@ struct nfsdevice *nfsv4_findmirror(struct nfsmount *);
/* nfs_clcomsubs.c */
void nfsm_uiombuf(struct nfsrv_descript *, struct uio *, int);
struct mbuf *nfsm_uiombuflist(struct uio *, int, struct mbuf **, char **);
-void nfscl_reqstart(struct nfsrv_descript *, int, struct nfsmount *,
- u_int8_t *, int, u_int32_t **, struct nfsclsession *, int, int);
nfsuint64 *nfscl_getcookie(struct nfsnode *, off_t off, int);
-void nfscl_fillsattr(struct nfsrv_descript *, struct vattr *,
- vnode_t, int, u_int32_t);
u_int8_t *nfscl_getmyip(struct nfsmount *, struct in6_addr *, int *);
int nfsm_getfh(struct nfsrv_descript *, struct nfsfh **);
int nfscl_mtofh(struct nfsrv_descript *, struct nfsfh **,
@@ -363,7 +364,6 @@ int nfscl_wcc_data(struct nfsrv_descript *, vnode_t,
int nfsm_loadattr(struct nfsrv_descript *, struct nfsvattr *);
int nfscl_request(struct nfsrv_descript *, vnode_t,
NFSPROC_T *, struct ucred *, void *);
-void nfsm_stateidtom(struct nfsrv_descript *, nfsv4stateid_t *, int);
/* nfs_nfsdsubs.c */
void nfsd_fhtovp(struct nfsrv_descript *, struct nfsrvfh *, int,
Modified: head/sys/fs/nfs/nfsport.h
==============================================================================
--- head/sys/fs/nfs/nfsport.h Thu Jun 14 09:36:25 2018 (r335129)
+++ head/sys/fs/nfs/nfsport.h Thu Jun 14 10:00:19 2018 (r335130)
@@ -1054,6 +1054,27 @@ extern const char nfs_vnode_tag[];
*/
#define nfsds_failerr(e) ((e) == ENXIO || (e) == EIO)
+/*
+ * Get a pointer to the MDS session, which is always the first element
+ * in the list.
+ * This macro can only be safely used when the NFSLOCKMNT() lock is held.
+ * The inline function can be used when the lock isn't held.
+ */
+#define NFSMNT_MDSSESSION(m) (&(TAILQ_FIRST(&((m)->nm_sess))->nfsclds_sess))
+
+static __inline struct nfsclsession *
+nfsmnt_mdssession(struct nfsmount *nmp)
+{
+ struct nfsclsession *tsep;
+
+ tsep = NULL;
+ mtx_lock(&nmp->nm_mtx);
+ if (TAILQ_FIRST(&nmp->nm_sess) != NULL)
+ tsep = NFSMNT_MDSSESSION(nmp);
+ mtx_unlock(&nmp->nm_mtx);
+ return (tsep);
+}
+
#endif /* _KERNEL */
#endif /* _NFS_NFSPORT_H */
Modified: head/sys/fs/nfsclient/nfs_clcomsubs.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clcomsubs.c Thu Jun 14 09:36:25 2018 (r335129)
+++ head/sys/fs/nfsclient/nfs_clcomsubs.c Thu Jun 14 10:00:19 2018 (r335130)
@@ -49,219 +49,12 @@ extern struct nfsv4_opflag nfsv4_opflag[NFSV41_NOPS];
extern int ncl_mbuf_mlen;
extern enum vtype newnv2tov_type[8];
extern enum vtype nv34tov_type[8];
-extern int nfs_bigreply[NFSV41_NPROCS];
NFSCLSTATEMUTEX;
#endif /* !APPLEKEXT */
static nfsuint64 nfs_nullcookie = {{ 0, 0 }};
-static struct {
- int op;
- int opcnt;
- const u_char *tag;
- int taglen;
-} nfsv4_opmap[NFSV41_NPROCS] = {
- { 0, 1, "Null", 4 },
- { NFSV4OP_GETATTR, 1, "Getattr", 7, },
- { NFSV4OP_SETATTR, 2, "Setattr", 7, },
- { NFSV4OP_LOOKUP, 3, "Lookup", 6, },
- { NFSV4OP_ACCESS, 2, "Access", 6, },
- { NFSV4OP_READLINK, 2, "Readlink", 8, },
- { NFSV4OP_READ, 1, "Read", 4, },
- { NFSV4OP_WRITE, 2, "Write", 5, },
- { NFSV4OP_OPEN, 5, "Open", 4, },
- { NFSV4OP_CREATE, 5, "Create", 6, },
- { NFSV4OP_CREATE, 1, "Create", 6, },
- { NFSV4OP_CREATE, 3, "Create", 6, },
- { NFSV4OP_REMOVE, 1, "Remove", 6, },
- { NFSV4OP_REMOVE, 1, "Remove", 6, },
- { NFSV4OP_SAVEFH, 5, "Rename", 6, },
- { NFSV4OP_SAVEFH, 4, "Link", 4, },
- { NFSV4OP_READDIR, 2, "Readdir", 7, },
- { NFSV4OP_READDIR, 2, "Readdir", 7, },
- { NFSV4OP_GETATTR, 1, "Getattr", 7, },
- { NFSV4OP_GETATTR, 1, "Getattr", 7, },
- { NFSV4OP_GETATTR, 1, "Getattr", 7, },
- { NFSV4OP_COMMIT, 2, "Commit", 6, },
- { NFSV4OP_LOOKUPP, 3, "Lookupp", 7, },
- { NFSV4OP_SETCLIENTID, 1, "SetClientID", 11, },
- { NFSV4OP_SETCLIENTIDCFRM, 1, "SetClientIDConfirm", 18, },
- { NFSV4OP_LOCK, 1, "Lock", 4, },
- { NFSV4OP_LOCKU, 1, "LockU", 5, },
- { NFSV4OP_OPEN, 2, "Open", 4, },
- { NFSV4OP_CLOSE, 1, "Close", 5, },
- { NFSV4OP_OPENCONFIRM, 1, "Openconfirm", 11, },
- { NFSV4OP_LOCKT, 1, "LockT", 5, },
- { NFSV4OP_OPENDOWNGRADE, 1, "Opendowngrade", 13, },
- { NFSV4OP_RENEW, 1, "Renew", 5, },
- { NFSV4OP_PUTROOTFH, 1, "Dirpath", 7, },
- { NFSV4OP_RELEASELCKOWN, 1, "Rellckown", 9, },
- { NFSV4OP_DELEGRETURN, 1, "Delegret", 8, },
- { NFSV4OP_DELEGRETURN, 3, "DelegRemove", 11, },
- { NFSV4OP_DELEGRETURN, 7, "DelegRename1", 12, },
- { NFSV4OP_DELEGRETURN, 9, "DelegRename2", 12, },
- { NFSV4OP_GETATTR, 1, "Getacl", 6, },
- { NFSV4OP_SETATTR, 1, "Setacl", 6, },
- { NFSV4OP_EXCHANGEID, 1, "ExchangeID", 10, },
- { NFSV4OP_CREATESESSION, 1, "CreateSession", 13, },
- { NFSV4OP_DESTROYSESSION, 1, "DestroySession", 14, },
- { NFSV4OP_DESTROYCLIENTID, 1, "DestroyClient", 13, },
- { NFSV4OP_FREESTATEID, 1, "FreeStateID", 11, },
- { NFSV4OP_LAYOUTGET, 1, "LayoutGet", 9, },
- { NFSV4OP_GETDEVINFO, 1, "GetDeviceInfo", 13, },
- { NFSV4OP_LAYOUTCOMMIT, 1, "LayoutCommit", 12, },
- { NFSV4OP_LAYOUTRETURN, 1, "LayoutReturn", 12, },
- { NFSV4OP_RECLAIMCOMPL, 1, "ReclaimComplete", 15, },
- { NFSV4OP_WRITE, 1, "WriteDS", 7, },
- { NFSV4OP_READ, 1, "ReadDS", 6, },
- { NFSV4OP_COMMIT, 1, "CommitDS", 8, },
- { NFSV4OP_OPEN, 3, "OpenLayoutGet", 13, },
- { NFSV4OP_OPEN, 8, "CreateLayGet", 12, },
-};
/*
- * NFS RPCS that have large request message size.
- */
-static int nfs_bigrequest[NFSV41_NPROCS] = {
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0
-};
-
-/*
- * Start building a request. Mostly just put the first file handle in
- * place.
- */
-APPLESTATIC void
-nfscl_reqstart(struct nfsrv_descript *nd, int procnum, struct nfsmount *nmp,
- u_int8_t *nfhp, int fhlen, u_int32_t **opcntpp, struct nfsclsession *sep,
- int vers, int minorvers)
-{
- struct mbuf *mb;
- u_int32_t *tl;
- int opcnt;
- nfsattrbit_t attrbits;
-
- /*
- * First, fill in some of the fields of nd.
- */
- nd->nd_slotseq = NULL;
- if (vers == NFS_VER4) {
- nd->nd_flag = ND_NFSV4 | ND_NFSCL;
- if (minorvers == NFSV41_MINORVERSION)
- nd->nd_flag |= ND_NFSV41;
- } else if (vers == NFS_VER3)
- nd->nd_flag = ND_NFSV3 | ND_NFSCL;
- else {
- if (NFSHASNFSV4(nmp)) {
- nd->nd_flag = ND_NFSV4 | ND_NFSCL;
- if (NFSHASNFSV4N(nmp))
- nd->nd_flag |= ND_NFSV41;
- } else if (NFSHASNFSV3(nmp))
- nd->nd_flag = ND_NFSV3 | ND_NFSCL;
- else
- nd->nd_flag = ND_NFSV2 | ND_NFSCL;
- }
- nd->nd_procnum = procnum;
- nd->nd_repstat = 0;
-
- /*
- * Get the first mbuf for the request.
- */
- if (nfs_bigrequest[procnum])
- NFSMCLGET(mb, M_WAITOK);
- else
- NFSMGET(mb);
- mbuf_setlen(mb, 0);
- nd->nd_mreq = nd->nd_mb = mb;
- nd->nd_bpos = NFSMTOD(mb, caddr_t);
-
- /*
- * And fill the first file handle into the request.
- */
- if (nd->nd_flag & ND_NFSV4) {
- opcnt = nfsv4_opmap[procnum].opcnt +
- nfsv4_opflag[nfsv4_opmap[procnum].op].needscfh;
- if ((nd->nd_flag & ND_NFSV41) != 0) {
- opcnt += nfsv4_opflag[nfsv4_opmap[procnum].op].needsseq;
- if (procnum == NFSPROC_RENEW)
- /*
- * For the special case of Renew, just do a
- * Sequence Op.
- */
- opcnt = 1;
- else if (procnum == NFSPROC_WRITEDS ||
- procnum == NFSPROC_COMMITDS)
- /*
- * For the special case of a Writeor Commit to
- * a DS, the opcnt == 3, for Sequence, PutFH,
- * Write/Commit.
- */
- opcnt = 3;
- }
- /*
- * What should the tag really be?
- */
- (void) nfsm_strtom(nd, nfsv4_opmap[procnum].tag,
- nfsv4_opmap[procnum].taglen);
- NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
- if ((nd->nd_flag & ND_NFSV41) != 0)
- *tl++ = txdr_unsigned(NFSV41_MINORVERSION);
- else
- *tl++ = txdr_unsigned(NFSV4_MINORVERSION);
- if (opcntpp != NULL)
- *opcntpp = tl;
- *tl = txdr_unsigned(opcnt);
- if ((nd->nd_flag & ND_NFSV41) != 0 &&
- nfsv4_opflag[nfsv4_opmap[procnum].op].needsseq > 0) {
- if (nfsv4_opflag[nfsv4_opmap[procnum].op].loopbadsess >
- 0)
- nd->nd_flag |= ND_LOOPBADSESS;
- NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
- *tl = txdr_unsigned(NFSV4OP_SEQUENCE);
- if (sep == NULL) {
- sep = nfsmnt_mdssession(nmp);
- nfsv4_setsequence(nmp, nd, sep,
- nfs_bigreply[procnum]);
- } else
- nfsv4_setsequence(nmp, nd, sep,
- nfs_bigreply[procnum]);
- }
- if (nfsv4_opflag[nfsv4_opmap[procnum].op].needscfh > 0) {
- NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
- *tl = txdr_unsigned(NFSV4OP_PUTFH);
- (void) nfsm_fhtom(nd, nfhp, fhlen, 0);
- if (nfsv4_opflag[nfsv4_opmap[procnum].op].needscfh
- == 2 && procnum != NFSPROC_WRITEDS &&
- procnum != NFSPROC_COMMITDS) {
- NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
- *tl = txdr_unsigned(NFSV4OP_GETATTR);
- /*
- * For Lookup Ops, we want all the directory
- * attributes, so we can load the name cache.
- */
- if (procnum == NFSPROC_LOOKUP ||
- procnum == NFSPROC_LOOKUPP)
- NFSGETATTR_ATTRBIT(&attrbits);
- else {
- NFSWCCATTR_ATTRBIT(&attrbits);
- nd->nd_flag |= ND_V4WCCATTR;
- }
- (void) nfsrv_putattrbit(nd, &attrbits);
- }
- }
- if (procnum != NFSPROC_RENEW ||
- (nd->nd_flag & ND_NFSV41) == 0) {
- NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
- *tl = txdr_unsigned(nfsv4_opmap[procnum].op);
- }
- } else {
- (void) nfsm_fhtom(nd, nfhp, fhlen, 0);
- }
- if (procnum < NFSV41_NPROCS)
- NFSINCRGLOBAL(nfsstatsv1.rpccnt[procnum]);
-}
-
-/*
* copies a uio scatter/gather list to an mbuf chain.
* NOTE: can ony handle iovcnt == 1
*/
@@ -592,38 +385,6 @@ nfscl_mtofh(struct nfsrv_descript *nd, struct nfsfh **
}
nfsmout:
return (error);
-}
-
-/*
- * Put a state Id in the mbuf list.
- */
-APPLESTATIC void
-nfsm_stateidtom(struct nfsrv_descript *nd, nfsv4stateid_t *stateidp, int flag)
-{
- nfsv4stateid_t *st;
-
- NFSM_BUILD(st, nfsv4stateid_t *, NFSX_STATEID);
- if (flag == NFSSTATEID_PUTALLZERO) {
- st->seqid = 0;
- st->other[0] = 0;
- st->other[1] = 0;
- st->other[2] = 0;
- } else if (flag == NFSSTATEID_PUTALLONE) {
- st->seqid = 0xffffffff;
- st->other[0] = 0xffffffff;
- st->other[1] = 0xffffffff;
- st->other[2] = 0xffffffff;
- } else if (flag == NFSSTATEID_PUTSEQIDZERO) {
- st->seqid = 0;
- st->other[0] = stateidp->other[0];
- st->other[1] = stateidp->other[1];
- st->other[2] = stateidp->other[2];
- } else {
- st->seqid = stateidp->seqid;
- st->other[0] = stateidp->other[0];
- st->other[1] = stateidp->other[1];
- st->other[2] = stateidp->other[2];
- }
}
/*
Modified: head/sys/fs/nfsclient/nfs_clport.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clport.c Thu Jun 14 09:36:25 2018 (r335129)
+++ head/sys/fs/nfsclient/nfs_clport.c Thu Jun 14 10:00:19 2018 (r335130)
@@ -819,124 +819,6 @@ nfsmout:
}
/*
- * Fill in the setable attributes. The full argument indicates whether
- * to fill in them all or just mode and time.
- */
-void
-nfscl_fillsattr(struct nfsrv_descript *nd, struct vattr *vap,
- struct vnode *vp, int flags, u_int32_t rdev)
-{
- u_int32_t *tl;
- struct nfsv2_sattr *sp;
- nfsattrbit_t attrbits;
-
- switch (nd->nd_flag & (ND_NFSV2 | ND_NFSV3 | ND_NFSV4)) {
- case ND_NFSV2:
- NFSM_BUILD(sp, struct nfsv2_sattr *, NFSX_V2SATTR);
- if (vap->va_mode == (mode_t)VNOVAL)
- sp->sa_mode = newnfs_xdrneg1;
- else
- sp->sa_mode = vtonfsv2_mode(vap->va_type, vap->va_mode);
- if (vap->va_uid == (uid_t)VNOVAL)
- sp->sa_uid = newnfs_xdrneg1;
- else
- sp->sa_uid = txdr_unsigned(vap->va_uid);
- if (vap->va_gid == (gid_t)VNOVAL)
- sp->sa_gid = newnfs_xdrneg1;
- else
- sp->sa_gid = txdr_unsigned(vap->va_gid);
- if (flags & NFSSATTR_SIZE0)
- sp->sa_size = 0;
- else if (flags & NFSSATTR_SIZENEG1)
- sp->sa_size = newnfs_xdrneg1;
- else if (flags & NFSSATTR_SIZERDEV)
- sp->sa_size = txdr_unsigned(rdev);
- else
- sp->sa_size = txdr_unsigned(vap->va_size);
- txdr_nfsv2time(&vap->va_atime, &sp->sa_atime);
- txdr_nfsv2time(&vap->va_mtime, &sp->sa_mtime);
- break;
- case ND_NFSV3:
- if (vap->va_mode != (mode_t)VNOVAL) {
- NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
- *tl++ = newnfs_true;
- *tl = txdr_unsigned(vap->va_mode);
- } else {
- NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
- *tl = newnfs_false;
- }
- if ((flags & NFSSATTR_FULL) && vap->va_uid != (uid_t)VNOVAL) {
- NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
- *tl++ = newnfs_true;
- *tl = txdr_unsigned(vap->va_uid);
- } else {
- NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
- *tl = newnfs_false;
- }
- if ((flags & NFSSATTR_FULL) && vap->va_gid != (gid_t)VNOVAL) {
- NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
- *tl++ = newnfs_true;
- *tl = txdr_unsigned(vap->va_gid);
- } else {
- NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
- *tl = newnfs_false;
- }
- if ((flags & NFSSATTR_FULL) && vap->va_size != VNOVAL) {
- NFSM_BUILD(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
- *tl++ = newnfs_true;
- txdr_hyper(vap->va_size, tl);
- } else {
- NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
- *tl = newnfs_false;
- }
- if (vap->va_atime.tv_sec != VNOVAL) {
- if ((vap->va_vaflags & VA_UTIMES_NULL) == 0) {
- NFSM_BUILD(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
- *tl++ = txdr_unsigned(NFSV3SATTRTIME_TOCLIENT);
- txdr_nfsv3time(&vap->va_atime, tl);
- } else {
- NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
- *tl = txdr_unsigned(NFSV3SATTRTIME_TOSERVER);
- }
- } else {
- NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
- *tl = txdr_unsigned(NFSV3SATTRTIME_DONTCHANGE);
- }
- if (vap->va_mtime.tv_sec != VNOVAL) {
- if ((vap->va_vaflags & VA_UTIMES_NULL) == 0) {
- NFSM_BUILD(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
- *tl++ = txdr_unsigned(NFSV3SATTRTIME_TOCLIENT);
- txdr_nfsv3time(&vap->va_mtime, tl);
- } else {
- NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
- *tl = txdr_unsigned(NFSV3SATTRTIME_TOSERVER);
- }
- } else {
- NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
- *tl = txdr_unsigned(NFSV3SATTRTIME_DONTCHANGE);
- }
- break;
- case ND_NFSV4:
- NFSZERO_ATTRBIT(&attrbits);
- if (vap->va_mode != (mode_t)VNOVAL)
- NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_MODE);
- if ((flags & NFSSATTR_FULL) && vap->va_uid != (uid_t)VNOVAL)
- NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_OWNER);
- if ((flags & NFSSATTR_FULL) && vap->va_gid != (gid_t)VNOVAL)
- NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_OWNERGROUP);
- if ((flags & NFSSATTR_FULL) && vap->va_size != VNOVAL)
- NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_SIZE);
- if (vap->va_atime.tv_sec != VNOVAL)
- NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEACCESSSET);
- if (vap->va_mtime.tv_sec != VNOVAL)
- NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMEMODIFYSET);
- (void) nfsv4_fillattr(nd, vp->v_mount, vp, NULL, vap, NULL, 0,
- &attrbits, NULL, NULL, 0, 0, 0, 0, (uint64_t)0, NULL);
- break;
- }
-}
-
-/*
* nfscl_request() - mostly a wrapper for newnfs_request().
*/
int
Modified: head/sys/fs/nfsclient/nfsmount.h
==============================================================================
--- head/sys/fs/nfsclient/nfsmount.h Thu Jun 14 09:36:25 2018 (r335129)
+++ head/sys/fs/nfsclient/nfsmount.h Thu Jun 14 10:00:19 2018 (r335130)
@@ -116,27 +116,6 @@ struct nfsmount {
*/
#define VFSTONFS(mp) ((struct nfsmount *)((mp)->mnt_data))
-/*
- * Get a pointer to the MDS session, which is always the first element
- * in the list.
- * This macro can only be safely used when the NFSLOCKMNT() lock is held.
- * The inline function can be used when the lock isn't held.
- */
-#define NFSMNT_MDSSESSION(m) (&(TAILQ_FIRST(&((m)->nm_sess))->nfsclds_sess))
-
-static __inline struct nfsclsession *
-nfsmnt_mdssession(struct nfsmount *nmp)
-{
- struct nfsclsession *tsep;
-
- tsep = NULL;
- mtx_lock(&nmp->nm_mtx);
- if (TAILQ_FIRST(&nmp->nm_sess) != NULL)
- tsep = NFSMNT_MDSSESSION(nmp);
- mtx_unlock(&nmp->nm_mtx);
- return (tsep);
-}
-
#ifndef NFS_DEFAULT_NAMETIMEO
#define NFS_DEFAULT_NAMETIMEO 60
#endif
More information about the svn-src-all
mailing list