[This patch allows architectures that use 64k blocksizes--like IA64 and
PPC64--to use 64k blocks on ext filesystems]

The patches to support blocksizes up to PAGESIZE, max 64KB for ext2/3/4,\
were originally from Takashi Sato.
http://marc.info/?l=linux-ext4&m=115768873518400&w=2

It's quite simple to support large block size in ext2/3/4, mostly just
enlarge the block size limit.  But it is NOT possible to have 64kB
blocksize on ext2/3/4 without some changes to the directory handling
code.  The reason is that an empty 64kB directory block would have a
rec_len == (__u16)2^16 == 0, and this would cause an error to be hit in
the filesystem.  The proposed solution is to put 2 empty records in such
a directory, or to special-case an impossible value like rec_len =
0xffff to handle this.

Signed-off-by: Takashi Sato <[EMAIL PROTECTED]>
Signed-off-by: Mingming Cao <[EMAIL PROTECTED]>
Signed-off-by: Christoph Lameter <[EMAIL PROTECTED]>

---
 fs/ext2/super.c         |    2 +-
 fs/ext3/super.c         |    5 ++++-
 fs/ext4/super.c         |    5 +++++
 include/linux/ext2_fs.h |    4 ++--
 include/linux/ext3_fs.h |    4 ++--
 include/linux/ext4_fs.h |    4 ++--
 6 files changed, 16 insertions(+), 8 deletions(-)

Index: linux-2.6.23-rc8-mm1/fs/ext2/super.c
===================================================================
--- linux-2.6.23-rc8-mm1.orig/fs/ext2/super.c   2007-09-25 14:53:57.000000000 
-0700
+++ linux-2.6.23-rc8-mm1/fs/ext2/super.c        2007-09-25 15:37:34.000000000 
-0700
@@ -856,7 +856,7 @@ static int ext2_fill_super(struct super_
                brelse(bh);
 
                if (!sb_set_blocksize(sb, blocksize)) {
-                       printk(KERN_ERR "EXT2-fs: blocksize too small for 
device.\n");
+                       printk(KERN_ERR "EXT2-fs: bad blocksize %d.\n", 
blocksize);
                        goto failed_sbi;
                }
 
Index: linux-2.6.23-rc8-mm1/fs/ext3/super.c
===================================================================
--- linux-2.6.23-rc8-mm1.orig/fs/ext3/super.c   2007-09-25 14:53:57.000000000 
-0700
+++ linux-2.6.23-rc8-mm1/fs/ext3/super.c        2007-09-25 15:37:34.000000000 
-0700
@@ -1625,7 +1625,10 @@ static int ext3_fill_super (struct super
                }
 
                brelse (bh);
-               sb_set_blocksize(sb, blocksize);
+               if (!sb_set_blocksize(sb, blocksize)) {
+                       printk(KERN_ERR "EXT3-fs: bad blocksize %d.\n", 
blocksize);
+                       goto out_fail;
+               }
                logic_sb_block = (sb_block * EXT3_MIN_BLOCK_SIZE) / blocksize;
                offset = (sb_block * EXT3_MIN_BLOCK_SIZE) % blocksize;
                bh = sb_bread(sb, logic_sb_block);
Index: linux-2.6.23-rc8-mm1/fs/ext4/super.c
===================================================================
--- linux-2.6.23-rc8-mm1.orig/fs/ext4/super.c   2007-09-25 14:53:57.000000000 
-0700
+++ linux-2.6.23-rc8-mm1/fs/ext4/super.c        2007-09-25 15:37:34.000000000 
-0700
@@ -1652,6 +1652,11 @@ static int ext4_fill_super (struct super
                goto out_fail;
        }
 
+       if (!sb_set_blocksize(sb, blocksize)) {
+               printk(KERN_ERR "EXT4-fs: bad blocksize %d.\n", blocksize);
+               goto out_fail;
+       }
+
        /*
         * The ext4 superblock will not be buffer aligned for other than 1kB
         * block sizes.  We need to calculate the offset from buffer start.
Index: linux-2.6.23-rc8-mm1/include/linux/ext2_fs.h
===================================================================
--- linux-2.6.23-rc8-mm1.orig/include/linux/ext2_fs.h   2007-09-25 
14:53:58.000000000 -0700
+++ linux-2.6.23-rc8-mm1/include/linux/ext2_fs.h        2007-09-25 
15:37:34.000000000 -0700
@@ -87,8 +87,8 @@ static inline struct ext2_sb_info *EXT2_
  * Macro-instructions used to manage several block sizes
  */
 #define EXT2_MIN_BLOCK_SIZE            1024
-#define        EXT2_MAX_BLOCK_SIZE             4096
-#define EXT2_MIN_BLOCK_LOG_SIZE                  10
+#define EXT2_MAX_BLOCK_SIZE            65536
+#define EXT2_MIN_BLOCK_LOG_SIZE                10
 #ifdef __KERNEL__
 # define EXT2_BLOCK_SIZE(s)            ((s)->s_blocksize)
 #else
Index: linux-2.6.23-rc8-mm1/include/linux/ext3_fs.h
===================================================================
--- linux-2.6.23-rc8-mm1.orig/include/linux/ext3_fs.h   2007-09-24 
17:33:10.000000000 -0700
+++ linux-2.6.23-rc8-mm1/include/linux/ext3_fs.h        2007-09-25 
15:37:34.000000000 -0700
@@ -76,8 +76,8 @@
  * Macro-instructions used to manage several block sizes
  */
 #define EXT3_MIN_BLOCK_SIZE            1024
-#define        EXT3_MAX_BLOCK_SIZE             4096
-#define EXT3_MIN_BLOCK_LOG_SIZE                  10
+#define        EXT3_MAX_BLOCK_SIZE             65536
+#define EXT3_MIN_BLOCK_LOG_SIZE                10
 #ifdef __KERNEL__
 # define EXT3_BLOCK_SIZE(s)            ((s)->s_blocksize)
 #else
Index: linux-2.6.23-rc8-mm1/include/linux/ext4_fs.h
===================================================================
--- linux-2.6.23-rc8-mm1.orig/include/linux/ext4_fs.h   2007-09-25 
14:53:58.000000000 -0700
+++ linux-2.6.23-rc8-mm1/include/linux/ext4_fs.h        2007-09-25 
15:37:34.000000000 -0700
@@ -77,8 +77,8 @@
  * Macro-instructions used to manage several block sizes
  */
 #define EXT4_MIN_BLOCK_SIZE            1024
-#define        EXT4_MAX_BLOCK_SIZE             4096
-#define EXT4_MIN_BLOCK_LOG_SIZE                  10
+#define        EXT4_MAX_BLOCK_SIZE             65536
+#define EXT4_MIN_BLOCK_LOG_SIZE                10
 #ifdef __KERNEL__
 # define EXT4_BLOCK_SIZE(s)            ((s)->s_blocksize)
 #else

-- 
-
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to