Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 14 Jul 1996 15:01:44 +0100
From:      Doug Rabson <dfr@nlsys.demon.co.uk>
To:        current@freebsd.org
Cc:        dfr@render.com
Subject:   NFSv3 fixes
Message-ID:  <31E8FDC8.167EB0E7@nlsys.demon.co.uk>

next in thread | raw e-mail | index | archive | help
Here is a second attempt at these NFSv3 fixes, based on some feedback from
Bruce Evans.  I will commit these tomorrow unless anyone else has some
comments.

Index: nfs_bio.c
===================================================================
RCS file: /home/ncvs/src/sys/nfs/nfs_bio.c,v
retrieving revision 1.23
diff -c -r1.23 nfs_bio.c
*** nfs_bio.c	1996/06/08 05:59:04	1.23
--- nfs_bio.c	1996/07/14 13:46:05
***************
*** 584,589 ****
--- 584,596 ----
  			bp->b_validoff = min(bp->b_validoff, bp->b_dirtyoff);
  			bp->b_validend = max(bp->b_validend, bp->b_dirtyend);
  		}
+ 
+ 		/*
+ 		 * Since this block is being modified, it must be written
+ 		 * again and not just committed.
+ 		 */
+ 		bp->b_flags &= ~B_NEEDCOMMIT;
+ 
  		/*
  		 * If the lease is non-cachable or IO_SYNC do bwrite().
  		 */
Index: nfs_subs.c
===================================================================
RCS file: /home/ncvs/src/sys/nfs/nfs_subs.c,v
retrieving revision 1.30
diff -c -r1.30 nfs_subs.c
*** nfs_subs.c	1996/06/23 17:19:25	1.30
--- nfs_subs.c	1996/07/14 13:46:18
***************
*** 635,640 ****
--- 635,642 ----
  	register int i;
  	struct mbuf *mreq, *mb2;
  	int siz, grpsiz, authsiz;
+ 	struct timeval tv;
+ 	static u_long base;
  
  	authsiz = nfsm_rndup(auth_len);
  	MGETHDR(mb, M_WAIT, MT_DATA);
***************
*** 653,660 ****
--- 655,676 ----
  	 * First the RPC header.
  	 */
  	nfsm_build(tl, u_long *, 8 * NFSX_UNSIGNED);
+ 
+ 	/*
+ 	 * derive initial xid from system time
+ 	 * XXX time is invalid if root not yet mounted
+ 	 */
+ 	if (!base && (rootvp)) {
+ 		microtime(&tv);
+ 		base = tv.tv_sec << 12;
+ 		nfs_xid = base;
+ 	}
+ 	/*
+ 	 * Skip zero xid if it should ever happen.
+ 	 */
  	if (++nfs_xid == 0)
  		nfs_xid++;
+ 
  	*tl++ = *xidp = txdr_unsigned(nfs_xid);
  	*tl++ = rpc_call;
  	*tl++ = rpc_vers;
***************
*** 834,840 ****
  }
  
  /*
!  * copies a uio scatter/gather list to an mbuf chain...
   */
  int
  nfsm_uiotombuf(uiop, mq, siz, bpos)
--- 850,857 ----
  }
  
  /*
!  * copies a uio scatter/gather list to an mbuf chain.
!  * NOTE: can ony handle iovcnt == 1
   */
  int
  nfsm_uiotombuf(uiop, mq, siz, bpos)
***************
*** 849,854 ****
--- 866,874 ----
  	int uiosiz, clflg, rem;
  	char *cp;
  
+ 	if (uiop->uio_iovcnt != 1)
+ 		panic("nfsm_uiotombuf: iovcnt != 1");
+ 
  	if (siz > MLEN)		/* or should it >= MCLBYTES ?? */
  		clflg = 1;
  	else
***************
*** 856,863 ****
  	rem = nfsm_rndup(siz)-siz;
  	mp = mp2 = *mq;
  	while (siz > 0) {
- 		if (uiop->uio_iovcnt <= 0 || uiop->uio_iov == NULL)
- 			return (EINVAL);
  		left = uiop->uio_iov->iov_len;
  		uiocp = uiop->uio_iov->iov_base;
  		if (left > siz)
--- 876,881 ----
***************
*** 892,904 ****
  			uiop->uio_offset += xfer;
  			uiop->uio_resid -= xfer;
  		}
! 		if (uiop->uio_iov->iov_len <= siz) {
! 			uiop->uio_iovcnt--;
! 			uiop->uio_iov++;
! 		} else {
! 			uiop->uio_iov->iov_base += uiosiz;
! 			uiop->uio_iov->iov_len -= uiosiz;
! 		}
  		siz -= uiosiz;
  	}
  	if (rem > 0) {
--- 910,917 ----
  			uiop->uio_offset += xfer;
  			uiop->uio_resid -= xfer;
  		}
! 		uiop->uio_iov->iov_base += uiosiz;
! 		uiop->uio_iov->iov_len -= uiosiz;
  		siz -= uiosiz;
  	}
  	if (rem > 0) {
Index: nfs_vnops.c
===================================================================
RCS file: /home/ncvs/src/sys/nfs/nfs_vnops.c,v
retrieving revision 1.33
diff -c -r1.33 nfs_vnops.c
*** nfs_vnops.c	1996/01/25 00:45:37	1.33
--- nfs_vnops.c	1996/07/14 13:46:52
***************
*** 757,763 ****
  			if (vap->va_mtime.ts_sec != time.tv_sec) {
  				nfsm_build(tl, u_long *, 3 * NFSX_UNSIGNED);
  				*tl++ = txdr_unsigned(NFSV3SATTRTIME_TOCLIENT);
! 				txdr_nfsv3time(&vap->va_atime, tl);
  			} else {
  				nfsm_build(tl, u_long *, NFSX_UNSIGNED);
  				*tl = txdr_unsigned(NFSV3SATTRTIME_TOSERVER);
--- 757,763 ----
  			if (vap->va_mtime.ts_sec != time.tv_sec) {
  				nfsm_build(tl, u_long *, 3 * NFSX_UNSIGNED);
  				*tl++ = txdr_unsigned(NFSV3SATTRTIME_TOCLIENT);
! 				txdr_nfsv3time(&vap->va_mtime, tl);
  			} else {
  				nfsm_build(tl, u_long *, NFSX_UNSIGNED);
  				*tl = txdr_unsigned(NFSV3SATTRTIME_TOSERVER);


-- 
Doug Rabson				Mail:  dfr@nlsys.demon.co.uk
					Phone: +44 181 951 1891



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?31E8FDC8.167EB0E7>