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
Gleb Kurtsou
gleb at FreeBSD.org
Tue Dec 23 08:09:53 UTC 2014
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 <sys/filedesc.h>
#include <sys/jail.h>
#include <sys/kernel.h>
+#include <sys/malloc.h>
#include <sys/mount.h>
#include <sys/malloc.h>
#include <sys/vnode.h>
@@ -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 <sys/kthread.h>
#include <sys/limits.h>
#include <sys/lock.h>
+#include <sys/malloc.h>
#include <sys/mount.h>
#include <sys/mutex.h>
#include <sys/namei.h>
@@ -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 ***
More information about the svn-src-projects
mailing list