BigDisk project: du(1) 64bit clean.

Scott Long scottl at freebsd.org
Tue Jan 4 19:12:09 PST 2005


Doug White wrote:
> On Tue, 4 Jan 2005, Pawel Jakub Dawidek wrote:
> 
> 
>>I want you to look at two patches which makes du(1) 64bit clean.
>>This work is part of the BigDisk project:
>>
>>	http://www.freebsd.org/projects/bigdisk/
>>
>>The main problem here is that du(1) uses fts(3) and fts_number field from
>>one of its structures to store size.
>>This field is defined as 'long' so it doesn't give us what we want
>>(on 32bit archs).
> 
> 
> No offense intended, but can we avoid introducing LP64 bugs, please?
> Particularly when the goal is "ABI compatibility."*
> 
> dwlab3,ttyp1,~,24>uname -m
> i386
> dwlab3,ttyp1,~,25>./test
> sizeof(long) [4] + sizeof(void *) [4] == 8 == sizeof(int64_t) [8]
> 
> ok .. but:
> 
> dwlab4,ttyp1,~,20>uname -m
> amd64
> dwlab4,ttyp1,~,21>./test
> sizeof(long) [8] + sizeof(void *) [8] == 16 != sizeof(int64_t) [8]
> 
> oops! The struct just grew by 8 bytes!
> 
> (*) On the same platform, obviously.
> 

I'm not sure how you are getting this.  The structure goes from

	long fts_number;	        /* local numeric value */
	void *fts_pointer;	        /* local address value */

to

	union {
		struct {
			long __fts_number;	/* local numeric value */
			void *__fts_pointer;	/* local address value */
		} __struct_ftsent;
		int64_t __fts_bignum;
	} __union_ftsent;


Regardless of how big a pointer or a long is on your platform, the two
fields are going to combine to consume at least 64 bits.  All that the
change does is overlay those >= 64bits with a int64_t.

Scott


More information about the freebsd-arch mailing list