aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Sato <sho@tnes.nec.co.jp>2006-03-26 04:37:51 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-03-26 11:57:00 -0500
commitabcb6c9fd13fc2ad7757b818924dc8109a0e3775 (patch)
tree39a1d5660d2bd92cffa8eef09d489b241e4072a1
parent93d2341c750cda0df48a6cc67b35fe25f1ec47df (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.h3
-rw-r--r--include/asm-m68k/stat.h3
-rw-r--r--include/asm-sh/stat.h8
-rw-r--r--include/linux/fs.h2
-rw-r--r--include/linux/stat.h2
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