svn commit: r323780 - in head/sys/fs: nfs nfsclient
Rick Macklem
rmacklem at FreeBSD.org
Tue Sep 19 21:31:37 UTC 2017
Author: rmacklem
Date: Tue Sep 19 21:31:36 2017
New Revision: 323780
URL: https://svnweb.freebsd.org/changeset/base/323780
Log:
Add a new function called nfsm_uiombuflist(), similar to nfsm_uiombuf().
This patch adds a new function called nfsm_uiombuflist(), which is
similar to nfsm_uiombuf(), but doesn't not use the fields in
struct nfsrv_descript. This new function will be used by the pNFS client
for writing to mirrors using Flex Files layout.
The function is not yet called anywhere.
Also, get rid of #ifndef APPLE, which is ancient cruft left over from
the Mac OSX port of the NFSv4 client.
Modified:
head/sys/fs/nfs/nfs_var.h
head/sys/fs/nfsclient/nfs_clcomsubs.c
Modified: head/sys/fs/nfs/nfs_var.h
==============================================================================
--- head/sys/fs/nfs/nfs_var.h Tue Sep 19 20:45:25 2017 (r323779)
+++ head/sys/fs/nfs/nfs_var.h Tue Sep 19 21:31:36 2017 (r323780)
@@ -301,6 +301,7 @@ struct ucred *nfsrv_getgrpscred(struct ucred *);
/* 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 *);
nfsuint64 *nfscl_getcookie(struct nfsnode *, off_t off, int);
Modified: head/sys/fs/nfsclient/nfs_clcomsubs.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clcomsubs.c Tue Sep 19 20:45:25 2017 (r323779)
+++ head/sys/fs/nfsclient/nfs_clcomsubs.c Tue Sep 19 21:31:36 2017 (r323780)
@@ -250,7 +250,6 @@ nfscl_reqstart(struct nfsrv_descript *nd, int procnum,
NFSINCRGLOBAL(nfsstatsv1.rpccnt[procnum]);
}
-#ifndef APPLE
/*
* copies a uio scatter/gather list to an mbuf chain.
* NOTE: can ony handle iovcnt == 1
@@ -332,7 +331,89 @@ nfsm_uiombuf(struct nfsrv_descript *nd, struct uio *ui
nd->nd_bpos = NFSMTOD(mp, caddr_t) + mbuf_len(mp);
nd->nd_mb = mp;
}
-#endif /* !APPLE */
+
+/*
+ * copies a uio scatter/gather list to an mbuf chain.
+ * This version returns the mbuf list and does not use "nd".
+ * NOTE: can ony handle iovcnt == 1
+ */
+struct mbuf *
+nfsm_uiombuflist(struct uio *uiop, int siz, struct mbuf **mbp, char **cpp)
+{
+ char *uiocp;
+ struct mbuf *mp, *mp2, *firstmp;
+ int xfer, left, mlen;
+ int uiosiz, clflg, rem;
+ char *cp, *tcp;
+
+ KASSERT(uiop->uio_iovcnt == 1, ("nfsm_uiotombuf: iovcnt != 1"));
+
+ if (siz > ncl_mbuf_mlen) /* or should it >= MCLBYTES ?? */
+ clflg = 1;
+ else
+ clflg = 0;
+ rem = NFSM_RNDUP(siz) - siz;
+ if (clflg != 0)
+ NFSMCLGET(mp, M_WAITOK);
+ else
+ NFSMGET(mp);
+ mbuf_setlen(mp, 0);
+ firstmp = mp2 = mp;
+ while (siz > 0) {
+ left = uiop->uio_iov->iov_len;
+ uiocp = uiop->uio_iov->iov_base;
+ if (left > siz)
+ left = siz;
+ uiosiz = left;
+ while (left > 0) {
+ mlen = M_TRAILINGSPACE(mp);
+ if (mlen == 0) {
+ if (clflg)
+ NFSMCLGET(mp, M_WAITOK);
+ else
+ NFSMGET(mp);
+ mbuf_setlen(mp, 0);
+ mbuf_setnext(mp2, mp);
+ mp2 = mp;
+ mlen = M_TRAILINGSPACE(mp);
+ }
+ xfer = (left > mlen) ? mlen : left;
+ if (uiop->uio_segflg == UIO_SYSSPACE)
+ NFSBCOPY(uiocp, NFSMTOD(mp, caddr_t) +
+ mbuf_len(mp), xfer);
+ else
+ copyin(uiocp, NFSMTOD(mp, caddr_t) +
+ mbuf_len(mp), xfer);
+ mbuf_setlen(mp, mbuf_len(mp) + xfer);
+ left -= xfer;
+ uiocp += xfer;
+ uiop->uio_offset += xfer;
+ uiop->uio_resid -= xfer;
+ }
+ tcp = (char *)uiop->uio_iov->iov_base;
+ tcp += uiosiz;
+ uiop->uio_iov->iov_base = (void *)tcp;
+ uiop->uio_iov->iov_len -= uiosiz;
+ siz -= uiosiz;
+ }
+ if (rem > 0) {
+ if (rem > M_TRAILINGSPACE(mp)) {
+ NFSMGET(mp);
+ mbuf_setlen(mp, 0);
+ mbuf_setnext(mp2, mp);
+ }
+ cp = NFSMTOD(mp, caddr_t) + mbuf_len(mp);
+ for (left = 0; left < rem; left++)
+ *cp++ = '\0';
+ mbuf_setlen(mp, mbuf_len(mp) + rem);
+ if (cpp != NULL)
+ *cpp = cp;
+ } else if (cpp != NULL)
+ *cpp = NFSMTOD(mp, caddr_t) + mbuf_len(mp);
+ if (mbp != NULL)
+ *mbp = mp;
+ return (firstmp);
+}
/*
* Load vnode attributes from the xdr file attributes.
More information about the svn-src-head
mailing list