On Thu, Jul 21, 2011 at 2:39 PM, Paul Eggert <eggert@cs.ucla.edu> wrote:
> On OSX 10.7 the relevant fields of the statvfs structure
> are defined to be fsblkcnt_t, or only 4 bytes long.

Thanks for the bug report.  Could you please give more details about
the problem?  What is the size of your file system?  What are the
types (e.g., are the types signed? and what are their sizes?)
and values of f_frsize, f_bsize, f_blocks, and all the other
members of a struct statvfs?


Sure.  The filesystem is 5.5TiB (5,858,217,984 bytes).  This is beyond the capacity an unsigned int can hold.  Here is an example of the bug:
> df /Volumes/VIDEO
Filesystem                         1K-blocks        Used   Available Use% Mounted on
//user1@192.168.1.100/VIDEO       1563250688 -1474553224 -1257163384  54% /Volumes/VIDEO

Here is what it should look like:
> df /Volumes/VIDEO
Filesystem                         1K-blocks       Used  Available Use% Mounted on
//user1@192.168.1.100/VIDEO       5858217984 2820414072 3037803912  49% /Volumes/VIDEO


Here are the relevant definitions on OSX:
struct statvfs {
    unsigned long f_bsize;    /* File system block size */
    unsigned long f_frsize;   /* Fundamental file system block size */
    fsblkcnt_t    f_blocks;   /* Blocks on FS in units of f_frsize */
    fsblkcnt_t    f_bfree;    /* Free blocks */
    fsblkcnt_t    f_bavail;   /* Blocks available to non-root */
    fsfilcnt_t    f_files;    /* Total inodes */
    fsfilcnt_t    f_ffree;    /* Free inodes */
    fsfilcnt_t    f_favail;   /* Free inodes for non-root */
    unsigned long f_fsid;     /* Filesystem ID */
    unsigned long f_flag;     /* Bit mask of values */
    unsigned long f_namemax;  /* Max file name length */
};

typedef __darwin_fsblkcnt_t fsblkcnt_t;
typedef __darwin_fsfilcnt_t fsfilcnt_t;

typedef unsigned int __darwin_fsblkcnt_t; /* Used by statvfs and fstatvfs */
typedef unsigned int __darwin_fsfilcnt_t; /* Used by statvfs and fstatvfs */

(gdb) print sizeof(buf.f_bsize)
$2 = 8
(gdb) print sizeof(buf.f_frsize)
$3 = 8
(gdb) print sizeof(buf.f_blocks)
$4 = 4
(gdb) print sizeof(buf.f_bfree)
$5 = 4
(gdb) print sizeof(buf.f_bavail)
$6 = 4
(gdb) print sizeof(buf.f_files)
$7 = 4
(gdb) print sizeof(buf.f_ffree)
$8 = 4
(gdb) print sizeof(buf.f_favail)
$9 = 4
(gdb) print sizeof(buf.f_fsid)
$10 = 8
(gdb) print sizeof(buf.f_flag)
$11 = 8
(gdb) print sizeof(buf.f_namemax)
$12 = 8

 
The patch you sent essentially says "statvfs is broken so badly on
MacOS X 10.7 that nobody should ever use it".  Is that really right?
It sounds extreme.


Not saying no one should use it at all.  All I am saying is that when using really large filesystems, then the statvfs structure is insufficient on OSX.  Hope this helps.

-Herb