public inbox for linux-ext4@vger.kernel.org
 help / color / mirror / Atom feed
* [RFC][1/4] ext2/3/4: enlarge blocksize
@ 2006-09-08  4:11 sho
  2006-09-08  7:01 ` Updated ext4 patches for 2.6.18-rc6 Mingming Cao
  2007-06-21 22:34 ` [RFC][1/4] ext2/3/4: enlarge blocksize Andreas Dilger
  0 siblings, 2 replies; 8+ messages in thread
From: sho @ 2006-09-08  4:11 UTC (permalink / raw)
  To: cmm, adilger, johann.lombardi; +Cc: linux-ext4, linux-kernel

Hi all,

On July 7, 2006, sho wrote:
> On Jun 29, 2006, Andreas wrote:
> > On Jun 28, 2006  17:50 +0200, Johann Lombardi wrote:
> > ext2/ext3_dir_entry_2 has a 16-bit entry(rec_len) and it 
> > would overflow
> > with 64KB blocksize.  This patch prevent from overflow by limiting
> > rec_len to 65532.
> > Having a max rec_len of 65532 is rather unfortunate, since the dir
> > blocks always need to filled with dir entries.  65536 - 65532 = 4,
> > and the minimum ext3_dir_entry size is 8 bytes.  I would instead
> > make this maybe 64 bytes less so that there is room for a filename
> > in the "tail" dir_entry.
>
> The fix, adding dummy entry at the tail of a directory block, needs
> to regenerate dummy entry when all of the entries are removed in
> kernel.
> While in e2fsprogs, e2fsck needs to do the same when destroyed by
> some reason.  Thus procedures get more complicated.
> Then I updated the patch to limit rec_len to 65532(64K - 4).  The
> difference from the previous patch is that the end of a directory
> block is changed to 65532(64K - 4) with 64K blocksize.
> This is more simple and less tweaky.  This necessarily makes 4-bytes
> from the end of a directory block useless, but 4-bytes is negligible
> compared to 64KB, who cares?

In response to Mingming's ext4 patches, I updated my patches.
These patches support large blocksize up to PAGESIZE (max 64KB).
NOTE:
They limit the end of a directory block to 65532(64K - 4)
to avoid overflow only when using 64KB block.

The difference from the previous patches is as follows.
- add ext4 support

This patch applies on top of Mingming's patches(against ext3dev-2.6.18-
rc4.patch) which were posted at:
	http://ext2.sourceforge.net/48bitext3/patches/latest/

Through mke2fs, ".." entry of root directory is supposed to have rec_len
which is equal to blocksize.  So just to fix kernel ends up occurring
the error in ext2_check_page() etc, if 64KB blocksize.  Thus I tested
with the provisional fix against e2fsprogs.  This patch doesn't include
that fix.

I tested I/O performance with 4K-64K blocksize on ext3.

my box:
  models       :NX-7700i
  CPU type     :Itanium2
  number of CPU:1
  architecture :ia64
  memory size  :8309152KB
  disk size    :70007.196(MB)

Results:
          blocksize    Read(MB/sec)    Write(MB/sec)
              4K          58.2            59.7
              8K          64.3            60.7
             16K          66.8            62.2
             32K          65.3            60.2
             64K          65.4            60.4

I don't know why 16K-blocksize marks the highest numbers.  But
without this patch, >4KB blocksize can't be used at least :)

The Patch-set consists of the following 4 patches.
  [1/4]  ext2/3/4: enlarge blocksize
         - Allow blocksize up to pagesize

  [2/4]  ext2: fix rec_len overflow
         - prevent rec_len from overflow with 64KB blocksize

  [3/4]  ext3: fix rec_len overflow
         - ditto

  [4/4]  ext4: fix rec_len overflow
         - ditto


Signed-off-by: Takashi Sato sho@tnes.nec.co.jp
---
diff -upNr -X linux-2.6.18-rc4-mingming/Documentation/dontdiff linux-2.6.18-rc4-mingming/fs/ext2/super.c linux-2.6.18-rc4-mingming-tnes/fs/ext2/super.c
--- linux-2.6.18-rc4-mingming/fs/ext2/super.c	2006-08-07 03:20:11.000000000 +0900
+++ linux-2.6.18-rc4-mingming-tnes/fs/ext2/super.c	2006-09-08 09:00:40.000000000 +0900
@@ -725,7 +725,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;
 		}

diff -upNr -X linux-2.6.18-rc4-mingming/Documentation/dontdiff linux-2.6.18-rc4-mingming/fs/ext3/super.c linux-2.6.18-rc4-mingming-tnes/fs/ext3/super.c
--- linux-2.6.18-rc4-mingming/fs/ext3/super.c	2006-08-07 03:20:11.000000000 +0900
+++ linux-2.6.18-rc4-mingming-tnes/fs/ext3/super.c	2006-09-08 09:00:02.000000000 +0900
@@ -1486,7 +1486,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);
diff -upNr -X linux-2.6.18-rc4-mingming/Documentation/dontdiff linux-2.6.18-rc4-mingming/fs/ext4/super.c linux-2.6.18-rc4-mingming-tnes/fs/ext4/super.c
--- linux-2.6.18-rc4-mingming/fs/ext4/super.c	2006-08-29 16:29:05.000000000 +0900
+++ linux-2.6.18-rc4-mingming-tnes/fs/ext4/super.c	2006-09-08 09:00:45.000000000 +0900
@@ -1497,7 +1497,10 @@ static int ext4_fill_super (struct super
 		}
 
 		brelse (bh);
-		sb_set_blocksize(sb, blocksize);
+		if (!sb_set_blocksize(sb, blocksize)) {
+			printk(KERN_ERR "EXT4-fs: bad blocksize %d.\n", blocksize);
+			goto out_fail;
+		}
 		logic_sb_block = sb_block * EXT4_MIN_BLOCK_SIZE;
 		offset = sector_div(logic_sb_block, blocksize);
 		bh = sb_bread(sb, logic_sb_block);
