Pat LaVarre <p_lavarre@yahoo.com> writes: > > > beyond 4 GiB works ... for mount type ext2 ... > > > vfat ... chokes down at 2 GiB - 1 ... > > > "File size limit exceeded" or ... > > > > From: OGAWA Hirofumi <hirofumi()mail!parknet!co!jp> > > Date: 2003-05-28 12:48:00 ... > > support was added at 2.5.27. > > Thanks for that specific hint. > > Can anyone say which of the 2.5.27 changes allowed > vfat to access more than 2 GiB per file? The attached file is the patch at that time from bk. IIRC, this patch was applied also to 2.4.x by trivial changes. -- OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
[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. diff -Nru a/fs/buffer.c b/fs/buffer.c --- a/fs/buffer.c Thu May 29 02:04:18 2003 +++ b/fs/buffer.c Thu May 29 02:04:18 2003 @@ -2078,7 +2078,7 @@ */ 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 inode *inode = mapping->host; diff -Nru a/fs/fat/file.c b/fs/fat/file.c --- a/fs/fat/file.c Thu May 29 02:04:18 2003 +++ b/fs/fat/file.c Thu May 29 02:04:18 2003 @@ -54,7 +54,7 @@ } if (!create) 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(); return -EIO; } diff -Nru a/fs/fat/inode.c b/fs/fat/inode.c --- a/fs/fat/inode.c Thu May 29 02:04:18 2003 +++ b/fs/fat/inode.c Thu May 29 02:04:18 2003 @@ -417,7 +417,7 @@ } inode->i_blksize = 1 << sbi->cluster_bits; 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)->mmu_private = inode->i_size; @@ -775,6 +775,8 @@ sbi->fat_length = CF_LE_L(b->fat32_length); sbi->root_cluster = CF_LE_L(b->root_cluster); + sb->s_maxbytes = 0xffffffff; + /* MC - if info_sector is 0, don't multiply by 0 */ sbi->fsinfo_sector = CF_LE_W(b->info_sector); if (sbi->fsinfo_sector == 0) @@ -1063,7 +1065,7 @@ /* this is as close to the truth as we can get ... */ inode->i_blksize = 1 << sbi->cluster_bits; 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 = date_dos2unix(CF_LE_W(de->time),CF_LE_W(de->date)); inode->i_ctime = diff -Nru a/include/linux/adfs_fs_i.h b/include/linux/adfs_fs_i.h --- a/include/linux/adfs_fs_i.h Thu May 29 02:04:18 2003 +++ b/include/linux/adfs_fs_i.h Thu May 29 02:04:18 2003 @@ -11,7 +11,7 @@ * adfs file system inode data in memory */ struct adfs_inode_info { - unsigned long mmu_private; + loff_t mmu_private; unsigned long parent_id; /* object id of parent */ __u32 loadaddr; /* RISC OS load address */ __u32 execaddr; /* RISC OS exec address */ diff -Nru a/include/linux/affs_fs_i.h b/include/linux/affs_fs_i.h --- a/include/linux/affs_fs_i.h Thu May 29 02:04:18 2003 +++ b/include/linux/affs_fs_i.h Thu May 29 02:04:18 2003 @@ -35,7 +35,7 @@ struct affs_ext_key *i_ac; /* associative cache of extended blocks */ u32 i_ext_last; /* last accessed 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_lastalloc; /* last allocated block */ int i_pa_cnt; /* number of preallocated blocks */ diff -Nru a/include/linux/buffer_head.h b/include/linux/buffer_head.h --- a/include/linux/buffer_head.h Thu May 29 02:04:18 2003 +++ b/include/linux/buffer_head.h Thu May 29 02:04:18 2003 @@ -178,7 +178,7 @@ int block_read_full_page(struct page*, 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*, - unsigned long *); + loff_t *); int generic_cont_expand(struct inode *inode, loff_t size) ; int block_commit_write(struct page *page, unsigned from, unsigned to); int block_sync_page(struct page *); diff -Nru a/include/linux/hfs_fs_i.h b/include/linux/hfs_fs_i.h --- a/include/linux/hfs_fs_i.h Thu May 29 02:04:18 2003 +++ b/include/linux/hfs_fs_i.h Thu May 29 02:04:18 2003 @@ -19,7 +19,7 @@ struct hfs_inode_info { int magic; /* A magic number */ - unsigned long mmu_private; + loff_t mmu_private; struct hfs_cat_entry *entry; /* For a regular or header file */ diff -Nru a/include/linux/hpfs_fs_i.h b/include/linux/hpfs_fs_i.h --- a/include/linux/hpfs_fs_i.h Thu May 29 02:04:18 2003 +++ b/include/linux/hpfs_fs_i.h Thu May 29 02:04:18 2003 @@ -2,7 +2,7 @@ #define _HPFS_FS_I struct hpfs_inode_info { - unsigned long mmu_private; + loff_t mmu_private; ino_t i_parent_dir; /* (directories) gives fnode of parent dir */ unsigned i_dno; /* (directories) root dnode */ unsigned i_dpos; /* (directories) temp for readdir */ diff -Nru a/include/linux/msdos_fs_i.h b/include/linux/msdos_fs_i.h --- a/include/linux/msdos_fs_i.h Thu May 29 02:04:18 2003 +++ b/include/linux/msdos_fs_i.h Thu May 29 02:04:18 2003 @@ -8,7 +8,7 @@ */ struct msdos_inode_info { - unsigned long mmu_private; + loff_t mmu_private; int i_start; /* first cluster or 0 */ int i_logstart; /* logical first cluster */ int i_attrs; /* unused attribute bits */ diff -Nru a/include/linux/qnx4_fs.h b/include/linux/qnx4_fs.h --- a/include/linux/qnx4_fs.h Thu May 29 02:04:18 2003 +++ b/include/linux/qnx4_fs.h Thu May 29 02:04:18 2003 @@ -106,7 +106,7 @@ struct qnx4_inode_info { struct qnx4_inode_entry raw; - unsigned long mmu_private; + loff_t mmu_private; struct inode vfs_inode; };