OSDN Git Service

ext4: unconditionally enable the i_version counter
authorJeff Layton <jlayton@kernel.org>
Wed, 24 Aug 2022 16:03:49 +0000 (18:03 +0200)
committerTheodore Ts'o <tytso@mit.edu>
Sat, 1 Oct 2022 03:45:00 +0000 (23:45 -0400)
The original i_version implementation was pretty expensive, requiring a
log flush on every change. Because of this, it was gated behind a mount
option (implemented via the MS_I_VERSION mountoption flag).

Commit ae5e165d855d (fs: new API for handling inode->i_version) made the
i_version flag much less expensive, so there is no longer a performance
penalty from enabling it. xfs and btrfs already enable it
unconditionally when the on-disk format can support it.

Have ext4 ignore the SB_I_VERSION flag, and just enable it
unconditionally.  While we're in here, mark the i_version mount
option Opt_removed.

[ Removed leftover bits of i_version from ext4_apply_options() since it
  now can't ever be set in ctx->mask_s_flags -- lczerner ]

Cc: stable@kernel.org
Cc: Dave Chinner <david@fromorbit.com>
Cc: Benjamin Coddington <bcodding@redhat.com>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Lukas Czerner <lczerner@redhat.com>
Reviewed-by: Christian Brauner (Microsoft) <brauner@kernel.org>
Reviewed-by: Jan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20220824160349.39664-3-lczerner@redhat.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/inode.c
fs/ext4/super.c

index 2a220be..c77d40f 100644 (file)
@@ -5425,7 +5425,7 @@ int ext4_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                        return -EINVAL;
                }
 
-               if (IS_I_VERSION(inode) && attr->ia_size != inode->i_size)
+               if (attr->ia_size != inode->i_size)
                        inode_inc_iversion(inode);
 
                if (shrink) {
@@ -5735,8 +5735,7 @@ int ext4_mark_iloc_dirty(handle_t *handle,
         * ea_inodes are using i_version for storing reference count, don't
         * mess with it
         */
-       if (IS_I_VERSION(inode) &&
-           !(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL))
+       if (!(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL))
                inode_inc_iversion(inode);
 
        /* the do_update_inode consumes one bh->b_count */
index 6bb0f49..2a7af6c 100644 (file)
@@ -1585,7 +1585,7 @@ enum {
        Opt_inlinecrypt,
        Opt_usrjquota, Opt_grpjquota, Opt_quota,
        Opt_noquota, Opt_barrier, Opt_nobarrier, Opt_err,
-       Opt_usrquota, Opt_grpquota, Opt_prjquota, Opt_i_version,
+       Opt_usrquota, Opt_grpquota, Opt_prjquota,
        Opt_dax, Opt_dax_always, Opt_dax_inode, Opt_dax_never,
        Opt_stripe, Opt_delalloc, Opt_nodelalloc, Opt_warn_on_error,
        Opt_nowarn_on_error, Opt_mblk_io_submit, Opt_debug_want_extra_isize,
@@ -1692,7 +1692,7 @@ static const struct fs_parameter_spec ext4_param_specs[] = {
        fsparam_flag    ("barrier",             Opt_barrier),
        fsparam_u32     ("barrier",             Opt_barrier),
        fsparam_flag    ("nobarrier",           Opt_nobarrier),
-       fsparam_flag    ("i_version",           Opt_i_version),
+       fsparam_flag    ("i_version",           Opt_removed),
        fsparam_flag    ("dax",                 Opt_dax),
        fsparam_enum    ("dax",                 Opt_dax_type, ext4_param_dax),
        fsparam_u32     ("stripe",              Opt_stripe),
@@ -2131,11 +2131,6 @@ static int ext4_parse_param(struct fs_context *fc, struct fs_parameter *param)
        case Opt_abort:
                ctx_set_mount_flag(ctx, EXT4_MF_FS_ABORTED);
                return 0;
-       case Opt_i_version:
-               ext4_msg(NULL, KERN_WARNING, deprecated_msg, param->key, "5.20");
-               ext4_msg(NULL, KERN_WARNING, "Use iversion instead\n");
-               ctx_set_flags(ctx, SB_I_VERSION);
-               return 0;
        case Opt_inlinecrypt:
 #ifdef CONFIG_FS_ENCRYPTION_INLINE_CRYPT
                ctx_set_flags(ctx, SB_INLINECRYPT);
@@ -2805,14 +2800,6 @@ static void ext4_apply_options(struct fs_context *fc, struct super_block *sb)
        sb->s_flags &= ~ctx->mask_s_flags;
        sb->s_flags |= ctx->vals_s_flags;
 
-       /*
-        * i_version differs from common mount option iversion so we have
-        * to let vfs know that it was set, otherwise it would get cleared
-        * on remount
-        */
-       if (ctx->mask_s_flags & SB_I_VERSION)
-               fc->sb_flags |= SB_I_VERSION;
-
 #define APPLY(X) ({ if (ctx->spec & EXT4_SPEC_##X) sbi->X = ctx->X; })
        APPLY(s_commit_interval);
        APPLY(s_stripe);
@@ -2961,8 +2948,6 @@ static int _ext4_show_options(struct seq_file *seq, struct super_block *sb,
                SEQ_OPTS_PRINT("min_batch_time=%u", sbi->s_min_batch_time);
        if (nodefs || sbi->s_max_batch_time != EXT4_DEF_MAX_BATCH_TIME)
                SEQ_OPTS_PRINT("max_batch_time=%u", sbi->s_max_batch_time);
-       if (sb->s_flags & SB_I_VERSION)
-               SEQ_OPTS_PUTS("i_version");
        if (nodefs || sbi->s_stripe)
                SEQ_OPTS_PRINT("stripe=%lu", sbi->s_stripe);
        if (nodefs || EXT4_MOUNT_DATA_FLAGS &
@@ -4632,6 +4617,9 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
        sb->s_flags = (sb->s_flags & ~SB_POSIXACL) |
                (test_opt(sb, POSIX_ACL) ? SB_POSIXACL : 0);
 
+       /* i_version is always enabled now */
+       sb->s_flags |= SB_I_VERSION;
+
        if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV &&
            (ext4_has_compat_features(sb) ||
             ext4_has_ro_compat_features(sb) ||