aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Sato <sho@tnes.nec.co.jp>2008-01-28 23:58:27 -0500
committerTheodore Ts'o <tytso@mit.edu>2008-01-28 23:58:27 -0500
commitafc7cbca5bfd556c3e12d3acefbee5ab0cbd4670 (patch)
tree90e6daf4a3f41433221d9cb8d7ce909cde0d62d1
parent8561b089afbaed2651591e5a4574fdca451d82f2 (diff)
ext4: Support large blocksize up to PAGESIZE
This patch set supports large block size(>4k, <=64k) in ext4, just enlarging the block size limit. But it is NOT possible to have 64kB blocksize on ext4 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 treat 64k rec_len with a an impossible value like rec_len = 0xffff to handle this. The Patch-set consists of the following 2 patches. [1/2] ext4: enlarge blocksize - Allow blocksize up to pagesize [2/2] ext4: fix rec_len overflow - prevent rec_len from overflow with 64KB blocksize Now on 64k page ppc64 box runs with this patch set we could create a 64k block size ext4dev, and able to handle empty directory block. Signed-off-by: Takashi Sato <sho@tnes.nec.co.jp> Signed-off-by: Mingming Cao <cmm@us.ibm.com>
-rw-r--r--fs/ext4/super.c5
-rw-r--r--include/linux/ext4_fs.h4
2 files changed, 7 insertions, 2 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 1ca0f546c466..ab7010dde1b5 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -1624,6 +1624,11 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent)
1624 goto out_fail; 1624 goto out_fail;
1625 } 1625 }
1626 1626
1627 if (!sb_set_blocksize(sb, blocksize)) {
1628 printk(KERN_ERR "EXT4-fs: bad blocksize %d.\n", blocksize);
1629 goto out_fail;
1630 }
1631
1627 /* 1632 /*
1628 * The ext4 superblock will not be buffer aligned for other than 1kB 1633 * The ext4 superblock will not be buffer aligned for other than 1kB
1629 * block sizes. We need to calculate the offset from buffer start. 1634 * block sizes. We need to calculate the offset from buffer start.
diff --git a/include/linux/ext4_fs.h b/include/linux/ext4_fs.h
index 97dd409d5f4a..dfe4487fc739 100644
--- a/include/linux/ext4_fs.h
+++ b/include/linux/ext4_fs.h
@@ -73,8 +73,8 @@
73 * Macro-instructions used to manage several block sizes 73 * Macro-instructions used to manage several block sizes
74 */ 74 */
75#define EXT4_MIN_BLOCK_SIZE 1024 75#define EXT4_MIN_BLOCK_SIZE 1024
76#define EXT4_MAX_BLOCK_SIZE 4096 76#define EXT4_MAX_BLOCK_SIZE 65536
77#define EXT4_MIN_BLOCK_LOG_SIZE 10 77#define EXT4_MIN_BLOCK_LOG_SIZE 10
78#ifdef __KERNEL__ 78#ifdef __KERNEL__
79# define EXT4_BLOCK_SIZE(s) ((s)->s_blocksize) 79# define EXT4_BLOCK_SIZE(s) ((s)->s_blocksize)
80#else 80#else