>0x7fffffff blocksize filesystem reporting

Kirk McKusick mckusick at beastie.mckusick.com
Thu Nov 6 16:02:05 PST 2003


> Date: Thu, 6 Nov 2003 17:45:28 +1100
> From: Tim Robbins <tjr at freebsd.org>
> To: Kirk McKusick <mckusick at mckusick.com>
> Cc: Peter Wemm <peter at freebsd.org>, Robert Watson <rwatson at nailabs.com>,
>         arch at freebsd.org
> Subject: Re: >0x7fffffff blocksize filesystem reporting
> X-ASK-Info: Whitelist match
> 
> On Wed, Nov 05, 2003 at 09:04:41PM -0800, Kirk McKusick wrote:
> 
> > + /*
> > +  * Convert a new format statfs structure to an old format statfs structure.
> > +  */
> > + static void
> > + cvtstatfs(td, nsp, osp)
> > + 	struct thread *td;
> > + 	struct statfs *nsp;
> > + 	struct ostatfs *osp;
> > + {
> > + 
> > + 	bzero(osp, sizeof(*osp));
> > + 	osp->f_bsize = nsp->f_bsize;
> > + 	osp->f_iosize = nsp->f_iosize;
> > + 	osp->f_blocks = nsp->f_blocks;
> > + 	osp->f_bfree = nsp->f_bfree;
> > + 	osp->f_bavail = nsp->f_bavail;
> > + 	osp->f_files = nsp->f_files;
> > + 	osp->f_ffree = nsp->f_ffree;
> > + 	osp->f_owner = nsp->f_owner;
> > + 	osp->f_type = nsp->f_type;
> > + 	osp->f_flags = nsp->f_flags;
> > + 	osp->f_syncwrites = nsp->f_syncwrites;
> > + 	osp->f_asyncwrites = nsp->f_asyncwrites;
> > + 	osp->f_syncreads = nsp->f_syncreads;
> > + 	osp->f_asyncreads = nsp->f_asyncreads;
> 
> It may be better to return LONG_MAX for some of these members than to
> truncate the value. Alternatively, the block size could be adjusted
> to ensure that f_blocks fits in a "long" even though f_blocks * f_bsize
> may overflow it, but this is messy and can't help if f_files or
> f_{sync,async}{reads,writes} are too big.
> 
> > + 	bcopy(nsp->f_fstypename, osp->f_fstypename, MFSNAMELEN);
> > + 	bcopy(nsp->f_mntonname, osp->f_mntonname, MNAMELEN);
> > + 	bcopy(nsp->f_mntfromname, osp->f_mntfromname, MNAMELEN);
> 
> On architectures where longs are not 32 bits (amd64), OMNAMELEN != MNAMELEN,
> so this may do the wrong thing.
> 
> 
> Tim

You make two good points. Here is my revised diff for cvtstatfs:

+ /*
+  * Convert a new format statfs structure to an old format statfs structure.
+  */
+ static void
+ cvtstatfs(td, nsp, osp)
+ 	struct thread *td;
+ 	struct statfs *nsp;
+ 	struct ostatfs *osp;
+ {
+ 
+ 	bzero(osp, sizeof(*osp));
+ 	osp->f_bsize = MIN(nsp->f_bsize, LONG_MAX);
+ 	osp->f_iosize = MIN(nsp->f_iosize, LONG_MAX);
+ 	osp->f_blocks = MIN(nsp->f_blocks, LONG_MAX);
+ 	osp->f_bfree = MIN(nsp->f_bfree, LONG_MAX);
+ 	osp->f_bavail = MIN(nsp->f_bavail, LONG_MAX);
+ 	osp->f_files = MIN(nsp->f_files, LONG_MAX);
+ 	osp->f_ffree = MIN(nsp->f_ffree, LONG_MAX);
+ 	osp->f_owner = nsp->f_owner;
+ 	osp->f_type = nsp->f_type;
+ 	osp->f_flags = nsp->f_flags;
+ 	osp->f_syncwrites = MIN(nsp->f_syncwrites, LONG_MAX);
+ 	osp->f_asyncwrites = MIN(nsp->f_asyncwrites, LONG_MAX);
+ 	osp->f_syncreads = MIN(nsp->f_syncreads, LONG_MAX);
+ 	osp->f_asyncreads = MIN(nsp->f_asyncreads, LONG_MAX);
+ 	bcopy(nsp->f_fstypename, osp->f_fstypename,
+ 	    MIN(MFSNAMELEN, OMNAMELEN));
+ 	bcopy(nsp->f_mntonname, osp->f_mntonname,
+ 	    MIN(MFSNAMELEN, OMNAMELEN));
+ 	bcopy(nsp->f_mntfromname, osp->f_mntfromname,
+ 	    MIN(MFSNAMELEN, OMNAMELEN));


More information about the freebsd-arch mailing list