diff -upNr -X linux-2.6.18-rc4-mingming/Documentation/dontdiff linux-2.6.18-rc4-mingming/include/linux/ext2_fs.h linux-2.6.18-rc4-mingming-tnes-no_compile/include/linux/ext2_fs.h
--- linux-2.6.18-rc4-mingming/include/linux/ext2_fs.h	2006-08-07 03:20:11.000000000 +0900
+++ linux-2.6.18-rc4-mingming-tnes-no_compile/include/linux/ext2_fs.h	2006-09-04 11:26:26.000000000 +0900
@@ -90,8 +90,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
diff -upNr -X linux-2.6.18-rc4-mingming/Documentation/dontdiff linux-2.6.18-rc4-mingming/include/linux/ext3_fs.h linux-2.6.18-rc4-mingming-tnes-no_compile/include/linux/ext3_fs.h
--- linux-2.6.18-rc4-mingming/include/linux/ext3_fs.h	2006-08-07 03:20:11.000000000 +0900
+++ linux-2.6.18-rc4-mingming-tnes-no_compile/include/linux/ext3_fs.h	2006-09-04 11:26:51.000000000 +0900
@@ -80,8 +80,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
diff -upNr -X linux-2.6.18-rc4-mingming/Documentation/dontdiff linux-2.6.18-rc4-mingming/include/linux/ext4_fs.h linux-2.6.18-rc4-mingming-tnes-no_compile/include/linux/ext4_fs.h
--- linux-2.6.18-rc4-mingming/include/linux/ext4_fs.h	2006-08-29 16:29:05.000000000 +0900
+++ linux-2.6.18-rc4-mingming-tnes-no_compile/include/linux/ext4_fs.h	2006-09-04 11:27:13.000000000 +0900
@@ -81,8 +81,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


Cheers, sho

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Updated ext4 patches for 2.6.18-rc6
  2006-09-08  4:11 [RFC][1/4] ext2/3/4: enlarge blocksize sho
@ 2006-09-08  7:01 ` Mingming Cao
  2006-09-08 16:13   ` Alexandre Ratchov
  2007-06-21 22:34 ` [RFC][1/4] ext2/3/4: enlarge blocksize Andreas Dilger
  1 sibling, 1 reply; 8+ messages in thread
From: Mingming Cao @ 2006-09-08  7:01 UTC (permalink / raw)
  To: akpm, shaggy; +Cc: linux-ext4, linux-kernel

Hello,

Just give you all an update about the latest ext4 patches before I leave
for vacation: The latest ext4 patches (clone ext4 + 48bit ext4) is
against 2.6.18-rc6, as usual, could be found at:

http://ext2.sourceforge.net/ext4/patches/latest/

Haven't done series testing yet, but fsx test runs fine a few hours on
ext4dev filesystem mounted with extents:)

change log since last release (2.6.18-rc4)

rebase ext4/jbd2 clone patches to 2.6.18-rc6 (Mingming Cao<cmm@us.ibm.com>)
rename ext3dev to ext4dev (Randy  Dunlap <rdunlap@xenotime.net>, Mingming Cao <cmm@us.ibm.com)
register-ext4dev.patch
+register-jbd2.patch

*comment fixs in extent patch (Randy  Dunlap <rdunlap@xenotime.net>)
+extents_comment_fix.patch

*change some micro and inline functions to c fuctions(Avantika Mathur<mathur@us.ibm.com)
+64bitmetadata_inline_funcs_fix.patch

*change ext4/jbd2 block type from sector_t to unsigned long long. (Mingming Cao<cmm@us.ibm.com>). remove sector_fmt.patch
+ext4_blk_type_from_sector_t_to_ulonglong.patch
+ext4_remove_sector_t_bits_check.patch
+jbd2_blks_type_from_sector_t_to_ull.patch
-sector_fmt.patch

Andrew, you could pull all the patches(in quilt style) from here(a
series of patches)
http://ext2.sourceforge.net/ext4/patches/latest/broken-out/

Shaggy has nicely offered to maintain and forward all these patches from
here while I am out, thanks, Shaggy:)

Thanks,
Mingming


^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: Updated ext4 patches for 2.6.18-rc6
@ 2006-09-08 10:17 sho
  0 siblings, 0 replies; 8+ messages in thread
From: sho @ 2006-09-08 10:17 UTC (permalink / raw)
  To: cmm; +Cc: linux-ext4

Hi Mingming,

I found a trivial bug in Mingming's ext4 patch titled
"ext4-extents-48bit.patch".

There happens a type conflicting:

+int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, ext4_fsblk_t iblock,

You should fix extern declaration for ext4_ext_get_blocks.


Cheers, sho

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Updated ext4 patches for 2.6.18-rc6
  2006-09-08  7:01 ` Updated ext4 patches for 2.6.18-rc6 Mingming Cao
@ 2006-09-08 16:13   ` Alexandre Ratchov
  2006-09-08 16:15     ` [patch 1/2] " Alexandre Ratchov
                       ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Alexandre Ratchov @ 2006-09-08 16:13 UTC (permalink / raw)
  To: Mingming Cao; +Cc: akpm, shaggy, linux-ext4, linux-kernel

