Skip to contentSkip to conversation

add new mkfs option to create ext4 filesystems

RFC PATCH In review Valerie Clement 3 participants 4 messages Jun 21, 2007 – Jun 25, 2007

lore
Share & tools
lore
#0 lore raw

RFC PATCH 1/11 add new mkfs option to create ext4 filesystems

This patch adds a new option '-D' to mkfs to allow creating ext4 filesystem.

 lib/ext2fs/ext2_fs.h    |    7 +++++++
 lib/ext2fs/initialize.c |    1 +
 misc/mke2fs.c           |   18 ++++++++++++++++--
 3 files changed, 24 insertions(+), 2 deletions(-)
misc/mke2fs.c +16 -2
Index: e2fsprogs-1.39-tyt3-v7/misc/mke2fs.c
===================================================================
@@ -96,7 +96,7 @@ static void usage(void)
 {
 	fprintf(stderr, _("Usage: %s [-c|-t|-l filename] [-b block-size] "
 	"[-f fragment-size]\n\t[-i bytes-per-inode] [-I inode-size] "
-	"[-j] [-J journal-options]\n"
+	"[-D descriptor-size] [-j] [-J journal-options]\n"
 	"\t[-N number-of-inodes] [-m reserved-blocks-percentage] "
 	"[-o creator-os]\n\t[-g blocks-per-group] [-L volume-label] "
 	"[-M last-mounted-directory]\n\t[-O feature[,...]] "
@@ -899,6 +899,7 @@ static void PRS(int argc, char *argv[])
 	int		blocksize = 0;
 	int		inode_ratio = 0;
 	int		inode_size = 0;
+	int		desc_size = 0;
 	double		reserved_ratio = 5.0;
 	int		sector_size = 0;
 	int		show_version_only = 0;
@@ -977,7 +978,7 @@ static void PRS(int argc, char *argv[])
 	}
 
 	while ((c = getopt (argc, argv,
-		    "b:cf:g:i:jl:m:no:qr:s:tvE:FI:J:L:M:N:O:R:ST:V")) != EOF) {
+		    "b:cf:g:i:jl:m:no:qr:s:tvD:E:FI:J:L:M:N:O:R:ST:V")) != EOF) {
 		switch (c) {
 		case 'b':
 			blocksize = strtol(optarg, &tmp, 0);
@@ -1094,6 +1095,14 @@ static void PRS(int argc, char *argv[])
 				exit(1);
 			}
 			break;
+		case 'D':
+			desc_size = strtoul(optarg, &tmp, 0);
+			if (*tmp) {
+				com_err(program_name, 0,
+					_("invalid descriptor size - %s"), optarg);
+				exit(1);
+			}
+			break;
 		case 'v':
 			verbose = 1;
 			break;
@@ -1422,6 +1431,11 @@ static void PRS(int argc, char *argv[])
 		}
 	}
 
