add new mkfs option to create ext4 filesystems
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
@@ -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
@@ -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
@@ -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 );
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.
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
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.