Unless I missed it, this patch series needs a 00/11 email that describes *what* "fast commit" is, and why we want it. This should include some benchmark results, since (I'd assume) that the "fast" part of the feature name implies a performance improvement? Cheers, Andreas > On Jul 21, 2019, at 10:00 PM, Harshad Shirwadkar <harshadshirwadkar@xxxxxxxxx> wrote: > > We are running out of mount option bits. This patch adds handling for > using s_mount_opt2 and also adds ability to turn on / off the fast > commit feature. In order to use fast commits, new version e2fsprogs > needs to set the fast feature commit flag. This also makes sure that > we have fast commit compatible e2fsprogs before starting to use the > feature. Mount flag "no_fastcommit", introuced in this patch, can be > passed to disable the feature at mount time. > > Signed-off-by: Harshad Shirwadkar <harshadshirwadkar@xxxxxxxxx> > --- > fs/ext4/ext4.h | 4 ++++ > fs/ext4/super.c | 27 ++++++++++++++++++++++----- > include/linux/jbd2.h | 5 ++++- > 3 files changed, 30 insertions(+), 6 deletions(-) > > diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h > index bf660aa7a9e0..becbda38b7db 100644 > --- a/fs/ext4/ext4.h > +++ b/fs/ext4/ext4.h > @@ -1146,6 +1146,8 @@ struct ext4_inode_info { > #define EXT4_MOUNT2_EXPLICIT_JOURNAL_CHECKSUM 0x00000008 /* User explicitly > specified journal checksum */ > > +#define EXT4_MOUNT2_JOURNAL_FAST_COMMIT 0x00000010 /* Journal fast commit */ > + > #define clear_opt(sb, opt) EXT4_SB(sb)->s_mount_opt &= \ > ~EXT4_MOUNT_##opt > #define set_opt(sb, opt) EXT4_SB(sb)->s_mount_opt |= \ > @@ -1643,6 +1645,7 @@ static inline void ext4_clear_state_flags(struct ext4_inode_info *ei) > #define EXT4_FEATURE_COMPAT_RESIZE_INODE 0x0010 > #define EXT4_FEATURE_COMPAT_DIR_INDEX 0x0020 > #define EXT4_FEATURE_COMPAT_SPARSE_SUPER2 0x0200 > +#define EXT4_FEATURE_COMPAT_FAST_COMMIT 0x0400 > > #define EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001 > #define EXT4_FEATURE_RO_COMPAT_LARGE_FILE 0x0002 > @@ -1743,6 +1746,7 @@ EXT4_FEATURE_COMPAT_FUNCS(xattr, EXT_ATTR) > EXT4_FEATURE_COMPAT_FUNCS(resize_inode, RESIZE_INODE) > EXT4_FEATURE_COMPAT_FUNCS(dir_index, DIR_INDEX) > EXT4_FEATURE_COMPAT_FUNCS(sparse_super2, SPARSE_SUPER2) > +EXT4_FEATURE_COMPAT_FUNCS(fast_commit, FAST_COMMIT) > > EXT4_FEATURE_RO_COMPAT_FUNCS(sparse_super, SPARSE_SUPER) > EXT4_FEATURE_RO_COMPAT_FUNCS(large_file, LARGE_FILE) > diff --git a/fs/ext4/super.c b/fs/ext4/super.c > index 4079605d437a..e376ac040cce 100644 > --- a/fs/ext4/super.c > +++ b/fs/ext4/super.c > @@ -1455,6 +1455,7 @@ enum { > Opt_dioread_nolock, Opt_dioread_lock, > Opt_discard, Opt_nodiscard, Opt_init_itable, Opt_noinit_itable, > Opt_max_dir_size_kb, Opt_nojournal_checksum, Opt_nombcache, > + Opt_no_fastcommit > }; > > static const match_table_t tokens = { > @@ -1537,6 +1538,7 @@ static const match_table_t tokens = { > {Opt_init_itable, "init_itable=%u"}, > {Opt_init_itable, "init_itable"}, > {Opt_noinit_itable, "noinit_itable"}, > + {Opt_no_fastcommit, "no_fastcommit"}, > {Opt_max_dir_size_kb, "max_dir_size_kb=%u"}, > {Opt_test_dummy_encryption, "test_dummy_encryption"}, > {Opt_nombcache, "nombcache"}, > @@ -1659,6 +1661,7 @@ static int clear_qf_name(struct super_block *sb, int qtype) > #define MOPT_NO_EXT3 0x0200 > #define MOPT_EXT4_ONLY (MOPT_NO_EXT2 | MOPT_NO_EXT3) > #define MOPT_STRING 0x0400 > +#define MOPT_2 0x0800 > > static const struct mount_opts { > int token; > @@ -1751,6 +1754,8 @@ static const struct mount_opts { > {Opt_max_dir_size_kb, 0, MOPT_GTE0}, > {Opt_test_dummy_encryption, 0, MOPT_GTE0}, > {Opt_nombcache, EXT4_MOUNT_NO_MBCACHE, MOPT_SET}, > + {Opt_no_fastcommit, EXT4_MOUNT2_JOURNAL_FAST_COMMIT, > + MOPT_CLEAR | MOPT_2 | MOPT_EXT4_ONLY}, > {Opt_err, 0, 0} > }; > > @@ -1858,8 +1863,9 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, > set_opt2(sb, EXPLICIT_DELALLOC); > } else if (m->mount_opt & EXT4_MOUNT_JOURNAL_CHECKSUM) { > set_opt2(sb, EXPLICIT_JOURNAL_CHECKSUM); > - } else > + } else if (m->mount_opt) { > return -1; > + } > } > if (m->flags & MOPT_CLEAR_ERR) > clear_opt(sb, ERRORS_MASK); > @@ -2027,10 +2033,17 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, > WARN_ON(1); > return -1; > } > - if (arg != 0) > - sbi->s_mount_opt |= m->mount_opt; > - else > - sbi->s_mount_opt &= ~m->mount_opt; > + if (m->flags & MOPT_2) { > + if (arg != 0) > + sbi->s_mount_opt2 |= m->mount_opt; > + else > + sbi->s_mount_opt2 &= ~m->mount_opt; > + } else { > + if (arg != 0) > + sbi->s_mount_opt |= m->mount_opt; > + else > + sbi->s_mount_opt &= ~m->mount_opt; > + } > } > return 1; > } > @@ -3733,6 +3746,9 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) > #ifdef CONFIG_EXT4_FS_POSIX_ACL > set_opt(sb, POSIX_ACL); > #endif > + if (ext4_has_feature_fast_commit(sb)) > + set_opt2(sb, JOURNAL_FAST_COMMIT); > + > /* don't forget to enable journal_csum when metadata_csum is enabled. */ > if (ext4_has_metadata_csum(sb)) > set_opt(sb, JOURNAL_CHECKSUM); > @@ -4334,6 +4350,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) > sbi->s_def_mount_opt &= ~EXT4_MOUNT_JOURNAL_CHECKSUM; > clear_opt(sb, JOURNAL_CHECKSUM); > clear_opt(sb, DATA_FLAGS); > + clear_opt2(sb, JOURNAL_FAST_COMMIT); > sbi->s_journal = NULL; > needs_recovery = 0; > goto no_journal; > diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h > index df03825ad1a1..b7eed49b8ecd 100644 > --- a/include/linux/jbd2.h > +++ b/include/linux/jbd2.h > @@ -288,6 +288,7 @@ typedef struct journal_superblock_s > #define JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT 0x00000004 > #define JBD2_FEATURE_INCOMPAT_CSUM_V2 0x00000008 > #define JBD2_FEATURE_INCOMPAT_CSUM_V3 0x00000010 > +#define JBD2_FEATURE_INCOMPAT_FAST_COMMIT 0x00000020 > > /* See "journal feature predicate functions" below */ > > @@ -298,7 +299,8 @@ typedef struct journal_superblock_s > JBD2_FEATURE_INCOMPAT_64BIT | \ > JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT | \ > JBD2_FEATURE_INCOMPAT_CSUM_V2 | \ > - JBD2_FEATURE_INCOMPAT_CSUM_V3) > + JBD2_FEATURE_INCOMPAT_CSUM_V3 | \ > + JBD2_FEATURE_INCOMPAT_FAST_COMMIT) > > #ifdef __KERNEL__ > > @@ -1235,6 +1237,7 @@ JBD2_FEATURE_INCOMPAT_FUNCS(64bit, 64BIT) > JBD2_FEATURE_INCOMPAT_FUNCS(async_commit, ASYNC_COMMIT) > JBD2_FEATURE_INCOMPAT_FUNCS(csum2, CSUM_V2) > JBD2_FEATURE_INCOMPAT_FUNCS(csum3, CSUM_V3) > +JBD2_FEATURE_INCOMPAT_FUNCS(fast_commit, FAST_COMMIT) > > /* > * Journal flag definitions > -- > 2.22.0.657.g960e92d24f-goog > Cheers, Andreas
Attachment:
signature.asc
Description: Message signed with OpenPGP