+	if (desc_size >= EXT2_MIN_DESC_SIZE_64BIT) {
+		fs_param.s_feature_incompat |= EXT4_FEATURE_INCOMPAT_64BIT;
+		fs_param.s_desc_size = EXT2_MIN_DESC_SIZE_64BIT;
+	}
+
 	if (!force && fs_param.s_blocks_count >= ((unsigned) 1 << 31)) {
 		com_err(program_name, 0,
 			_("Filesystem too large.  No more than 2**31-1 blocks\n"
lib/ext2fs/ext2_fs.h +7 -0
Index: e2fsprogs-1.39-tyt3-v7/lib/ext2fs/ext2_fs.h
===================================================================
@@ -217,6 +217,13 @@ struct ext2_dx_countlimit {
 /*
  * Macro-instructions used to manage group descriptors
  */
+#define EXT2_MIN_DESC_SIZE		32
+#define EXT2_MIN_DESC_SIZE_64BIT	64
+#define EXT2_MAX_DESC_SIZE		EXT2_MIN_BLOCK_SIZE
+#define EXT2_DESC_SIZE(s)						\
+	((EXT2_SB(s)->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) ? \
+	 EXT2_MIN_DESC_SIZE_64BIT : EXT2_MIN_DESC_SIZE)
+
 #define EXT2_BLOCKS_PER_GROUP(s)	(EXT2_SB(s)->s_blocks_per_group)
 #define EXT2_INODES_PER_GROUP(s)	(EXT2_SB(s)->s_inodes_per_group)
 #define EXT2_INODES_PER_BLOCK(s)	(EXT2_BLOCK_SIZE(s)/EXT2_INODE_SIZE(s))
lib/ext2fs/initialize.c +1 -0
Index: e2fsprogs-1.39-tyt3-v7/lib/ext2fs/initialize.c
===================================================================
@@ -149,6 +149,7 @@ errcode_t ext2fs_initialize(const char *
 
 	set_field(s_log_block_size, 0);	/* default blocksize: 1024 bytes */
 	set_field(s_log_frag_size, 0); /* default fragsize: 1024 bytes */
+	set_field(s_desc_size, 0);
 	set_field(s_first_data_block, super->s_log_block_size ? 0 : 1);
 	set_field(s_max_mnt_count, EXT2_DFL_MAX_MNT_COUNT);
 	set_field(s_errors, EXT2_ERRORS_DEFAULT);
#1 lore raw

misc/mke2fs.c static void PRS(int argc, char *argv[]) · line 1104

Quoted 11 lines · Valerie Clement
misc/mke2fs.c +7 -0
@@ -1094,6 +1095,14 @@ static void PRS(int argc, char *argv[])
 				exit(1);
 			}
 			break;
+		case 'D':
+			desc_size = strtoul(optarg, &tmp, 0);
+			if (*tmp) {
+				com_err(program_name, 0,
+					_("invalid descriptor size - %s"), optarg);
+				exit(1);
+			}

I think we should limit the descriptor size to a power-of-two value so that we can access it with only shift operations instead of division, and we do not need to worry about descriptors crossing blocks.

Also, the upper limit should be the filesystem blocksize.

misc/mke2fs.c static void PRS(int argc, char *argv[]) · line 1434

Quoted 5 lines
misc/mke2fs.c +4 -0
@@ -1422,6 +1431,11 @@ static void PRS(int argc, char *argv[])
+	if (desc_size >= EXT2_MIN_DESC_SIZE_64BIT) {
+		fs_param.s_feature_incompat |= EXT4_FEATURE_INCOMPAT_64BIT;
+		fs_param.s_desc_size = EXT2_MIN_DESC_SIZE_64BIT;
+	}

This should be "if (desc_size > EXT2_MIN_DESC_SIZE)" I think, even though the two are (currently) equivalent.

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

#2 lore raw
In reply to Valerie Clement
Quoted 59 lines · Valerie Clement

This patch adds a new option '-D' to mkfs to allow creating ext4 filesystem.

 lib/ext2fs/ext2_fs.h    |    7 +++++++
 lib/ext2fs/initialize.c |    1 +
 misc/mke2fs.c           |   18 ++++++++++++++++--
 3 files changed, 24 insertions(+), 2 deletions(-)

------------------------------------------------------------------------

Index: e2fsprogs-1.39-tyt3-v7/misc/mke2fs.c
===================================================================

misc/mke2fs.c +11 -2
@@ -96,7 +96,7 @@ static void usage(void)
 {
 	fprintf(stderr, _("Usage: %s [-c|-t|-l filename] [-b block-size] "
 	"[-f fragment-size]\n\t[-i bytes-per-inode] [-I inode-size] "
-	"[-j] [-J journal-options]\n"
+	"[-D descriptor-size] [-j] [-J journal-options]\n"
 	"\t[-N number-of-inodes] [-m reserved-blocks-percentage] "
 	"[-o creator-os]\n\t[-g blocks-per-group] [-L volume-label] "
 	"[-M last-mounted-directory]\n\t[-O feature[,...]] "
@@ -899,6 +899,7 @@ static void PRS(int argc, char *argv[])
 	int		blocksize = 0;
 	int		inode_ratio = 0;
 	int		inode_size = 0;
+	int		desc_size = 0;
 	double		reserved_ratio = 5.0;
 	int		sector_size = 0;
 	int		show_version_only = 0;
@@ -977,7 +978,7 @@ static void PRS(int argc, char *argv[])
 	}
 
 	while ((c = getopt (argc, argv,
-		    "b:cf:g:i:jl:m:no:qr:s:tvE:FI:J:L:M:N:O:R:ST:V")) != EOF) {
+		    "b:cf:g:i:jl:m:no:qr:s:tvD:E:FI:J:L:M:N:O:R:ST:V")) != EOF) {
 		switch (c) {
 		case 'b':
 			blocksize = strtol(optarg, &tmp, 0);
@@ -1094,6 +1095,14 @@ static void PRS(int argc, char *argv[])
 				exit(1);
 			}
 			break;
+		case 'D':
+			desc_size = strtoul(optarg, &tmp, 0);
+			if (*tmp) {
+				com_err(program_name, 0,
+					_("invalid descriptor size - %s"), optarg);
+				exit(1);
+			}
+			break;
 		case 'v':
 			verbose = 1;
 			break;

misc/mke2fs.c static void PRS(int argc, char *argv[]) · line 1440

Quoted 10 lines
misc/mke2fs.c +5 -0
@@ -1422,6 +1431,11 @@ static void PRS(int argc, char *argv[])
 		}
 	}
 
+	if (desc_size >= EXT2_MIN_DESC_SIZE_64BIT) {
+		fs_param.s_feature_incompat |= EXT4_FEATURE_INCOMPAT_64BIT;
+		fs_param.s_desc_size = EXT2_MIN_DESC_SIZE_64BIT;
+	}
+
 	if (!force && fs_param.s_blocks_count >= ((unsigned) 1 << 31)) {
 

Why would one need variable descriptor size. Right now we have only two descriptor sizes right (32 and 64 ). Can't we figure out the descriptor size we should use by looking at the partition size ? What is that i am missing ?.

-aneesh

#3 lore raw
Quoted 4 lines · Aneesh Kumar K.V

Why would one need variable descriptor size. Right now we have only two descriptor sizes right (32 and 64 ). Can't we figure out
the descriptor size we should use by looking at the partition size ? What is that i am missing ?.

Because one may want to expand an ext4 filesystem over 16TB after format time, and this would require a 64-byte descriptor. In ext4 the descriptor is almost completely full already (to deal with BIG_BG changes, and possibly large blocksize changes), so we may even need 128-byte descriptors soon.

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