diff options
Diffstat (limited to 'sys/nfs')
-rw-r--r-- | sys/nfs/nfs_bio.c | 8 | ||||
-rw-r--r-- | sys/nfs/nfs_serv.c | 16 | ||||
-rw-r--r-- | sys/nfs/nfs_socket.c | 2 | ||||
-rw-r--r-- | sys/nfs/nfs_subs.c | 60 | ||||
-rw-r--r-- | sys/nfs/nfs_vnops.c | 16 |
5 files changed, 66 insertions, 36 deletions
diff --git a/sys/nfs/nfs_bio.c b/sys/nfs/nfs_bio.c index 3a422dc184d4..e10649d08b3d 100644 --- a/sys/nfs/nfs_bio.c +++ b/sys/nfs/nfs_bio.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * From: @(#)nfs_bio.c 7.19 (Berkeley) 4/16/91 - * $Id: nfs_bio.c,v 1.5 1994/02/06 22:20:09 davidg Exp $ + * $Id: nfs_bio.c,v 1.6 1994/06/12 04:05:39 davidg Exp $ */ #include "param.h" @@ -175,8 +175,6 @@ nfs_bioread(vp, uio, ioflag, cred) error = uiomove(bp->b_un.b_addr + on, (int)n, uio); switch (vp->v_type) { case VREG: - if (n+on == biosize || uio->uio_offset == np->n_size) - bp->b_flags |= B_AGE; break; case VLNK: n = 0; @@ -298,12 +296,10 @@ again: brelse(bp); return (error); } + bp->b_proc = (struct proc *)0; if ((n+on) == biosize) { - bp->b_flags |= B_AGE; - bp->b_proc = (struct proc *)0; bawrite(bp); } else { - bp->b_proc = (struct proc *)0; bdwrite(bp); } } while (error == 0 && uio->uio_resid > 0 && n != 0); diff --git a/sys/nfs/nfs_serv.c b/sys/nfs/nfs_serv.c index 6205a268448e..20f7015c1f26 100644 --- a/sys/nfs/nfs_serv.c +++ b/sys/nfs/nfs_serv.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * From: @(#)nfs_serv.c 7.40 (Berkeley) 5/15/91 - * $Id: nfs_serv.c,v 1.5 1993/12/19 00:54:12 wollman Exp $ + * $Id: nfs_serv.c,v 1.6 1994/06/11 23:33:53 karl Exp $ */ /* @@ -667,10 +667,16 @@ nfsrv_create(mrep, md, dpos, cred, xid, mrq, repstat, p) vput(nd.ni_dvp); VOP_ABORTOP(&nd); vap->va_size = fxdr_unsigned(long, *(tl+3)); /* 28 Aug 92*/ -/* 08 Sep 92*/ if (vap->va_size != -1 && (error = VOP_SETATTR(vp, vap, cred, p))) { - vput(vp); - nfsm_reply(0); - } + if (vap->va_size != -1) { + if (error = nfsrv_access(vp, VWRITE, cred, p)) { + vput(vp); + nfsm_reply(0); + } + if (error = VOP_SETATTR(vp, vap, cred, p)) { + vput(vp); + nfsm_reply(0); + } + } } bzero((caddr_t)fhp, sizeof(nfh)); fhp->fh_fsid = vp->v_mount->mnt_stat.f_fsid; diff --git a/sys/nfs/nfs_socket.c b/sys/nfs/nfs_socket.c index 41b386d70dfc..f3c3c880785b 100644 --- a/sys/nfs/nfs_socket.c +++ b/sys/nfs/nfs_socket.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * From: @(#)nfs_socket.c 7.23 (Berkeley) 4/20/91 - * $Id: nfs_socket.c,v 1.4.2.1 1994/05/03 21:04:53 rgrimes Exp $ + * $Id: nfs_socket.c,v 1.5 1994/05/03 17:49:16 davidg Exp $ */ /* 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--; diff --git a/sys/nfs/nfs_vnops.c b/sys/nfs/nfs_vnops.c index b5548e751576..0066b77b13b6 100644 --- a/sys/nfs/nfs_vnops.c +++ b/sys/nfs/nfs_vnops.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * From: @(#)nfs_vnops.c 7.60 (Berkeley) 5/24/91 - * $Id: nfs_vnops.c,v 1.7 1994/01/31 23:40:50 martin Exp $ + * $Id: nfs_vnops.c,v 1.8 1994/06/14 03:41:10 davidg Exp $ */ /* @@ -278,9 +278,19 @@ nfs_open(vp, mode, cred, p) register enum vtype vtyp; vtyp = vp->v_type; - if (vtyp == VREG || vtyp == VDIR || vtyp == VLNK) + if (vtyp == VREG || vtyp == VDIR || vtyp == VLNK) { + struct nfsnode *np; + struct vattr vattr; + np = VTONFS(vp); + if (nfs_dogetattr(vp, &vattr, cred, 1, p) == 0) { + if (np->n_mtime != vattr.va_mtime.tv_sec) { + np->n_direofoffset = 0; + vinvalbuf(vp, TRUE); + np->n_mtime = vattr.va_mtime.tv_sec; + } + } return (0); - else + } else return (EACCES); } |