rfc: [patch 6/6] more e2fsprogs fixes

Alexandre Ratchov <[email protected]> Fri, 25 Aug 2006 15:22:13 +0200
Newsgroups gmane.comp.file-systems.ext2.devel
Message-ID <[email protected]>
this is the kernel side of 18-blk-64bit-desc48 patch. It
adds bg_{block_bitmap,inode_bitmap,inode_table}_hi fields in
group descriptors and removes relative adressing.

Index: linux-2.6.18-rc4/include/linux/ext4_fs.h
===================================================================
--- linux-2.6.18-rc4.orig/include/linux/ext4_fs.h	2006-08-22 20:33:48.000000000 +0200
+++ linux-2.6.18-rc4/include/linux/ext4_fs.h	2006-08-23 18:07:14.000000000 +0200
@@ -133,59 +133,42 @@ struct ext4_group_desc
 	__le16	bg_free_inodes_count;	/* Free inodes count */
 	__le16	bg_used_dirs_count;	/* Directories count */
 	__u16	bg_pad;
-	__le32	bg_reserved[3];
+	__le32	bg_block_bitmap_hi;	/* Blocks bitmap block MSB */
+	__le32	bg_inode_bitmap_hi;	/* Inodes bitmap block MSB */
+	__le32	bg_inode_table_hi;	/* Inodes table block MSB */
 };
 
 #ifdef __KERNEL__
 #include <linux/ext4_fs_i.h>
 #include <linux/ext4_fs_sb.h>
-static inline 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;
-}
-
-static inline 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;
-}
-
-#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_BLOCK_BITMAP(bg, group_base)				\
+	((ext4_fsblk_t)(le32_to_cpu((bg)->bg_block_bitmap) | 		\
+	 ((u64)le32_to_cpu((bg)->bg_block_bitmap_hi) << 32)))
+#define EXT4_INODE_BITMAP(bg, group_base)				\
+	((ext4_fsblk_t)(le32_to_cpu((bg)->bg_inode_bitmap) | 		\
+	 ((u64)le32_to_cpu((bg)->bg_inode_bitmap_hi) << 32)))
+#define EXT4_INODE_TABLE(bg, group_base)				\
+	((ext4_fsblk_t)(le32_to_cpu((bg)->bg_inode_table) |		\
+	 ((u64)le32_to_cpu((bg)->bg_inode_table_hi) << 32)))
+#define EXT4_BLOCK_BITMAP_SET(bg, group_base, val) do {			\
+	(bg)->bg_block_bitmap = cpu_to_le32((val) & 0xffffffff);	\
+	(bg)->bg_block_bitmap_hi = cpu_to_le32((val) >> 32);		\
+} while(0)
+#define EXT4_INODE_BITMAP_SET(bg, group_base, val) do {			\
+	(bg)->bg_inode_bitmap = cpu_to_le32((val) & 0xffffffff);	\
+	(bg)->bg_inode_bitmap_hi = cpu_to_le32((val) >> 32);		\
+} while(0)
+#define EXT4_INODE_TABLE_SET(bg, group_base, val) do {			\
+	(bg)->bg_inode_table = cpu_to_le32((val) & 0xffffffff);		\
+	(bg)->bg_inode_table_hi = cpu_to_le32((val) >> 32);		\
+} while(0)
 
 #define EXT4_IS_USED_BLOCK_BITMAP(bg)	\
-	((bg)->bg_block_bitmap != 0)
+	((bg)->bg_block_bitmap != 0 || (bg)->bg_block_bitmap_hi != 0)
 #define EXT4_IS_USED_INODE_BITMAP(bg)	\
-	((bg)->bg_inode_bitmap != 0)
+	((bg)->bg_inode_bitmap != 0 || (bg)->bg_inode_bitmap_hi != 0)
 #define EXT4_IS_USED_INODE_TABLE(bg)	\
-	((bg)->bg_inode_table != 0)
+	((bg)->bg_inode_table != 0 || (bg)->bg_inode_table_hi != 0)
 #endif
 /*
  * Macro-instructions used to manage group descriptors
@@ -249,9 +232,9 @@ static inline ext4_fsblk_t EXT4_RELATIVE
 /* 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;
@@ -260,9 +243,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;

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642