Re: 2 GiB - 1 per file vfat max

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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;
 };
 

[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux