From owner-svn-src-projects@FreeBSD.ORG Tue Dec 23 08:09:53 2014 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 0EA5AC4B; Tue, 23 Dec 2014 08:09:53 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id EC6656475D; Tue, 23 Dec 2014 08:09:52 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id sBN89q7a076666; Tue, 23 Dec 2014 08:09:52 GMT (envelope-from gleb@FreeBSD.org) Received: (from gleb@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id sBN89nlk076652; Tue, 23 Dec 2014 08:09:49 GMT (envelope-from gleb@FreeBSD.org) Message-Id: <201412230809.sBN89nlk076652@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: gleb set sender to gleb@FreeBSD.org using -f From: Gleb Kurtsou Date: Tue, 23 Dec 2014 08:09:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r276108 - in projects/ino64/sys: compat/freebsd32 compat/linux compat/svr4 fs/nfs fs/nfsserver fs/nullfs fs/unionfs i386/ibcs2 kern nfsserver sys X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 23 Dec 2014 08:09:53 -0000 Author: gleb Date: Tue Dec 23 08:09:48 2014 New Revision: 276108 URL: https://svnweb.freebsd.org/changeset/base/276108 Log: Avoid placing struct statfs on stack in kernel. MNAMELEN is about to be increased thus makeing the struct too large for the kernel stack. Use M_STATFS malloc type for struct statfs. Modified: projects/ino64/sys/compat/freebsd32/freebsd32_misc.c projects/ino64/sys/compat/linux/linux_stats.c projects/ino64/sys/compat/svr4/svr4_misc.c projects/ino64/sys/fs/nfs/nfs_commonsubs.c projects/ino64/sys/fs/nfsserver/nfs_nfsdserv.c projects/ino64/sys/fs/nullfs/null_vfsops.c projects/ino64/sys/fs/unionfs/union_vfsops.c projects/ino64/sys/i386/ibcs2/ibcs2_stat.c projects/ino64/sys/kern/kern_acct.c projects/ino64/sys/kern/vfs_default.c projects/ino64/sys/kern/vfs_mount.c projects/ino64/sys/kern/vfs_syscalls.c projects/ino64/sys/nfsserver/nfs_serv.c projects/ino64/sys/sys/mount.h Modified: projects/ino64/sys/compat/freebsd32/freebsd32_misc.c ============================================================================== --- projects/ino64/sys/compat/freebsd32/freebsd32_misc.c Tue Dec 23 08:05:03 2014 (r276107) +++ projects/ino64/sys/compat/freebsd32/freebsd32_misc.c Tue Dec 23 08:09:48 2014 (r276108) @@ -264,7 +264,7 @@ freebsd4_freebsd32_getfsstat(struct thre uap->buf++; count--; } - free(buf, M_TEMP); + free(buf, M_STATFS); } return (error); } @@ -1329,14 +1329,17 @@ int freebsd4_freebsd32_statfs(struct thread *td, struct freebsd4_freebsd32_statfs_args *uap) { struct statfs32 s32; - struct statfs s; + struct statfs *sp; int error; - error = kern_statfs(td, uap->path, UIO_USERSPACE, &s); - if (error) - return (error); - copy_statfs(&s, &s32); - return (copyout(&s32, uap->buf, sizeof(s32))); + sp = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + error = kern_statfs(td, uap->path, UIO_USERSPACE, sp); + if (error == 0) { + copy_statfs(sp, &s32); + error = copyout(&s32, uap->buf, sizeof(s32)); + } + free(sp, M_STATFS); + return (error); } #endif @@ -1345,14 +1348,17 @@ int freebsd4_freebsd32_fstatfs(struct thread *td, struct freebsd4_freebsd32_fstatfs_args *uap) { struct statfs32 s32; - struct statfs s; + struct statfs *sp; int error; - error = kern_fstatfs(td, uap->fd, &s); - if (error) - return (error); - copy_statfs(&s, &s32); - return (copyout(&s32, uap->buf, sizeof(s32))); + sp = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + error = kern_fstatfs(td, uap->fd, sp); + if (error == 0) { + copy_statfs(sp, &s32); + error = copyout(&s32, uap->buf, sizeof(s32)); + } + free(sp, M_STATFS); + return (error); } #endif @@ -1361,17 +1367,20 @@ int freebsd4_freebsd32_fhstatfs(struct thread *td, struct freebsd4_freebsd32_fhstatfs_args *uap) { struct statfs32 s32; - struct statfs s; + struct statfs *sp; fhandle_t fh; int error; if ((error = copyin(uap->u_fhp, &fh, sizeof(fhandle_t))) != 0) return (error); - error = kern_fhstatfs(td, fh, &s); - if (error) - return (error); - copy_statfs(&s, &s32); - return (copyout(&s32, uap->buf, sizeof(s32))); + sp = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + error = kern_fhstatfs(td, fh, sp); + if (error == 0) { + copy_statfs(sp, &s32); + error = copyout(&s32, uap->buf, sizeof(s32)); + } + free(sp, M_STATFS); + return (error); } #endif Modified: projects/ino64/sys/compat/linux/linux_stats.c ============================================================================== --- projects/ino64/sys/compat/linux/linux_stats.c Tue Dec 23 08:05:03 2014 (r276107) +++ projects/ino64/sys/compat/linux/linux_stats.c Tue Dec 23 08:09:48 2014 (r276108) @@ -397,7 +397,7 @@ int linux_statfs(struct thread *td, struct linux_statfs_args *args) { struct l_statfs linux_statfs; - struct statfs bsd_statfs; + struct statfs *bsd_statfs; char *path; int error, dev_shm; @@ -408,14 +408,17 @@ linux_statfs(struct thread *td, struct l printf(ARGS(statfs, "%s, *"), path); #endif dev_shm = 0; - error = kern_statfs(td, path, UIO_SYSSPACE, &bsd_statfs); + bsd_statfs = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + error = kern_statfs(td, path, UIO_SYSSPACE, bsd_statfs); if (strncmp(path, "/dev/shm", sizeof("/dev/shm") - 1) == 0) dev_shm = (path[8] == '\0' || (path[8] == '/' && path[9] == '\0')); LFREEPATH(path); - if (error) + if (error == 0) + bsd_to_linux_statfs(bsd_statfs, &linux_statfs); + free(bsd_statfs, M_STATFS); + if (error != 0) return (error); - bsd_to_linux_statfs(&bsd_statfs, &linux_statfs); if (dev_shm) linux_statfs.f_type = LINUX_SHMFS_MAGIC; return copyout(&linux_statfs, args->buf, sizeof(linux_statfs)); @@ -441,7 +444,7 @@ int linux_statfs64(struct thread *td, struct linux_statfs64_args *args) { struct l_statfs64 linux_statfs; - struct statfs bsd_statfs; + struct statfs *bsd_statfs; char *path; int error; @@ -454,11 +457,14 @@ linux_statfs64(struct thread *td, struct if (ldebug(statfs64)) printf(ARGS(statfs64, "%s, *"), path); #endif - error = kern_statfs(td, path, UIO_SYSSPACE, &bsd_statfs); + bsd_statfs = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + error = kern_statfs(td, path, UIO_SYSSPACE, bsd_statfs); LFREEPATH(path); - if (error) + if (error == 0) + bsd_to_linux_statfs64(bsd_statfs, &linux_statfs); + free(bsd_statfs, M_STATFS); + if (error != 0) return (error); - bsd_to_linux_statfs64(&bsd_statfs, &linux_statfs); return copyout(&linux_statfs, args->buf, sizeof(linux_statfs)); } @@ -466,17 +472,20 @@ int linux_fstatfs(struct thread *td, struct linux_fstatfs_args *args) { struct l_statfs linux_statfs; - struct statfs bsd_statfs; + struct statfs *bsd_statfs; int error; #ifdef DEBUG if (ldebug(fstatfs)) printf(ARGS(fstatfs, "%d, *"), args->fd); #endif - error = kern_fstatfs(td, args->fd, &bsd_statfs); - if (error) - return error; - bsd_to_linux_statfs(&bsd_statfs, &linux_statfs); + bsd_statfs = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + error = kern_fstatfs(td, args->fd, bsd_statfs); + if (error == 0) + bsd_to_linux_statfs(bsd_statfs, &linux_statfs); + free(bsd_statfs, M_STATFS); + if (error != 0) + return (error); return copyout(&linux_statfs, args->buf, sizeof(linux_statfs)); } Modified: projects/ino64/sys/compat/svr4/svr4_misc.c ============================================================================== --- projects/ino64/sys/compat/svr4/svr4_misc.c Tue Dec 23 08:05:03 2014 (r276107) +++ projects/ino64/sys/compat/svr4/svr4_misc.c Tue Dec 23 08:09:48 2014 (r276108) @@ -1429,17 +1429,20 @@ svr4_sys_statvfs(td, uap) struct svr4_sys_statvfs_args *uap; { struct svr4_statvfs sfs; - struct statfs bfs; + struct statfs *bfs; char *path; int error; CHECKALTEXIST(td, uap->path, &path); - error = kern_statfs(td, path, UIO_SYSSPACE, &bfs); + bfs = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + error = kern_statfs(td, path, UIO_SYSSPACE, bfs); free(path, M_TEMP); - if (error) + if (error == 0) + bsd_statfs_to_svr4_statvfs(bfs, &sfs); + free(bfs, M_STATFS); + if (error != 0) return (error); - bsd_statfs_to_svr4_statvfs(&bfs, &sfs); return copyout(&sfs, uap->fs, sizeof(sfs)); } @@ -1450,13 +1453,16 @@ svr4_sys_fstatvfs(td, uap) struct svr4_sys_fstatvfs_args *uap; { struct svr4_statvfs sfs; - struct statfs bfs; + struct statfs *bfs; int error; - error = kern_fstatfs(td, uap->fd, &bfs); - if (error) + bfs = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + error = kern_fstatfs(td, uap->fd, bfs); + if (error == 0) + bsd_statfs_to_svr4_statvfs(bfs, &sfs); + free(bfs, M_STATFS); + if (error != 0) return (error); - bsd_statfs_to_svr4_statvfs(&bfs, &sfs); return copyout(&sfs, uap->fs, sizeof(sfs)); } @@ -1467,17 +1473,20 @@ svr4_sys_statvfs64(td, uap) struct svr4_sys_statvfs64_args *uap; { struct svr4_statvfs64 sfs; - struct statfs bfs; + struct statfs *bfs; char *path; int error; CHECKALTEXIST(td, uap->path, &path); - error = kern_statfs(td, path, UIO_SYSSPACE, &bfs); + bfs = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + error = kern_statfs(td, path, UIO_SYSSPACE, bfs); free(path, M_TEMP); - if (error) + if (error == 0) + bsd_statfs_to_svr4_statvfs64(bfs, &sfs); + free(bfs, M_STATFS); + if (error != 0) return (error); - bsd_statfs_to_svr4_statvfs64(&bfs, &sfs); return copyout(&sfs, uap->fs, sizeof(sfs)); } @@ -1488,13 +1497,16 @@ svr4_sys_fstatvfs64(td, uap) struct svr4_sys_fstatvfs64_args *uap; { struct svr4_statvfs64 sfs; - struct statfs bfs; + struct statfs *bfs; int error; - error = kern_fstatfs(td, uap->fd, &bfs); - if (error) + bfs = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + error = kern_fstatfs(td, uap->fd, bfs); + if (error == 0) + bsd_statfs_to_svr4_statvfs64(bfs, &sfs); + free(bfs, M_STATFS); + if (error != 0) return (error); - bsd_statfs_to_svr4_statvfs64(&bfs, &sfs); return copyout(&sfs, uap->fs, sizeof(sfs)); } Modified: projects/ino64/sys/fs/nfs/nfs_commonsubs.c ============================================================================== --- projects/ino64/sys/fs/nfs/nfs_commonsubs.c Tue Dec 23 08:05:03 2014 (r276107) +++ projects/ino64/sys/fs/nfs/nfs_commonsubs.c Tue Dec 23 08:09:48 2014 (r276108) @@ -2022,7 +2022,7 @@ nfsv4_fillattr(struct nfsrv_descript *nd nfsattrbit_t *retbitp = &retbits; u_int32_t freenum, *retnump; u_int64_t uquad; - struct statfs fs; + struct statfs *fs; struct nfsfsinfo fsinf; struct timespec temptime; NFSACL_T *aclp, *naclp = NULL; @@ -2054,11 +2054,13 @@ nfsv4_fillattr(struct nfsrv_descript *nd /* * Get the VFS_STATFS(), since some attributes need them. */ + fs = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); if (NFSISSETSTATFS_ATTRBIT(retbitp)) { - error = VFS_STATFS(mp, &fs); + error = VFS_STATFS(mp, fs); if (error != 0) { if (reterr) { nd->nd_repstat = NFSERR_ACCES; + free(fs, M_STATFS); return (0); } NFSCLRSTATFS_ATTRBIT(retbitp); @@ -2090,6 +2092,7 @@ nfsv4_fillattr(struct nfsrv_descript *nd if (error != 0) { if (reterr) { nd->nd_repstat = NFSERR_ACCES; + free(fs, M_STATFS); return (0); } NFSCLRBIT_ATTRBIT(retbitp, NFSATTRBIT_ACL); @@ -2231,7 +2234,7 @@ nfsv4_fillattr(struct nfsrv_descript *nd /* * Check quota and use min(quota, f_ffree). */ - freenum = fs.f_ffree; + freenum = fs->f_ffree; #ifdef QUOTA /* * ufs_quotactl() insists that the uid argument @@ -2254,13 +2257,13 @@ nfsv4_fillattr(struct nfsrv_descript *nd case NFSATTRBIT_FILESFREE: NFSM_BUILD(tl, u_int32_t *, NFSX_HYPER); *tl++ = 0; - *tl = txdr_unsigned(fs.f_ffree); + *tl = txdr_unsigned(fs->f_ffree); retnum += NFSX_HYPER; break; case NFSATTRBIT_FILESTOTAL: NFSM_BUILD(tl, u_int32_t *, NFSX_HYPER); *tl++ = 0; - *tl = txdr_unsigned(fs.f_files); + *tl = txdr_unsigned(fs->f_files); retnum += NFSX_HYPER; break; case NFSATTRBIT_FSLOCATIONS: @@ -2336,9 +2339,9 @@ nfsv4_fillattr(struct nfsrv_descript *nd break; case NFSATTRBIT_QUOTAHARD: if (priv_check_cred(cred, PRIV_VFS_EXCEEDQUOTA, 0)) - freenum = fs.f_bfree; + freenum = fs->f_bfree; else - freenum = fs.f_bavail; + freenum = fs->f_bavail; #ifdef QUOTA /* * ufs_quotactl() insists that the uid argument @@ -2354,15 +2357,15 @@ nfsv4_fillattr(struct nfsrv_descript *nd #endif /* QUOTA */ NFSM_BUILD(tl, u_int32_t *, NFSX_HYPER); uquad = (u_int64_t)freenum; - NFSQUOTABLKTOBYTE(uquad, fs.f_bsize); + NFSQUOTABLKTOBYTE(uquad, fs->f_bsize); txdr_hyper(uquad, tl); retnum += NFSX_HYPER; break; case NFSATTRBIT_QUOTASOFT: if (priv_check_cred(cred, PRIV_VFS_EXCEEDQUOTA, 0)) - freenum = fs.f_bfree; + freenum = fs->f_bfree; else - freenum = fs.f_bavail; + freenum = fs->f_bavail; #ifdef QUOTA /* * ufs_quotactl() insists that the uid argument @@ -2378,7 +2381,7 @@ nfsv4_fillattr(struct nfsrv_descript *nd #endif /* QUOTA */ NFSM_BUILD(tl, u_int32_t *, NFSX_HYPER); uquad = (u_int64_t)freenum; - NFSQUOTABLKTOBYTE(uquad, fs.f_bsize); + NFSQUOTABLKTOBYTE(uquad, fs->f_bsize); txdr_hyper(uquad, tl); retnum += NFSX_HYPER; break; @@ -2399,7 +2402,7 @@ nfsv4_fillattr(struct nfsrv_descript *nd #endif /* QUOTA */ NFSM_BUILD(tl, u_int32_t *, NFSX_HYPER); uquad = (u_int64_t)freenum; - NFSQUOTABLKTOBYTE(uquad, fs.f_bsize); + NFSQUOTABLKTOBYTE(uquad, fs->f_bsize); txdr_hyper(uquad, tl); retnum += NFSX_HYPER; break; @@ -2412,24 +2415,24 @@ nfsv4_fillattr(struct nfsrv_descript *nd case NFSATTRBIT_SPACEAVAIL: NFSM_BUILD(tl, u_int32_t *, NFSX_HYPER); if (priv_check_cred(cred, PRIV_VFS_BLOCKRESERVE, 0)) - uquad = (u_int64_t)fs.f_bfree; + uquad = (u_int64_t)fs->f_bfree; else - uquad = (u_int64_t)fs.f_bavail; - uquad *= fs.f_bsize; + uquad = (u_int64_t)fs->f_bavail; + uquad *= fs->f_bsize; txdr_hyper(uquad, tl); retnum += NFSX_HYPER; break; case NFSATTRBIT_SPACEFREE: NFSM_BUILD(tl, u_int32_t *, NFSX_HYPER); - uquad = (u_int64_t)fs.f_bfree; - uquad *= fs.f_bsize; + uquad = (u_int64_t)fs->f_bfree; + uquad *= fs->f_bsize; txdr_hyper(uquad, tl); retnum += NFSX_HYPER; break; case NFSATTRBIT_SPACETOTAL: NFSM_BUILD(tl, u_int32_t *, NFSX_HYPER); - uquad = (u_int64_t)fs.f_blocks; - uquad *= fs.f_bsize; + uquad = (u_int64_t)fs->f_blocks; + uquad *= fs->f_bsize; txdr_hyper(uquad, tl); retnum += NFSX_HYPER; break; @@ -2506,6 +2509,7 @@ nfsv4_fillattr(struct nfsrv_descript *nd } if (naclp != NULL) acl_free(naclp); + free(fs, M_STATFS); *retnump = txdr_unsigned(retnum); return (retnum + prefixnum); } Modified: projects/ino64/sys/fs/nfsserver/nfs_nfsdserv.c ============================================================================== --- projects/ino64/sys/fs/nfsserver/nfs_nfsdserv.c Tue Dec 23 08:05:03 2014 (r276107) +++ projects/ino64/sys/fs/nfsserver/nfs_nfsdserv.c Tue Dec 23 08:09:48 2014 (r276108) @@ -2034,14 +2034,14 @@ nfsrvd_statfs(struct nfsrv_descript *nd, u_int32_t *tl; int getret = 1; struct nfsvattr at; - struct statfs sfs; u_quad_t tval; + sf = NULL; if (nd->nd_repstat) { nfsrv_postopattr(nd, getret, &at); goto out; } - sf = &sfs; + sf = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); nd->nd_repstat = nfsvno_statfs(vp, sf); getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1); vput(vp); @@ -2077,6 +2077,7 @@ nfsrvd_statfs(struct nfsrv_descript *nd, } out: + free(sf, M_STATFS); NFSEXITCODE2(0, nd); return (0); } @@ -3599,19 +3600,20 @@ nfsrvd_verify(struct nfsrv_descript *nd, { int error = 0, ret, fhsize = NFSX_MYFH; struct nfsvattr nva; - struct statfs sf; + struct statfs *sf; struct nfsfsinfo fs; fhandle_t fh; + sf = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1); if (!nd->nd_repstat) - nd->nd_repstat = nfsvno_statfs(vp, &sf); + nd->nd_repstat = nfsvno_statfs(vp, sf); if (!nd->nd_repstat) nd->nd_repstat = nfsvno_getfh(vp, &fh, p); if (!nd->nd_repstat) { nfsvno_getfs(&fs, isdgram); error = nfsv4_loadattr(nd, vp, &nva, NULL, &fh, fhsize, NULL, - &sf, NULL, &fs, NULL, 1, &ret, NULL, NULL, p, nd->nd_cred); + sf, NULL, &fs, NULL, 1, &ret, NULL, NULL, p, nd->nd_cred); if (!error) { if (nd->nd_procnum == NFSV4OP_NVERIFY) { if (ret == 0) @@ -3623,6 +3625,7 @@ nfsrvd_verify(struct nfsrv_descript *nd, } } vput(vp); + free(sf, M_STATFS); NFSEXITCODE2(error, nd); return (error); } Modified: projects/ino64/sys/fs/nullfs/null_vfsops.c ============================================================================== --- projects/ino64/sys/fs/nullfs/null_vfsops.c Tue Dec 23 08:05:03 2014 (r276107) +++ projects/ino64/sys/fs/nullfs/null_vfsops.c Tue Dec 23 08:09:48 2014 (r276108) @@ -300,29 +300,33 @@ nullfs_statfs(mp, sbp) struct statfs *sbp; { int error; - struct statfs mstat; + struct statfs *mstat; NULLFSDEBUG("nullfs_statfs(mp = %p, vp = %p->%p)\n", (void *)mp, (void *)MOUNTTONULLMOUNT(mp)->nullm_rootvp, (void *)NULLVPTOLOWERVP(MOUNTTONULLMOUNT(mp)->nullm_rootvp)); - bzero(&mstat, sizeof(mstat)); + mstat = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK | M_ZERO); - error = VFS_STATFS(MOUNTTONULLMOUNT(mp)->nullm_vfs, &mstat); - if (error) + error = VFS_STATFS(MOUNTTONULLMOUNT(mp)->nullm_vfs, mstat); + if (error) { + free(mstat, M_STATFS); return (error); + } /* now copy across the "interesting" information and fake the rest */ - sbp->f_type = mstat.f_type; + sbp->f_type = mstat->f_type; sbp->f_flags = (sbp->f_flags & (MNT_RDONLY | MNT_NOEXEC | MNT_NOSUID | - MNT_UNION | MNT_NOSYMFOLLOW)) | (mstat.f_flags & ~MNT_ROOTFS); - sbp->f_bsize = mstat.f_bsize; - sbp->f_iosize = mstat.f_iosize; - sbp->f_blocks = mstat.f_blocks; - sbp->f_bfree = mstat.f_bfree; - sbp->f_bavail = mstat.f_bavail; - sbp->f_files = mstat.f_files; - sbp->f_ffree = mstat.f_ffree; + MNT_UNION | MNT_NOSYMFOLLOW)) | (mstat->f_flags & ~MNT_ROOTFS); + sbp->f_bsize = mstat->f_bsize; + sbp->f_iosize = mstat->f_iosize; + sbp->f_blocks = mstat->f_blocks; + sbp->f_bfree = mstat->f_bfree; + sbp->f_bavail = mstat->f_bavail; + sbp->f_files = mstat->f_files; + sbp->f_ffree = mstat->f_ffree; + + free(mstat, M_STATFS); return (0); } Modified: projects/ino64/sys/fs/unionfs/union_vfsops.c ============================================================================== --- projects/ino64/sys/fs/unionfs/union_vfsops.c Tue Dec 23 08:05:03 2014 (r276107) +++ projects/ino64/sys/fs/unionfs/union_vfsops.c Tue Dec 23 08:09:48 2014 (r276108) @@ -400,7 +400,7 @@ unionfs_statfs(struct mount *mp, struct { struct unionfs_mount *ump; int error; - struct statfs mstat; + struct statfs *mstat; uint64_t lbsize; ump = MOUNTTOUNIONFSMOUNT(mp); @@ -408,39 +408,47 @@ unionfs_statfs(struct mount *mp, struct UNIONFSDEBUG("unionfs_statfs(mp = %p, lvp = %p, uvp = %p)\n", (void *)mp, (void *)ump->um_lowervp, (void *)ump->um_uppervp); - bzero(&mstat, sizeof(mstat)); + mstat = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK | M_ZERO); - error = VFS_STATFS(ump->um_lowervp->v_mount, &mstat); - if (error) + error = VFS_STATFS(ump->um_lowervp->v_mount, mstat); + if (error) { + free(mstat, M_STATFS); return (error); + } /* now copy across the "interesting" information and fake the rest */ - sbp->f_blocks = mstat.f_blocks; - sbp->f_files = mstat.f_files; + sbp->f_blocks = mstat->f_blocks; + sbp->f_files = mstat->f_files; - lbsize = mstat.f_bsize; + lbsize = mstat->f_bsize; - error = VFS_STATFS(ump->um_uppervp->v_mount, &mstat); - if (error) + error = VFS_STATFS(ump->um_uppervp->v_mount, mstat); + if (error) { + free(mstat, M_STATFS); return (error); + } + /* * The FS type etc is copy from upper vfs. * (write able vfs have priority) */ - sbp->f_type = mstat.f_type; - sbp->f_flags = mstat.f_flags; - sbp->f_bsize = mstat.f_bsize; - sbp->f_iosize = mstat.f_iosize; - - if (mstat.f_bsize != lbsize) - sbp->f_blocks = ((off_t)sbp->f_blocks * lbsize) / mstat.f_bsize; - - sbp->f_blocks += mstat.f_blocks; - sbp->f_bfree = mstat.f_bfree; - sbp->f_bavail = mstat.f_bavail; - sbp->f_files += mstat.f_files; - sbp->f_ffree = mstat.f_ffree; + sbp->f_type = mstat->f_type; + sbp->f_flags = mstat->f_flags; + sbp->f_bsize = mstat->f_bsize; + sbp->f_iosize = mstat->f_iosize; + + if (mstat->f_bsize != lbsize) + sbp->f_blocks = ((off_t)sbp->f_blocks * lbsize) / + mstat->f_bsize; + + sbp->f_blocks += mstat->f_blocks; + sbp->f_bfree = mstat->f_bfree; + sbp->f_bavail = mstat->f_bavail; + sbp->f_files += mstat->f_files; + sbp->f_ffree = mstat->f_ffree; + + free(mstat, M_STATFS); return (0); } Modified: projects/ino64/sys/i386/ibcs2/ibcs2_stat.c ============================================================================== --- projects/ino64/sys/i386/ibcs2/ibcs2_stat.c Tue Dec 23 08:05:03 2014 (r276107) +++ projects/ino64/sys/i386/ibcs2/ibcs2_stat.c Tue Dec 23 08:09:48 2014 (r276108) @@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -108,16 +109,18 @@ ibcs2_statfs(td, uap) struct thread *td; struct ibcs2_statfs_args *uap; { - struct statfs sf; + struct statfs *sf; char *path; int error; CHECKALTEXIST(td, uap->path, &path); - error = kern_statfs(td, path, UIO_SYSSPACE, &sf); + sf = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + error = kern_statfs(td, path, UIO_SYSSPACE, sf); free(path, M_TEMP); - if (error) - return (error); - return cvt_statfs(&sf, (caddr_t)uap->buf, uap->len); + if (error == 0) + error = cvt_statfs(sf, (caddr_t)uap->buf, uap->len); + free(sf, M_STATFS); + return (error); } int @@ -125,13 +128,15 @@ ibcs2_fstatfs(td, uap) struct thread *td; struct ibcs2_fstatfs_args *uap; { - struct statfs sf; + struct statfs *sf; int error; - error = kern_fstatfs(td, uap->fd, &sf); - if (error) - return (error); - return cvt_statfs(&sf, (caddr_t)uap->buf, uap->len); + sf = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + error = kern_fstatfs(td, uap->fd, sf); + if (error == 0) + error = cvt_statfs(sf, (caddr_t)uap->buf, uap->len); + free(sf, M_STATFS); + return (error); } int Modified: projects/ino64/sys/kern/kern_acct.c ============================================================================== --- projects/ino64/sys/kern/kern_acct.c Tue Dec 23 08:05:03 2014 (r276107) +++ projects/ino64/sys/kern/kern_acct.c Tue Dec 23 08:09:48 2014 (r276108) @@ -78,6 +78,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -552,7 +553,7 @@ encode_long(long val) static void acctwatch(void) { - struct statfs sb; + struct statfs *sp; sx_assert(&acct_sx, SX_XLOCKED); @@ -580,21 +581,25 @@ acctwatch(void) * Stopping here is better than continuing, maybe it will be VBAD * next time around. */ - if (VFS_STATFS(acct_vp->v_mount, &sb) < 0) + sp = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + if (VFS_STATFS(acct_vp->v_mount, sp) < 0) { + free(sp, M_STATFS); return; + } if (acct_suspended) { - if (sb.f_bavail > (int64_t)(acctresume * sb.f_blocks / + if (sp->f_bavail > (int64_t)(acctresume * sp->f_blocks / 100)) { acct_suspended = 0; log(LOG_NOTICE, "Accounting resumed\n"); } } else { - if (sb.f_bavail <= (int64_t)(acctsuspend * sb.f_blocks / + if (sp->f_bavail <= (int64_t)(acctsuspend * sp->f_blocks / 100)) { acct_suspended = 1; log(LOG_NOTICE, "Accounting suspended\n"); } } + free(sp, M_STATFS); } /* Modified: projects/ino64/sys/kern/vfs_default.c ============================================================================== --- projects/ino64/sys/kern/vfs_default.c Tue Dec 23 08:05:03 2014 (r276107) +++ projects/ino64/sys/kern/vfs_default.c Tue Dec 23 08:09:48 2014 (r276108) @@ -898,7 +898,8 @@ int vop_stdallocate(struct vop_allocate_args *ap) { #ifdef __notyet__ - struct statfs sfs; + struct statfs *sfs; + off_t maxfilesize = 0; #endif struct iovec aiov; struct vattr vattr, *vap; @@ -934,12 +935,16 @@ vop_stdallocate(struct vop_allocate_args * Check if the filesystem sets f_maxfilesize; if not use * VOP_SETATTR to perform the check. */ - error = VFS_STATFS(vp->v_mount, &sfs, td); + sfs = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + error = VFS_STATFS(vp->v_mount, sfs, td); + if (error == 0) + maxfilesize = sfs->f_maxfilesize; + free(sfs, M_STATFS); if (error != 0) goto out; - if (sfs.f_maxfilesize) { - if (offset > sfs.f_maxfilesize || len > sfs.f_maxfilesize || - offset + len > sfs.f_maxfilesize) { + if (maxfilesize) { + if (offset > maxfilesize || len > maxfilesize || + offset + len > maxfilesize) { error = EFBIG; goto out; } Modified: projects/ino64/sys/kern/vfs_mount.c ============================================================================== --- projects/ino64/sys/kern/vfs_mount.c Tue Dec 23 08:05:03 2014 (r276107) +++ projects/ino64/sys/kern/vfs_mount.c Tue Dec 23 08:09:48 2014 (r276108) @@ -79,6 +79,7 @@ SYSCTL_INT(_vfs, OID_AUTO, usermount, CT "Unprivileged users may mount and unmount file systems"); MALLOC_DEFINE(M_MOUNT, "mount", "vfs mount structure"); +MALLOC_DEFINE(M_STATFS, "statfs", "statfs structure"); static uma_zone_t mount_zone; /* List of mounted filesystems. */ Modified: projects/ino64/sys/kern/vfs_syscalls.c ============================================================================== --- projects/ino64/sys/kern/vfs_syscalls.c Tue Dec 23 08:05:03 2014 (r276107) +++ projects/ino64/sys/kern/vfs_syscalls.c Tue Dec 23 08:09:48 2014 (r276108) @@ -268,12 +268,14 @@ sys_statfs(td, uap) struct statfs *buf; } */ *uap; { - struct statfs sf; + struct statfs *sfp; int error; - error = kern_statfs(td, uap->path, UIO_USERSPACE, &sf); + sfp = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + error = kern_statfs(td, uap->path, UIO_USERSPACE, sfp); if (error == 0) - error = copyout(&sf, uap->buf, sizeof(sf)); + error = copyout(sfp, uap->buf, sizeof(struct statfs)); + free(sfp, M_STATFS); return (error); } @@ -282,7 +284,7 @@ kern_statfs(struct thread *td, char *pat struct statfs *buf) { struct mount *mp; - struct statfs *sp, sb; + struct statfs *sp; struct nameidata nd; int error; @@ -314,13 +316,11 @@ kern_statfs(struct thread *td, char *pat error = VFS_STATFS(mp, sp); if (error != 0) goto out; + *buf = *sp; if (priv_check(td, PRIV_VFS_GENERATION)) { - bcopy(sp, &sb, sizeof(sb)); - sb.f_fsid.val[0] = sb.f_fsid.val[1] = 0; - prison_enforce_statfs(td->td_ucred, mp, &sb); - sp = &sb; + buf->f_fsid.val[0] = buf->f_fsid.val[1] = 0; + prison_enforce_statfs(td->td_ucred, mp, buf); } - *buf = *sp; out: vfs_unbusy(mp); return (error); @@ -343,12 +343,14 @@ sys_fstatfs(td, uap) struct statfs *buf; } */ *uap; { - struct statfs sf; + struct statfs *sfp; int error; - error = kern_fstatfs(td, uap->fd, &sf); + sfp = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + error = kern_fstatfs(td, uap->fd, sfp); if (error == 0) - error = copyout(&sf, uap->buf, sizeof(sf)); + error = copyout(sfp, uap->buf, sizeof(struct statfs)); + free(sfp, M_STATFS); return (error); } @@ -357,7 +359,7 @@ kern_fstatfs(struct thread *td, int fd, { struct file *fp; struct mount *mp; - struct statfs *sp, sb; + struct statfs *sp; struct vnode *vp; cap_rights_t rights; int error; @@ -400,13 +402,11 @@ kern_fstatfs(struct thread *td, int fd, error = VFS_STATFS(mp, sp); if (error != 0) goto out; + *buf = *sp; if (priv_check(td, PRIV_VFS_GENERATION)) { - bcopy(sp, &sb, sizeof(sb)); - sb.f_fsid.val[0] = sb.f_fsid.val[1] = 0; - prison_enforce_statfs(td->td_ucred, mp, &sb); - sp = &sb; + buf->f_fsid.val[0] = buf->f_fsid.val[1] = 0; + prison_enforce_statfs(td->td_ucred, mp, buf); } - *buf = *sp; out: if (mp) vfs_unbusy(mp); @@ -447,11 +447,12 @@ kern_getfsstat(struct thread *td, struct enum uio_seg bufseg, int flags) { struct mount *mp, *nmp; - struct statfs *sfsp, *sp, sb; + struct statfs *sfsp, *sp, *sptmp; size_t count, maxcount; int error; maxcount = bufsize / sizeof(struct statfs); + sptmp = NULL; if (bufsize == 0) sfsp = NULL; else if (bufseg == UIO_USERSPACE) @@ -465,7 +466,7 @@ kern_getfsstat(struct thread *td, struct mtx_unlock(&mountlist_mtx); if (maxcount > count) maxcount = count; - sfsp = *buf = malloc(maxcount * sizeof(struct statfs), M_TEMP, + sfsp = *buf = malloc(maxcount * sizeof(struct statfs), M_STATFS, M_WAITOK); } count = 0; @@ -508,15 +509,19 @@ kern_getfsstat(struct thread *td, struct continue; } if (priv_check(td, PRIV_VFS_GENERATION)) { - bcopy(sp, &sb, sizeof(sb)); - sb.f_fsid.val[0] = sb.f_fsid.val[1] = 0; - prison_enforce_statfs(td->td_ucred, mp, &sb); - sp = &sb; + sptmp = malloc(sizeof(struct statfs), M_STATFS, + M_WAITOK); + *sptmp = *sp; + sptmp->f_fsid.val[0] = sptmp->f_fsid.val[1] = 0; + prison_enforce_statfs(td->td_ucred, mp, sptmp); + sp = sptmp; } - if (bufseg == UIO_SYSSPACE) + if (bufseg == UIO_SYSSPACE) { bcopy(sp, sfsp, sizeof(*sp)); - else /* if (bufseg == UIO_USERSPACE) */ { + free(sptmp, M_STATFS); + } else /* if (bufseg == UIO_USERSPACE) */ { error = copyout(sp, sfsp, sizeof(*sp)); + free(sptmp, M_STATFS); if (error != 0) { vfs_unbusy(mp); return (error); @@ -541,7 +546,7 @@ kern_getfsstat(struct thread *td, struct /* * Get old format filesystem statistics. */ -static void cvtstatfs(struct statfs *, struct ostatfs *); +static void freebsd4_cvtstatfs(struct statfs *, struct ostatfs *); #ifndef _SYS_SYSPROTO_H_ struct freebsd4_statfs_args { @@ -558,14 +563,17 @@ freebsd4_statfs(td, uap) } */ *uap; { struct ostatfs osb; - struct statfs sf; + struct statfs *sfp; int error; - error = kern_statfs(td, uap->path, UIO_USERSPACE, &sf); - if (error != 0) - return (error); - cvtstatfs(&sf, &osb); - return (copyout(&osb, uap->buf, sizeof(osb))); + sfp = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + error = kern_statfs(td, uap->path, UIO_USERSPACE, sfp); + if (error == 0) { + freebsd4_cvtstatfs(sfp, &osb); + error = copyout(&osb, uap->buf, sizeof(osb)); + } + free(sfp, M_STATFS); + return (error); } /* @@ -586,14 +594,17 @@ freebsd4_fstatfs(td, uap) } */ *uap; { struct ostatfs osb; - struct statfs sf; + struct statfs *sfp; int error; - error = kern_fstatfs(td, uap->fd, &sf); - if (error != 0) - return (error); - cvtstatfs(&sf, &osb); - return (copyout(&osb, uap->buf, sizeof(osb))); + sfp = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + error = kern_fstatfs(td, uap->fd, sfp); + if (error == 0) { + freebsd4_cvtstatfs(sfp, &osb); + error = copyout(&osb, uap->buf, sizeof(osb)); + } + free(sfp, M_STATFS); + return (error); } /* @@ -627,13 +638,13 @@ freebsd4_getfsstat(td, uap) count = td->td_retval[0]; sp = buf; while (count > 0 && error == 0) { - cvtstatfs(sp, &osb); + freebsd4_cvtstatfs(sp, &osb); error = copyout(&osb, uap->buf, sizeof(osb)); sp++; uap->buf++; count--; } - free(buf, M_TEMP); + free(buf, M_STATFS); } return (error); } @@ -656,25 +667,28 @@ freebsd4_fhstatfs(td, uap) } */ *uap; { struct ostatfs osb; - struct statfs sf; + struct statfs *sfp; fhandle_t fh; int error; error = copyin(uap->u_fhp, &fh, sizeof(fhandle_t)); if (error != 0) return (error); - error = kern_fhstatfs(td, fh, &sf); - if (error != 0) - return (error); - cvtstatfs(&sf, &osb); - return (copyout(&osb, uap->buf, sizeof(osb))); + sfp = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK); + error = kern_fhstatfs(td, fh, sfp); + if (error == 0) { + freebsd4_cvtstatfs(sfp, &osb); + error = copyout(&osb, uap->buf, sizeof(osb)); + } + free(sfp, M_STATFS); + return (error); } /* * Convert a new format statfs structure to an old format statfs structure. */ static void -cvtstatfs(nsp, osp) +freebsd4_cvtstatfs(nsp, osp) struct statfs *nsp; struct ostatfs *osp; { @@ -4349,17 +4363,19 @@ sys_fhstatfs(td, uap) struct statfs *buf; } */ *uap; { - struct statfs sf; *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***