ext4: Add fs parameter specifications for mount options
authorLukas Czerner <lczerner@redhat.com>
Wed, 27 Oct 2021 14:18:46 +0000 (16:18 +0200)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 9 Dec 2021 19:11:07 +0000 (14:11 -0500)
Create an array of fs_parameter_spec called ext4_param_specs to
hold the mount option specifications we're going to be using with the
new mount api.

Signed-off-by: Lukas Czerner <lczerner@redhat.com>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
Link: https://lore.kernel.org/r/20211027141857.33657-3-lczerner@redhat.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/super.c

index 4e33b5e..fb59649 100644 (file)
@@ -47,6 +47,8 @@
 #include <linux/kthread.h>
 #include <linux/freezer.h>
 #include <linux/fsnotify.h>
+#include <linux/fs_context.h>
+#include <linux/fs_parser.h>
 
 #include "ext4.h"
 #include "ext4_extents.h"      /* Needed for trace points definition */
@@ -1688,11 +1690,160 @@ enum {
        Opt_discard, Opt_nodiscard, Opt_init_itable, Opt_noinit_itable,
        Opt_max_dir_size_kb, Opt_nojournal_checksum, Opt_nombcache,
        Opt_no_prefetch_block_bitmaps, Opt_mb_optimize_scan,
+       Opt_errors, Opt_data, Opt_data_err, Opt_jqfmt, Opt_dax_type,
 #ifdef CONFIG_EXT4_DEBUG
        Opt_fc_debug_max_replay, Opt_fc_debug_force
 #endif
 };
 
