[PATCH] 2TB files: st_blocks is invalid when calling stat64
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 <sho@tnes.nec.co.jp> Cc: Dave Kleikamp <shaggy@austin.ibm.com> Cc: Jan Kara <jack@ucw.cz> Cc: Trond Myklebust <trond.myklebust@fys.uio.no> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
93d2341c75
commit
abcb6c9fd1
5 changed files with 5 additions and 13 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -490,7 +490,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;
|
||||
|
|
|
@ -69,7 +69,7 @@ struct kstat {
|
|||
struct timespec mtime;
|
||||
struct timespec ctime;
|
||||
unsigned long blksize;
|
||||
unsigned long blocks;
|
||||
unsigned long long blocks;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue