提交 abcb6c9f 编写于 作者: T Takashi Sato 提交者: Linus Torvalds

[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: NTakashi 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: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 93d2341c
...@@ -58,8 +58,7 @@ struct stat64 { ...@@ -58,8 +58,7 @@ struct stat64 {
long long st_size; long long st_size;
unsigned long st_blksize; unsigned long st_blksize;
unsigned long st_blocks; /* Number 512-byte blocks allocated. */ unsigned long long st_blocks; /* Number 512-byte blocks allocated. */
unsigned long __pad4; /* future possible st_blocks high bits */
unsigned long st_atime; unsigned long st_atime;
unsigned long st_atime_nsec; unsigned long st_atime_nsec;
......
...@@ -60,8 +60,7 @@ struct stat64 { ...@@ -60,8 +60,7 @@ struct stat64 {
long long st_size; long long st_size;
unsigned long st_blksize; unsigned long st_blksize;
unsigned long __pad4; /* future possible st_blocks high bits */ unsigned long long st_blocks; /* Number 512-byte blocks allocated. */
unsigned long st_blocks; /* Number 512-byte blocks allocated. */
unsigned long st_atime; unsigned long st_atime;
unsigned long st_atime_nsec; unsigned long st_atime_nsec;
......
...@@ -60,13 +60,7 @@ struct stat64 { ...@@ -60,13 +60,7 @@ struct stat64 {
long long st_size; long long st_size;
unsigned long st_blksize; unsigned long st_blksize;
#if defined(__BIG_ENDIAN__) unsigned long long st_blocks; /* Number 512-byte blocks allocated. */
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 st_atime; unsigned long st_atime;
unsigned long st_atime_nsec; unsigned long st_atime_nsec;
......
...@@ -490,7 +490,7 @@ struct inode { ...@@ -490,7 +490,7 @@ struct inode {
unsigned int i_blkbits; unsigned int i_blkbits;
unsigned long i_blksize; unsigned long i_blksize;
unsigned long i_version; unsigned long i_version;
unsigned long i_blocks; sector_t i_blocks;
unsigned short i_bytes; unsigned short i_bytes;
spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */
struct mutex i_mutex; struct mutex i_mutex;
......
...@@ -69,7 +69,7 @@ struct kstat { ...@@ -69,7 +69,7 @@ struct kstat {
struct timespec mtime; struct timespec mtime;
struct timespec ctime; struct timespec ctime;
unsigned long blksize; unsigned long blksize;
unsigned long blocks; unsigned long long blocks;
}; };
#endif #endif
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册