svn commit: r225624 - stable/8/sys/nfsclient

John Baldwin jhb at FreeBSD.org
Fri Sep 16 18:23:40 UTC 2011


Author: jhb
Date: Fri Sep 16 18:23:39 2011
New Revision: 225624
URL: http://svn.freebsd.org/changeset/base/225624

Log:
  MFC 224733:
  Allow the NFS client to use a max file size larger than 1TB for v3 mounts.
  It now allows files up to OFF_MAX subject to whatever limit the server
  advertises.

Modified:
  stable/8/sys/nfsclient/nfs_bio.c
  stable/8/sys/nfsclient/nfs_vfsops.c
  stable/8/sys/nfsclient/nfs_vnops.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)

Modified: stable/8/sys/nfsclient/nfs_bio.c
==============================================================================
--- stable/8/sys/nfsclient/nfs_bio.c	Fri Sep 16 18:18:38 2011	(r225623)
+++ stable/8/sys/nfsclient/nfs_bio.c	Fri Sep 16 18:23:39 2011	(r225624)
@@ -438,6 +438,7 @@ nfs_bioread(struct vnode *vp, struct uio
 	struct thread *td;
 	struct nfsmount *nmp = VFSTONFS(vp->v_mount);
 	daddr_t lbn, rabn;
+	off_t end;
 	int bcount;
 	int seqcount;
 	int nra, error = 0, n = 0, on = 0;
@@ -457,8 +458,9 @@ nfs_bioread(struct vnode *vp, struct uio
 	} else
 		mtx_unlock(&nmp->nm_mtx);		
 
+	end = uio->uio_offset + uio->uio_resid;
 	if (vp->v_type != VDIR &&
-	    (uio->uio_offset + uio->uio_resid) > nmp->nm_maxfilesize)
+	    (end > nmp->nm_maxfilesize || end < uio->uio_offset))
 		return (EFBIG);
 
 	if (nfs_directio_enable && (ioflag & IO_DIRECT) && (vp->v_type == VREG))
@@ -858,6 +860,7 @@ nfs_write(struct vop_write_args *ap)
 	struct vattr vattr;
 	struct nfsmount *nmp = VFSTONFS(vp->v_mount);
 	daddr_t lbn;
+	off_t end;
 	int bcount;
 	int n, on, error = 0;
 
@@ -925,7 +928,8 @@ flush_and_restart:
 
 	if (uio->uio_offset < 0)
 		return (EINVAL);
-	if ((uio->uio_offset + uio->uio_resid) > nmp->nm_maxfilesize)
+	end = uio->uio_offset + uio->uio_resid;
+	if (end > nmp->nm_maxfilesize || end < uio->uio_offset)
 		return (EFBIG);
 	if (uio->uio_resid == 0)
 		return (0);

Modified: stable/8/sys/nfsclient/nfs_vfsops.c
==============================================================================
--- stable/8/sys/nfsclient/nfs_vfsops.c	Fri Sep 16 18:18:38 2011	(r225623)
+++ stable/8/sys/nfsclient/nfs_vfsops.c	Fri Sep 16 18:23:39 2011	(r225624)
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/bio.h>
 #include <sys/buf.h>
 #include <sys/jail.h>
+#include <sys/limits.h>
 #include <sys/lock.h>
 #include <sys/malloc.h>
 #include <sys/mbuf.h>
@@ -1226,13 +1227,11 @@ mountnfs(struct nfs_args *argp, struct m
 	 *
 	 * For V3, nfs_fsinfo will adjust this as necessary.  Assume maximum
 	 * that we can handle until we find out otherwise.
-	 * XXX Our "safe" limit on the client is what we can store in our
-	 * buffer cache using signed(!) block numbers.
 	 */
 	if ((argp->flags & NFSMNT_NFSV3) == 0)
 		nmp->nm_maxfilesize = 0xffffffffLL;
 	else
-		nmp->nm_maxfilesize = (u_int64_t)0x80000000 * DEV_BSIZE - 1;
+		nmp->nm_maxfilesize = OFF_MAX;
 
 	nmp->nm_timeo = NFS_TIMEO;
 	nmp->nm_retry = NFS_RETRANS;

Modified: stable/8/sys/nfsclient/nfs_vnops.c
==============================================================================
--- stable/8/sys/nfsclient/nfs_vnops.c	Fri Sep 16 18:18:38 2011	(r225623)
+++ stable/8/sys/nfsclient/nfs_vnops.c	Fri Sep 16 18:23:39 2011	(r225624)
@@ -1277,6 +1277,7 @@ nfs_readrpc(struct vnode *vp, struct uio
 	caddr_t bpos, dpos;
 	struct mbuf *mreq, *mrep, *md, *mb;
 	struct nfsmount *nmp;
+	off_t end;
 	int error = 0, len, retlen, tsiz, eof, attrflag;
 	int v3 = NFS_ISV3(vp);
 	int rsize;
@@ -1287,7 +1288,8 @@ nfs_readrpc(struct vnode *vp, struct uio
 	nmp = VFSTONFS(vp->v_mount);
 	tsiz = uiop->uio_resid;
 	mtx_lock(&nmp->nm_mtx);
-	if (uiop->uio_offset + tsiz > nmp->nm_maxfilesize) {
+	end = uiop->uio_offset + tsiz;
+	if (end > nmp->nm_maxfilesize || end < uiop->uio_offset) {
 		mtx_unlock(&nmp->nm_mtx);
 		return (EFBIG);
 	}
@@ -1349,6 +1351,7 @@ nfs_writerpc(struct vnode *vp, struct ui
 	caddr_t bpos, dpos;
 	struct mbuf *mreq, *mrep, *md, *mb;
 	struct nfsmount *nmp = VFSTONFS(vp->v_mount);
+	off_t end;
 	int error = 0, len, tsiz, wccflag = NFSV3_WCCRATTR, rlen, commit;
 	int v3 = NFS_ISV3(vp), committed = NFSV3WRITE_FILESYNC;
 	int wsize;
@@ -1357,7 +1360,8 @@ nfs_writerpc(struct vnode *vp, struct ui
 	*must_commit = 0;
 	tsiz = uiop->uio_resid;
 	mtx_lock(&nmp->nm_mtx);
-	if (uiop->uio_offset + tsiz > nmp->nm_maxfilesize) {
+	end = uiop->uio_offset + tsiz;
+	if (end > nmp->nm_maxfilesize || end < uiop->uio_offset) {
 		mtx_unlock(&nmp->nm_mtx);		
 		return (EFBIG);
 	}


More information about the svn-src-all mailing list