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-stable
mailing list