Commit d4db5063 authored by Hirofumi Ogawa's avatar Hirofumi Ogawa Committed by Linus Torvalds

[PATCH] Add 4G-1 file support to FAT32

This patch changes cont_prepare_write(), in order to support a 4G-1
file for FAT32.

 int cont_prepare_write(struct page *page, unsigned offset,
-		unsigned to, get_block_t *get_block, unsigned long *bytes)
+		unsigned to, get_block_t *get_block, loff_t *bytes)

And it fixes broken adfs/affs/fat/hfs/hpfs/qnx4 by this
cont_prepare_write() change.
parent 047cef32
...@@ -2078,7 +2078,7 @@ int generic_cont_expand(struct inode *inode, loff_t size) ...@@ -2078,7 +2078,7 @@ int generic_cont_expand(struct inode *inode, loff_t size)
*/ */
int cont_prepare_write(struct page *page, unsigned offset, int cont_prepare_write(struct page *page, unsigned offset,
unsigned to, get_block_t *get_block, unsigned long *bytes) unsigned to, get_block_t *get_block, loff_t *bytes)
{ {
struct address_space *mapping = page->mapping; struct address_space *mapping = page->mapping;
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
......
...@@ -54,7 +54,7 @@ int fat_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_r ...@@ -54,7 +54,7 @@ int fat_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_r
} }
if (!create) if (!create)
return 0; return 0;
if (iblock << sb->s_blocksize_bits != MSDOS_I(inode)->mmu_private) { if (iblock != MSDOS_I(inode)->mmu_private >> sb->s_blocksize_bits) {
BUG(); BUG();
return -EIO; return -EIO;
} }
......
...@@ -417,7 +417,7 @@ static int fat_read_root(struct inode *inode) ...@@ -417,7 +417,7 @@ static int fat_read_root(struct inode *inode)
} }
inode->i_blksize = 1 << sbi->cluster_bits; inode->i_blksize = 1 << sbi->cluster_bits;
inode->i_blocks = ((inode->i_size + inode->i_blksize - 1) inode->i_blocks = ((inode->i_size + inode->i_blksize - 1)
& ~(inode->i_blksize - 1)) >> 9; & ~((loff_t)inode->i_blksize - 1)) >> 9;
MSDOS_I(inode)->i_logstart = 0; MSDOS_I(inode)->i_logstart = 0;
MSDOS_I(inode)->mmu_private = inode->i_size; MSDOS_I(inode)->mmu_private = inode->i_size;
...@@ -775,6 +775,8 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, ...@@ -775,6 +775,8 @@ int fat_fill_super(struct super_block *sb, void *data, int silent,
sbi->fat_length = CF_LE_L(b->fat32_length); sbi->fat_length = CF_LE_L(b->fat32_length);
sbi->root_cluster = CF_LE_L(b->root_cluster); sbi->root_cluster = CF_LE_L(b->root_cluster);
sb->s_maxbytes = 0xffffffff;
/* MC - if info_sector is 0, don't multiply by 0 */ /* MC - if info_sector is 0, don't multiply by 0 */
sbi->fsinfo_sector = CF_LE_W(b->info_sector); sbi->fsinfo_sector = CF_LE_W(b->info_sector);
if (sbi->fsinfo_sector == 0) if (sbi->fsinfo_sector == 0)
...@@ -1063,7 +1065,7 @@ static int fat_fill_inode(struct inode *inode, struct msdos_dir_entry *de) ...@@ -1063,7 +1065,7 @@ static int fat_fill_inode(struct inode *inode, struct msdos_dir_entry *de)
/* this is as close to the truth as we can get ... */ /* this is as close to the truth as we can get ... */
inode->i_blksize = 1 << sbi->cluster_bits; inode->i_blksize = 1 << sbi->cluster_bits;
inode->i_blocks = ((inode->i_size + inode->i_blksize - 1) inode->i_blocks = ((inode->i_size + inode->i_blksize - 1)
& ~(inode->i_blksize - 1)) >> 9; & ~((loff_t)inode->i_blksize - 1)) >> 9;
inode->i_mtime = inode->i_atime = inode->i_mtime = inode->i_atime =
date_dos2unix(CF_LE_W(de->time),CF_LE_W(de->date)); date_dos2unix(CF_LE_W(de->time),CF_LE_W(de->date));
inode->i_ctime = inode->i_ctime =
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* adfs file system inode data in memory * adfs file system inode data in memory
*/ */
struct adfs_inode_info { struct adfs_inode_info {
unsigned long mmu_private; loff_t mmu_private;
unsigned long parent_id; /* object id of parent */ unsigned long parent_id; /* object id of parent */
__u32 loadaddr; /* RISC OS load address */ __u32 loadaddr; /* RISC OS load address */
__u32 execaddr; /* RISC OS exec address */ __u32 execaddr; /* RISC OS exec address */
......
...@@ -35,7 +35,7 @@ struct affs_inode_info { ...@@ -35,7 +35,7 @@ struct affs_inode_info {
struct affs_ext_key *i_ac; /* associative cache of extended blocks */ struct affs_ext_key *i_ac; /* associative cache of extended blocks */
u32 i_ext_last; /* last accessed extended block */ u32 i_ext_last; /* last accessed extended block */
struct buffer_head *i_ext_bh; /* bh of last extended block */ struct buffer_head *i_ext_bh; /* bh of last extended block */
unsigned long mmu_private; loff_t mmu_private;
u32 i_protect; /* unused attribute bits */ u32 i_protect; /* unused attribute bits */
u32 i_lastalloc; /* last allocated block */ u32 i_lastalloc; /* last allocated block */
int i_pa_cnt; /* number of preallocated blocks */ int i_pa_cnt; /* number of preallocated blocks */
......
...@@ -178,7 +178,7 @@ int block_write_full_page(struct page*, get_block_t*); ...@@ -178,7 +178,7 @@ int block_write_full_page(struct page*, get_block_t*);
int block_read_full_page(struct page*, get_block_t*); int block_read_full_page(struct page*, get_block_t*);
int block_prepare_write(struct page*, unsigned, unsigned, get_block_t*); int block_prepare_write(struct page*, unsigned, unsigned, get_block_t*);
int cont_prepare_write(struct page*, unsigned, unsigned, get_block_t*, int cont_prepare_write(struct page*, unsigned, unsigned, get_block_t*,
unsigned long *); loff_t *);
int generic_cont_expand(struct inode *inode, loff_t size) ; int generic_cont_expand(struct inode *inode, loff_t size) ;
int block_commit_write(struct page *page, unsigned from, unsigned to); int block_commit_write(struct page *page, unsigned from, unsigned to);
int block_sync_page(struct page *); int block_sync_page(struct page *);
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
struct hfs_inode_info { struct hfs_inode_info {
int magic; /* A magic number */ int magic; /* A magic number */
unsigned long mmu_private; loff_t mmu_private;
struct hfs_cat_entry *entry; struct hfs_cat_entry *entry;
/* For a regular or header file */ /* For a regular or header file */
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#define _HPFS_FS_I #define _HPFS_FS_I
struct hpfs_inode_info { struct hpfs_inode_info {
unsigned long mmu_private; loff_t mmu_private;
ino_t i_parent_dir; /* (directories) gives fnode of parent dir */ ino_t i_parent_dir; /* (directories) gives fnode of parent dir */
unsigned i_dno; /* (directories) root dnode */ unsigned i_dno; /* (directories) root dnode */
unsigned i_dpos; /* (directories) temp for readdir */ unsigned i_dpos; /* (directories) temp for readdir */
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
*/ */
struct msdos_inode_info { struct msdos_inode_info {
unsigned long mmu_private; loff_t mmu_private;
int i_start; /* first cluster or 0 */ int i_start; /* first cluster or 0 */
int i_logstart; /* logical first cluster */ int i_logstart; /* logical first cluster */
int i_attrs; /* unused attribute bits */ int i_attrs; /* unused attribute bits */
......
...@@ -106,7 +106,7 @@ struct qnx4_sb_info { ...@@ -106,7 +106,7 @@ struct qnx4_sb_info {
struct qnx4_inode_info { struct qnx4_inode_info {
struct qnx4_inode_entry raw; struct qnx4_inode_entry raw;
unsigned long mmu_private; loff_t mmu_private;
struct inode vfs_inode; struct inode vfs_inode;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment