diff options
author | Takashi Sato <sho@tnes.nec.co.jp> | 2006-03-26 04:37:51 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-26 11:57:00 -0500 |
commit | abcb6c9fd13fc2ad7757b818924dc8109a0e3775 (patch) | |
tree | 39a1d5660d2bd92cffa8eef09d489b241e4072a1 | |
parent | 93d2341c750cda0df48a6cc67b35fe25f1ec47df (diff) |
[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>
-rw-r--r-- | include/asm-i386/stat.h | 3 | ||||
-rw-r--r-- | include/asm-m68k/stat.h | 3 | ||||
-rw-r--r-- | include/asm-sh/stat.h | 8 | ||||
-rw-r--r-- | include/linux/fs.h | 2 | ||||
-rw-r--r-- | include/linux/stat.h | 2 |
5 files changed, 5 insertions, 13 deletions
diff --git a/include/asm-i386/stat.h b/include/asm-i386/stat.h index b464f8020ec4..67eae78323ba 100644 --- a/include/asm-i386/stat.h +++ b/include/asm-i386/stat.h | |||
@@ -58,8 +58,7 @@ struct stat64 { | |||
58 | long long st_size; | 58 | long long st_size; |
59 | unsigned long st_blksize; | 59 | unsigned long st_blksize; |
60 | 60 | ||
61 | unsigned long st_blocks; /* Number 512-byte blocks allocated. */ | 61 | unsigned long long st_blocks; /* Number 512-byte blocks allocated. */ |
62 | unsigned long __pad4; /* future possible st_blocks high bits */ | ||
63 | 62 | ||
64 | unsigned long st_atime; | 63 | unsigned long st_atime; |
65 | unsigned long st_atime_nsec; | 64 | unsigned long st_atime_nsec; |
diff --git a/include/asm-m68k/stat.h b/include/asm-m68k/stat.h index c4c402a45e21..dd38bc2e9f98 100644 --- a/include/asm-m68k/stat.h +++ b/include/asm-m68k/stat.h | |||
@@ -60,8 +60,7 @@ struct stat64 { | |||
60 | long long st_size; | 60 | long long st_size; |
61 | unsigned long st_blksize; | 61 | unsigned long st_blksize; |
62 | 62 | ||
63 | unsigned long __pad4; /* future possible st_blocks high bits */ | 63 | unsigned long long st_blocks; /* Number 512-byte blocks allocated. */ |
64 | unsigned long st_blocks; /* Number 512-byte blocks allocated. */ | ||
65 | 64 | ||
66 | unsigned long st_atime; | 65 | unsigned long st_atime; |
67 | unsigned long st_atime_nsec; | 66 | unsigned long st_atime_nsec; |
diff --git a/include/asm-sh/stat.h b/include/asm-sh/stat.h index 914e3fcbbd37..6c41a60657f1 100644 --- a/include/asm-sh/stat.h +++ b/include/asm-sh/stat.h | |||
@@ -60,13 +60,7 @@ struct stat64 { | |||
60 | long long st_size; | 60 | long long st_size; |
61 | unsigned long st_blksize; | 61 | unsigned long st_blksize; |
62 | 62 | ||
63 | #if defined(__BIG_ENDIAN__) | 63 | unsigned long long st_blocks; /* Number 512-byte blocks allocated. */ |
64 | unsigned long __pad4; /* Future possible st_blocks hi bits */ | ||
65 | unsigned long st_blocks; /* Number 512-byte blocks allocated. */ | ||
66 | #else /* Must be little */ | ||
67 | unsigned long st_blocks; /* Number 512-byte blocks allocated. */ | ||
68 | unsigned long __pad4; /* Future possible st_blocks hi bits */ | ||
69 | #endif | ||
70 | 64 | ||
71 | unsigned long st_atime; | 65 | unsigned long st_atime; |
72 | unsigned long st_atime_nsec; | 66 | unsigned long st_atime_nsec; |
diff --git a/include/linux/fs.h b/include/linux/fs.h index ab67181a5a55..64b0ca4f14e3 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -490,7 +490,7 @@ struct inode { | |||
490 | unsigned int i_blkbits; | 490 | unsigned int i_blkbits; |
491 | unsigned long i_blksize; | 491 | unsigned long i_blksize; |
492 | unsigned long i_version; | 492 | unsigned long i_version; |
493 | unsigned long i_blocks; | 493 | sector_t i_blocks; |
494 | unsigned short i_bytes; | 494 | unsigned short i_bytes; |
495 | spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ | 495 | spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ |
496 | struct mutex i_mutex; | 496 | struct mutex i_mutex; |
diff --git a/include/linux/stat.h b/include/linux/stat.h index 8ff2a122dfef..8669291352db 100644 --- a/include/linux/stat.h +++ b/include/linux/stat.h | |||
@@ -69,7 +69,7 @@ struct kstat { | |||
69 | struct timespec mtime; | 69 | struct timespec mtime; |
70 | struct timespec ctime; | 70 | struct timespec ctime; |
71 | unsigned long blksize; | 71 | unsigned long blksize; |
72 | unsigned long blocks; | 72 | unsigned long long blocks; |
73 | }; | 73 | }; |
74 | 74 | ||
75 | #endif | 75 | #endif |