From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Darrick J. Wong" Subject: Re: [PATCH 37/37] ext5: define new subtype to add features and reduce testing complexity Date: Mon, 5 May 2014 18:33:17 -0700 Message-ID: <20140506013317.GO8434@birch.djwong.org> References: <20140501231222.31890.82860.stgit@birch.djwong.org> <20140501231629.31890.34812.stgit@birch.djwong.org> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: tytso@mit.edu, linux-ext4@vger.kernel.org To: =?utf-8?B?THVrw6HFoQ==?= Czerner Return-path: Received: from aserp1040.oracle.com ([141.146.126.69]:36454 "EHLO aserp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933462AbaEFBdY (ORCPT ); Mon, 5 May 2014 21:33:24 -0400 Content-Disposition: inline In-Reply-To: Sender: linux-ext4-owner@vger.kernel.org List-ID: On Fri, May 02, 2014 at 11:45:25AM +0200, Luk=C3=A1=C5=A1 Czerner wrote= : > On Thu, 1 May 2014, Darrick J. Wong wrote: >=20 > > Date: Thu, 01 May 2014 16:16:29 -0700 > > From: Darrick J. Wong > > To: tytso@mit.edu, darrick.wong@oracle.com > > Cc: linux-ext4@vger.kernel.org > > Subject: [PATCH 37/37] ext5: define new subtype to add features and= reduce > > testing complexity > >=20 > > This patch defines ext5 as a set of required feature flags and moun= t > > options, for the purpose of spreading new features to freshly > > formatted filesystems and reducing the testing matrix by disabling > > nearly all mount options. The patch uses the s_minor_rev_level fie= ld > > to indicate the existence of ext5, and switch on feature/mount opti= on > > enforcement in the kernel. > >=20 > > The required feature set is: > > ^resize_inode,dirindex,ext_attr,sparse_super2,filetype,meta_bg,exte= nts, > > ^flex_bg,64bit,inline_data,sparse_super,huge_file,large_file,dir_nl= ink, > > extra_isize,metadata_csum > >=20 > > The required mount options are: > > acl,block_validity,user_xattr,journal_checksum > >=20 > > All other mount options are no longer functional. > >=20 > > The 'ext4' type remains unchanged, for people who require mount > > options or a different feature set. I don't intend to fork any cod= e; > > I'm just painting a bigger target (for testing). >=20 > This is definitely NACK by me. I do not like this and there are > several reasons why. >=20 > First of all the name. Given the history of ext file system we tend > to increase then number with the new version of file system. However > you're saying that this is just for testing features ... in that > case it does not make any sense to call it ext5, but not just that > it's stupid to call it ext5 especially since we might actually want > to release ext5 in the future and this would be really confusing for > everybody involved. I should have been clearer about my aim for "ext5" -- I want to define ext5 to be "ext4 + some new features - some mount options", and then work on stabilizing those features. Historically, we've defined each extN to be ext(N-1) + more features, and that's what I'm doing here too. ext5 would be a real release, with new features and fewer mount options. The comment about reducing testing was merely a reflection upon the side effects of locking down some of the feature flags and mount options. I don't think it's a good idea to change what features you get with 'mke2fs -T ext4' since that hasn't changed since ~2008 or so. Maybe I should have called it ext5dev and killed off ext4dev. > I've been trying to get rid of the ext4dev bits and pieces > more-or-less successfully and you're adding new type once again. We > might start the discussion whether to revive ext4dev for this kind > of thing but I am not really convinced that this is the right way to > go either. >=20 > What about just simply using mkefs.conf to specify the feature set > we want and use that ? It's simple enough and it should work. We > could also extend the configuration to be able to set default > mount options and such if that's not possible. I just do not understa= nd > why to introduce new file system type if that's just for testing > ext4 features. Well, yes, I could just create a new fs_types stanza in mke2fs.conf. I wanted to put a little more teeth in that and actually have the kernel and e2fsck be able to check that a FS has been declared as 'ext5' and that all the required bits are really there, hence the ability to set s_minor_rev_level. I'm not really married to going that far, though. (There's already an interface for specifying some of the default mount options in the superblock; that was sufficient for me.) --D >=20 > Thanks! > -Lukas >=20 >=20 >=20 > >=20 > > Signed-off-by: Darrick J. Wong > > --- > > e2fsck/problem.c | 15 +++++++++ > > e2fsck/problem.h | 14 ++++++-- > > e2fsck/unix.c | 68 +++++++++++++++++++++++++++= ++++++++++++ > > lib/e2p/ls.c | 11 ++++++ > > lib/ext2fs/ext2_fs.h | 3 ++ > > lib/ext2fs/ext2fs.h | 50 +++++++++++++++++++++++++++= ++ > > lib/ext2fs/initialize.c | 1 + > > misc/Makefile.in | 11 ++++-- > > misc/mke2fs.c | 30 +++++++++++++++++ > > misc/mke2fs.conf.in | 4 ++ > > misc/tune2fs.c | 23 +++++++++++++ > > tests/metadata-checksum-test.sh | 5 +++ > > tests/t_mke2fs_ext5/expect | 45 ++++++++++++++++++++++++++ > > tests/t_mke2fs_ext5/script | 33 +++++++++++++++++++ > > 14 files changed, 306 insertions(+), 7 deletions(-) > > create mode 100644 tests/t_mke2fs_ext5/expect > > create mode 100755 tests/t_mke2fs_ext5/script > >=20 > >=20 > > diff --git a/e2fsck/problem.c b/e2fsck/problem.c > > index ec20bd1..ddfe2b7 100644 > > --- a/e2fsck/problem.c > > +++ b/e2fsck/problem.c > > @@ -454,6 +454,21 @@ static struct e2fsck_problem problem_table[] =3D= { > > N_("@S 64bit filesystems needs extents to access the whole disk= =2E "), > > PROMPT_FIX, PR_PREEN_OK | PR_NO_OK}, > > =20 > > + /* ext5 feature set incorrect. */ > > + { PR_0_FIX_EXT5_FEATURES, > > + N_("@S ext5 feature set incorrect. "), > > + PROMPT_FIX, PR_PREEN_OK | PR_NO_OK}, > > + > > + /* ext5 flag doesn't match with feature set. */ > > + { PR_0_REMOVE_EXT5_MINOR_REV, > > + N_("@S ext5 flag doesn't match with feature set. "), > > + PROMPT_CLEAR, PR_PREEN_OK | PR_NO_OK}, > > + > > + /* ext5 default mount options incorrect. */ > > + { PR_0_FIX_EXT5_MNTOPTS, > > + N_("@S ext5 default mount options incorrect. "), > > + PROMPT_FIX, PR_PREEN_OK | PR_NO_OK}, > > + > > /* Pass 1 errors */ > > =20 > > /* Pass 1: Checking inodes, blocks, and sizes */ > > diff --git a/e2fsck/problem.h b/e2fsck/problem.h > > index bc9fa9c..935f78a 100644 > > --- a/e2fsck/problem.h > > +++ b/e2fsck/problem.h > > @@ -249,9 +249,6 @@ struct problem_context { > > /* Checking group descriptor failed */ > > #define PR_0_CHECK_DESC_FAILED 0x000045 > > =20 > > -/* 64bit is set but extents are not set. */ > > -#define PR_0_64BIT_WITHOUT_EXTENTS 0x000048 > > - > > /* > > * metadata_csum supersedes uninit_bg; both feature bits cannot be= set > > * simultaneously. > > @@ -261,6 +258,17 @@ struct problem_context { > > /* Superblock has invalid MMP checksum. */ > > #define PR_0_MMP_CSUM_INVALID 0x000047 > > =20 > > +/* 64bit is set but extents are not set. */ > > +#define PR_0_64BIT_WITHOUT_EXTENTS 0x000048 > > + > > +/* ext5 feature set incorrect. */ > > +#define PR_0_FIX_EXT5_FEATURES 0x000049 > > + > > +/* ext5 flag doesn't match with feature set. */ > > +#define PR_0_REMOVE_EXT5_MINOR_REV 0x00004A > > + > > +/* ext5 default mount options incorrect. */ > > +#define PR_0_FIX_EXT5_MNTOPTS 0x00004B > > =20 > > /* > > * Pass 1 errors > > diff --git a/e2fsck/unix.c b/e2fsck/unix.c > > index da888c2..55a5d03 100644 > > --- a/e2fsck/unix.c > > +++ b/e2fsck/unix.c > > @@ -1205,6 +1205,71 @@ check_error: > > return retval; > > } > > =20 > > +#define EXT5_FEATURE_COMPAT_FIXABLE (EXT2_FEATURE_COMPAT_DIR_INDEX= |\ > > + EXT2_FEATURE_COMPAT_EXT_ATTR) > > + > > +#define EXT5_FEATURE_INCOMPAT_FIXABLE (EXT3_FEATURE_INCOMPAT_EXTEN= TS|\ > > + EXT4_FEATURE_INCOMPAT_INLINE_DATA) > > + > > +#define EXT5_FEATURE_RO_COMPAT_FIXABLE (EXT4_FEATURE_RO_COMPAT_HUG= E_FILE|\ > > + EXT2_FEATURE_RO_COMPAT_LARGE_FILE|\ > > + EXT4_FEATURE_RO_COMPAT_DIR_NLINK|\ > > + EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE) > > + > > +static void check_ext5_fs(e2fsck_t ctx, struct problem_context *pc= tx) > > +{ > > + struct ext2_super_block *sb =3D ctx->fs->super; > > + __u32 features[3]; > > + > > + if (sb->s_minor_rev_level !=3D EXT5_MINOR_REV_LEVEL) > > + return; > > + > > + features[0] =3D EXT5_FEATURE_COMPAT_REQD ^ > > + (sb->s_feature_compat & EXT5_FEATURE_COMPAT_REQD_MASK); > > + features[1] =3D EXT5_FEATURE_INCOMPAT_REQD ^ > > + (sb->s_feature_incompat & EXT5_FEATURE_INCOMPAT_REQD_MASK); > > + features[2] =3D EXT5_FEATURE_RO_COMPAT_REQD ^ > > + (sb->s_feature_ro_compat & EXT5_FEATURE_RO_COMPAT_REQD_MASK); > > + > > + if (!features[0] && !features[1] && !features[2]) > > + goto check_mntopts; > > + > > + if ((features[0] & EXT5_FEATURE_COMPAT_FIXABLE) =3D=3D features[0= ] && > > + (features[1] & EXT5_FEATURE_INCOMPAT_FIXABLE) =3D=3D features= [1] && > > + (features[2] & EXT5_FEATURE_RO_COMPAT_FIXABLE) =3D=3D feature= s[2]) { > > + if (fix_problem(ctx, PR_0_FIX_EXT5_FEATURES, pctx)) { > > + sb->s_feature_compat =3D EXT5_FEATURE_COMPAT_REQD | > > + (sb->s_feature_compat & > > + ~EXT5_FEATURE_COMPAT_REQD_MASK); > > + sb->s_feature_incompat =3D EXT5_FEATURE_INCOMPAT_REQD | > > + (sb->s_feature_incompat & > > + ~EXT5_FEATURE_INCOMPAT_REQD_MASK); > > + sb->s_feature_ro_compat =3D EXT5_FEATURE_RO_COMPAT_REQD | > > + (sb->s_feature_ro_compat & > > + ~EXT5_FEATURE_RO_COMPAT_REQD_MASK); > > + ext2fs_mark_super_dirty(ctx->fs); > > + } > > + } else { > > + if (fix_problem(ctx, PR_0_REMOVE_EXT5_MINOR_REV, pctx)) { > > + sb->s_minor_rev_level =3D 0; > > + ext2fs_mark_super_dirty(ctx->fs); > > + } > > + } > > + > > +check_mntopts: > > + if (!(EXT5_DEF_MNTOPT ^ > > + (sb->s_default_mount_opts & EXT5_DEF_MNTOPT_MASK))) > > + return; > > + > > + if (fix_problem(ctx, PR_0_FIX_EXT5_MNTOPTS, pctx)) { > > + sb->s_default_mount_opts =3D EXT5_DEF_MNTOPT | > > + (sb->s_default_mount_opts & ~EXT5_DEF_MNTOPT_MASK); > > + ext2fs_mark_super_dirty(ctx->fs); > > + } > > + > > + return; > > +} > > + > > int main (int argc, char *argv[]) > > { > > errcode_t retval =3D 0, retval2 =3D 0, orig_retval =3D 0; > > @@ -1601,6 +1666,9 @@ print_unsupp_features: > > } > > #endif > > =20 > > + /* check ext5 features and mount options */ > > + check_ext5_fs(ctx, &pctx); > > + > > /* > > * If the user specified a specific superblock, presumably the > > * master superblock has been trashed. So we mark the > > diff --git a/lib/e2p/ls.c b/lib/e2p/ls.c > > index a7ea38a..ba91e6a 100644 > > --- a/lib/e2p/ls.c > > +++ b/lib/e2p/ls.c > > @@ -239,6 +239,17 @@ void list_super2(struct ext2_super_block * sb,= FILE *f) > > #endif > > } else > > fprintf(f, " (unknown)\n"); > > + if (sb->s_minor_rev_level) { > > + fprintf(f, "Filesystem minor rev #: %d", > > + sb->s_minor_rev_level); > > + switch (sb->s_minor_rev_level) { > > + case EXT5_MINOR_REV_LEVEL: > > + fprintf(f, " (ext5)\n"); > > + break; > > + default: > > + fprintf(f, " (unknown)\n"); > > + } > > + } > > print_features(sb, f); > > print_super_flags(sb, f); > > print_mntopts(sb, f); > > diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h > > index 21a8187..027cfe9 100644 > > --- a/lib/ext2fs/ext2_fs.h > > +++ b/lib/ext2fs/ext2_fs.h > > @@ -926,4 +926,7 @@ struct mmp_struct { > > */ > > #define EXT4_INLINE_DATA_DOTDOT_SIZE (4) > > =20 > > +/* Minor revision level for ext5 */ > > +#define EXT5_MINOR_REV_LEVEL (2) > > + > > #endif /* _LINUX_EXT2_FS_H */ > > diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h > > index 84c7c74..fd53162 100644 > > --- a/lib/ext2fs/ext2fs.h > > +++ b/lib/ext2fs/ext2fs.h > > @@ -611,6 +611,56 @@ typedef struct ext2_icount *ext2_icount_t; > > EXT4_LIB_RO_COMPAT_QUOTA|\ > > EXT4_FEATURE_RO_COMPAT_METADATA_CSUM) > > =20 > > +/* ext5 features */ > > +#define EXT5_FEATURE_COMPAT_REQD_MASK (EXT2_FEATURE_COMPAT_RESIZE_= INODE|\ > > + EXT2_FEATURE_COMPAT_DIR_INDEX|\ > > + EXT2_FEATURE_COMPAT_EXT_ATTR|\ > > + EXT4_FEATURE_COMPAT_SPARSE_SUPER2) > > + > > +#define EXT5_FEATURE_COMPAT_REQD (EXT2_FEATURE_COMPAT_DIR_INDEX|\ > > + EXT2_FEATURE_COMPAT_EXT_ATTR|\ > > + EXT4_FEATURE_COMPAT_SPARSE_SUPER2) > > + > > +#define EXT5_FEATURE_INCOMPAT_REQD_MASK (EXT2_FEATURE_INCOMPAT_FIL= ETYPE|\ > > + EXT2_FEATURE_INCOMPAT_META_BG|\ > > + EXT3_FEATURE_INCOMPAT_EXTENTS|\ > > + EXT4_FEATURE_INCOMPAT_FLEX_BG|\ > > + EXT4_FEATURE_INCOMPAT_64BIT|\ > > + EXT4_FEATURE_INCOMPAT_INLINE_DATA) > > + > > +#define EXT5_FEATURE_INCOMPAT_REQD (EXT2_FEATURE_INCOMPAT_FILETYPE= |\ > > + EXT2_FEATURE_INCOMPAT_META_BG|\ > > + EXT3_FEATURE_INCOMPAT_EXTENTS|\ > > + EXT4_FEATURE_INCOMPAT_FLEX_BG|\ > > + EXT4_FEATURE_INCOMPAT_64BIT|\ > > + EXT4_FEATURE_INCOMPAT_INLINE_DATA) > > + > > +#define EXT5_FEATURE_RO_COMPAT_REQD_MASK (EXT2_FEATURE_RO_COMPAT_S= PARSE_SUPER|\ > > + EXT4_FEATURE_RO_COMPAT_HUGE_FILE|\ > > + EXT2_FEATURE_RO_COMPAT_LARGE_FILE|\ > > + EXT4_FEATURE_RO_COMPAT_DIR_NLINK|\ > > + EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE|\ > > + EXT4_FEATURE_RO_COMPAT_GDT_CSUM|\ > > + EXT4_FEATURE_RO_COMPAT_METADATA_CSUM) > > + > > +#define EXT5_FEATURE_RO_COMPAT_REQD (EXT2_FEATURE_RO_COMPAT_SPARSE= _SUPER|\ > > + EXT4_FEATURE_RO_COMPAT_HUGE_FILE|\ > > + EXT2_FEATURE_RO_COMPAT_LARGE_FILE|\ > > + EXT4_FEATURE_RO_COMPAT_DIR_NLINK|\ > > + EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE|\ > > + EXT4_FEATURE_RO_COMPAT_METADATA_CSUM) > > + > > +#define EXT5_DEF_MNTOPT_MASK (EXT2_DEFM_XATTR_USER|\ > > + EXT2_DEFM_ACL|\ > > + EXT2_DEFM_UID16|\ > > + EXT4_DEFM_NOBARRIER|\ > > + EXT4_DEFM_BLOCK_VALIDITY|\ > > + EXT4_DEFM_NODELALLOC) > > + > > +#define EXT5_DEF_MNTOPT (EXT2_DEFM_XATTR_USER|\ > > + EXT2_DEFM_ACL|\ > > + EXT4_DEFM_BLOCK_VALIDITY) > > + > > /* > > * These features are only allowed if EXT2_FLAG_SOFTSUPP_FEATURES = is passed > > * to ext2fs_openfs() > > diff --git a/lib/ext2fs/initialize.c b/lib/ext2fs/initialize.c > > index 75fbf8e..2d0731b 100644 > > --- a/lib/ext2fs/initialize.c > > +++ b/lib/ext2fs/initialize.c > > @@ -173,6 +173,7 @@ errcode_t ext2fs_initialize(const char *name, i= nt flags, > > set_field(s_raid_stripe_width, 0); /* default stripe width: 0 */ > > set_field(s_log_groups_per_flex, 0); > > set_field(s_flags, 0); > > + set_field(s_minor_rev_level, 0); > > assign_field(s_backup_bgs[0]); > > assign_field(s_backup_bgs[1]); > > if (super->s_feature_incompat & ~EXT2_LIB_FEATURE_INCOMPAT_SUPP) = { > > diff --git a/misc/Makefile.in b/misc/Makefile.in > > index 1b942f2..6776f41 100644 > > --- a/misc/Makefile.in > > +++ b/misc/Makefile.in > > @@ -475,7 +475,7 @@ install: all $(SMANPAGES) $(UMANPAGES) installd= irs > > $(ES) " INSTALL $(sbindir)/$$i"; \ > > $(INSTALL_PROGRAM) $$i $(DESTDIR)$(sbindir)/$$i; \ > > done > > - $(Q) for i in ext2 ext3 ext4 ext4dev; do \ > > + $(Q) for i in ext2 ext3 ext4 ext4dev ext5; do \ > > $(ES) " LINK $(root_sbindir)/mkfs.$$i"; \ > > (cd $(DESTDIR)$(root_sbindir); \ > > $(LN) $(LINK_INSTALL_FLAGS) mke2fs mkfs.$$i); \ > > @@ -504,7 +504,7 @@ install: all $(SMANPAGES) $(UMANPAGES) installd= irs > > done > > $(Q) $(RM) -f $(DESTDIR)$(man8dir)/mkfs.ext2.8.gz \ > > $(DESTDIR)$(man8dir)/mkfs.ext3.8.gz > > - $(Q) for i in ext2 ext3 ext4 ext4dev; do \ > > + $(Q) for i in ext2 ext3 ext4 ext4dev ext5; do \ > > $(ES) " LINK mkfs.$$i.8"; \ > > (cd $(DESTDIR)$(man8dir); \ > > $(LN) $(LINK_INSTALL_FLAGS) mke2fs.8 mkfs.$$i.8); \ > > @@ -580,7 +580,8 @@ uninstall: > > $(RM) -f $(DESTDIR)$(root_sbindir)/mkfs.ext2 \ > > $(DESTDIR)$(root_sbindir)/mkfs.ext3 \ > > $(DESTDIR)$(root_sbindir)/mkfs.ext4 \ > > - $(DESTDIR)$(root_sbindir)/mkfs.ext4dev > > + $(DESTDIR)$(root_sbindir)/mkfs.ext4dev \ > > + $(DESTDIR)$(root_sbindir)/mkfs.ext5 > > for i in $(UPROGS); do \ > > $(RM) -f $(DESTDIR)$(bindir)/$$i; \ > > done > > @@ -591,10 +592,12 @@ uninstall: > > $(DESTDIR)$(man8dir)/mkfs.ext3.8 \ > > $(DESTDIR)$(man8dir)/mkfs.ext4.8 \ > > $(DESTDIR)$(man8dir)/mkfs.ext4dev.8 \ > > + $(DESTDIR)$(man8dir)/mkfs.ext5.8 \ > > $(DESTDIR)$(man8dir)/fsck.ext2.8 \ > > $(DESTDIR)$(man8dir)/fsck.ext3.8 \ > > $(DESTDIR)$(man8dir)/fsck.ext4.8 \ > > - $(DESTDIR)$(man8dir)/fsck.ext4dev.8 > > + $(DESTDIR)$(man8dir)/fsck.ext4dev.8 \ > > + $(DESTDIR)$(man8dir)/fsck.ext5.8 > > =20 > > for i in $(UMANPAGES); do \ > > $(RM) -f $(DESTDIR)$(man1dir)/$$i; \ > > diff --git a/misc/mke2fs.c b/misc/mke2fs.c > > index a794689..c810238 100644 > > --- a/misc/mke2fs.c > > +++ b/misc/mke2fs.c > > @@ -1915,6 +1915,36 @@ profile_error: > > &fs_param.s_feature_compat); > > if (tmp) > > free(tmp); > > + > > + /* Add in ext5 options */ > > + tmp =3D get_string_from_profile(fs_types, "interface", NULL); > > + if (tmp) { > > + if (!strcmp(tmp, "ext5")) > > + fs_param.s_minor_rev_level =3D EXT5_MINOR_REV_LEVEL; > > + else { > > + fprintf(stderr, _("Unknown interface `%s'.\n"), tmp); > > + exit(1); > > + } > > + free(tmp); > > + } > > + if (fs_param.s_minor_rev_level =3D=3D EXT5_MINOR_REV_LEVEL) { > > + fs_param.s_feature_incompat =3D EXT5_FEATURE_INCOMPAT_REQD | > > + (fs_param.s_feature_incompat & > > + ~EXT5_FEATURE_INCOMPAT_REQD_MASK); > > + fs_param.s_feature_ro_compat =3D EXT5_FEATURE_RO_COMPAT_REQD | > > + (fs_param.s_feature_ro_compat & > > + ~EXT5_FEATURE_RO_COMPAT_REQD_MASK); > > + fs_param.s_feature_compat =3D EXT5_FEATURE_COMPAT_REQD | > > + (fs_param.s_feature_compat & > > + ~EXT5_FEATURE_COMPAT_REQD_MASK); > > + fs_param.s_default_mount_opts =3D EXT5_DEF_MNTOPT | > > + (fs_param.s_default_mount_opts & ~EXT5_DEF_MNTOPT_MASK); > > + fs_param.s_rev_level =3D EXT2_DYNAMIC_REV; > > + if (r_opt < EXT2_DYNAMIC_REV) > > + r_opt =3D -1; > > + fs_param.s_inode_size =3D 256; > > + } > > + > > /* > > * If the user specified features incompatible with the Hurd, com= plain > > */ > > diff --git a/misc/mke2fs.conf.in b/misc/mke2fs.conf.in > > index de0250d..94fd139 100644 > > --- a/misc/mke2fs.conf.in > > +++ b/misc/mke2fs.conf.in > > @@ -20,6 +20,10 @@ > > inode_size =3D 256 > > options =3D test_fs=3D1 > > } > > + ext5 =3D { > > + features =3D has_journal > > + interface =3D ext5 > > + } > > small =3D { > > blocksize =3D 1024 > > inode_size =3D 128 > > diff --git a/misc/tune2fs.c b/misc/tune2fs.c > > index 6571764..d3d6330 100644 > > --- a/misc/tune2fs.c > > +++ b/misc/tune2fs.c > > @@ -2406,6 +2406,26 @@ static int tune2fs_setup_tdb(const char *nam= e, io_manager *io_ptr) > > return retval; > > } > > =20 > > +static errcode_t update_minor_rev(ext2_filsys fs) > > +{ > > + if (fs->super->s_minor_rev_level !=3D EXT5_MINOR_REV_LEVEL) > > + return 0; > > + > > + if ((EXT5_FEATURE_COMPAT_REQD ^ > > + (fs->super->s_feature_compat & EXT5_FEATURE_COMPAT_REQD_MASK= )) || > > + (EXT5_FEATURE_INCOMPAT_REQD ^ > > + (fs->super->s_feature_incompat & EXT5_FEATURE_INCOMPAT_REQD_= MASK)) || > > + (EXT5_FEATURE_RO_COMPAT_REQD ^ > > + (fs->super->s_feature_ro_compat & EXT5_FEATURE_RO_COMPAT_REQ= D_MASK)) || > > + (EXT5_DEF_MNTOPT ^ > > + (fs->super->s_default_mount_opts & EXT5_DEF_MNTOPT_MASK))) { > > + fs->super->s_minor_rev_level =3D 0; > > + ext2fs_mark_super_dirty(fs); > > + } > > + > > + return 0; > > +} > > + > > int main(int argc, char **argv) > > { > > errcode_t retval; > > @@ -2659,6 +2679,9 @@ retry_open: > > if (rc) > > goto closefs; > > } > > + rc =3D update_minor_rev(fs); > > + if (rc) > > + goto closefs; > > if (extended_cmd) { > > rc =3D parse_extended_opts(fs, extended_cmd); > > if (rc) > > diff --git a/tests/metadata-checksum-test.sh b/tests/metadata-check= sum-test.sh > > index a17bfd2..e51b1fa 100755 > > --- a/tests/metadata-checksum-test.sh > > +++ b/tests/metadata-checksum-test.sh > > @@ -190,6 +190,7 @@ cat > "${MKE2FS_CONFIG}" << ENDL > > blocksize =3D 4096 > > inode_size =3D 256 > > inode_ratio =3D 16384 > > + interface =3D ext5 > > =20 > > [fs_types] > > ext4icsum_no_bv =3D { > > @@ -200,6 +201,7 @@ cat > "${MKE2FS_CONFIG}" << ENDL > > options =3D mmp_update_interval=3D5 #${RESIZE_PARAM} > > lazy_itable_init =3D 1 > > cluster_size =3D $((BLK_SZ * 2)) > > + interface =3D ext5 > > } > > ext4icsum =3D { > > features =3D has_journal,extent,huge_file,flex_bg,uninit_bg,dir_= nlink,extra_isize,64bit$MKFS_OPTS > > @@ -208,6 +210,7 @@ cat > "${MKE2FS_CONFIG}" << ENDL > > options =3D mmp_update_interval=3D5 #${RESIZE_PARAM} > > lazy_itable_init =3D 1 > > cluster_size =3D $((BLK_SZ * 2)) > > + interface =3D ext5 > > } > > ext4icsum_noresize =3D { > > features =3D has_journal,extent,huge_file,flex_bg,uninit_bg,dir_= nlink,extra_isize,64bit$MKFS_OPTS > > @@ -216,6 +219,7 @@ cat > "${MKE2FS_CONFIG}" << ENDL > > options =3D mmp_update_interval=3D5 > > lazy_itable_init =3D 1 > > cluster_size =3D $((BLK_SZ * 2)) > > + interface =3D ext5 > > } > > ext4icsum_hugefiles =3D { > > features =3D has_journal,extent,huge_file,flex_bg,uninit_bg,dir_= nlink,extra_isize,64bit$MKFS_OPTS > > @@ -235,6 +239,7 @@ cat > "${MKE2FS_CONFIG}" << ENDL > > hugefiles_digits =3D 4 > > hugefiles_size =3D 1G > > num_hugefiles =3D 0 > > + interface =3D ext5 > > } > > ENDL > > MKFS_OPTS=3D"" > > diff --git a/tests/t_mke2fs_ext5/expect b/tests/t_mke2fs_ext5/expec= t > > new file mode 100644 > > index 0000000..87e1185 > > --- /dev/null > > +++ b/tests/t_mke2fs_ext5/expect > > @@ -0,0 +1,45 @@ > > +Filesystem volume name: > > +Last mounted on: > > +Filesystem magic number: 0xEF53 > > +Filesystem revision #: 1 (dynamic) > > +Filesystem minor rev #: 2 (ext5) > > +Filesystem features: ext_attr dir_index sparse_super2 filetyp= e meta_bg extent 64bit flex_bg inline_data sparse_super large_file huge= _file dir_nlink extra_isize metadata_csum > > +Filesystem flags: signed_directory_hash=20 > > +Default mount options: user_xattr acl block_validity > > +Filesystem state: clean > > +Errors behavior: Continue > > +Filesystem OS type: Linux > > +Inode count: 64 > > +Block count: 128 > > +Reserved block count: 6 > > +Free blocks: 116 > > +Free inodes: 53 > > +First block: 0 > > +Block size: 4096 > > +Fragment size: 4096 > > +Group descriptor size: 64 > > +Blocks per group: 32768 > > +Fragments per group: 32768 > > +Inodes per group: 64 > > +Inode blocks per group: 4 > > +Flex block group size: 16 > > +Last mount time: n/a > > +Mount count: 0 > > +Maximum mount count: -1 > > +Check interval: 0 () > > +Lifetime writes: 5 kB > > +Reserved blocks uid: 0 (user root) > > +Reserved blocks gid: 0 (group root) > > +First inode: 11 > > +Inode size: 256 > > +Required extra isize: 28 > > +Desired extra isize: 28 > > +Default directory hash: half_md4 > > + > > + > > +Group 0: (Blocks 0-127) [ITABLE_ZEROED] > > + Primary superblock at 0, Group descriptor at 1 > > + Inode table at 34-37 (+34) > > + 116 free blocks, 53 free inodes, 2 directories, 53 unused inodes > > + Free blocks: 7-17, 19-33, 38-127 > > + Free inodes: 12-64 > > diff --git a/tests/t_mke2fs_ext5/script b/tests/t_mke2fs_ext5/scrip= t > > new file mode 100755 > > index 0000000..9be9bf5 > > --- /dev/null > > +++ b/tests/t_mke2fs_ext5/script > > @@ -0,0 +1,33 @@ > > +test_description=3D"mke2fs with ext5" > > + > > +conf=3D$TMPFILE.conf > > + > > +cat > $conf << ENDL > > +[defaults] > > + interface =3D ext5 > > +ENDL > > + > > +trap "rm -rf $TMPFILE $TMPFILE.conf" EXIT INT QUIT > > +dd if=3D/dev/zero of=3D$TMPFILE bs=3D1k count=3D512 > /dev/null 2>= &1 > > +OUT=3D$test_name.log > > +EXP=3D$test_dir/expect > > +rm -rf $OUT > > + > > +# Test command line option > > +MKE2FS_CONFIG=3D$TMPFILE.conf > > +export MKE2FS_CONFIG > > +$MKE2FS -F $TMPFILE > /dev/null 2>&1 > > +$DUMPE2FS $TMPFILE | egrep -v "(Filesystem UUID|Filesystem created= |Last write time|Last checked|Directory Hash Seed|Checksum| csum )" >> = $OUT > > + > > +cmp -s $OUT $EXP > > +status=3D$? > > + > > +if [ "$status" =3D 0 ] ; then > > + echo "$test_name: $test_description: ok" > > + touch $test_name.ok > > +else > > + echo "$test_name: $test_description: failed" > > + diff $DIFF_OPTS $EXP $OUT > $test_name.failed > > + rm -f $test_name.tmp > > +fi > > + > >=20 > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-ext= 4" in > > the body of a message to majordomo@vger.kernel.org > > More majordomo info at http://vger.kernel.org/majordomo-info.html > >=20 > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4"= in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" i= n the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html