 abcb6c9fd1
			
		
	
	
	abcb6c9fd1
	
	
	
		
			
			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>
		
			
				
	
	
		
			78 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef __ASM_SH_STAT_H
 | |
| #define __ASM_SH_STAT_H
 | |
| 
 | |
| struct __old_kernel_stat {
 | |
| 	unsigned short st_dev;
 | |
| 	unsigned short st_ino;
 | |
| 	unsigned short st_mode;
 | |
| 	unsigned short st_nlink;
 | |
| 	unsigned short st_uid;
 | |
| 	unsigned short st_gid;
 | |
| 	unsigned short st_rdev;
 | |
| 	unsigned long  st_size;
 | |
| 	unsigned long  st_atime;
 | |
| 	unsigned long  st_mtime;
 | |
| 	unsigned long  st_ctime;
 | |
| };
 | |
| 
 | |
| struct stat {
 | |
| 	unsigned short st_dev;
 | |
| 	unsigned short __pad1;
 | |
| 	unsigned long st_ino;
 | |
| 	unsigned short st_mode;
 | |
| 	unsigned short st_nlink;
 | |
| 	unsigned short st_uid;
 | |
| 	unsigned short st_gid;
 | |
| 	unsigned short st_rdev;
 | |
| 	unsigned short __pad2;
 | |
| 	unsigned long  st_size;
 | |
| 	unsigned long  st_blksize;
 | |
| 	unsigned long  st_blocks;
 | |
| 	unsigned long  st_atime;
 | |
| 	unsigned long  st_atime_nsec;
 | |
| 	unsigned long  st_mtime;
 | |
| 	unsigned long  st_mtime_nsec;
 | |
| 	unsigned long  st_ctime;
 | |
| 	unsigned long  st_ctime_nsec;
 | |
| 	unsigned long  __unused4;
 | |
| 	unsigned long  __unused5;
 | |
| };
 | |
| 
 | |
| #define STAT_HAVE_NSEC 1
 | |
| 
 | |
| /* This matches struct stat64 in glibc2.1, hence the absolutely
 | |
|  * insane amounts of padding around dev_t's.
 | |
|  */
 | |
| struct stat64 {
 | |
| 	unsigned long long	st_dev;
 | |
| 	unsigned char	__pad0[4];
 | |
| 
 | |
| 	unsigned long	st_ino;
 | |
| 	unsigned int	st_mode;
 | |
| 	unsigned int	st_nlink;
 | |
| 
 | |
| 	unsigned long	st_uid;
 | |
| 	unsigned long	st_gid;
 | |
| 
 | |
| 	unsigned long long	st_rdev;
 | |
| 	unsigned char	__pad3[4];
 | |
| 
 | |
| 	long long	st_size;
 | |
| 	unsigned long	st_blksize;
 | |
| 
 | |
| 	unsigned long long	st_blocks;	/* Number 512-byte blocks allocated. */
 | |
| 
 | |
| 	unsigned long	st_atime;
 | |
| 	unsigned long	st_atime_nsec;
 | |
| 
 | |
| 	unsigned long	st_mtime;
 | |
| 	unsigned long	st_mtime_nsec;
 | |
| 
 | |
| 	unsigned long	st_ctime;
 | |
| 	unsigned long	st_ctime_nsec; 
 | |
| 
 | |
| 	unsigned long	__unused1;
 | |
| 	unsigned long	__unused2;
 | |
| };
 | |
| 
 | |
| #endif /* __ASM_SH_STAT_H */
 |