On Fri, Sep 08, 2006 at 12:01:08AM -0700, Mingming Cao wrote:
> Hello,
> 
> Just give you all an update about the latest ext4 patches before I leave
> for vacation: The latest ext4 patches (clone ext4 + 48bit ext4) is
> against 2.6.18-rc6, as usual, could be found at:
> 
> http://ext2.sourceforge.net/ext4/patches/latest/
> 
> Haven't done series testing yet, but fsx test runs fine a few hours on
> ext4dev filesystem mounted with extents:)
> 
> change log since last release (2.6.18-rc4)
> 
> rebase ext4/jbd2 clone patches to 2.6.18-rc6 (Mingming Cao<cmm@us.ibm.com>)
> rename ext3dev to ext4dev (Randy  Dunlap <rdunlap@xenotime.net>, Mingming Cao <cmm@us.ibm.com)
> register-ext4dev.patch
> +register-jbd2.patch
> 
> *comment fixs in extent patch (Randy  Dunlap <rdunlap@xenotime.net>)
> +extents_comment_fix.patch
> 
> *change some micro and inline functions to c fuctions(Avantika Mathur<mathur@us.ibm.com)
> +64bitmetadata_inline_funcs_fix.patch
> 
> *change ext4/jbd2 block type from sector_t to unsigned long long. (Mingming Cao<cmm@us.ibm.com>). remove sector_fmt.patch
> +ext4_blk_type_from_sector_t_to_ulonglong.patch
> +ext4_remove_sector_t_bits_check.patch
> +jbd2_blks_type_from_sector_t_to_ull.patch
> -sector_fmt.patch
> 
> Andrew, you could pull all the patches(in quilt style) from here(a
> series of patches)
> http://ext2.sourceforge.net/ext4/patches/latest/broken-out/
> 
> Shaggy has nicely offered to maintain and forward all these patches from
> here while I am out, thanks, Shaggy:)
>

hi,

there are 2 more patches:

* ext4_remove_relative_block_numbers:

  use 48bit absolute block numbers instead of mixed relative/absolute block
  numbers. This is simpler and seems to fix issues with large file systems.
   
* ext4_allow_larger_descriptor_size:

  allow larger block group descriptors: this patch will allow to add new
  features that need more space in the block descriptor.

here is the complete patch set:

http://www.bullopensource.org/ext4/20060908/ext4-linux-2.6.18-rc6.tar.gz

there's also a patch set for the latest e2fsprogs that is in sync with the
kernel patches:

http://www.bullopensource.org/ext4/20060908/ext4-e2fsprogs-1.39.tar.gz

cheers,

-- Alexandre

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [patch 1/2] Re: Updated ext4 patches for 2.6.18-rc6
  2006-09-08 16:13   ` Alexandre Ratchov
@ 2006-09-08 16:15     ` Alexandre Ratchov
  2006-09-08 16:18     ` [patch 2/2] " Alexandre Ratchov
  2006-09-08 18:09     ` Andreas Dilger
  2 siblings, 0 replies; 8+ messages in thread
From: Alexandre Ratchov @ 2006-09-08 16:15 UTC (permalink / raw)
  To: Mingming Cao; +Cc: akpm, shaggy, linux-ext4, linux-kernel

Index: linux-2.6.18-rc6/include/linux/ext4_fs.h
===================================================================
--- linux-2.6.18-rc6.orig/include/linux/ext4_fs.h	2006-09-08 14:37:44.000000000 +0200
+++ linux-2.6.18-rc6/include/linux/ext4_fs.h	2006-09-08 14:38:02.000000000 +0200
@@ -132,34 +132,16 @@ struct ext4_group_desc
 	__le16	bg_free_blocks_count;	/* Free blocks count */
 	__le16	bg_free_inodes_count;	/* Free inodes count */
 	__le16	bg_used_dirs_count;	/* Directories count */
-	__u16	bg_pad;
-	__le32	bg_reserved[3];
+	__u16	bg_flags;		/* reserved for fsck */
+	__le16	bg_block_bitmap_hi;	/* Blocks bitmap block MSB */
+	__le16	bg_inode_bitmap_hi;	/* Inodes bitmap block MSB */
+	__le16	bg_inode_table_hi;	/* Inodes table block MSB */
+	__u16	bg_reserved[3];
 };
 
 #ifdef __KERNEL__
 #include <linux/ext4_fs_i.h>
 #include <linux/ext4_fs_sb.h>
