Date: Thu, 9 Jul 2020 00:34:08 +0000 (UTC) From: Rick Macklem <rmacklem@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r363033 - in projects/nfs-over-tls/sys/fs: nfs nfsclient Message-ID: <202007090034.0690Y8Yd089993@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: rmacklem Date: Thu Jul 9 00:34:07 2020 New Revision: 363033 URL: https://svnweb.freebsd.org/changeset/base/363033 Log: Essentially revert changes done to nfsm_uiombuflist() to what is in head/. The changes allowed the mbuf list to be created using ext_pgs mbufs. This is used for doing writing to mirrored DSs. However, these writes require that part of the mbuf list be copied (by nfsm_copym()) and m_copym() cannot do this for ext_pgs mbufs. The work to patch m_copym() to do partial copies of ext_pgs mbuf lists is non-trivial, so I am not doing it at this time. This does mean that the write requests will be in mbuf clusters and will need to be copied in the krpc before sosend() for TLS connections, but will work correctly. Modified: projects/nfs-over-tls/sys/fs/nfs/nfs_var.h projects/nfs-over-tls/sys/fs/nfsclient/nfs_clcomsubs.c projects/nfs-over-tls/sys/fs/nfsclient/nfs_clrpcops.c Modified: projects/nfs-over-tls/sys/fs/nfs/nfs_var.h ============================================================================== --- projects/nfs-over-tls/sys/fs/nfs/nfs_var.h Wed Jul 8 21:40:27 2020 (r363032) +++ projects/nfs-over-tls/sys/fs/nfs/nfs_var.h Thu Jul 9 00:34:07 2020 (r363033) @@ -363,7 +363,7 @@ void nfsm_set(struct nfsrv_descript *, u_int); /* nfs_clcomsubs.c */ void nfsm_uiombuf(struct nfsrv_descript *, struct uio *, int); -struct mbuf *nfsm_uiombuflist(bool, int, struct uio *, int, struct mbuf **, char **); +struct mbuf *nfsm_uiombuflist(struct uio *, int, struct mbuf **, char **); nfsuint64 *nfscl_getcookie(struct nfsnode *, off_t off, int); u_int8_t *nfscl_getmyip(struct nfsmount *, struct in6_addr *, int *); int nfsm_getfh(struct nfsrv_descript *, struct nfsfh **); Modified: projects/nfs-over-tls/sys/fs/nfsclient/nfs_clcomsubs.c ============================================================================== --- projects/nfs-over-tls/sys/fs/nfsclient/nfs_clcomsubs.c Wed Jul 8 21:40:27 2020 (r363032) +++ projects/nfs-over-tls/sys/fs/nfsclient/nfs_clcomsubs.c Thu Jul 9 00:34:07 2020 (r363033) @@ -156,24 +156,20 @@ nfsm_uiombuf(struct nfsrv_descript *nd, struct uio *ui /* * copies a uio scatter/gather list to an mbuf chain. * This version returns the mbuf list and does not use "nd". - * It allocates mbuf(s) of NFSM_RNDUP(siz) and ensures that - * it is nul padded to a multiple of 4 bytes. - * Since mbufs are allocated by this function, they will - * always have space for an exact multiple of 4 bytes in - * each mbuf. This implies that the nul padding can be - * safely done without checking for available space in - * the mbuf data area (or page for M_EXTPG mbufs). * NOTE: can ony handle iovcnt == 1 + * This function is used to create an mbuf list for doing writing to + * mirrored flexfile DSs. + * It cannot be modified to optionally support ext_pgs mbufs until + * nfsm_copym() is converted to work for ext_pgs mbufs. */ struct mbuf * -nfsm_uiombuflist(bool doextpgs, int maxextsiz, struct uio *uiop, int siz, - struct mbuf **mbp, char **cpp) +nfsm_uiombuflist(struct uio *uiop, int siz, struct mbuf **mbp, char **cpp) { char *uiocp; struct mbuf *mp, *mp2, *firstmp; - int i, left, mlen, rem, xfer; - int uiosiz, clflg, bextpg, bextpgsiz = 0; - char *mcp, *tcp; + int xfer, left, mlen; + int uiosiz, clflg; + char *tcp; KASSERT(uiop->uio_iovcnt == 1, ("nfsm_uiotombuf: iovcnt != 1")); @@ -181,21 +177,11 @@ nfsm_uiombuflist(bool doextpgs, int maxextsiz, struct clflg = 1; else clflg = 0; - rem = NFSM_RNDUP(siz) - siz; - if (doextpgs) { - mp = mb_alloc_ext_plus_pages(PAGE_SIZE, M_WAITOK); - mcp = (char *)(void *) - PHYS_TO_DMAP(mp->m_epg_pa[0]); - bextpgsiz = PAGE_SIZE; - bextpg = 0; - } else { - if (clflg != 0) - NFSMCLGET(mp, M_WAITOK); - else - NFSMGET(mp); - mp->m_len = 0; - mcp = mtod(mp, char *); - } + if (clflg != 0) + NFSMCLGET(mp, M_WAITOK); + else + NFSMGET(mp); + mp->m_len = 0; firstmp = mp2 = mp; while (siz > 0) { left = uiop->uio_iov->iov_len; @@ -204,42 +190,27 @@ nfsm_uiombuflist(bool doextpgs, int maxextsiz, struct left = siz; uiosiz = left; while (left > 0) { - if (doextpgs) - mlen = bextpgsiz; - else - mlen = M_TRAILINGSPACE(mp); + mlen = M_TRAILINGSPACE(mp); if (mlen == 0) { - if (doextpgs) { - mp = nfsm_add_ext_pgs(mp, maxextsiz, - &bextpg); - mcp = (char *)(void *)PHYS_TO_DMAP( - mp->m_epg_pa[bextpg]); - mlen = bextpgsiz = PAGE_SIZE; - } else { - if (clflg) - NFSMCLGET(mp, M_WAITOK); - else - NFSMGET(mp); - mp->m_len = 0; - mcp = mtod(mp, char *); - mlen = M_TRAILINGSPACE(mp); - mp2->m_next = mp; - mp2 = mp; - } + if (clflg) + NFSMCLGET(mp, M_WAITOK); + else + NFSMGET(mp); + mp->m_len = 0; + mp2->m_next = mp; + mp2 = mp; + mlen = M_TRAILINGSPACE(mp); } xfer = (left > mlen) ? mlen : left; if (uiop->uio_segflg == UIO_SYSSPACE) - NFSBCOPY(uiocp, mcp, xfer); + NFSBCOPY(uiocp, mtod(mp, caddr_t) + + mp->m_len, xfer); else - copyin(uiocp, mcp, xfer); + copyin(uiocp, mtod(mp, caddr_t) + + mp->m_len, xfer); mp->m_len += xfer; left -= xfer; uiocp += xfer; - mcp += xfer; - if (doextpgs) { - bextpgsiz -= xfer; - mp->m_epg_last_len += xfer; - } uiop->uio_offset += xfer; uiop->uio_resid -= xfer; } @@ -249,14 +220,8 @@ nfsm_uiombuflist(bool doextpgs, int maxextsiz, struct uiop->uio_iov->iov_len -= uiosiz; siz -= uiosiz; } - for (i = 0; i < rem; i++) { - *mcp++ = '\0'; - mp->m_len++; - if (doextpgs) - mp->m_epg_last_len++; - } if (cpp != NULL) - *cpp = mcp; + *cpp = mtod(mp, caddr_t) + mp->m_len; if (mbp != NULL) *mbp = mp; return (firstmp); Modified: projects/nfs-over-tls/sys/fs/nfsclient/nfs_clrpcops.c ============================================================================== --- projects/nfs-over-tls/sys/fs/nfsclient/nfs_clrpcops.c Wed Jul 8 21:40:27 2020 (r363032) +++ projects/nfs-over-tls/sys/fs/nfsclient/nfs_clrpcops.c Thu Jul 9 00:34:07 2020 (r363033) @@ -5759,11 +5759,11 @@ nfscl_doiods(vnode_t vp, struct uio *uiop, int *iomode uint32_t rwaccess, int docommit, struct ucred *cred, NFSPROC_T *p) { struct nfsnode *np = VTONFS(vp); - struct nfsmount *nmp = VFSTONFS(vnode_mount(vp)); + struct nfsmount *nmp = VFSTONFS(vp->v_mount); struct nfscllayout *layp; struct nfscldevinfo *dip; struct nfsclflayout *rflp; - struct mbuf *m, *m2; + struct mbuf *m; struct nfsclwritedsdorpc *drpc, *tdrpc; nfsv4stateid_t stateid; struct ucred *newcred; @@ -5775,11 +5775,6 @@ nfscl_doiods(vnode_t vp, struct uio *uiop, int *iomode size_t iovlen = 0; off_t offs = 0; ssize_t resid = 0; - int maxextsiz; - bool doextpgs; -#ifdef KERN_TLS - u_int maxlen; -#endif if (!NFSHASPNFS(nmp) || nfscl_enablecallb == 0 || nfs_numnfscbd == 0 || (np->n_flag & NNOLAYOUT) != 0) @@ -5873,19 +5868,8 @@ nfscl_doiods(vnode_t vp, struct uio *uiop, int *iomode iovbase = uiop->uio_iov->iov_base; iovlen = uiop->uio_iov->iov_len; - doextpgs = false; - maxextsiz = 0; -#ifdef KERN_TLS - if (NFSHASTLS(nmp) && - rpctls_getinfo(&maxlen, - false, false)) { - doextpgs = true; - maxextsiz = maxlen; - } -#endif - m = nfsm_uiombuflist(doextpgs, - maxextsiz, uiop, len, NULL, - NULL); + m = nfsm_uiombuflist(uiop, len, + NULL, NULL); } tdrpc = drpc = malloc(sizeof(*drpc) * (mirrorcnt - 1), M_TEMP, M_WAITOK | @@ -5893,12 +5877,6 @@ nfscl_doiods(vnode_t vp, struct uio *uiop, int *iomode } } for (i = firstmirror; i < mirrorcnt && error == 0; i++){ - if (m != NULL && i < mirrorcnt - 1) - m2 = m_copym(m, 0, M_COPYALL, M_WAITOK); - else { - m2 = m; - m = NULL; - } if ((layp->nfsly_flags & NFSLY_FLEXFILE) != 0) { dev = rflp->nfsfl_ffm[i].dev; dip = nfscl_getdevinfo(nmp->nm_clp, dev, @@ -5915,7 +5893,7 @@ nfscl_doiods(vnode_t vp, struct uio *uiop, int *iomode uiop, iomode, must_commit, &eof, &stateid, rwaccess, dip, layp, rflp, off, xfer, - i, docommit, m2, tdrpc, + i, docommit, m, tdrpc, newcred, p); else error = nfscl_doflayoutio(vp, @@ -5924,13 +5902,12 @@ nfscl_doiods(vnode_t vp, struct uio *uiop, int *iomode dip, layp, rflp, off, xfer, docommit, newcred, p); nfscl_reldevinfo(dip); - } else { - m_freem(m2); + } else error = EIO; - } tdrpc++; } - m_freem(m); + if (m != NULL) + m_freem(m); tdrpc = drpc; timo = hz / 50; /* Wait for 20msec. */ if (timo < 1)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202007090034.0690Y8Yd089993>