From: Ian Kent <raven@themaw.net>
To: "Darrick J. Wong" <darrick.wong@oracle.com>
Cc: linux-xfs <linux-xfs@vger.kernel.org>,
Christoph Hellwig <hch@infradead.org>,
Brian Foster <bfoster@redhat.com>,
Eric Sandeen <sandeen@sandeen.net>,
David Howells <dhowells@redhat.com>,
Dave Chinner <dchinner@redhat.com>,
Al Viro <viro@ZenIV.linux.org.uk>
Subject: Re: [PATCH v9 13/17] xfs: switch to use the new mount-api
Date: Tue, 05 Nov 2019 11:00:36 +0800 [thread overview]
Message-ID: <befb9f60e51ca786c97a00731c91c6483ca604d1.camel@themaw.net> (raw)
In-Reply-To: <20191104225331.GN4153244@magnolia>
On Mon, 2019-11-04 at 14:53 -0800, Darrick J. Wong wrote:
> On Mon, Nov 04, 2019 at 06:55:44PM +0800, Ian Kent wrote:
> > Define the struct fs_parameter_spec table that's used by the new
> > mount-api for options parsing.
> >
> > Create the various fs context operations methods and define the
> > fs_context_operations struct.
> >
> > Create the fs context initialization method and update the struct
> > file_system_type to utilize it. The initialization function is
> > responsible for working storage initialization, allocation and
> > initialization of file system private information storage and for
> > setting the operations in the fs context.
> >
> > Also set struct file_system_type .parameters to the newly defined
> > struct fs_parameter_spec options parsing table for use by the fs
> > context methods and remove unused code.
> >
> > Signed-off-by: Ian Kent <raven@themaw.net>
> > ---
> > fs/xfs/xfs_super.c | 408 ++++++++++++++++++++++----------------
> > --------------
> > 1 file changed, 171 insertions(+), 237 deletions(-)
> >
> > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
> > index 62dfc678c415..2d4edaaf934e 100644
> > --- a/fs/xfs/xfs_super.c
> > +++ b/fs/xfs/xfs_super.c
> > @@ -37,7 +37,8 @@
> > #include "xfs_reflink.h"
> >
> > #include <linux/magic.h>
> > -#include <linux/parser.h>
> > +#include <linux/fs_context.h>
> > +#include <linux/fs_parser.h>
> >
> > static const struct super_operations xfs_super_operations;
> >
> > @@ -58,55 +59,57 @@ enum {
> > Opt_filestreams, Opt_quota, Opt_noquota, Opt_usrquota,
> > Opt_grpquota,
> > Opt_prjquota, Opt_uquota, Opt_gquota, Opt_pquota,
> > Opt_uqnoenforce, Opt_gqnoenforce, Opt_pqnoenforce,
> > Opt_qnoenforce,
> > - Opt_discard, Opt_nodiscard, Opt_dax, Opt_err,
> > + Opt_discard, Opt_nodiscard, Opt_dax,
> > };
> >
> > -static const match_table_t tokens = {
> > - {Opt_logbufs, "logbufs=%u"}, /* number of XFS log
> > buffers */
> > - {Opt_logbsize, "logbsize=%s"}, /* size of XFS log buffers
> > */
> > - {Opt_logdev, "logdev=%s"}, /* log device */
> > - {Opt_rtdev, "rtdev=%s"}, /* realtime I/O device */
> > - {Opt_wsync, "wsync"}, /* safe-mode nfs compatible mount
> > */
> > - {Opt_noalign, "noalign"}, /* turn off stripe
> > alignment */
> > - {Opt_swalloc, "swalloc"}, /* turn on stripe width
> > allocation */
> > - {Opt_sunit, "sunit=%u"}, /* data volume stripe unit */
> > - {Opt_swidth, "swidth=%u"}, /* data volume stripe width
> > */
> > - {Opt_nouuid, "nouuid"}, /* ignore filesystem UUID
> > */
> > - {Opt_grpid, "grpid"}, /* group-ID from parent directory
> > */
> > - {Opt_nogrpid, "nogrpid"}, /* group-ID from current
> > process */
> > - {Opt_bsdgroups, "bsdgroups"}, /* group-ID from parent
> > directory */
> > - {Opt_sysvgroups,"sysvgroups"}, /* group-ID from current
> > process */
> > - {Opt_allocsize, "allocsize=%s"},/* preferred allocation
> > size */
> > - {Opt_norecovery,"norecovery"}, /* don't run XFS recovery
> > */
> > - {Opt_inode64, "inode64"}, /* inodes can be allocated
> > anywhere */
> > - {Opt_inode32, "inode32"}, /* inode allocation limited to
> > - * XFS_MAXINUMBER_32 */
> > - {Opt_ikeep, "ikeep"}, /* do not free empty inode clusters
> > */
> > - {Opt_noikeep, "noikeep"}, /* free empty inode
> > clusters */
> > - {Opt_largeio, "largeio"}, /* report large I/O sizes
> > in stat() */
> > - {Opt_nolargeio, "nolargeio"}, /* do not report large I/O
> > sizes
> > - * in stat(). */
> > - {Opt_attr2, "attr2"}, /* do use attr2 attribute format */
> > - {Opt_noattr2, "noattr2"}, /* do not use attr2
> > attribute format */
> > - {Opt_filestreams,"filestreams"},/* use filestreams allocator */
> > - {Opt_quota, "quota"}, /* disk quotas (user) */
> > - {Opt_noquota, "noquota"}, /* no quotas */
> > - {Opt_usrquota, "usrquota"}, /* user quota enabled */
> > - {Opt_grpquota, "grpquota"}, /* group quota enabled */
> > - {Opt_prjquota, "prjquota"}, /* project quota enabled */
> > - {Opt_uquota, "uquota"}, /* user quota (IRIX
> > variant) */
> > - {Opt_gquota, "gquota"}, /* group quota (IRIX
> > variant) */
> > - {Opt_pquota, "pquota"}, /* project quota (IRIX
> > variant) */
> > - {Opt_uqnoenforce,"uqnoenforce"},/* user quota limit enforcement
> > */
> > - {Opt_gqnoenforce,"gqnoenforce"},/* group quota limit
> > enforcement */
> > - {Opt_pqnoenforce,"pqnoenforce"},/* project quota limit
> > enforcement */
> > - {Opt_qnoenforce, "qnoenforce"}, /* same as uqnoenforce */
> > - {Opt_discard, "discard"}, /* Discard unused blocks */
> > - {Opt_nodiscard, "nodiscard"}, /* Do not discard unused
> > blocks */
> > - {Opt_dax, "dax"}, /* Enable direct access to bdev
> > pages */
> > - {Opt_err, NULL},
> > +static const struct fs_parameter_spec xfs_param_specs[] = {
> > + fsparam_u32("logbufs", Opt_logbufs),
> > + fsparam_string("logbsize", Opt_logbsize),
> > + fsparam_string("logdev", Opt_logdev),
> > + fsparam_string("rtdev", Opt_rtdev),
> > + fsparam_flag("wsync", Opt_wsync),
> > + fsparam_flag("noalign", Opt_noalign),
> > + fsparam_flag("swalloc", Opt_swalloc),
> > + fsparam_u32("sunit", Opt_sunit),
> > + fsparam_u32("swidth", Opt_swidth),
> > + fsparam_flag("nouuid", Opt_nouuid),
> > + fsparam_flag("grpid", Opt_grpid),
> > + fsparam_flag("nogrpid", Opt_nogrpid),
> > + fsparam_flag("bsdgroups", Opt_bsdgroups),
> > + fsparam_flag("sysvgroups", Opt_sysvgroups),
> > + fsparam_string("allocsize", Opt_allocsize),
> > + fsparam_flag("norecovery", Opt_norecovery),
> > + fsparam_flag("inode64", Opt_inode64),
> > + fsparam_flag("inode32", Opt_inode32),
> > + fsparam_flag("ikeep", Opt_ikeep),
> > + fsparam_flag("noikeep", Opt_noikeep),
> > + fsparam_flag("largeio", Opt_largeio),
> > + fsparam_flag("nolargeio", Opt_nolargeio),
> > + fsparam_flag("attr2", Opt_attr2),
> > + fsparam_flag("noattr2", Opt_noattr2),
> > + fsparam_flag("filestreams", Opt_filestreams),
> > + fsparam_flag("quota", Opt_quota),
> > + fsparam_flag("noquota", Opt_noquota),
> > + fsparam_flag("usrquota", Opt_usrquota),
> > + fsparam_flag("grpquota", Opt_grpquota),
> > + fsparam_flag("prjquota", Opt_prjquota),
> > + fsparam_flag("uquota", Opt_uquota),
> > + fsparam_flag("gquota", Opt_gquota),
> > + fsparam_flag("pquota", Opt_pquota),
> > + fsparam_flag("uqnoenforce", Opt_uqnoenforce),
> > + fsparam_flag("gqnoenforce", Opt_gqnoenforce),
> > + fsparam_flag("pqnoenforce", Opt_pqnoenforce),
> > + fsparam_flag("qnoenforce", Opt_qnoenforce),
> > + fsparam_flag("discard", Opt_discard),
> > + fsparam_flag("nodiscard", Opt_nodiscard),
> > + fsparam_flag("dax", Opt_dax),
> > + {}
> > };
> >
> > +static const struct fs_parameter_description xfs_fs_parameters = {
> > + .name = "xfs",
> > + .specs = xfs_param_specs,
> > +};
> >
> > static int
> > suffix_kstrtoint(
> > @@ -143,55 +146,42 @@ suffix_kstrtoint(
> > return ret;
> > }
> >
> > -static int
> > -match_kstrtoint(
> > - const substring_t *s,
> > - unsigned int base,
> > - int *res)
> > -{
> > - const char *value;
> > - int ret;
> > -
> > - value = match_strdup(s);
> > - if (!value)
> > - return -ENOMEM;
> > - ret = suffix_kstrtoint(value, base, res);
> > - kfree(value);
> > - return ret;
> > -}
> > -
> > static int
> > xfs_fc_parse_param(
>
> This is the only function where mp->m_super can be NULL, correct?
Yep.
>
> If so, I'll add a comment to that effect, and,
> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Thanks, much appreciated.
>
> (for this and patch 12.)
>
> Will throw this at a testing cloud and see what happens...
It's seems ok when I run it against xfstests but I'm not as familiar
with what to expect as you would be, I'm interested to hear how it
goes, ;)
I noticed a significant change in test run times with the latest
for-next but there was also an xfstests update so I'm not sure
what caused it. Some test run times went up by 8 to 10 or more
times, which seemed like a big change, possibly a regression.
Ian
>
> --D
>
> > - int token,
> > - char *p,
> > - substring_t *args,
> > - struct xfs_mount *mp)
> > + struct fs_context *fc,
> > + struct fs_parameter *param)
> > {
> > + struct xfs_mount *mp = fc->s_fs_info;
> > + struct fs_parse_result result;
> > int size = 0;
> > + int opt;
> > +
> > + opt = fs_parse(fc, &xfs_fs_parameters, param, &result);
> > + if (opt < 0)
> > + return opt;
> >
> > - switch (token) {
> > + switch (opt) {
> > case Opt_logbufs:
> > - if (match_int(args, &mp->m_logbufs))
> > - return -EINVAL;
> > + mp->m_logbufs = result.uint_32;
> > return 0;
> > case Opt_logbsize:
> > - if (match_kstrtoint(args, 10, &mp->m_logbsize))
> > + if (suffix_kstrtoint(param->string, 10, &mp-
> > >m_logbsize))
> > return -EINVAL;
> > return 0;
> > case Opt_logdev:
> > kfree(mp->m_logname);
> > - mp->m_logname = match_strdup(args);
> > + mp->m_logname = kstrdup(param->string, GFP_KERNEL);
> > if (!mp->m_logname)
> > return -ENOMEM;
> > return 0;
> > case Opt_rtdev:
> > kfree(mp->m_rtname);
> > - mp->m_rtname = match_strdup(args);
> > + mp->m_rtname = kstrdup(param->string, GFP_KERNEL);
> > if (!mp->m_rtname)
> > return -ENOMEM;
> > return 0;
> > case Opt_allocsize:
> > - if (match_kstrtoint(args, 10, &size))
> > + if (suffix_kstrtoint(param->string, 10, &size))
> > return -EINVAL;
> > mp->m_allocsize_log = ffs(size) - 1;
> > mp->m_flags |= XFS_MOUNT_ALLOCSIZE;
> > @@ -217,12 +207,10 @@ xfs_fc_parse_param(
> > mp->m_flags |= XFS_MOUNT_SWALLOC;
> > return 0;
> > case Opt_sunit:
> > - if (match_int(args, &mp->m_dalign))
> > - return -EINVAL;
> > + mp->m_dalign = result.uint_32;
> > return 0;
> > case Opt_swidth:
> > - if (match_int(args, &mp->m_swidth))
> > - return -EINVAL;
> > + mp->m_swidth = result.uint_32;
> > return 0;
> > case Opt_inode32:
> > mp->m_flags |= XFS_MOUNT_SMALL_INUMS;
> > @@ -301,7 +289,7 @@ xfs_fc_parse_param(
> > return 0;
> > #endif
> > default:
> > - xfs_warn(mp, "unknown mount option [%s].", p);
> > + xfs_warn(mp, "unknown mount option [%s].", param->key);
> > return -EINVAL;
> > }
> >
> > @@ -376,62 +364,6 @@ xfs_fc_validate_params(
> > return 0;
> > }
> >
> > -/*
> > - * This function fills in xfs_mount_t fields based on mount args.
> > - * Note: the superblock has _not_ yet been read in.
> > - *
> > - * Note that this function leaks the various device name
> > allocations on
> > - * failure. The caller takes care of them.
> > - *
> > - * *sb is const because this is also used to test options on the
> > remount
> > - * path, and we don't want this to have any side effects at
> > remount time.
> > - * Today this function does not change *sb, but just to future-
> > proof...
> > - */
> > -static int
> > -xfs_parseargs(
> > - struct xfs_mount *mp,
> > - char *options)
> > -{
> > - const struct super_block *sb = mp->m_super;
> > - char *p;
> > - substring_t args[MAX_OPT_ARGS];
> > -
> > - /*
> > - * Copy binary VFS mount flags we are interested in.
> > - */
> > - if (sb_rdonly(sb))
> > - mp->m_flags |= XFS_MOUNT_RDONLY;
> > - if (sb->s_flags & SB_DIRSYNC)
> > - mp->m_flags |= XFS_MOUNT_DIRSYNC;
> > - if (sb->s_flags & SB_SYNCHRONOUS)
> > - mp->m_flags |= XFS_MOUNT_WSYNC;
> > -
> > - /*
> > - * These can be overridden by the mount option parsing.
> > - */
> > - mp->m_logbufs = -1;
> > - mp->m_logbsize = -1;
> > - mp->m_allocsize_log = 16; /* 64k */
> > -
> > - if (!options)
> > - return 0;
> > -
> > - while ((p = strsep(&options, ",")) != NULL) {
> > - int token;
> > - int ret;
> > -
> > - if (!*p)
> > - continue;
> > -
> > - token = match_token(p, tokens, args);
> > - ret = xfs_fc_parse_param(token, p, args, mp);
> > - if (ret)
> > - return ret;
> > - }
> > -
> > - return xfs_fc_validate_params(mp);
> > -}
> > -
> > struct proc_xfs_info {
> > uint64_t flag;
> > char *str;
> > @@ -1207,25 +1139,6 @@ xfs_quiesce_attr(
> > xfs_log_quiesce(mp);
> > }
> >
> > -STATIC int
> > -xfs_test_remount_options(
> > - struct super_block *sb,
> > - char *options)
> > -{
> > - int error = 0;
> > - struct xfs_mount *tmp_mp;
> > -
> > - tmp_mp = kmem_zalloc(sizeof(*tmp_mp), KM_MAYFAIL);
> > - if (!tmp_mp)
> > - return -ENOMEM;
> > -
> > - tmp_mp->m_super = sb;
> > - error = xfs_parseargs(tmp_mp, options);
> > - xfs_mount_free(tmp_mp);
> > -
> > - return error;
> > -}
> > -
> > static int
> > xfs_remount_rw(
> > struct xfs_mount *mp)
> > @@ -1329,76 +1242,57 @@ xfs_remount_ro(
> > return 0;
> > }
> >
> > -STATIC int
> > -xfs_fs_remount(
> > - struct super_block *sb,
> > - int *flags,
> > - char *options)
> > +/*
> > + * Logically we would return an error here to prevent users from
> > believing
> > + * they might have changed mount options using remount which can't
> > be changed.
> > + *
> > + * But unfortunately mount(8) adds all options from mtab and fstab
> > to the mount
> > + * arguments in some cases so we can't blindly reject options, but
> > have to
> > + * check for each specified option if it actually differs from the
> > currently
> > + * set option and only reject it if that's the case.
> > + *
> > + * Until that is implemented we return success for every remount
> > request, and
> > + * silently ignore all options that we can't actually change.
> > + */
> > +static int
> > +xfs_fc_reconfigure(
> > + struct fs_context *fc)
> > {
> > - struct xfs_mount *mp = XFS_M(sb);
> > + struct xfs_mount *mp = XFS_M(fc->root->d_sb);
> > + struct xfs_mount *new_mp = fc->s_fs_info;
> > xfs_sb_t *sbp = &mp->m_sb;
> > - substring_t args[MAX_OPT_ARGS];
> > - char *p;
> > + int flags = fc->sb_flags;
> > int error;
> >
> > - /* First, check for complete junk; i.e. invalid options */
> > - error = xfs_test_remount_options(sb, options);
> > + error = xfs_fc_validate_params(new_mp);
> > if (error)
> > return error;
> >
> > - sync_filesystem(sb);
> > - while ((p = strsep(&options, ",")) != NULL) {
> > - int token;
> > -
> > - if (!*p)
> > - continue;
> > -
> > - token = match_token(p, tokens, args);
> > - switch (token) {
> > - case Opt_inode64:
> > - mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS;
> > - mp->m_maxagi = xfs_set_inode_alloc(mp, sbp-
> > >sb_agcount);
> > - break;
> > - case Opt_inode32:
> > - mp->m_flags |= XFS_MOUNT_SMALL_INUMS;
> > - mp->m_maxagi = xfs_set_inode_alloc(mp, sbp-
> > >sb_agcount);
> > - break;
> > - default:
> > - /*
> > - * Logically we would return an error here to
> > prevent
> > - * users from believing they might have changed
> > - * mount options using remount which can't be
> > changed.
> > - *
> > - * But unfortunately mount(8) adds all options
> > from
> > - * mtab and fstab to the mount arguments in
> > some cases
> > - * so we can't blindly reject options, but have
> > to
> > - * check for each specified option if it
> > actually
> > - * differs from the currently set option and
> > only
> > - * reject it if that's the case.
> > - *
> > - * Until that is implemented we return success
> > for
> > - * every remount request, and silently ignore
> > all
> > - * options that we can't actually change.
> > - */
> > -#if 0
> > - xfs_info(mp,
> > - "mount option \"%s\" not supported for remount", p);
> > - return -EINVAL;
> > -#else
> > - break;
> > -#endif
> > - }
> > + sync_filesystem(mp->m_super);
> > +
> > + /* inode32 -> inode64 */
> > + if ((mp->m_flags & XFS_MOUNT_SMALL_INUMS) &&
> > + !(new_mp->m_flags & XFS_MOUNT_SMALL_INUMS)) {
> > + mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS;
> > + mp->m_maxagi = xfs_set_inode_alloc(mp, sbp-
> > >sb_agcount);
> > + }
> > +
> > + /* inode64 -> inode32 */
> > + if (!(mp->m_flags & XFS_MOUNT_SMALL_INUMS) &&
> > + (new_mp->m_flags & XFS_MOUNT_SMALL_INUMS)) {
> > + mp->m_flags |= XFS_MOUNT_SMALL_INUMS;
> > + mp->m_maxagi = xfs_set_inode_alloc(mp, sbp-
> > >sb_agcount);
> > }
> >
> > /* ro -> rw */
> > - if ((mp->m_flags & XFS_MOUNT_RDONLY) && !(*flags & SB_RDONLY))
> > {
> > + if ((mp->m_flags & XFS_MOUNT_RDONLY) && !(flags & SB_RDONLY)) {
> > error = xfs_remount_rw(mp);
> > if (error)
> > return error;
> > }
> >
> > /* rw -> ro */
> > - if (!(mp->m_flags & XFS_MOUNT_RDONLY) && (*flags & SB_RDONLY))
> > {
> > + if (!(mp->m_flags & XFS_MOUNT_RDONLY) && (flags & SB_RDONLY)) {
> > error = xfs_remount_ro(mp);
> > if (error)
> > return error;
> > @@ -1588,28 +1482,18 @@ xfs_mount_alloc(void)
> > return mp;
> > }
> >
> > -
> > -STATIC int
> > -xfs_fs_fill_super(
> > +static int
> > +xfs_fc_fill_super(
> > struct super_block *sb,
> > - void *data,
> > - int silent)
> > + struct fs_context *fc)
> > {
> > + struct xfs_mount *mp = sb->s_fs_info;
> > struct inode *root;
> > - struct xfs_mount *mp = NULL;
> > int flags = 0, error = -ENOMEM;
> >
> > - /*
> > - * allocate mp and do all low-level struct initializations
> > before we
> > - * attach it to the super
> > - */
> > - mp = xfs_mount_alloc();
> > - if (!mp)
> > - goto out;
> > mp->m_super = sb;
> > - sb->s_fs_info = mp;
> >
> > - error = xfs_parseargs(mp, (char *)data);
> > + error = xfs_fc_validate_params(mp);
> > if (error)
> > goto out_free_names;
> >
> > @@ -1633,7 +1517,7 @@ xfs_fs_fill_super(
> > msleep(xfs_globals.mount_delay * 1000);
> > }
> >
> > - if (silent)
> > + if (fc->sb_flags & SB_SILENT)
> > flags |= XFS_MFSI_QUIET;
> >
> > error = xfs_open_devices(mp);
> > @@ -1778,7 +1662,6 @@ xfs_fs_fill_super(
> > out_free_names:
> > sb->s_fs_info = NULL;
> > xfs_mount_free(mp);
> > - out:
> > return error;
> >
> > out_unmount:
> > @@ -1787,6 +1670,13 @@ xfs_fs_fill_super(
> > goto out_free_sb;
> > }
> >
> > +static int
> > +xfs_fc_get_tree(
> > + struct fs_context *fc)
> > +{
> > + return get_tree_bdev(fc, xfs_fc_fill_super);
> > +}
> > +
> > STATIC void
> > xfs_fs_put_super(
> > struct super_block *sb)
> > @@ -1811,16 +1701,6 @@ xfs_fs_put_super(
> > xfs_mount_free(mp);
> > }
> >
> > -STATIC struct dentry *
> > -xfs_fs_mount(
> > - struct file_system_type *fs_type,
> > - int flags,
> > - const char *dev_name,
> > - void *data)
> > -{
> > - return mount_bdev(fs_type, flags, dev_name, data,
> > xfs_fs_fill_super);
> > -}
> > -
> > static long
> > xfs_fs_nr_cached_objects(
> > struct super_block *sb,
> > @@ -1850,16 +1730,70 @@ static const struct super_operations
> > xfs_super_operations = {
> > .freeze_fs = xfs_fs_freeze,
> > .unfreeze_fs = xfs_fs_unfreeze,
> > .statfs = xfs_fs_statfs,
> > - .remount_fs = xfs_fs_remount,
> > .show_options = xfs_fs_show_options,
> > .nr_cached_objects = xfs_fs_nr_cached_objects,
> > .free_cached_objects = xfs_fs_free_cached_objects,
> > };
> >
> > +static void xfs_fc_free(
> > + struct fs_context *fc)
> > +{
> > + struct xfs_mount *mp = fc->s_fs_info;
> > +
> > + /*
> > + * mp is stored in the fs_context when it is initialized.
> > + * mp is transferred to the superblock on a successful mount,
> > + * but if an error occurs before the transfer we have to free
> > + * it here.
> > + */
> > + if (mp)
> > + xfs_mount_free(mp);
> > +}
> > +
> > +static const struct fs_context_operations xfs_context_ops = {
> > + .parse_param = xfs_fc_parse_param,
> > + .get_tree = xfs_fc_get_tree,
> > + .reconfigure = xfs_fc_reconfigure,
> > + .free = xfs_fc_free,
> > +};
> > +
> > +static int xfs_init_fs_context(
> > + struct fs_context *fc)
> > +{
> > + struct xfs_mount *mp;
> > +
> > + mp = xfs_mount_alloc();
> > + if (!mp)
> > + return -ENOMEM;
> > +
> > + /*
> > + * These can be overridden by the mount option parsing.
> > + */
> > + mp->m_logbufs = -1;
> > + mp->m_logbsize = -1;
> > + mp->m_allocsize_log = 16; /* 64k */
> > +
> > + /*
> > + * Copy binary VFS mount flags we are interested in.
> > + */
> > + if (fc->sb_flags & SB_RDONLY)
> > + mp->m_flags |= XFS_MOUNT_RDONLY;
> > + if (fc->sb_flags & SB_DIRSYNC)
> > + mp->m_flags |= XFS_MOUNT_DIRSYNC;
> > + if (fc->sb_flags & SB_SYNCHRONOUS)
> > + mp->m_flags |= XFS_MOUNT_WSYNC;
> > +
> > + fc->s_fs_info = mp;
> > + fc->ops = &xfs_context_ops;
> > +
> > + return 0;
> > +}
> > +
> > static struct file_system_type xfs_fs_type = {
> > .owner = THIS_MODULE,
> > .name = "xfs",
> > - .mount = xfs_fs_mount,
> > + .init_fs_context = xfs_init_fs_context,
> > + .parameters = &xfs_fs_parameters,
> > .kill_sb = kill_block_super,
> > .fs_flags = FS_REQUIRES_DEV,
> > };
> >
next prev parent reply other threads:[~2019-11-05 3:00 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-04 10:54 [PATCH v9 00/17] xfs: mount API patch series Ian Kent
2019-11-04 10:54 ` [PATCH v9 01/17] xfs: remove unused struct xfs_mount field m_fsname_len Ian Kent
2019-11-04 10:54 ` [PATCH v9 02/17] xfs: use super s_id instead of struct xfs_mount m_fsname Ian Kent
2019-11-04 10:54 ` [PATCH v9 03/17] xfs: dont use XFS_IS_QUOTA_RUNNING() for option check Ian Kent
2019-11-04 10:54 ` [PATCH v9 04/17] xfs: use kmem functions for struct xfs_mount Ian Kent
2019-11-04 10:55 ` [PATCH v9 05/17] xfs: merge freeing of mp names and mp Ian Kent
2019-11-04 10:55 ` [PATCH v9 06/17] xfs: add xfs_remount_rw() helper Ian Kent
2019-11-04 10:55 ` [PATCH v9 07/17] xfs: add xfs_remount_ro() helper Ian Kent
2019-11-04 10:55 ` [PATCH v9 08/17] xfs: refactor suffix_kstrtoint() Ian Kent
2019-11-04 10:55 ` [PATCH v9 09/17] xfs: avoid redundant checks when options is empty Ian Kent
2019-11-04 10:55 ` [PATCH v9 10/17] xfs: refactor xfs_parseags() Ian Kent
2019-11-04 10:55 ` [PATCH v9 11/17] xfs: move xfs_parseargs() validation to a helper Ian Kent
2019-11-04 10:55 ` [PATCH v9 12/17] xfs: dont set sb in xfs_mount_alloc() Ian Kent
2019-11-04 10:55 ` [PATCH v9 13/17] xfs: switch to use the new mount-api Ian Kent
2019-11-04 15:14 ` Christoph Hellwig
2019-11-04 22:53 ` Darrick J. Wong
2019-11-05 3:00 ` Ian Kent [this message]
2019-11-05 15:23 ` Darrick J. Wong
2019-11-06 2:27 ` Ian Kent
2019-11-04 10:55 ` [PATCH v9 14/17] xfs: move xfs_fc_reconfigure() above xfs_fc_free() Ian Kent
2019-11-04 10:55 ` [PATCH v9 15/17] xfs: move xfs_fc_get_tree() above xfs_fc_reconfigure() Ian Kent
2019-11-04 10:56 ` [PATCH v9 16/17] xfs: move xfs_fc_parse_param() above xfs_fc_get_tree() Ian Kent
2019-11-04 10:56 ` [PATCH v9 17/17] xfs: fold xfs_mount-alloc() into xfs_init_fs_context() Ian Kent
2019-11-04 15:14 ` Christoph Hellwig
2019-11-04 20:55 ` Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=befb9f60e51ca786c97a00731c91c6483ca604d1.camel@themaw.net \
--to=raven@themaw.net \
--cc=bfoster@redhat.com \
--cc=darrick.wong@oracle.com \
--cc=dchinner@redhat.com \
--cc=dhowells@redhat.com \
--cc=hch@infradead.org \
--cc=linux-xfs@vger.kernel.org \
--cc=sandeen@sandeen.net \
--cc=viro@ZenIV.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).