-
-#define EXT4_BLOCK_BITMAP(bg, group_base)	\
-		ext4_relative_decode(group_base, le32_to_cpu((bg)->bg_block_bitmap))
-#define EXT4_INODE_BITMAP(bg, group_base)	\
-		ext4_relative_decode(group_base, le32_to_cpu((bg)->bg_inode_bitmap))
-#define EXT4_INODE_TABLE(bg, group_base)	\
-		ext4_relative_decode(group_base, le32_to_cpu((bg)->bg_inode_table))
-
-#define EXT4_BLOCK_BITMAP_SET(bg, group_base, value)	\
-	do {(bg)->bg_block_bitmap = ext4_relative_encode(group_base, value);} while(0)
-#define EXT4_INODE_BITMAP_SET(bg, group_base, value)	\
-	do {(bg)->bg_inode_bitmap = ext4_relative_encode(group_base, value);} while(0)
-#define EXT4_INODE_TABLE_SET(bg, group_base, value)	\
-	do {(bg)->bg_inode_table = ext4_relative_encode(group_base, value);} while(0)
-
-#define EXT4_IS_USED_BLOCK_BITMAP(bg)	\
-	((bg)->bg_block_bitmap != 0)
-#define EXT4_IS_USED_INODE_BITMAP(bg)	\
-	((bg)->bg_inode_bitmap != 0)
-#define EXT4_IS_USED_INODE_TABLE(bg)	\
-	((bg)->bg_inode_table != 0)
 #endif
 /*
  * Macro-instructions used to manage group descriptors
@@ -223,9 +205,9 @@ struct ext4_group_desc
 /* Used to pass group descriptor data when online resize is done */
 struct ext4_new_group_input {
 	__u32 group;            /* Group number for this data */
-	__u32 block_bitmap;     /* Absolute block number of block bitmap */
-	__u32 inode_bitmap;     /* Absolute block number of inode bitmap */
-	__u32 inode_table;      /* Absolute block number of inode table start */
+	__u64 block_bitmap;     /* Absolute block number of block bitmap */
+	__u64 inode_bitmap;     /* Absolute block number of inode bitmap */
+	__u64 inode_table;      /* Absolute block number of inode table start */
 	__u32 blocks_count;     /* Total number of blocks in this group */
 	__u16 reserved_blocks;  /* Number of reserved blocks in this group */
 	__u16 unused;
@@ -234,9 +216,9 @@ struct ext4_new_group_input {
 /* The struct ext4_new_group_input in kernel space, with free_blocks_count */
 struct ext4_new_group_data {
 	__u32 group;
-	__u32 block_bitmap;
-	__u32 inode_bitmap;
-	__u32 inode_table;
+	__u64 block_bitmap;
+	__u64 inode_bitmap;
+	__u64 inode_table;
 	__u32 blocks_count;
 	__u16 reserved_blocks;
 	__u16 unused;
@@ -911,8 +893,12 @@ extern void ext4_warning (struct super_b
 extern void ext4_update_dynamic_rev (struct super_block *sb);
 extern ext4_fsblk_t ext4_blocks_count(struct ext4_super_block *es);
 extern ext4_fsblk_t ext4_r_blocks_count(struct ext4_super_block *es);
-extern u32 ext4_relative_encode(ext4_fsblk_t group_base, ext4_fsblk_t fs_block);
-extern ext4_fsblk_t ext4_relative_decode(ext4_fsblk_t group_base, u32 gdp_block);
+extern ext4_fsblk_t ext4_block_bitmap(struct ext4_group_desc *bg);
+extern ext4_fsblk_t ext4_inode_bitmap(struct ext4_group_desc *bg);
+extern ext4_fsblk_t ext4_inode_table(struct ext4_group_desc *bg);
+extern void ext4_block_bitmap_set(struct ext4_group_desc *bg, ext4_fsblk_t blk);
+extern void ext4_inode_bitmap_set(struct ext4_group_desc *bg, ext4_fsblk_t blk);
+extern void ext4_inode_table_set(struct ext4_group_desc *bg, ext4_fsblk_t blk);
 
 #define ext4_std_error(sb, errno)				\
 do {								\
Index: linux-2.6.18-rc6/fs/ext4/balloc.c
===================================================================
--- linux-2.6.18-rc6.orig/fs/ext4/balloc.c	2006-09-08 14:37:48.000000000 +0200
+++ linux-2.6.18-rc6/fs/ext4/balloc.c	2006-09-08 14:42:54.000000000 +0200
@@ -87,16 +87,13 @@ read_block_bitmap(struct super_block *sb
 	desc = ext4_get_group_desc (sb, block_group, NULL);
 	if (!desc)
 		goto error_out;
-	bh = sb_bread(sb,
-		      EXT4_BLOCK_BITMAP(desc,
-			      ext4_group_first_block_no(sb, block_group)));
+	bh = sb_bread(sb, ext4_block_bitmap(desc));
 	if (!bh)
 		ext4_error (sb, "read_block_bitmap",
 			    "Cannot read block bitmap - "
 			    "block_group = %d, block_bitmap = %llu",
 			    block_group,
-			    EXT4_BLOCK_BITMAP(desc,
-			      ext4_group_first_block_no(sb, block_group)));
+			    ext4_block_bitmap(desc));
 error_out:
 	return bh;
 }
@@ -338,7 +335,7 @@ void ext4_free_blocks_sb(handle_t *handl
 		goto error_return;
 	}
 
-	ext4_debug ("freeing block(s) %lu-%lu\n", block, block + count - 1);
+	ext4_debug ("freeing block(s) %llu-%llu\n", block, block + count - 1);
 
 do_more:
 	overflow = 0;
@@ -359,20 +356,10 @@ do_more:
 	if (!desc)
 		goto error_return;
 
-	if (in_range (EXT4_BLOCK_BITMAP(desc,
-				ext4_group_first_block_no(sb, block_group)),
-		      block, count) ||
-	    in_range (EXT4_INODE_BITMAP(desc,
-			    	ext4_group_first_block_no(sb, block_group)),
-		      block, count) ||
-	    in_range (block,
-		      EXT4_INODE_TABLE(desc,
-			      	ext4_group_first_block_no(sb, block_group)),
-		      sbi->s_itb_per_group) ||
-	    in_range (block + count - 1,
-		      EXT4_INODE_TABLE(desc,
-			      	ext4_group_first_block_no(sb, block_group)),
-		      sbi->s_itb_per_group))
+	if (in_range(ext4_block_bitmap(desc), block, count) ||
+	    in_range(ext4_inode_bitmap(desc), block, count) ||
+	    in_range(block, ext4_inode_table(desc), sbi->s_itb_per_group) ||
+	    in_range(block + count - 1, ext4_inode_table(desc), sbi->s_itb_per_group))
 		ext4_error (sb, "ext4_free_blocks",
 			    "Freeing blocks in system zones - "
 			    "Block = %llu, count = %lu",
@@ -1372,16 +1359,12 @@ allocated:
 
 	ret_block = grp_alloc_blk + ext4_group_first_block_no(sb, group_no);
 
-	if (in_range(EXT4_BLOCK_BITMAP(gdp, ext4_group_first_block_no(sb, group_no)),
-				ret_block, num) ||
-	    in_range(EXT4_BLOCK_BITMAP(gdp, ext4_group_first_block_no(sb, group_no)),
-		    		ret_block, num) ||
-	    in_range(ret_block, EXT4_INODE_TABLE(gdp,
-			    	ext4_group_first_block_no(sb, group_no)),
-		      EXT4_SB(sb)->s_itb_per_group) ||
-	    in_range(ret_block + num - 1, EXT4_INODE_TABLE(gdp,
-			    ext4_group_first_block_no(sb, group_no)),
-		      EXT4_SB(sb)->s_itb_per_group))
+	if (in_range(ext4_block_bitmap(gdp), ret_block, num) ||
+	    in_range(ext4_block_bitmap(gdp), ret_block, num) ||
+	    in_range(ret_block, ext4_inode_table(gdp),
+			EXT4_SB(sb)->s_itb_per_group) ||
+	    in_range(ret_block + num - 1, ext4_inode_table(gdp),
+			EXT4_SB(sb)->s_itb_per_group))
 		ext4_error(sb, "ext4_new_block",
 			    "Allocating block in system zone - "
 			    "blocks from %llu, length %lu",
Index: linux-2.6.18-rc6/fs/ext4/resize.c
===================================================================
--- linux-2.6.18-rc6.orig/fs/ext4/resize.c	2006-09-08 14:37:48.000000000 +0200
+++ linux-2.6.18-rc6/fs/ext4/resize.c	2006-09-08 14:38:02.000000000 +0200
@@ -829,12 +829,9 @@ int ext4_group_add(struct super_block *s
 	/* Update group descriptor block for new group */
 	gdp = (struct ext4_group_desc *)primary->b_data + gdb_off;
 
-	EXT4_BLOCK_BITMAP_SET(gdp, ext4_group_first_block_no(sb, gdb_num),
-				   input->block_bitmap); /* LV FIXME */
-	EXT4_INODE_BITMAP_SET(gdp, ext4_group_first_block_no(sb, gdb_num),
-			           input->inode_bitmap); /* LV FIXME */
-	EXT4_INODE_TABLE_SET(gdp, ext4_group_first_block_no(sb, gdb_num),
-			          input->inode_table); /* LV FIXME */
+	ext4_block_bitmap_set(gdp, input->block_bitmap); /* LV FIXME */
+	ext4_inode_bitmap_set(gdp, input->inode_bitmap); /* LV FIXME */
+	ext4_inode_table_set(gdp, input->inode_table); /* LV FIXME */
 	gdp->bg_free_blocks_count = cpu_to_le16(input->free_blocks_count);
 	gdp->bg_free_inodes_count = cpu_to_le16(EXT4_INODES_PER_GROUP(sb));
 
Index: linux-2.6.18-rc6/fs/ext4/ialloc.c
===================================================================
--- linux-2.6.18-rc6.orig/fs/ext4/ialloc.c	2006-09-08 14:37:44.000000000 +0200
+++ linux-2.6.18-rc6/fs/ext4/ialloc.c	2006-09-08 14:38:02.000000000 +0200
@@ -60,14 +60,12 @@ read_inode_bitmap(struct super_block * s
 	if (!desc)
 		goto error_out;
 
-	bh = sb_bread(sb, EXT4_INODE_BITMAP(desc,
-			      ext4_group_first_block_no(sb, block_group)));
+	bh = sb_bread(sb, ext4_inode_bitmap(desc));
 	if (!bh)
 		ext4_error(sb, "read_inode_bitmap",
 			    "Cannot read inode bitmap - "
 			    "block_group = %lu, inode_bitmap = %llu",
-			    block_group, EXT4_INODE_BITMAP(desc,
-			      ext4_group_first_block_no(sb, block_group)));
+			    block_group, ext4_inode_bitmap(desc));
 error_out:
 	return bh;
 }
Index: linux-2.6.18-rc6/fs/ext4/inode.c
===================================================================
--- linux-2.6.18-rc6.orig/fs/ext4/inode.c	2006-09-08 14:37:54.000000000 +0200
+++ linux-2.6.18-rc6/fs/ext4/inode.c	2006-09-08 14:38:02.000000000 +0200
@@ -2434,8 +2434,7 @@ static ext4_fsblk_t ext4_get_inode_block
 	 */
 	offset = ((ino - 1) % EXT4_INODES_PER_GROUP(sb)) *
 		EXT4_INODE_SIZE(sb);
-	block = EXT4_INODE_TABLE((gdp+desc),
-			ext4_group_first_block_no(sb, block_group)) +
+	block = ext4_inode_table(gdp + desc) +
 			(offset >> EXT4_BLOCK_SIZE_BITS(sb));
 
 	iloc->block_group = block_group;
@@ -2502,10 +2501,8 @@ static int __ext4_get_inode_loc(struct i
 			if (!desc)
 				goto make_io;
 
-			bitmap_bh = sb_getblk(inode->i_sb,
-				EXT4_INODE_BITMAP(desc,
-				     ext4_group_first_block_no(inode->i_sb,
-						     block_group)));
+			bitmap_bh = sb_getblk(inode->i_sb, 
+				ext4_inode_bitmap(desc));
 			if (!bitmap_bh)
 				goto make_io;
 
Index: linux-2.6.18-rc6/fs/ext4/super.c
===================================================================
--- linux-2.6.18-rc6.orig/fs/ext4/super.c	2006-09-08 14:37:44.000000000 +0200
+++ linux-2.6.18-rc6/fs/ext4/super.c	2006-09-08 14:56:00.000000000 +0200
@@ -74,31 +74,41 @@ ext4_fsblk_t ext4_r_blocks_count(struct 
 				(__u64)le32_to_cpu(es->s_r_blocks_count));
 }
 
-u32 ext4_relative_encode(ext4_fsblk_t group_base, ext4_fsblk_t fs_block)
-{
-	s32 gdp_block;
-
-	if (fs_block < (1ULL<<32) && group_base < (1ULL<<32))
-		return fs_block;
-
-	gdp_block = (fs_block - group_base);
-	BUG_ON ((group_base + gdp_block) != fs_block);
-
-	return gdp_block;
-}
-
-ext4_fsblk_t ext4_relative_decode(ext4_fsblk_t group_base, u32 gdp_block)
-{
-	if (group_base >= (1ULL<<32))
-		return group_base + (s32) gdp_block;
-
-	if ((s32) gdp_block >= 0 && gdp_block < group_base &&
-	   	  group_base + gdp_block >= (1ULL<<32))
-		return group_base + gdp_block;
-
-	return gdp_block;
-}
-
+ext4_fsblk_t ext4_block_bitmap(struct ext4_group_desc *bg)
+{	
+	return le32_to_cpu(bg->bg_block_bitmap) | 
+		((ext4_fsblk_t)le32_to_cpu(bg->bg_block_bitmap_hi) << 32);
+}	
+
+ext4_fsblk_t ext4_inode_bitmap(struct ext4_group_desc *bg)
+{	
+	return le32_to_cpu(bg->bg_inode_bitmap) | 
+		((ext4_fsblk_t)le32_to_cpu(bg->bg_inode_bitmap_hi) << 32);
+}	
+
+ext4_fsblk_t ext4_inode_table(struct ext4_group_desc *bg)
+{	
+	return le32_to_cpu(bg->bg_inode_table) | 
+		((ext4_fsblk_t)le32_to_cpu(bg->bg_inode_table_hi) << 32);
+}	
+
+void ext4_block_bitmap_set(struct ext4_group_desc *bg, ext4_fsblk_t blk)
+{	
+	bg->bg_block_bitmap    = cpu_to_le32((u32)blk);
+	bg->bg_block_bitmap_hi = cpu_to_le32(blk >> 32);
+}	
+
+void ext4_inode_bitmap_set(struct ext4_group_desc *bg, ext4_fsblk_t blk)
+{	
+	bg->bg_inode_bitmap    = cpu_to_le32((u32)blk);
+	bg->bg_inode_bitmap_hi = cpu_to_le32(blk >> 32);
+}	
+
+void ext4_inode_table_set(struct ext4_group_desc *bg, ext4_fsblk_t blk)
+{	
+	bg->bg_inode_table    = cpu_to_le32((u32)blk);
+	bg->bg_inode_table_hi = cpu_to_le32(blk >> 32);
+}	
 
 static void ext4_free_blocks_count_set(struct ext4_super_block *es, __u32 v)
 {
@@ -1194,41 +1204,32 @@ static int ext4_check_descriptors (struc
 		if ((i % EXT4_DESC_PER_BLOCK(sb)) == 0)
 			gdp = (struct ext4_group_desc *)
 					sbi->s_group_desc[desc_block++]->b_data;
-		if (EXT4_BLOCK_BITMAP(gdp, ext4_group_first_block_no(sb, i)) <
-				block ||
-		    	EXT4_BLOCK_BITMAP(gdp, ext4_group_first_block_no(sb, i)) >=
-				block + EXT4_BLOCKS_PER_GROUP(sb))
+		if (ext4_block_bitmap(gdp) < block ||
+		    ext4_block_bitmap(gdp) >= block + EXT4_BLOCKS_PER_GROUP(sb))
 		{
 			ext4_error (sb, "ext4_check_descriptors",
 				    "Block bitmap for group %d"
-				    " not in group (block %lu)!",
-				    i, (unsigned long)
-					EXT4_BLOCK_BITMAP(gdp, ext4_group_first_block_no(sb, i)));
+				    " not in group (block %llu)!",
+				    i, ext4_block_bitmap(gdp));
 			return 0;
 		}
-		if (EXT4_INODE_BITMAP(gdp, ext4_group_first_block_no(sb, i)) <
-				block ||
-		    EXT4_INODE_BITMAP(gdp, ext4_group_first_block_no(sb, i)) >=
-				block + EXT4_BLOCKS_PER_GROUP(sb))
+		if (ext4_inode_bitmap(gdp) < block ||
+		    ext4_inode_bitmap(gdp) >= block + EXT4_BLOCKS_PER_GROUP(sb))
 		{
 			ext4_error (sb, "ext4_check_descriptors",
 				    "Inode bitmap for group %d"
-				    " not in group (block %lu)!",
-				    i, (unsigned long)
-					EXT4_INODE_BITMAP(gdp, ext4_group_first_block_no(sb, i)));
+				    " not in group (block %llu)!",
+				    i, ext4_inode_bitmap(gdp));
 			return 0;
 		}
-		if (EXT4_INODE_TABLE(gdp, ext4_group_first_block_no(sb, i)) <
-			block ||
-		    EXT4_INODE_TABLE(gdp, ext4_group_first_block_no(sb, i)) +
-							sbi->s_itb_per_group >=
+		if (ext4_inode_table(gdp) < block ||
+		    ext4_inode_table(gdp) + sbi->s_itb_per_group >=
 			block + EXT4_BLOCKS_PER_GROUP(sb))
 		{
 			ext4_error (sb, "ext4_check_descriptors",
 				    "Inode table for group %d"
-				    " not in group (block %lu)!",
-				    i, (unsigned long)
-					EXT4_INODE_TABLE(gdp, ext4_group_first_block_no(sb, i)));
+				    " not in group (block %llu)!",
+				    i, ext4_inode_table(gdp));
 			return 0;
 		}
 		block += EXT4_BLOCKS_PER_GROUP(sb);

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [patch 2/2] Re: Updated ext4 patches for 2.6.18-rc6
  2006-09-08 16:13   ` Alexandre Ratchov
  2006-09-08 16:15     ` [patch 1/2] " Alexandre Ratchov
@ 2006-09-08 16:18     ` Alexandre Ratchov
  2006-09-08 18:09     ` Andreas Dilger
  2 siblings, 0 replies; 8+ messages in thread
From: Alexandre Ratchov @ 2006-09-08 16:18 UTC (permalink / raw)
  To: Mingming Cao; +Cc: akpm, shaggy, linux-ext4, linux-kernel

Index: linux-2.6.18-rc6/fs/ext4/balloc.c
===================================================================
--- linux-2.6.18-rc6.orig/fs/ext4/balloc.c	2006-09-08 18:29:57.000000000 +0200
+++ linux-2.6.18-rc6/fs/ext4/balloc.c	2006-09-08 18:30:17.000000000 +0200
@@ -66,10 +66,12 @@ struct ext4_group_desc * ext4_get_group_
 		return NULL;
 	}
 
-	desc = (struct ext4_group_desc *) sbi->s_group_desc[group_desc]->b_data;
+	desc = (struct ext4_group_desc *)(
+		(__u8 *)sbi->s_group_desc[group_desc]->b_data +
+		offset * EXT4_DESC_SIZE(sb));
 	if (bh)
 		*bh = sbi->s_group_desc[group_desc];
-	return desc + offset;
+	return desc;
 }
 
 /*
Index: linux-2.6.18-rc6/fs/ext4/inode.c
===================================================================
--- linux-2.6.18-rc6.orig/fs/ext4/inode.c	2006-09-08 18:29:57.000000000 +0200
+++ linux-2.6.18-rc6/fs/ext4/inode.c	2006-09-08 18:34:34.000000000 +0200
@@ -2428,14 +2428,16 @@ static ext4_fsblk_t ext4_get_inode_block
 		return 0;
 	}
 
-	gdp = (struct ext4_group_desc *)bh->b_data;
+	gdp = (struct ext4_group_desc *)((__u8 *)bh->b_data + 
+		desc * EXT4_DESC_SIZE(sb));
 	/*
 	 * Figure out the offset within the block group inode table
 	 */
 	offset = ((ino - 1) % EXT4_INODES_PER_GROUP(sb)) *
 		EXT4_INODE_SIZE(sb);
-	block = ext4_inode_table(gdp + desc) +
-			(offset >> EXT4_BLOCK_SIZE_BITS(sb));
+	block = ext4_inode_table(gdp) + (offset >> EXT4_BLOCK_SIZE_BITS(sb));
+
+
 
 	iloc->block_group = block_group;
 	iloc->offset = offset & (EXT4_BLOCK_SIZE(sb) - 1);
Index: linux-2.6.18-rc6/include/linux/ext4_fs.h
===================================================================
--- linux-2.6.18-rc6.orig/include/linux/ext4_fs.h	2006-09-08 18:29:57.000000000 +0200
+++ linux-2.6.18-rc6/include/linux/ext4_fs.h	2006-09-08 18:30:17.000000000 +0200
@@ -146,6 +146,9 @@ struct ext4_group_desc
 /*
  * Macro-instructions used to manage group descriptors
  */
+#define EXT4_MIN_DESC_SIZE		32
+#define	EXT4_MAX_DESC_SIZE		EXT4_MIN_BLOCK_SIZE
+#define EXT4_DESC_SIZE(s)		(EXT4_SB(s)->s_desc_size)
 #ifdef __KERNEL__
 # define EXT4_BLOCKS_PER_GROUP(s)	(EXT4_SB(s)->s_blocks_per_group)
 # define EXT4_DESC_PER_BLOCK(s)		(EXT4_SB(s)->s_desc_per_block)
@@ -153,7 +156,7 @@ struct ext4_group_desc
 # define EXT4_DESC_PER_BLOCK_BITS(s)	(EXT4_SB(s)->s_desc_per_block_bits)
 #else
 # define EXT4_BLOCKS_PER_GROUP(s)	((s)->s_blocks_per_group)
-# define EXT4_DESC_PER_BLOCK(s)		(EXT4_BLOCK_SIZE(s) / sizeof (struct ext4_group_desc))
+# define EXT4_DESC_PER_BLOCK(s)		(EXT4_BLOCK_SIZE(s) / EXT4_DESC_SIZE(s))
 # define EXT4_INODES_PER_GROUP(s)	((s)->s_inodes_per_group)
 #endif
 
@@ -461,7 +464,7 @@ struct ext4_super_block {
 	 * things it doesn't understand...
 	 */
 	__le32	s_first_ino;		/* First non-reserved inode */
-	__le16   s_inode_size;		/* size of inode structure */
+	__le16  s_inode_size;		/* size of inode structure */
 	__le16	s_block_group_nr;	/* block group # of this superblock */
 	__le32	s_feature_compat;	/* compatible feature set */
 /*60*/	__le32	s_feature_incompat;	/* incompatible feature set */
@@ -487,7 +490,7 @@ struct ext4_super_block {
 	__le32	s_hash_seed[4];		/* HTREE hash seed */
 	__u8	s_def_hash_version;	/* Default hash version to use */
 	__u8	s_reserved_char_pad;
-	__u16	s_reserved_word_pad;
+	__le16  s_desc_size;		/* size of group descriptor */
 /*100*/	__le32	s_default_mount_opts;
 	__le32	s_first_meta_bg; 	/* First metablock block group */
 	__le32	s_mkfs_time;		/* When the filesystem was created */
Index: linux-2.6.18-rc6/fs/ext4/super.c
===================================================================
--- linux-2.6.18-rc6.orig/fs/ext4/super.c	2006-09-08 18:29:57.000000000 +0200
+++ linux-2.6.18-rc6/fs/ext4/super.c	2006-09-08 18:30:17.000000000 +0200
@@ -1233,7 +1233,8 @@ static int ext4_check_descriptors (struc
 			return 0;
 		}
 		block += EXT4_BLOCKS_PER_GROUP(sb);
-		gdp++;
+		gdp = (struct ext4_group_desc *)
+			((__u8 *)gdp + EXT4_DESC_SIZE(sb));
 	}
 
 	ext4_free_blocks_count_set(sbi->s_es, ext4_count_free_blocks(sb));
@@ -1585,7 +1586,18 @@ static int ext4_fill_super (struct super
 		       sbi->s_frag_size, blocksize);
 		goto failed_mount;
 	}
-	sbi->s_frags_per_block = 1;
+	sbi->s_desc_size = le16_to_cpu(es->s_desc_size);
+	if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_64BIT)) {
+		if (sbi->s_desc_size < EXT4_MIN_DESC_SIZE ||
+		    sbi->s_desc_size > EXT4_MAX_DESC_SIZE ||
+		    sbi->s_desc_size & (sbi->s_desc_size - 1)) {
+			printk(KERN_ERR
+			       "EXT4-fs: unsupported descriptor size %d\n",
+			       sbi->s_desc_size);
+			goto failed_mount;
+		}
+	} else
+		sbi->s_desc_size = EXT4_MIN_DESC_SIZE;
 	sbi->s_blocks_per_group = le32_to_cpu(es->s_blocks_per_group);
 	sbi->s_frags_per_group = le32_to_cpu(es->s_frags_per_group);
 	sbi->s_inodes_per_group = le32_to_cpu(es->s_inodes_per_group);
@@ -1596,7 +1608,7 @@ static int ext4_fill_super (struct super
 		goto cantfind_ext4;
 	sbi->s_itb_per_group = sbi->s_inodes_per_group /
 					sbi->s_inodes_per_block;
-	sbi->s_desc_per_block = blocksize / sizeof(struct ext4_group_desc);
+	sbi->s_desc_per_block = blocksize / EXT4_DESC_SIZE(sb);
 	sbi->s_sbh = bh;
 	sbi->s_mount_state = le16_to_cpu(es->s_state);
 	sbi->s_addr_per_block_bits = log2(EXT4_ADDR_PER_BLOCK(sb));
Index: linux-2.6.18-rc6/include/linux/ext4_fs_sb.h
===================================================================
--- linux-2.6.18-rc6.orig/include/linux/ext4_fs_sb.h	2006-09-08 18:29:57.000000000 +0200
+++ linux-2.6.18-rc6/include/linux/ext4_fs_sb.h	2006-09-08 18:30:17.000000000 +0200
@@ -29,6 +29,7 @@
  */
 struct ext4_sb_info {
 	unsigned long s_frag_size;	/* Size of a fragment in bytes */
+	unsigned long s_desc_size;	/* Size of a group descriptor in bytes */
 	unsigned long s_frags_per_block;/* Number of fragments per block */
 	unsigned long s_inodes_per_block;/* Number of inodes per block */
 	unsigned long s_frags_per_group;/* Number of fragments in a group */

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Updated ext4 patches for 2.6.18-rc6
  2006-09-08 16:13   ` Alexandre Ratchov
  2006-09-08 16:15     ` [patch 1/2] " Alexandre Ratchov
  2006-09-08 16:18     ` [patch 2/2] " Alexandre Ratchov
@ 2006-09-08 18:09     ` Andreas Dilger
  2 siblings, 0 replies; 8+ messages in thread
From: Andreas Dilger @ 2006-09-08 18:09 UTC (permalink / raw)
  To: Alexandre Ratchov; +Cc: Mingming Cao, akpm, shaggy, linux-ext4, linux-kernel

On Sep 08, 2006  18:13 +0200, Alexandre Ratchov wrote:
> there are 2 more patches:
> 
> * ext4_remove_relative_block_numbers:
> 
>   use 48bit absolute block numbers instead of mixed relative/absolute block
>   numbers. This is simpler and seems to fix issues with large file systems.
>    
> * ext4_allow_larger_descriptor_size:
> 
>   allow larger block group descriptors: this patch will allow to add new
>   features that need more space in the block descriptor.

Hmm, I'm a bit confused.  If we are adding larger block group descriptors,
why wouldn't we put 32-bit "high" block numbers into the larger descriptor
space?  That could be part of the INCOMPAT_64BIT support.

Cheers, Andreas
--
Andreas Dilger
Principal Software Engineer
Cluster File Systems, Inc.


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC][1/4] ext2/3/4: enlarge blocksize
  2006-09-08  4:11 [RFC][1/4] ext2/3/4: enlarge blocksize sho
  2006-09-08  7:01 ` Updated ext4 patches for 2.6.18-rc6 Mingming Cao
@ 2007-06-21 22:34 ` Andreas Dilger
  1 sibling, 0 replies; 8+ messages in thread
From: Andreas Dilger @ 2007-06-21 22:34 UTC (permalink / raw)
  To: sho; +Cc: linux-ext4

On Sep 08, 2006  13:11 +0900, sho@tnes.nec.co.jp wrote:
> On July 7, 2006, sho wrote:
> These patches support large blocksize up to PAGESIZE (max 64KB).
> NOTE:
> They limit the end of a directory block to 65532(64K - 4)
> to avoid overflow only when using 64KB block.

Takashi, in light of the (very exciting ;-) patches to handle 64kB
PAGE_SIZE on x86 systems, could you please update the large blocksize
patch to the latest ext4 tree?

> diff -upNr -X linux-2.6.18-rc4-mingming/Documentation/dontdiff linux-2.6.18-rc4-mingming/fs/ext2/super.c linux-2.6.18-rc4-mingming-tnes/fs/ext2/super.c
> --- linux-2.6.18-rc4-mingming/fs/ext2/super.c	2006-08-07 03:20:11.000000000 +0900
> +++ linux-2.6.18-rc4-mingming-tnes/fs/ext2/super.c	2006-09-08 09:00:40.000000000 +0900
> @@ -725,7 +725,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;
>  		}

We need a check in ext2 (like ext3/ext4) to ensure that blocksize <
EXT2_MAX_BLOCK_SIZE.  It could be increased to 32768 without danger
I think, only the directory problem prevents it from working with 65536.

Cheers, Andreas
--
Andreas Dilger
Principal Software Engineer
Cluster File Systems, Inc.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2007-06-21 22:34 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-09-08  4:11 [RFC][1/4] ext2/3/4: enlarge blocksize sho
2006-09-08  7:01 ` Updated ext4 patches for 2.6.18-rc6 Mingming Cao
2006-09-08 16:13   ` Alexandre Ratchov
2006-09-08 16:15     ` [patch 1/2] " Alexandre Ratchov
2006-09-08 16:18     ` [patch 2/2] " Alexandre Ratchov
2006-09-08 18:09     ` Andreas Dilger
2007-06-21 22:34 ` [RFC][1/4] ext2/3/4: enlarge blocksize Andreas Dilger
  -- strict thread matches above, loose matches on Subject: below --
2006-09-08 10:17 Updated ext4 patches for 2.6.18-rc6 sho

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox