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);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to