The Postfix fsspace() function wraps system APIs and represents the result thusly:
struct fsspace { unsigned long block_size; /* block size */ unsigned long block_free; /* free space */ }; If 'unsigned long' is a 32-bit type, then block_free will overflow if free space / block_size > 4 giga The warning message may also suffer from overflow: /* * Multiplication factor for free space check. Free space must be at least * smtpd_space_multf * message_size_limit. */ double smtpd_space_multf = 1.5; msg_warn("not enough free space in mail queue: %lu bytes < " "%g*message size limit", (unsigned long) fsbuf.block_free * fsbuf.block_size, smtpd_space_multf); The number in the warning message will overflow if 'unsigned long' is a 32-bit type, and the free space is > 4GB. So yes, I agree with the suggestion that this could be a 32-bit problem. On a 64-bit system you want to have 64-bit longs. Can you run the test program below? On my laptop (the default LP64 environment, i.e. 64-bit long and pointer) the output looks like: sizeof char: 1 sizeof short: 2 sizeof int: 4 sizeof long: 8 sizeof off_t: 8 sizeof ssize_t: 8 sizeof &char: 8 ... Wietse #include <sys/types.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { #define PRINT_SIZE_NP(x) do { \ printf("sizeof %s: %ld\n", #x, (long) sizeof(x)); \ } while (0) PRINT_SIZE_NP(char); PRINT_SIZE_NP(short); PRINT_SIZE_NP(int); PRINT_SIZE_NP(long); PRINT_SIZE_NP(off_t); PRINT_SIZE_NP(ssize_t); #define PRINT_SIZE_PT(x) do { \ x *y; printf("sizeof &%s: %ld\n", #x, (long) sizeof(y)); \ } while (0) PRINT_SIZE_PT(char); PRINT_SIZE_PT(short); PRINT_SIZE_PT(int); PRINT_SIZE_PT(off_t); PRINT_SIZE_PT(ssize_t); return (0); }