From owner-freebsd-arch@FreeBSD.ORG Thu Nov 6 16:02:05 2003 Return-Path: Delivered-To: freebsd-arch@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id BE6F516A4CF; Thu, 6 Nov 2003 16:02:05 -0800 (PST) Received: from beastie.mckusick.com (beastie.mckusick.com [209.31.233.184]) by mx1.FreeBSD.org (Postfix) with ESMTP id 7929443FEC; Thu, 6 Nov 2003 16:02:04 -0800 (PST) (envelope-from mckusick@beastie.mckusick.com) Received: from beastie.mckusick.com (localhost [127.0.0.1]) by beastie.mckusick.com (8.12.8/8.12.3) with ESMTP id hA7021eN035691; Thu, 6 Nov 2003 16:02:01 -0800 (PST) (envelope-from mckusick@beastie.mckusick.com) Message-Id: <200311070002.hA7021eN035691@beastie.mckusick.com> To: Tim Robbins In-Reply-To: Your message of "Thu, 06 Nov 2003 17:45:28 +1100." <20031106064528.GA1440@wombat.robbins.dropbear.id.au> Date: Thu, 06 Nov 2003 16:02:01 -0800 From: Kirk McKusick cc: Robert Watson cc: arch@freebsd.org cc: Peter Wemm Subject: Re: >0x7fffffff blocksize filesystem reporting X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 07 Nov 2003 00:02:05 -0000 > Date: Thu, 6 Nov 2003 17:45:28 +1100 > From: Tim Robbins > To: Kirk McKusick > Cc: Peter Wemm , Robert Watson , > arch@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));