diff options
author | svn2git <svn2git@FreeBSD.org> | 1994-07-01 08:00:00 +0000 |
---|---|---|
committer | svn2git <svn2git@FreeBSD.org> | 1994-07-01 08:00:00 +0000 |
commit | 5e0e9b99dc3fc0ecd49d929db0d57c784b66f481 (patch) | |
tree | e779b5a6edddbb949b7990751b12d6f25304ba86 /sys/nfs/nfs_subs.c | |
parent | a16f65c7d117419bd266c28a1901ef129a337569 (diff) |
Diffstat (limited to 'sys/nfs/nfs_subs.c')
-rw-r--r-- | sys/nfs/nfs_subs.c | 60 |
1 files changed, 39 insertions, 21 deletions
diff --git a/sys/nfs/nfs_subs.c b/sys/nfs/nfs_subs.c index 14e011882160..d512bde223bf 100644 --- a/sys/nfs/nfs_subs.c +++ b/sys/nfs/nfs_subs.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * From: @(#)nfs_subs.c 7.41 (Berkeley) 5/15/91 - * $Id: nfs_subs.c,v 1.5 1993/12/19 00:54:15 wollman Exp $ + * $Id: nfs_subs.c,v 1.6 1994/04/14 07:50:11 davidg Exp $ */ /* @@ -262,6 +262,12 @@ nfsm_mbuftouio(mrep, uiop, siz, dpos) return (error); } +void nfsm_nullfree() +{ + /* Nothing to do here */ +} + + /* * copies a uio scatter/gather list to an mbuf chain... */ @@ -278,7 +284,7 @@ nfsm_uiotombuf(uiop, mq, siz, bpos) int uiosiz, clflg, rem; char *cp; - if (siz > MLEN) /* or should it >= MCLBYTES ?? */ + if (siz > MLEN && uiop->uio_segflg != UIO_SYSSPACE) clflg = 1; else clflg = 0; @@ -292,31 +298,43 @@ nfsm_uiotombuf(uiop, mq, siz, bpos) if (left > siz) left = siz; uiosiz = left; - while (left > 0) { + if (uiop->uio_segflg == UIO_SYSSPACE) { MGET(mp, M_WAIT, MT_DATA); - if (clflg) - MCLGET(mp, M_WAIT); - mp->m_len = NFSMSIZ(mp); + mp->m_flags |= M_EXT; + mp->m_data = mp->m_ext.ext_buf = uiocp; + mp->m_len = mp->m_ext.ext_size = uiosiz; + mp->m_ext.ext_free = nfsm_nullfree; mp2->m_next = mp; mp2 = mp; - xfer = (left > mp->m_len) ? mp->m_len : left; + uiop->uio_offset += uiosiz; + uiop->uio_resid -= uiosiz; + } else { + while (left > 0) { + MGET(mp, M_WAIT, MT_DATA); + if (clflg) + MCLGET(mp, M_WAIT); + mp->m_len = NFSMSIZ(mp); + mp2->m_next = mp; + mp2 = mp; + xfer = (left > mp->m_len) ? mp->m_len : left; #ifdef notdef - /* Not Yet.. */ - if (uiop->uio_iov->iov_op != NULL) - (*(uiop->uio_iov->iov_op)) - (uiocp, mtod(mp, caddr_t), xfer); - else + /* Not Yet.. */ + if (uiop->uio_iov->iov_op != NULL) + (*(uiop->uio_iov->iov_op)) + (uiocp, mtod(mp, caddr_t), xfer); + else + if (uiop->uio_segflg == UIO_SYSSPACE) + bcopy(uiocp, mtod(mp, caddr_t), xfer); + else #endif - if (uiop->uio_segflg == UIO_SYSSPACE) - bcopy(uiocp, mtod(mp, caddr_t), xfer); - else copyin(uiocp, mtod(mp, caddr_t), xfer); - len = mp->m_len; - mp->m_len = xfer; - left -= xfer; - uiocp += xfer; - uiop->uio_offset += xfer; - uiop->uio_resid -= xfer; + len = mp->m_len; + mp->m_len = xfer; + left -= xfer; + uiocp += xfer; + uiop->uio_offset += xfer; + uiop->uio_resid -= xfer; + } } if (uiop->uio_iov->iov_len <= siz) { uiop->uio_iovcnt--; |