From: David Howells <dhowells@redhat.com> To: viro@zeniv.linux.org.uk Cc: "Felipe Balbi" <balbi@kernel.org>, "Michał Nazarewicz" <mina86@mina86.com>, linux-usb@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, dhowells@redhat.com Subject: [RFC PATCH 53/68] vfs: Convert functionfs to use the new mount API Date: Wed, 27 Mar 2019 23:47:18 +0000 [thread overview] Message-ID: <155373043876.7602.1318289599022013332.stgit@warthog.procyon.org.uk> (raw) In-Reply-To: <155372999953.7602.13784796495137723805.stgit@warthog.procyon.org.uk> Convert the functionfs filesystem to the new internal mount API as the old one will be obsoleted and removed. This allows greater flexibility in communication of mount parameters between userspace, the VFS and the filesystem. See Documentation/filesystems/mount_api.txt for more information. Signed-off-by: David Howells <dhowells@redhat.com> cc: Felipe Balbi <balbi@kernel.org> cc: Michał Nazarewicz <mina86@mina86.com> cc: linux-usb@vger.kernel.org --- drivers/usb/gadget/function/f_fs.c | 233 +++++++++++++++++++----------------- 1 file changed, 120 insertions(+), 113 deletions(-) diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index 20413c276c61..796c8b688477 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c @@ -17,6 +17,7 @@ #include <linux/blkdev.h> #include <linux/pagemap.h> #include <linux/export.h> +#include <linux/fs_parser.h> #include <linux/hid.h> #include <linux/mm.h> #include <linux/module.h> @@ -1447,9 +1448,9 @@ struct ffs_sb_fill_data { struct ffs_data *ffs_data; }; -static int ffs_sb_fill(struct super_block *sb, void *_data, int silent) +static int ffs_sb_fill(struct super_block *sb, struct fs_context *fc) { - struct ffs_sb_fill_data *data = _data; + struct ffs_sb_fill_data *data = fc->fs_private; struct inode *inode; struct ffs_data *ffs = data->ffs_data; @@ -1482,147 +1483,152 @@ static int ffs_sb_fill(struct super_block *sb, void *_data, int silent) return 0; } -static int ffs_fs_parse_opts(struct ffs_sb_fill_data *data, char *opts) -{ - ENTER(); +enum { + Opt_no_disconnect, + Opt_rmode, + Opt_fmode, + Opt_mode, + Opt_uid, + Opt_gid, +}; - if (!opts || !*opts) - return 0; +static const struct fs_parameter_spec ffs_fs_param_specs[] = { + fsparam_bool ("no_disconnect", Opt_no_disconnect), + fsparam_u32 ("rmode", Opt_rmode), + fsparam_u32 ("fmode", Opt_fmode), + fsparam_u32 ("mode", Opt_mode), + fsparam_u32 ("uid", Opt_uid), + fsparam_u32 ("gid", Opt_gid), + {} +}; - for (;;) { - unsigned long value; - char *eq, *comma; - - /* Option limit */ - comma = strchr(opts, ','); - if (comma) - *comma = 0; - - /* Value limit */ - eq = strchr(opts, '='); - if (unlikely(!eq)) { - pr_err("'=' missing in %s\n", opts); - return -EINVAL; - } - *eq = 0; +static const struct fs_parameter_description ffs_fs_fs_parameters = { + .name = "kAFS", + .specs = ffs_fs_param_specs, +}; - /* Parse value */ - if (kstrtoul(eq + 1, 0, &value)) { - pr_err("%s: invalid value: %s\n", opts, eq + 1); - return -EINVAL; - } +static int ffs_fs_parse_param(struct fs_context *fc, struct fs_parameter *param) +{ + struct ffs_sb_fill_data *data = fc->fs_private; + struct fs_parse_result result; + int opt; - /* Interpret option */ - switch (eq - opts) { - case 13: - if (!memcmp(opts, "no_disconnect", 13)) - data->no_disconnect = !!value; - else - goto invalid; - break; - case 5: - if (!memcmp(opts, "rmode", 5)) - data->root_mode = (value & 0555) | S_IFDIR; - else if (!memcmp(opts, "fmode", 5)) - data->perms.mode = (value & 0666) | S_IFREG; - else - goto invalid; - break; + ENTER(); - case 4: - if (!memcmp(opts, "mode", 4)) { - data->root_mode = (value & 0555) | S_IFDIR; - data->perms.mode = (value & 0666) | S_IFREG; - } else { - goto invalid; - } - break; + opt = fs_parse(fc, &ffs_fs_fs_parameters, param, &result); + if (opt < 0) + return opt; - case 3: - if (!memcmp(opts, "uid", 3)) { - data->perms.uid = make_kuid(current_user_ns(), value); - if (!uid_valid(data->perms.uid)) { - pr_err("%s: unmapped value: %lu\n", opts, value); - return -EINVAL; - } - } else if (!memcmp(opts, "gid", 3)) { - data->perms.gid = make_kgid(current_user_ns(), value); - if (!gid_valid(data->perms.gid)) { - pr_err("%s: unmapped value: %lu\n", opts, value); - return -EINVAL; - } - } else { - goto invalid; - } - break; + switch (opt) { + case Opt_no_disconnect: + data->no_disconnect = result.boolean; + break; + case Opt_rmode: + data->root_mode = (result.uint_32 & 0555) | S_IFDIR; + break; + case Opt_fmode: + data->perms.mode = (result.uint_32 & 0666) | S_IFREG; + break; + case Opt_mode: + data->root_mode = (result.uint_32 & 0555) | S_IFDIR; + data->perms.mode = (result.uint_32 & 0666) | S_IFREG; + break; - default: -invalid: - pr_err("%s: invalid option\n", opts); - return -EINVAL; - } + case Opt_uid: + data->perms.uid = make_kuid(current_user_ns(), result.uint_32); + if (!uid_valid(data->perms.uid)) + goto unmapped_value; + break; + case Opt_gid: + data->perms.gid = make_kgid(current_user_ns(), result.uint_32); + if (!gid_valid(data->perms.gid)) + goto unmapped_value; + break; - /* Next iteration */ - if (!comma) - break; - opts = comma + 1; + default: + return -ENOPARAM; } return 0; -} -/* "mount -t functionfs dev_name /dev/function" ends up here */ +unmapped_value: + return invalf(fc, "%s: unmapped value: %u", param->key, result.uint_32); +} -static struct dentry * -ffs_fs_mount(struct file_system_type *t, int flags, - const char *dev_name, void *opts) -{ - struct ffs_sb_fill_data data = { - .perms = { - .mode = S_IFREG | 0600, - .uid = GLOBAL_ROOT_UID, - .gid = GLOBAL_ROOT_GID, - }, - .root_mode = S_IFDIR | 0500, - .no_disconnect = false, - }; - struct dentry *rv; - int ret; +/* + * Set up the superblock for a mount. + */ +static int ffs_fs_get_tree(struct fs_context *fc) +{ + struct ffs_sb_fill_data *ctx = fc->fs_private; void *ffs_dev; struct ffs_data *ffs; ENTER(); - ret = ffs_fs_parse_opts(&data, opts); - if (unlikely(ret < 0)) - return ERR_PTR(ret); + if (!fc->source) + return invalf(fc, "No source specified"); - ffs = ffs_data_new(dev_name); + ffs = ffs_data_new(fc->source); if (unlikely(!ffs)) - return ERR_PTR(-ENOMEM); - ffs->file_perms = data.perms; - ffs->no_disconnect = data.no_disconnect; + return -ENOMEM; + ffs->file_perms = ctx->perms; + ffs->no_disconnect = ctx->no_disconnect; - ffs->dev_name = kstrdup(dev_name, GFP_KERNEL); + ffs->dev_name = kstrdup(fc->source, GFP_KERNEL); if (unlikely(!ffs->dev_name)) { ffs_data_put(ffs); - return ERR_PTR(-ENOMEM); + return -ENOMEM; } - ffs_dev = ffs_acquire_dev(dev_name); + ffs_dev = ffs_acquire_dev(ffs->dev_name); if (IS_ERR(ffs_dev)) { ffs_data_put(ffs); - return ERR_CAST(ffs_dev); + return PTR_ERR(ffs_dev); } + ffs->private_data = ffs_dev; - data.ffs_data = ffs; + ctx->ffs_data = ffs; + return vfs_get_super(fc, vfs_get_independent_super, ffs_sb_fill); +} + +static void ffs_fs_free_fc(struct fs_context *fc) +{ + struct ffs_sb_fill_data *ctx = fc->fs_private; + + if (ctx) { + if (ctx->ffs_data) { + ffs_release_dev(ctx->ffs_data); + ffs_data_put(ctx->ffs_data); + } - rv = mount_nodev(t, flags, &data, ffs_sb_fill); - if (IS_ERR(rv) && data.ffs_data) { - ffs_release_dev(data.ffs_data); - ffs_data_put(data.ffs_data); + kfree(ctx); } - return rv; +} + +static const struct fs_context_operations ffs_fs_context_ops = { + .free = ffs_fs_free_fc, + .parse_param = ffs_fs_parse_param, + .get_tree = ffs_fs_get_tree, +}; + +static int ffs_fs_init_fs_context(struct fs_context *fc) +{ + struct ffs_sb_fill_data *ctx; + + ctx = kzalloc(sizeof(struct ffs_sb_fill_data), GFP_KERNEL); + if (!ctx) + return -ENOMEM; + + ctx->perms.mode = S_IFREG | 0600; + ctx->perms.uid = GLOBAL_ROOT_UID; + ctx->perms.gid = GLOBAL_ROOT_GID; + ctx->root_mode = S_IFDIR | 0500; + ctx->no_disconnect = false; + + fc->fs_private = ctx; + fc->ops = &ffs_fs_context_ops; + return 0; } static void @@ -1640,7 +1646,8 @@ ffs_fs_kill_sb(struct super_block *sb) static struct file_system_type ffs_fs_type = { .owner = THIS_MODULE, .name = "functionfs", - .mount = ffs_fs_mount, + .init_fs_context = ffs_fs_init_fs_context, + .parameters = &ffs_fs_fs_parameters, .kill_sb = ffs_fs_kill_sb, }; MODULE_ALIAS_FS("functionfs");
WARNING: multiple messages have this Message-ID (diff)
From: David Howells <dhowells@redhat.com> To: viro@zeniv.linux.org.uk Cc: "Felipe Balbi" <balbi@kernel.org>, "Michał Nazarewicz" <mina86@mina86.com>, linux-usb@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, dhowells@redhat.com Subject: [RFC,53/68] vfs: Convert functionfs to use the new mount API Date: Wed, 27 Mar 2019 23:47:18 +0000 [thread overview] Message-ID: <155373043876.7602.1318289599022013332.stgit@warthog.procyon.org.uk> (raw) Convert the functionfs filesystem to the new internal mount API as the old one will be obsoleted and removed. This allows greater flexibility in communication of mount parameters between userspace, the VFS and the filesystem. See Documentation/filesystems/mount_api.txt for more information. Signed-off-by: David Howells <dhowells@redhat.com> cc: Felipe Balbi <balbi@kernel.org> cc: Michał Nazarewicz <mina86@mina86.com> cc: linux-usb@vger.kernel.org --- drivers/usb/gadget/function/f_fs.c | 233 +++++++++++++++++++----------------- 1 file changed, 120 insertions(+), 113 deletions(-) diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index 20413c276c61..796c8b688477 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c @@ -17,6 +17,7 @@ #include <linux/blkdev.h> #include <linux/pagemap.h> #include <linux/export.h> +#include <linux/fs_parser.h> #include <linux/hid.h> #include <linux/mm.h> #include <linux/module.h> @@ -1447,9 +1448,9 @@ struct ffs_sb_fill_data { struct ffs_data *ffs_data; }; -static int ffs_sb_fill(struct super_block *sb, void *_data, int silent) +static int ffs_sb_fill(struct super_block *sb, struct fs_context *fc) { - struct ffs_sb_fill_data *data = _data; + struct ffs_sb_fill_data *data = fc->fs_private; struct inode *inode; struct ffs_data *ffs = data->ffs_data; @@ -1482,147 +1483,152 @@ static int ffs_sb_fill(struct super_block *sb, void *_data, int silent) return 0; } -static int ffs_fs_parse_opts(struct ffs_sb_fill_data *data, char *opts) -{ - ENTER(); +enum { + Opt_no_disconnect, + Opt_rmode, + Opt_fmode, + Opt_mode, + Opt_uid, + Opt_gid, +}; - if (!opts || !*opts) - return 0; +static const struct fs_parameter_spec ffs_fs_param_specs[] = { + fsparam_bool ("no_disconnect", Opt_no_disconnect), + fsparam_u32 ("rmode", Opt_rmode), + fsparam_u32 ("fmode", Opt_fmode), + fsparam_u32 ("mode", Opt_mode), + fsparam_u32 ("uid", Opt_uid), + fsparam_u32 ("gid", Opt_gid), + {} +}; - for (;;) { - unsigned long value; - char *eq, *comma; - - /* Option limit */ - comma = strchr(opts, ','); - if (comma) - *comma = 0; - - /* Value limit */ - eq = strchr(opts, '='); - if (unlikely(!eq)) { - pr_err("'=' missing in %s\n", opts); - return -EINVAL; - } - *eq = 0; +static const struct fs_parameter_description ffs_fs_fs_parameters = { + .name = "kAFS", + .specs = ffs_fs_param_specs, +}; - /* Parse value */ - if (kstrtoul(eq + 1, 0, &value)) { - pr_err("%s: invalid value: %s\n", opts, eq + 1); - return -EINVAL; - } +static int ffs_fs_parse_param(struct fs_context *fc, struct fs_parameter *param) +{ + struct ffs_sb_fill_data *data = fc->fs_private; + struct fs_parse_result result; + int opt; - /* Interpret option */ - switch (eq - opts) { - case 13: - if (!memcmp(opts, "no_disconnect", 13)) - data->no_disconnect = !!value; - else - goto invalid; - break; - case 5: - if (!memcmp(opts, "rmode", 5)) - data->root_mode = (value & 0555) | S_IFDIR; - else if (!memcmp(opts, "fmode", 5)) - data->perms.mode = (value & 0666) | S_IFREG; - else - goto invalid; - break; + ENTER(); - case 4: - if (!memcmp(opts, "mode", 4)) { - data->root_mode = (value & 0555) | S_IFDIR; - data->perms.mode = (value & 0666) | S_IFREG; - } else { - goto invalid; - } - break; + opt = fs_parse(fc, &ffs_fs_fs_parameters, param, &result); + if (opt < 0) + return opt; - case 3: - if (!memcmp(opts, "uid", 3)) { - data->perms.uid = make_kuid(current_user_ns(), value); - if (!uid_valid(data->perms.uid)) { - pr_err("%s: unmapped value: %lu\n", opts, value); - return -EINVAL; - } - } else if (!memcmp(opts, "gid", 3)) { - data->perms.gid = make_kgid(current_user_ns(), value); - if (!gid_valid(data->perms.gid)) { - pr_err("%s: unmapped value: %lu\n", opts, value); - return -EINVAL; - } - } else { - goto invalid; - } - break; + switch (opt) { + case Opt_no_disconnect: + data->no_disconnect = result.boolean; + break; + case Opt_rmode: + data->root_mode = (result.uint_32 & 0555) | S_IFDIR; + break; + case Opt_fmode: + data->perms.mode = (result.uint_32 & 0666) | S_IFREG; + break; + case Opt_mode: + data->root_mode = (result.uint_32 & 0555) | S_IFDIR; + data->perms.mode = (result.uint_32 & 0666) | S_IFREG; + break; - default: -invalid: - pr_err("%s: invalid option\n", opts); - return -EINVAL; - } + case Opt_uid: + data->perms.uid = make_kuid(current_user_ns(), result.uint_32); + if (!uid_valid(data->perms.uid)) + goto unmapped_value; + break; + case Opt_gid: + data->perms.gid = make_kgid(current_user_ns(), result.uint_32); + if (!gid_valid(data->perms.gid)) + goto unmapped_value; + break; - /* Next iteration */ - if (!comma) - break; - opts = comma + 1; + default: + return -ENOPARAM; } return 0; -} -/* "mount -t functionfs dev_name /dev/function" ends up here */ +unmapped_value: + return invalf(fc, "%s: unmapped value: %u", param->key, result.uint_32); +} -static struct dentry * -ffs_fs_mount(struct file_system_type *t, int flags, - const char *dev_name, void *opts) -{ - struct ffs_sb_fill_data data = { - .perms = { - .mode = S_IFREG | 0600, - .uid = GLOBAL_ROOT_UID, - .gid = GLOBAL_ROOT_GID, - }, - .root_mode = S_IFDIR | 0500, - .no_disconnect = false, - }; - struct dentry *rv; - int ret; +/* + * Set up the superblock for a mount. + */ +static int ffs_fs_get_tree(struct fs_context *fc) +{ + struct ffs_sb_fill_data *ctx = fc->fs_private; void *ffs_dev; struct ffs_data *ffs; ENTER(); - ret = ffs_fs_parse_opts(&data, opts); - if (unlikely(ret < 0)) - return ERR_PTR(ret); + if (!fc->source) + return invalf(fc, "No source specified"); - ffs = ffs_data_new(dev_name); + ffs = ffs_data_new(fc->source); if (unlikely(!ffs)) - return ERR_PTR(-ENOMEM); - ffs->file_perms = data.perms; - ffs->no_disconnect = data.no_disconnect; + return -ENOMEM; + ffs->file_perms = ctx->perms; + ffs->no_disconnect = ctx->no_disconnect; - ffs->dev_name = kstrdup(dev_name, GFP_KERNEL); + ffs->dev_name = kstrdup(fc->source, GFP_KERNEL); if (unlikely(!ffs->dev_name)) { ffs_data_put(ffs); - return ERR_PTR(-ENOMEM); + return -ENOMEM; } - ffs_dev = ffs_acquire_dev(dev_name); + ffs_dev = ffs_acquire_dev(ffs->dev_name); if (IS_ERR(ffs_dev)) { ffs_data_put(ffs); - return ERR_CAST(ffs_dev); + return PTR_ERR(ffs_dev); } + ffs->private_data = ffs_dev; - data.ffs_data = ffs; + ctx->ffs_data = ffs; + return vfs_get_super(fc, vfs_get_independent_super, ffs_sb_fill); +} + +static void ffs_fs_free_fc(struct fs_context *fc) +{ + struct ffs_sb_fill_data *ctx = fc->fs_private; + + if (ctx) { + if (ctx->ffs_data) { + ffs_release_dev(ctx->ffs_data); + ffs_data_put(ctx->ffs_data); + } - rv = mount_nodev(t, flags, &data, ffs_sb_fill); - if (IS_ERR(rv) && data.ffs_data) { - ffs_release_dev(data.ffs_data); - ffs_data_put(data.ffs_data); + kfree(ctx); } - return rv; +} + +static const struct fs_context_operations ffs_fs_context_ops = { + .free = ffs_fs_free_fc, + .parse_param = ffs_fs_parse_param, + .get_tree = ffs_fs_get_tree, +}; + +static int ffs_fs_init_fs_context(struct fs_context *fc) +{ + struct ffs_sb_fill_data *ctx; + + ctx = kzalloc(sizeof(struct ffs_sb_fill_data), GFP_KERNEL); + if (!ctx) + return -ENOMEM; + + ctx->perms.mode = S_IFREG | 0600; + ctx->perms.uid = GLOBAL_ROOT_UID; + ctx->perms.gid = GLOBAL_ROOT_GID; + ctx->root_mode = S_IFDIR | 0500; + ctx->no_disconnect = false; + + fc->fs_private = ctx; + fc->ops = &ffs_fs_context_ops; + return 0; } static void @@ -1640,7 +1646,8 @@ ffs_fs_kill_sb(struct super_block *sb) static struct file_system_type ffs_fs_type = { .owner = THIS_MODULE, .name = "functionfs", - .mount = ffs_fs_mount, + .init_fs_context = ffs_fs_init_fs_context, + .parameters = &ffs_fs_fs_parameters, .kill_sb = ffs_fs_kill_sb, }; MODULE_ALIAS_FS("functionfs");
next prev parent reply other threads:[~2019-03-27 23:47 UTC|newest] Thread overview: 111+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-03-27 23:40 [RFC PATCH 00/68] VFS: Convert a bunch of filesystems to the new mount API David Howells 2019-03-27 23:40 ` [Cluster-devel] " David Howells 2019-03-27 23:40 ` David Howells 2019-03-27 23:40 ` David Howells 2019-03-27 23:40 ` David Howells 2019-03-27 23:40 ` [RFC PATCH 01/68] kbuild: skip sub-make for in-tree build with GNU Make 4.x David Howells 2019-03-28 0:53 ` Masahiro Yamada 2019-03-30 12:11 ` Masahiro Yamada 2019-04-10 9:54 ` David Howells 2019-03-27 23:40 ` [RFC PATCH 02/68] vfs: Update mount API docs David Howells 2019-03-27 23:40 ` [RFC PATCH 03/68] vfs: Fix refcounting of filenames in fs_parser David Howells 2019-03-27 23:41 ` [RFC PATCH 04/68] vfs: Provide sb->s_iflags settings in fs_context struct David Howells 2019-03-27 23:41 ` [RFC PATCH 05/68] vfs: Provide a mount_pseudo-replacement for the new mount API David Howells 2019-03-27 23:41 ` [RFC PATCH 06/68] vfs: Convert aio to use " David Howells 2019-03-27 23:41 ` [RFC PATCH 07/68] vfs: Convert anon_inodes " David Howells 2019-03-27 23:41 ` [RFC PATCH 08/68] vfs: Convert bdev " David Howells 2019-03-27 23:41 ` [RFC PATCH 09/68] vfs: Convert nsfs " David Howells 2019-03-27 23:41 ` [RFC PATCH 10/68] vfs: Convert pipe " David Howells 2019-03-27 23:41 ` [RFC PATCH 11/68] vfs: Convert zsmalloc " David Howells 2019-03-27 23:42 ` [RFC PATCH 12/68] vfs: Convert sockfs " David Howells 2019-03-27 23:42 ` [RFC PATCH 13/68] vfs: Convert dax " David Howells 2019-03-27 23:42 ` David Howells 2019-03-27 23:42 ` [RFC PATCH 14/68] vfs: Convert drm " David Howells 2019-03-28 7:47 ` Daniel Vetter 2019-03-28 7:47 ` Daniel Vetter 2019-04-10 9:59 ` David Howells 2019-04-10 9:59 ` David Howells 2019-03-27 23:42 ` [RFC PATCH 15/68] vfs: Convert ia64 perfmon " David Howells 2019-03-27 23:42 ` [RFC PATCH 16/68] vfs: Convert cxl " David Howells 2019-03-27 23:42 ` David Howells 2019-03-27 23:42 ` [RFC PATCH 17/68] vfs: Convert ocxlflash " David Howells 2019-03-27 23:42 ` [RFC PATCH 18/68] vfs: Convert virtio_balloon " David Howells 2019-03-27 23:42 ` David Howells 2019-03-27 23:42 ` [RFC PATCH 19/68] vfs: Convert btrfs_test " David Howells 2019-03-27 23:43 ` [RFC PATCH 20/68] vfs: Kill off mount_pseudo() and mount_pseudo_xattr() David Howells 2019-03-27 23:43 ` [RFC PATCH 21/68] vfs: Use sget_fc() for pseudo-filesystems David Howells 2019-03-27 23:43 ` [RFC PATCH 22/68] vfs: Convert binderfs to use the new mount API David Howells 2019-03-28 14:45 ` Dan Carpenter 2019-04-10 10:01 ` David Howells 2019-03-27 23:43 ` [RFC PATCH 23/68] vfs: Convert nfsctl " David Howells 2019-03-27 23:43 ` [RFC PATCH 24/68] vfs: Convert rpc_pipefs " David Howells 2019-03-27 23:43 ` [RFC PATCH 25/68] vfs: Kill mount_ns() David Howells 2019-03-27 23:43 ` [RFC PATCH 26/68] vfs: Kill sget_userns() David Howells 2019-03-27 23:43 ` [RFC PATCH 27/68] vfs: Convert binfmt_misc to use the new mount API David Howells 2019-03-27 23:44 ` [RFC PATCH 28/68] vfs: Convert configfs " David Howells 2019-03-27 23:44 ` [RFC PATCH 29/68] vfs: Convert efivarfs " David Howells 2019-03-27 23:44 ` [RFC PATCH 30/68] vfs: Convert fusectl " David Howells 2019-04-24 13:49 ` Miklos Szeredi 2019-04-24 15:16 ` David Howells 2019-03-27 23:44 ` [RFC PATCH 31/68] vfs: Convert qib_fs/ipathfs " David Howells 2019-04-09 17:14 ` Dennis Dalessandro 2019-03-27 23:44 ` [RFC PATCH 32/68] vfs: Convert ibmasmfs " David Howells 2019-03-27 23:44 ` [RFC PATCH 33/68] vfs: Convert oprofilefs " David Howells 2019-03-27 23:44 ` [RFC PATCH 34/68] vfs: Convert gadgetfs " David Howells 2019-03-27 23:44 ` [RFC,34/68] " David Howells 2019-03-27 23:44 ` [RFC PATCH 35/68] vfs: Convert xenfs " David Howells 2019-04-02 7:38 ` Juergen Gross 2019-04-02 7:38 ` Juergen Gross 2019-03-27 23:44 ` David Howells 2019-03-27 23:45 ` [RFC PATCH 36/68] vfs: Convert openpromfs " David Howells 2019-03-27 23:45 ` [RFC PATCH 37/68] vfs: Convert apparmorfs " David Howells 2019-03-27 23:45 ` [RFC PATCH 38/68] vfs: Convert securityfs " David Howells 2019-03-27 23:45 ` [RFC PATCH 39/68] vfs: Convert selinuxfs " David Howells 2019-03-27 23:45 ` [RFC PATCH 40/68] vfs: Convert smackfs " David Howells 2019-03-27 23:45 ` [RFC PATCH 41/68] vfs: Convert ramfs, shmem, tmpfs, devtmpfs, rootfs " David Howells 2019-03-27 23:45 ` [RFC PATCH 42/68] vfs: Create fs_context-aware mount_bdev() replacement David Howells 2019-03-27 23:45 ` [RFC PATCH 43/68] vfs: Make fs_parse() handle fs_param_is_fd-type params better David Howells 2019-03-27 23:46 ` [RFC PATCH 44/68] vfs: Convert fuse to use the new mount API David Howells 2019-04-24 13:53 ` Miklos Szeredi 2019-04-24 15:22 ` David Howells 2019-04-24 17:28 ` Miklos Szeredi 2019-03-27 23:46 ` [RFC PATCH 45/68] vfs: Move the subtype parameter into fuse David Howells 2019-03-27 23:46 ` [RFC PATCH 46/68] mtd: Provide fs_context-aware mount_mtd() replacement David Howells 2019-03-27 23:46 ` David Howells 2019-03-27 23:46 ` [RFC PATCH 47/68] vfs: Convert romfs to use the new mount API David Howells 2019-03-27 23:46 ` David Howells 2019-03-27 23:46 ` [RFC PATCH 48/68] vfs: Convert cramfs " David Howells 2019-03-27 23:46 ` David Howells 2019-04-01 15:25 ` Nicolas Pitre 2019-04-01 15:25 ` Nicolas Pitre 2019-03-27 23:46 ` [RFC PATCH 49/68] vfs: Convert jffs2 " David Howells 2019-03-27 23:46 ` David Howells 2019-03-27 23:46 ` [RFC PATCH 50/68] mtd: Kill mount_mtd() David Howells 2019-03-27 23:46 ` David Howells 2019-03-27 23:47 ` [RFC PATCH 51/68] vfs: Convert squashfs to use the new mount API David Howells 2019-03-27 23:47 ` [RFC PATCH 52/68] vfs: Convert ceph " David Howells 2019-04-27 12:27 ` Jeff Layton 2019-03-27 23:47 ` David Howells [this message] 2019-03-27 23:47 ` [RFC,53/68] vfs: Convert functionfs " David Howells 2019-03-28 10:43 ` [RFC PATCH 53/68] " Michał Nazarewicz 2019-03-28 10:43 ` [RFC,53/68] " Michał Nazarewicz 2019-03-27 23:47 ` [RFC PATCH 54/68] vfs: Add a single-or-reconfig keying to vfs_get_super() David Howells 2019-03-27 23:47 ` [RFC PATCH 55/68] vfs: Convert debugfs to use the new mount API David Howells 2019-03-27 23:47 ` [RFC PATCH 56/68] vfs: Convert tracefs " David Howells 2019-03-27 23:47 ` [RFC PATCH 57/68] vfs: Convert pstore " David Howells 2019-03-28 0:24 ` Kees Cook 2019-03-27 23:47 ` [RFC PATCH 58/68] hypfs: Fix error number left in struct pointer member David Howells 2019-03-27 23:48 ` [RFC PATCH 59/68] vfs: Convert hypfs to use the new mount API David Howells 2019-03-27 23:48 ` [RFC PATCH 60/68] vfs: Convert spufs " David Howells 2019-03-27 23:48 ` David Howells 2019-03-27 23:48 ` [RFC PATCH 61/68] vfs: Kill mount_single() David Howells 2019-03-27 23:48 ` [RFC PATCH 62/68] vfs: Convert coda to use the new mount API David Howells 2019-03-27 23:48 ` [RFC PATCH 63/68] vfs: Convert autofs " David Howells 2019-03-27 23:48 ` [RFC PATCH 64/68] vfs: Convert devpts " David Howells 2019-04-05 12:52 ` Christian Brauner 2019-03-27 23:48 ` [RFC PATCH 65/68] vfs: Convert bpf " David Howells 2019-03-27 23:48 ` [RFC PATCH 66/68] vfs: Convert ubifs " David Howells 2019-03-27 23:48 ` David Howells 2019-03-27 23:49 ` [RFC PATCH 67/68] vfs: Convert orangefs " David Howells 2019-03-27 23:49 ` [RFC PATCH 68/68] gfs2: Convert gfs2 to fs_context David Howells 2019-03-27 23:49 ` [Cluster-devel] " David Howells
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=155373043876.7602.1318289599022013332.stgit@warthog.procyon.org.uk \ --to=dhowells@redhat.com \ --cc=balbi@kernel.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-usb@vger.kernel.org \ --cc=mina86@mina86.com \ --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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.