diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 858b9ce472be..521f0b7317c3 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -491,12 +491,16 @@ static int fuse_parse_param(struct fs_context *fc, struct fs_parameter *param) struct fuse_fs_context *ctx = fc->fs_private; int opt; - /* - * Ignore options coming from mount(MS_REMOUNT) for backward - * compatibility. - */ - if (fc->purpose == FS_CONTEXT_FOR_RECONFIGURE) - return 0; + if (fc->purpose == FS_CONTEXT_FOR_RECONFIGURE) { + /* + * Ignore options coming from mount(MS_REMOUNT) for backward + * compatibility. + */ + if (fc->oldapi) + return 0; + + return invalf(fc, "No changes allowed in reconfigure"); + } opt = fs_parse(fc, &fuse_fs_parameters, param, &result); if (opt < 0) diff --git a/fs/namespace.c b/fs/namespace.c index 2fd0bf91aa77..176bccdf6f30 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -2618,6 +2618,7 @@ static int do_remount(struct path *path, int ms_flags, int sb_flags, if (IS_ERR(fc)) return PTR_ERR(fc); + fc->oldapi = true; err = parse_monolithic_mount_data(fc, data); if (!err) { down_write(&sb->s_umount); diff --git a/include/linux/fs_context.h b/include/linux/fs_context.h index ebcb91a57e86..d5a73cd318f8 100644 --- a/include/linux/fs_context.h +++ b/include/linux/fs_context.h @@ -105,6 +105,7 @@ struct fs_context { enum fs_context_phase phase:8; /* The phase the context is in */ bool need_free:1; /* Need to call ops->free() */ bool global:1; /* Goes into &init_user_ns */ + bool oldapi:1; /* Coming from mount(2) */ }; struct fs_context_operations {