+static const struct constant_table ext4_param_errors[] = {
+       {"continue",    Opt_err_cont},
+       {"panic",       Opt_err_panic},
+       {"remount-ro",  Opt_err_ro},
+       {}
+};
+
+static const struct constant_table ext4_param_data[] = {
+       {"journal",     Opt_data_journal},
+       {"ordered",     Opt_data_ordered},
+       {"writeback",   Opt_data_writeback},
+       {}
+};
+
+static const struct constant_table ext4_param_data_err[] = {
+       {"abort",       Opt_data_err_abort},
+       {"ignore",      Opt_data_err_ignore},
+       {}
+};
+
+static const struct constant_table ext4_param_jqfmt[] = {
+       {"vfsold",      Opt_jqfmt_vfsold},
+       {"vfsv0",       Opt_jqfmt_vfsv0},
+       {"vfsv1",       Opt_jqfmt_vfsv1},
+       {}
+};
+
+static const struct constant_table ext4_param_dax[] = {
+       {"always",      Opt_dax_always},
+       {"inode",       Opt_dax_inode},
+       {"never",       Opt_dax_never},
+       {}
+};
+
+/* String parameter that allows empty argument */
+#define fsparam_string_empty(NAME, OPT) \
+       __fsparam(fs_param_is_string, NAME, OPT, fs_param_can_be_empty, NULL)
+
+/*
+ * Mount option specification
+ * We don't use fsparam_flag_no because of the way we set the
+ * options and the way we show them in _ext4_show_options(). To
+ * keep the changes to a minimum, let's keep the negative options
+ * separate for now.
+ */
+static const struct fs_parameter_spec ext4_param_specs[] = {
+       fsparam_flag    ("bsddf",               Opt_bsd_df),
+       fsparam_flag    ("minixdf",             Opt_minix_df),
+       fsparam_flag    ("grpid",               Opt_grpid),
+       fsparam_flag    ("bsdgroups",           Opt_grpid),
+       fsparam_flag    ("nogrpid",             Opt_nogrpid),
+       fsparam_flag    ("sysvgroups",          Opt_nogrpid),
+       fsparam_u32     ("resgid",              Opt_resgid),
+       fsparam_u32     ("resuid",              Opt_resuid),
+       fsparam_u32     ("sb",                  Opt_sb),
+       fsparam_enum    ("errors",              Opt_errors, ext4_param_errors),
+       fsparam_flag    ("nouid32",             Opt_nouid32),
+       fsparam_flag    ("debug",               Opt_debug),
+       fsparam_flag    ("oldalloc",            Opt_removed),
+       fsparam_flag    ("orlov",               Opt_removed),
+       fsparam_flag    ("user_xattr",          Opt_user_xattr),
+       fsparam_flag    ("nouser_xattr",        Opt_nouser_xattr),
+       fsparam_flag    ("acl",                 Opt_acl),
+       fsparam_flag    ("noacl",               Opt_noacl),
+       fsparam_flag    ("norecovery",          Opt_noload),
+       fsparam_flag    ("noload",              Opt_noload),
+       fsparam_flag    ("bh",                  Opt_removed),
+       fsparam_flag    ("nobh",                Opt_removed),
+       fsparam_u32     ("commit",              Opt_commit),
+       fsparam_u32     ("min_batch_time",      Opt_min_batch_time),
+       fsparam_u32     ("max_batch_time",      Opt_max_batch_time),
+       fsparam_u32     ("journal_dev",         Opt_journal_dev),
+       fsparam_bdev    ("journal_path",        Opt_journal_path),
+       fsparam_flag    ("journal_checksum",    Opt_journal_checksum),
+       fsparam_flag    ("nojournal_checksum",  Opt_nojournal_checksum),
+       fsparam_flag    ("journal_async_commit",Opt_journal_async_commit),
+       fsparam_flag    ("abort",               Opt_abort),
+       fsparam_enum    ("data",                Opt_data, ext4_param_data),
+       fsparam_enum    ("data_err",            Opt_data_err,
+                                               ext4_param_data_err),
+       fsparam_string_empty
+                       ("usrjquota",           Opt_usrjquota),
+       fsparam_string_empty
+                       ("grpjquota",           Opt_grpjquota),
+       fsparam_enum    ("jqfmt",               Opt_jqfmt, ext4_param_jqfmt),
+       fsparam_flag    ("grpquota",            Opt_grpquota),
+       fsparam_flag    ("quota",               Opt_quota),
+       fsparam_flag    ("noquota",             Opt_noquota),
+       fsparam_flag    ("usrquota",            Opt_usrquota),
+       fsparam_flag    ("prjquota",            Opt_prjquota),
+       fsparam_flag    ("barrier",             Opt_barrier),
+       fsparam_u32     ("barrier",             Opt_barrier),
+       fsparam_flag    ("nobarrier",           Opt_nobarrier),
+       fsparam_flag    ("i_version",           Opt_i_version),
+       fsparam_flag    ("dax",                 Opt_dax),
+       fsparam_enum    ("dax",                 Opt_dax_type, ext4_param_dax),
+       fsparam_u32     ("stripe",              Opt_stripe),
+       fsparam_flag    ("delalloc",            Opt_delalloc),
+       fsparam_flag    ("nodelalloc",          Opt_nodelalloc),
+       fsparam_flag    ("warn_on_error",       Opt_warn_on_error),
+       fsparam_flag    ("nowarn_on_error",     Opt_nowarn_on_error),
+       fsparam_flag    ("lazytime",            Opt_lazytime),
+       fsparam_flag    ("nolazytime",          Opt_nolazytime),
+       fsparam_u32     ("debug_want_extra_isize",
+                                               Opt_debug_want_extra_isize),
+       fsparam_flag    ("mblk_io_submit",      Opt_removed),
+       fsparam_flag    ("nomblk_io_submit",    Opt_removed),
+       fsparam_flag    ("block_validity",      Opt_block_validity),
+       fsparam_flag    ("noblock_validity",    Opt_noblock_validity),
+       fsparam_u32     ("inode_readahead_blks",
+                                               Opt_inode_readahead_blks),
+       fsparam_u32     ("journal_ioprio",      Opt_journal_ioprio),
+       fsparam_u32     ("auto_da_alloc",       Opt_auto_da_alloc),
+       fsparam_flag    ("auto_da_alloc",       Opt_auto_da_alloc),
+       fsparam_flag    ("noauto_da_alloc",     Opt_noauto_da_alloc),
+       fsparam_flag    ("dioread_nolock",      Opt_dioread_nolock),
+       fsparam_flag    ("nodioread_nolock",    Opt_dioread_lock),
+       fsparam_flag    ("dioread_lock",        Opt_dioread_lock),
+       fsparam_flag    ("discard",             Opt_discard),
+       fsparam_flag    ("nodiscard",           Opt_nodiscard),
+       fsparam_u32     ("init_itable",         Opt_init_itable),
+       fsparam_flag    ("init_itable",         Opt_init_itable),
+       fsparam_flag    ("noinit_itable",       Opt_noinit_itable),
+#ifdef CONFIG_EXT4_DEBUG
+       fsparam_flag    ("fc_debug_force",      Opt_fc_debug_force),
+       fsparam_u32     ("fc_debug_max_replay", Opt_fc_debug_max_replay),
+#endif
+       fsparam_u32     ("max_dir_size_kb",     Opt_max_dir_size_kb),
+       fsparam_flag    ("test_dummy_encryption",
+                                               Opt_test_dummy_encryption),
+       fsparam_string  ("test_dummy_encryption",
+                                               Opt_test_dummy_encryption),
+       fsparam_flag    ("inlinecrypt",         Opt_inlinecrypt),
+       fsparam_flag    ("nombcache",           Opt_nombcache),
+       fsparam_flag    ("no_mbcache",          Opt_nombcache), /* for backward compatibility */
+       fsparam_flag    ("prefetch_block_bitmaps",
+                                               Opt_removed),
+       fsparam_flag    ("no_prefetch_block_bitmaps",
+                                               Opt_no_prefetch_block_bitmaps),
+       fsparam_s32     ("mb_optimize_scan",    Opt_mb_optimize_scan),
+       fsparam_string  ("check",               Opt_removed),   /* mount option from ext2/3 */
+       fsparam_flag    ("nocheck",             Opt_removed),   /* mount option from ext2/3 */
+       fsparam_flag    ("reservation",         Opt_removed),   /* mount option from ext2/3 */
+       fsparam_flag    ("noreservation",       Opt_removed),   /* mount option from ext2/3 */
+       fsparam_u32     ("journal",             Opt_removed),   /* mount option from ext2/3 */
+       {}
+};
+
 static const match_table_t tokens = {
        {Opt_bsd_df, "bsddf"},
        {Opt_minix_df, "minixdf"},