svn commit: r360650 - head/sys/fs/nfs
Rick Macklem
rmacklem at FreeBSD.org
Tue May 5 00:58:04 UTC 2020
Author: rmacklem
Date: Tue May 5 00:58:03 2020
New Revision: 360650
URL: https://svnweb.freebsd.org/changeset/base/360650
Log:
Revert r360514, to avoid unnecessary churn of the sources.
r360514 prepared the NFS code for changes to handle ext_pgs mbufs on
the receive side. However, at this time, KERN_TLS does not pass
ext_pgs mbufs up through soreceive(). As such, as this time, only
the send/build side of the NFS mbuf code needs to handle ext_pgs mbufs.
Revert r360514 since the rather extensive changes required for receive
side ext_pgs mbufs are not yet needed.
This avoids unnecessary churn of the sources.
Modified:
head/sys/fs/nfs/nfs_commonsubs.c
head/sys/fs/nfs/nfs_var.h
Modified: head/sys/fs/nfs/nfs_commonsubs.c
==============================================================================
--- head/sys/fs/nfs/nfs_commonsubs.c Tue May 5 00:08:41 2020 (r360649)
+++ head/sys/fs/nfs/nfs_commonsubs.c Tue May 5 00:58:03 2020 (r360650)
@@ -229,8 +229,6 @@ static void nfsrv_removeuser(struct nfsusrgrp *usrp, i
static int nfsrv_getrefstr(struct nfsrv_descript *, u_char **, u_char **,
int *, int *);
static void nfsrv_refstrbigenough(int, u_char **, u_char **, int *);
-static int nfsm_copyfrommbuf(struct nfsrv_descript *, char *, enum uio_seg,
- int);
static struct {
int op;
@@ -703,49 +701,52 @@ nfsm_dissct(struct nfsrv_descript *nd, int siz, int ho
caddr_t retp;
retp = NULL;
- left = mtod(nd->nd_md, char *) + nd->nd_md->m_len -
- nd->nd_dpos;
+ left = mtod(nd->nd_md, caddr_t) + nd->nd_md->m_len - nd->nd_dpos;
while (left == 0) {
- if (!nfsm_shiftnext(nd, &left))
- return (NULL);
+ nd->nd_md = nd->nd_md->m_next;
+ if (nd->nd_md == NULL)
+ return (retp);
+ left = nd->nd_md->m_len;
+ nd->nd_dpos = mtod(nd->nd_md, caddr_t);
}
if (left >= siz) {
retp = nd->nd_dpos;
nd->nd_dpos += siz;
+ } else if (nd->nd_md->m_next == NULL) {
+ return (retp);
} else if (siz > ncl_mbuf_mhlen) {
panic("nfs S too big");
} else {
- /* Allocate a new mbuf for the "siz" bytes of data. */
MGET(mp2, MT_DATA, how);
if (mp2 == NULL)
return (NULL);
-
- /*
- * Link the new mp2 mbuf into the list then copy left
- * bytes from the mbuf before it and siz - left bytes
- * from the mbuf(s) after it.
- */
mp2->m_next = nd->nd_md->m_next;
nd->nd_md->m_next = mp2;
nd->nd_md->m_len -= left;
- retp = p = mtod(mp2, char *);
- memcpy(p, nd->nd_dpos, left); /* Copy what was left */
+ nd->nd_md = mp2;
+ retp = p = mtod(mp2, caddr_t);
+ NFSBCOPY(nd->nd_dpos, p, left); /* Copy what was left */
siz2 = siz - left;
p += left;
- mp2->m_len = siz;
- nd->nd_md = mp2->m_next;
+ mp2 = mp2->m_next;
/* Loop around copying up the siz2 bytes */
while (siz2 > 0) {
- if (nd->nd_md == NULL)
+ if (mp2 == NULL)
return (NULL);
- nfsm_set(nd, 0, false);
- xfer = nfsm_copyfrommbuf(nd, p,
- UIO_SYSSPACE, siz2);
- p += xfer;
- siz2 -= xfer;
+ xfer = (siz2 > mp2->m_len) ? mp2->m_len : siz2;
+ if (xfer > 0) {
+ NFSBCOPY(mtod(mp2, caddr_t), p, xfer);
+ mp2->m_data += xfer;
+ mp2->m_len -= xfer;
+ p += xfer;
+ siz2 -= xfer;
+ }
if (siz2 > 0)
- nd->nd_md = nd->nd_md->m_next;
+ mp2 = mp2->m_next;
}
+ nd->nd_md->m_len = siz;
+ nd->nd_md = mp2;
+ nd->nd_dpos = mtod(mp2, caddr_t);
}
return (retp);
}
@@ -4824,76 +4825,5 @@ nfsv4_findmirror(struct nfsmount *nmp)
}
}
return (ds);
-}
-
-/*
- * Fill in the fields of "struct nfsrv_descript" for a new ext_pgs mbuf.
- * The build argument is true for build and false for dissect.
- */
-int
-nfsm_set(struct nfsrv_descript *nd, u_int offs, bool build)
-{
- struct mbuf *m;
- int rlen;
-
- if (build)
- m = nd->nd_mb;
- else
- m = nd->nd_md;
- if (build) {
- nd->nd_bpos = mtod(m, char *) + offs;
- rlen = m->m_len - offs;
- } else {
- nd->nd_dpos = mtod(m, char *);
- rlen = m->m_len;
- }
- return (rlen);
-}
-
-/*
- * Copy up to "len" bytes from the mbuf into "cp" and adjust the
- * mbuf accordingly.
- * If cp == NULL, do not do the actual copy, but adjust the mbuf.
- * Return the number of bytes actually copied.
- * Adjust m_data and m_len so that a future calculation of what
- * is left using mtod() will work correctly.
- */
-static int
-nfsm_copyfrommbuf(struct nfsrv_descript *nd, char *cp, enum uio_seg segflg,
- int len)
-{
- struct mbuf *m;
- int xfer;
-
- m = nd->nd_md;
- xfer = mtod(m, char *) + m->m_len - nd->nd_dpos;
- xfer = min(xfer, len);
- if (xfer > 0) {
- if (cp != NULL) {
- if (segflg == UIO_SYSSPACE)
- memcpy(cp, nd->nd_dpos, xfer);
- else
- copyout(nd->nd_dpos, cp, xfer);
- }
- nd->nd_dpos += xfer;
- m->m_data += xfer;
- m->m_len -= xfer;
- }
- return (xfer);
-}
-
-/*
- * Shift to the next mbuf in the list list and update the nd fields.
- * Return true if successful, false otherwise.
- */
-bool
-nfsm_shiftnext(struct nfsrv_descript *nd, int *leftp)
-{
-
- nd->nd_md = nd->nd_md->m_next;
- if (nd->nd_md == NULL)
- return (false);
- *leftp = nfsm_set(nd, 0, false);
- return (true);
}
Modified: head/sys/fs/nfs/nfs_var.h
==============================================================================
--- head/sys/fs/nfs/nfs_var.h Tue May 5 00:08:41 2020 (r360649)
+++ head/sys/fs/nfs/nfs_var.h Tue May 5 00:58:03 2020 (r360650)
@@ -361,8 +361,6 @@ int nfsv4_sequencelookup(struct nfsmount *, struct nfs
void nfsv4_freeslot(struct nfsclsession *, int);
struct ucred *nfsrv_getgrpscred(struct ucred *);
struct nfsdevice *nfsv4_findmirror(struct nfsmount *);
-int nfsm_set(struct nfsrv_descript *, u_int, bool);
-bool nfsm_shiftnext(struct nfsrv_descript *, int *);
/* nfs_clcomsubs.c */
void nfsm_uiombuf(struct nfsrv_descript *, struct uio *, int);
More information about the svn-src-all
mailing list