From: "Takashi Sato" This patch series fixes the following problems on 32 bits architecture. o stat64 returns the lower 32 bits of blocks, although userland st_blocks has 64 bits, because i_blocks has only 32 bits. The ioctl with FIOQSIZE has the same problem. o As Dave Kleikamp said, making >2TB file on JFS results in writing an invalid block number to disk inode. The cause is the same as above too. o In generic quota code dquot_transfer(), the file usage is calculated from i_blocks via inode_get_bytes(). If the file is over 2TB, the change of usage is less than expected. The cause is the same as above too. o As Trond Myklebust said, statfs64's entries related to blocks are invalid on statfs64 for a network filesystem which has more than 2^32-1 blocks with CONFIG_LBD disabled. [PATCH 3/3] We made patches to fix problems that occur when handling a large filesystem and a large file. It was discussed on the mails titled "stat64 for over 2TB file returned invalid st_blocks". Signed-off-by: Takashi Sato Cc: Dave Kleikamp Cc: Jan Kara Cc: Trond Myklebust Signed-off-by: Andrew Morton --- include/asm-i386/stat.h | 3 +-- include/asm-m68k/stat.h | 3 +-- include/asm-sh/stat.h | 8 +------- include/linux/fs.h | 2 +- include/linux/stat.h | 2 +- 5 files changed, 5 insertions(+), 13 deletions(-) diff -puN include/asm-i386/stat.h~2tb-files-st_blocks-is-invalid-when-calling-stat64 include/asm-i386/stat.h --- devel/include/asm-i386/stat.h~2tb-files-st_blocks-is-invalid-when-calling-stat64 2006-02-27 20:58:36.000000000 -0800 +++ devel-akpm/include/asm-i386/stat.h 2006-02-27 20:58:36.000000000 -0800 @@ -58,8 +58,7 @@ struct stat64 { long long st_size; unsigned long st_blksize; - unsigned long st_blocks; /* Number 512-byte blocks allocated. */ - unsigned long __pad4; /* future possible st_blocks high bits */ + unsigned long long st_blocks; /* Number 512-byte blocks allocated. */ unsigned long st_atime; unsigned long st_atime_nsec; diff -puN include/asm-m68k/stat.h~2tb-files-st_blocks-is-invalid-when-calling-stat64 include/asm-m68k/stat.h --- devel/include/asm-m68k/stat.h~2tb-files-st_blocks-is-invalid-when-calling-stat64 2006-02-27 20:58:36.000000000 -0800 +++ devel-akpm/include/asm-m68k/stat.h 2006-02-27 20:58:36.000000000 -0800 @@ -60,8 +60,7 @@ struct stat64 { long long st_size; unsigned long st_blksize; - unsigned long __pad4; /* future possible st_blocks high bits */ - unsigned long st_blocks; /* Number 512-byte blocks allocated. */ + unsigned long long st_blocks; /* Number 512-byte blocks allocated. */ unsigned long st_atime; unsigned long st_atime_nsec; diff -puN include/asm-sh/stat.h~2tb-files-st_blocks-is-invalid-when-calling-stat64 include/asm-sh/stat.h --- devel/include/asm-sh/stat.h~2tb-files-st_blocks-is-invalid-when-calling-stat64 2006-02-27 20:58:36.000000000 -0800 +++ devel-akpm/include/asm-sh/stat.h 2006-02-27 20:58:36.000000000 -0800 @@ -60,13 +60,7 @@ struct stat64 { long long st_size; unsigned long st_blksize; -#if defined(__BIG_ENDIAN__) - unsigned long __pad4; /* Future possible st_blocks hi bits */ - unsigned long st_blocks; /* Number 512-byte blocks allocated. */ -#else /* Must be little */ - unsigned long st_blocks; /* Number 512-byte blocks allocated. */ - unsigned long __pad4; /* Future possible st_blocks hi bits */ -#endif + unsigned long long st_blocks; /* Number 512-byte blocks allocated. */ unsigned long st_atime; unsigned long st_atime_nsec; diff -puN include/linux/fs.h~2tb-files-st_blocks-is-invalid-when-calling-stat64 include/linux/fs.h --- devel/include/linux/fs.h~2tb-files-st_blocks-is-invalid-when-calling-stat64 2006-02-27 20:58:36.000000000 -0800 +++ devel-akpm/include/linux/fs.h 2006-02-27 20:58:36.000000000 -0800 @@ -488,7 +488,7 @@ struct inode { unsigned int i_blkbits; unsigned long i_blksize; unsigned long i_version; - unsigned long i_blocks; + sector_t i_blocks; unsigned short i_bytes; spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ struct mutex i_mutex; diff -puN include/linux/stat.h~2tb-files-st_blocks-is-invalid-when-calling-stat64 include/linux/stat.h --- devel/include/linux/stat.h~2tb-files-st_blocks-is-invalid-when-calling-stat64 2006-02-27 20:58:36.000000000 -0800 +++ devel-akpm/include/linux/stat.h 2006-02-27 20:58:36.000000000 -0800 @@ -69,7 +69,7 @@ struct kstat { struct timespec mtime; struct timespec ctime; unsigned long blksize; - unsigned long blocks; + unsigned long long blocks; }; #endif _