]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/nfs/super.c
Merge tag 'mac80211-for-net-2020-02-14' of git://git.kernel.org/pub/scm/linux/kernel...
[linux.git] / fs / nfs / super.c
index 59962bc0118f4cd528a44767a29246f4b61a7e59..dada09b391c653a7f0fa1e6c8dd87daba0b204be 100644 (file)
 
 #define NFSDBG_FACILITY                NFSDBG_VFS
 
-static struct dentry *nfs_prepared_mount(struct file_system_type *fs_type,
-               int flags, const char *dev_name, void *raw_data);
-
-struct file_system_type nfs_fs_type = {
-       .owner          = THIS_MODULE,
-       .name           = "nfs",
-       .mount          = nfs_fs_mount,
-       .kill_sb        = nfs_kill_super,
-       .fs_flags       = FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,
-};
-MODULE_ALIAS_FS("nfs");
-EXPORT_SYMBOL_GPL(nfs_fs_type);
-
-struct file_system_type nfs_prepared_fs_type = {
-       .owner          = THIS_MODULE,
-       .name           = "nfs",
-       .mount          = nfs_prepared_mount,
-       .kill_sb        = nfs_kill_super,
-       .fs_flags       = FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,
-};
-EXPORT_SYMBOL_GPL(nfs_prepared_fs_type);
-
 const struct super_operations nfs_sops = {
        .alloc_inode    = nfs_alloc_inode,
        .free_inode     = nfs_free_inode,
@@ -104,22 +82,10 @@ const struct super_operations nfs_sops = {
        .show_devname   = nfs_show_devname,
        .show_path      = nfs_show_path,
        .show_stats     = nfs_show_stats,
-       .remount_fs     = nfs_remount,
 };
 EXPORT_SYMBOL_GPL(nfs_sops);
 
 #if IS_ENABLED(CONFIG_NFS_V4)
-struct file_system_type nfs4_fs_type = {
-       .owner          = THIS_MODULE,
-       .name           = "nfs4",
-       .mount          = nfs_fs_mount,
-       .kill_sb        = nfs_kill_super,
-       .fs_flags       = FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,
-};
-MODULE_ALIAS_FS("nfs4");
-MODULE_ALIAS("nfs4");
-EXPORT_SYMBOL_GPL(nfs4_fs_type);
-
 static int __init register_nfs4_fs(void)
 {
        return register_filesystem(&nfs4_fs_type);
@@ -409,6 +375,7 @@ static void nfs_show_mount_options(struct seq_file *m, struct nfs_server *nfss,
        } nfs_info[] = {
                { NFS_MOUNT_SOFT, ",soft", "" },
                { NFS_MOUNT_SOFTERR, ",softerr", "" },
+               { NFS_MOUNT_SOFTREVAL, ",softreval", "" },
                { NFS_MOUNT_POSIX, ",posix", "" },
                { NFS_MOUNT_NOCTO, ",nocto", "" },
                { NFS_MOUNT_NOAC, ",noac", "" },
@@ -726,11 +693,11 @@ bool nfs_auth_info_match(const struct nfs_auth_info *auth_info,
 EXPORT_SYMBOL_GPL(nfs_auth_info_match);
 
 /*
- * Ensure that a specified authtype in cfg->auth_info is supported by
- * the server. Returns 0 and sets cfg->selected_flavor if it's ok, and
+ * Ensure that a specified authtype in ctx->auth_info is supported by
+ * the server. Returns 0 and sets ctx->selected_flavor if it's ok, and
  * -EACCES if not.
  */
-static int nfs_verify_authflavors(struct nfs_fs_context *cfg,
+static int nfs_verify_authflavors(struct nfs_fs_context *ctx,
                                  rpc_authflavor_t *server_authlist,
                                  unsigned int count)
 {
@@ -753,7 +720,7 @@ static int nfs_verify_authflavors(struct nfs_fs_context *cfg,
        for (i = 0; i < count; i++) {
                flavor = server_authlist[i];
 
-               if (nfs_auth_info_match(&cfg->auth_info, flavor))
+               if (nfs_auth_info_match(&ctx->auth_info, flavor))
                        goto out;
 
                if (flavor == RPC_AUTH_NULL)
@@ -761,7 +728,7 @@ static int nfs_verify_authflavors(struct nfs_fs_context *cfg,
        }
 
        if (found_auth_null) {
-               flavor = cfg->auth_info.flavors[0];
+               flavor = ctx->auth_info.flavors[0];
                goto out;
        }
 
@@ -770,8 +737,8 @@ static int nfs_verify_authflavors(struct nfs_fs_context *cfg,
        return -EACCES;
 
 out:
-       cfg->selected_flavor = flavor;
-       dfprintk(MOUNT, "NFS: using auth flavor %u\n", cfg->selected_flavor);
+       ctx->selected_flavor = flavor;
+       dfprintk(MOUNT, "NFS: using auth flavor %u\n", ctx->selected_flavor);
        return 0;
 }
 
@@ -779,50 +746,51 @@ static int nfs_verify_authflavors(struct nfs_fs_context *cfg,
  * Use the remote server's MOUNT service to request the NFS file handle
  * corresponding to the provided path.
  */
-static int nfs_request_mount(struct nfs_fs_context *cfg,
+static int nfs_request_mount(struct fs_context *fc,
                             struct nfs_fh *root_fh,
                             rpc_authflavor_t *server_authlist,
                             unsigned int *server_authlist_len)
 {
+       struct nfs_fs_context *ctx = nfs_fc2context(fc);
        struct nfs_mount_request request = {
                .sap            = (struct sockaddr *)
-                                               &cfg->mount_server.address,
-               .dirpath        = cfg->nfs_server.export_path,
-               .protocol       = cfg->mount_server.protocol,
+                                               &ctx->mount_server.address,
+               .dirpath        = ctx->nfs_server.export_path,
+               .protocol       = ctx->mount_server.protocol,
                .fh             = root_fh,
-               .noresvport     = cfg->flags & NFS_MOUNT_NORESVPORT,
+               .noresvport     = ctx->flags & NFS_MOUNT_NORESVPORT,
                .auth_flav_len  = server_authlist_len,
                .auth_flavs     = server_authlist,
-               .net            = cfg->net,
+               .net            = fc->net_ns,
        };
        int status;
 
-       if (cfg->mount_server.version == 0) {
-               switch (cfg->version) {
+       if (ctx->mount_server.version == 0) {
+               switch (ctx->version) {
                        default:
-                               cfg->mount_server.version = NFS_MNT3_VERSION;
+                               ctx->mount_server.version = NFS_MNT3_VERSION;
                                break;
                        case 2:
-                               cfg->mount_server.version = NFS_MNT_VERSION;
+                               ctx->mount_server.version = NFS_MNT_VERSION;
                }
        }
-       request.version = cfg->mount_server.version;
+       request.version = ctx->mount_server.version;
 
-       if (cfg->mount_server.hostname)
-               request.hostname = cfg->mount_server.hostname;
+       if (ctx->mount_server.hostname)
+               request.hostname = ctx->mount_server.hostname;
        else
-               request.hostname = cfg->nfs_server.hostname;
+               request.hostname = ctx->nfs_server.hostname;
 
        /*
         * Construct the mount server's address.
         */
-       if (cfg->mount_server.address.sa_family == AF_UNSPEC) {
-               memcpy(request.sap, &cfg->nfs_server.address,
-                      cfg->nfs_server.addrlen);
-               cfg->mount_server.addrlen = cfg->nfs_server.addrlen;
+       if (ctx->mount_server.address.sa_family == AF_UNSPEC) {
+               memcpy(request.sap, &ctx->nfs_server.address,
+                      ctx->nfs_server.addrlen);
+               ctx->mount_server.addrlen = ctx->nfs_server.addrlen;
        }
-       request.salen = cfg->mount_server.addrlen;
-       nfs_set_port(request.sap, &cfg->mount_server.port, 0);
+       request.salen = ctx->mount_server.addrlen;
+       nfs_set_port(request.sap, &ctx->mount_server.port, 0);
 
        /*
         * Now ask the mount server to map our export path
@@ -838,20 +806,18 @@ static int nfs_request_mount(struct nfs_fs_context *cfg,
        return 0;
 }
 
-static struct nfs_server *nfs_try_mount_request(struct nfs_mount_info *mount_info)
+static struct nfs_server *nfs_try_mount_request(struct fs_context *fc)
 {
+       struct nfs_fs_context *ctx = nfs_fc2context(fc);
        int status;
        unsigned int i;
        bool tried_auth_unix = false;
        bool auth_null_in_list = false;
        struct nfs_server *server = ERR_PTR(-EACCES);
-       struct nfs_fs_context *ctx = mount_info->ctx;
        rpc_authflavor_t authlist[NFS_MAX_SECFLAVORS];
        unsigned int authlist_len = ARRAY_SIZE(authlist);
-       struct nfs_subversion *nfs_mod = mount_info->nfs_mod;
 
-       status = nfs_request_mount(ctx, mount_info->mntfh, authlist,
-                                       &authlist_len);
+       status = nfs_request_mount(fc, ctx->mntfh, authlist, &authlist_len);
        if (status)
                return ERR_PTR(status);
 
@@ -865,7 +831,7 @@ static struct nfs_server *nfs_try_mount_request(struct nfs_mount_info *mount_inf
                         ctx->selected_flavor);
                if (status)
                        return ERR_PTR(status);
-               return nfs_mod->rpc_ops->create_server(mount_info);
+               return ctx->nfs_mod->rpc_ops->create_server(fc);
        }
 
        /*
@@ -892,7 +858,7 @@ static struct nfs_server *nfs_try_mount_request(struct nfs_mount_info *mount_inf
                }
                dfprintk(MOUNT, "NFS: attempting to use auth flavor %u\n", flavor);
                ctx->selected_flavor = flavor;
-               server = nfs_mod->rpc_ops->create_server(mount_info);
+               server = ctx->nfs_mod->rpc_ops->create_server(fc);
                if (!IS_ERR(server))
                        return server;
        }
@@ -908,23 +874,22 @@ static struct nfs_server *nfs_try_mount_request(struct nfs_mount_info *mount_inf
        /* Last chance! Try AUTH_UNIX */
        dfprintk(MOUNT, "NFS: attempting to use auth flavor %u\n", RPC_AUTH_UNIX);
        ctx->selected_flavor = RPC_AUTH_UNIX;
-       return nfs_mod->rpc_ops->create_server(mount_info);
+       return ctx->nfs_mod->rpc_ops->create_server(fc);
 }
 
-static struct dentry *nfs_fs_mount_common(int, const char *, struct nfs_mount_info *);
-
-struct dentry *nfs_try_mount(int flags, const char *dev_name,
-                            struct nfs_mount_info *mount_info)
+int nfs_try_get_tree(struct fs_context *fc)
 {
-       struct nfs_subversion *nfs_mod = mount_info->nfs_mod;
-       if (mount_info->ctx->need_mount)
-               mount_info->server = nfs_try_mount_request(mount_info);
+       struct nfs_fs_context *ctx = nfs_fc2context(fc);
+
+       if (ctx->need_mount)
+               ctx->server = nfs_try_mount_request(fc);
        else
-               mount_info->server = nfs_mod->rpc_ops->create_server(mount_info);
+               ctx->server = ctx->nfs_mod->rpc_ops->create_server(fc);
 
-       return nfs_fs_mount_common(flags, dev_name, mount_info);
+       return nfs_get_tree_common(fc);
 }
-EXPORT_SYMBOL_GPL(nfs_try_mount);
+EXPORT_SYMBOL_GPL(nfs_try_get_tree);
+
 
 #define NFS_REMOUNT_CMP_FLAGMASK ~(NFS_MOUNT_INTR \
                | NFS_MOUNT_SECURE \
@@ -965,15 +930,11 @@ nfs_compare_remount_data(struct nfs_server *nfss,
        return 0;
 }
 
-int
-nfs_remount(struct super_block *sb, int *flags, char *raw_data)
+int nfs_reconfigure(struct fs_context *fc)
 {
-       int error;
+       struct nfs_fs_context *ctx = nfs_fc2context(fc);
+       struct super_block *sb = fc->root->d_sb;
        struct nfs_server *nfss = sb->s_fs_info;
-       struct nfs_fs_context *ctx;
-       struct nfs_mount_data *options = (struct nfs_mount_data *)raw_data;
-       struct nfs4_mount_data *options4 = (struct nfs4_mount_data *)raw_data;
-       u32 nfsvers = nfss->nfs_client->rpc_ops->version;
 
        sync_filesystem(sb);
 
@@ -983,64 +944,30 @@ nfs_remount(struct super_block *sb, int *flags, char *raw_data)
         * ones were explicitly specified. Fall back to legacy behavior and
         * just return success.
         */
-       if ((nfsvers == 4 && (!options4 || options4->version == 1)) ||
-           (nfsvers <= 3 && (!options || (options->version >= 1 &&
-                                          options->version <= 6))))
+       if (ctx->skip_reconfig_option_check)
                return 0;
 
-       ctx = nfs_alloc_parsed_mount_data();
-       if (ctx == NULL)
-               return -ENOMEM;
-
-       /* fill out struct with values from existing mount */
-       ctx->flags = nfss->flags;
-       ctx->rsize = nfss->rsize;
-       ctx->wsize = nfss->wsize;
-       ctx->retrans = nfss->client->cl_timeout->to_retries;
-       ctx->selected_flavor = nfss->client->cl_auth->au_flavor;
-       ctx->acregmin = nfss->acregmin / HZ;
-       ctx->acregmax = nfss->acregmax / HZ;
-       ctx->acdirmin = nfss->acdirmin / HZ;
-       ctx->acdirmax = nfss->acdirmax / HZ;
-       ctx->timeo = 10U * nfss->client->cl_timeout->to_initval / HZ;
-       ctx->nfs_server.port = nfss->port;
-       ctx->nfs_server.addrlen = nfss->nfs_client->cl_addrlen;
-       ctx->version = nfsvers;
-       ctx->minorversion = nfss->nfs_client->cl_minorversion;
-       ctx->net = current->nsproxy->net_ns;
-       memcpy(&ctx->nfs_server.address, &nfss->nfs_client->cl_addr,
-               ctx->nfs_server.addrlen);
-
-       /* overwrite those values with any that were specified */
-       error = -EINVAL;
-       if (!nfs_parse_mount_options((char *)options, ctx))
-               goto out;
-
        /*
         * noac is a special case. It implies -o sync, but that's not
-        * necessarily reflected in the mtab options. do_remount_sb
+        * necessarily reflected in the mtab options. reconfigure_super
         * will clear SB_SYNCHRONOUS if -o sync wasn't specified in the
         * remount options, so we have to explicitly reset it.
         */
-       if (ctx->flags & NFS_MOUNT_NOAC)
-               *flags |= SB_SYNCHRONOUS;
+       if (ctx->flags & NFS_MOUNT_NOAC) {
+               fc->sb_flags |= SB_SYNCHRONOUS;
+               fc->sb_flags_mask |= SB_SYNCHRONOUS;
+       }
 
        /* compare new mount options with old ones */
-       error = nfs_compare_remount_data(nfss, ctx);
-       if (!error)
-               error = security_sb_remount(sb, ctx->lsm_opts);
-out:
-       nfs_free_parsed_mount_data(ctx);
-       return error;
+       return nfs_compare_remount_data(nfss, ctx);
 }
-EXPORT_SYMBOL_GPL(nfs_remount);
+EXPORT_SYMBOL_GPL(nfs_reconfigure);
 
 /*
  * Finish setting up an NFS superblock
  */
-static void nfs_fill_super(struct super_block *sb, struct nfs_mount_info *mount_info)
+static void nfs_fill_super(struct super_block *sb, struct nfs_fs_context *ctx)
 {
-       struct nfs_fs_context *ctx = mount_info->ctx;
        struct nfs_server *server = NFS_SB(sb);
 
        sb->s_blocksize_bits = 0;
@@ -1081,13 +1008,14 @@ static void nfs_fill_super(struct super_block *sb, struct nfs_mount_info *mount_
        nfs_super_set_maxbytes(sb, server->maxfilesize);
 }
 
-static int nfs_compare_mount_options(const struct super_block *s, const struct nfs_server *b, int flags)
+static int nfs_compare_mount_options(const struct super_block *s, const struct nfs_server *b,
+                                    const struct fs_context *fc)
 {
        const struct nfs_server *a = s->s_fs_info;
        const struct rpc_clnt *clnt_a = a->client;
        const struct rpc_clnt *clnt_b = b->client;
 
-       if ((s->s_flags & NFS_MS_MASK) != (flags & NFS_MS_MASK))
+       if ((s->s_flags & NFS_SB_MASK) != (fc->sb_flags & NFS_SB_MASK))
                goto Ebusy;
        if (a->nfs_client != b->nfs_client)
                goto Ebusy;
@@ -1112,19 +1040,11 @@ static int nfs_compare_mount_options(const struct super_block *s, const struct n
        return 0;
 }
 
-struct nfs_sb_mountdata {
-       struct nfs_server *server;
-       int mntflags;
-};
-
-static int nfs_set_super(struct super_block *s, void *data)
+static int nfs_set_super(struct super_block *s, struct fs_context *fc)
 {
-       struct nfs_sb_mountdata *sb_mntdata = data;
-       struct nfs_server *server = sb_mntdata->server;
+       struct nfs_server *server = fc->s_fs_info;
        int ret;
 
-       s->s_flags = sb_mntdata->mntflags;
-       s->s_fs_info = server;
        s->s_d_op = server->nfs_client->rpc_ops->dentry_ops;
        ret = set_anon_super(s, server);
        if (ret == 0)
@@ -1189,11 +1109,9 @@ static int nfs_compare_userns(const struct nfs_server *old,
        return 1;
 }
 
-static int nfs_compare_super(struct super_block *sb, void *data)
+static int nfs_compare_super(struct super_block *sb, struct fs_context *fc)
 {
-       struct nfs_sb_mountdata *sb_mntdata = data;
-       struct nfs_server *server = sb_mntdata->server, *old = NFS_SB(sb);
-       int mntflags = sb_mntdata->mntflags;
+       struct nfs_server *server = fc->s_fs_info, *old = NFS_SB(sb);
 
        if (!nfs_compare_super_address(old, server))
                return 0;
@@ -1204,13 +1122,12 @@ static int nfs_compare_super(struct super_block *sb, void *data)
                return 0;
        if (!nfs_compare_userns(old, server))
                return 0;
-       return nfs_compare_mount_options(sb, server, mntflags);
+       return nfs_compare_mount_options(sb, server, fc);
 }
 
 #ifdef CONFIG_NFS_FSCACHE
 static void nfs_get_cache_cookie(struct super_block *sb,
-                                struct nfs_fs_context *ctx,
-                                struct nfs_clone_mount *cloned)
+                                struct nfs_fs_context *ctx)
 {
        struct nfs_server *nfss = NFS_SB(sb);
        char *uniq = NULL;
@@ -1219,30 +1136,32 @@ static void nfs_get_cache_cookie(struct super_block *sb,
        nfss->fscache_key = NULL;
        nfss->fscache = NULL;
 
-       if (ctx) {
-               if (!(ctx->options & NFS_OPTION_FSCACHE))
-                       return;
-               if (ctx->fscache_uniq) {
-                       uniq = ctx->fscache_uniq;
-                       ulen = strlen(ctx->fscache_uniq);
-               }
-       } else if (cloned) {
-               struct nfs_server *mnt_s = NFS_SB(cloned->sb);
+       if (!ctx)
+               return;
+
+       if (ctx->clone_data.sb) {
+               struct nfs_server *mnt_s = NFS_SB(ctx->clone_data.sb);
                if (!(mnt_s->options & NFS_OPTION_FSCACHE))
                        return;
                if (mnt_s->fscache_key) {
                        uniq = mnt_s->fscache_key->key.uniquifier;
                        ulen = mnt_s->fscache_key->key.uniq_len;
                }
-       } else
+       } else {
+               if (!(ctx->options & NFS_OPTION_FSCACHE))
+                       return;
+               if (ctx->fscache_uniq) {
+                       uniq = ctx->fscache_uniq;
+                       ulen = strlen(ctx->fscache_uniq);
+               }
                return;
+       }
 
        nfs_fscache_get_super_cookie(sb, uniq, ulen);
 }
 #else
 static void nfs_get_cache_cookie(struct super_block *sb,
-                                struct nfs_fs_context *parsed,
-                                struct nfs_clone_mount *cloned)
+                                struct nfs_fs_context *ctx)
 {
 }
 #endif
@@ -1254,40 +1173,40 @@ static void nfs_set_readahead(struct backing_dev_info *bdi,
        bdi->io_pages = iomax_pages;
 }
 
-static struct dentry *nfs_fs_mount_common(int flags, const char *dev_name,
-                                  struct nfs_mount_info *mount_info)
+int nfs_get_tree_common(struct fs_context *fc)
 {
+       struct nfs_fs_context *ctx = nfs_fc2context(fc);
        struct super_block *s;
-       struct dentry *mntroot = ERR_PTR(-ENOMEM);
-       int (*compare_super)(struct super_block *, void *) = nfs_compare_super;
-       struct nfs_server *server = mount_info->server;
+       int (*compare_super)(struct super_block *, struct fs_context *) = nfs_compare_super;
+       struct nfs_server *server = ctx->server;
        unsigned long kflags = 0, kflags_out = 0;
-       struct nfs_sb_mountdata sb_mntdata = {
-               .mntflags = flags,
-               .server = server,
-       };
        int error;
 
-       mount_info->server = NULL;
+       ctx->server = NULL;
        if (IS_ERR(server))
-               return ERR_CAST(server);
+               return PTR_ERR(server);
 
        if (server->flags & NFS_MOUNT_UNSHARED)
                compare_super = NULL;
 
        /* -o noac implies -o sync */
        if (server->flags & NFS_MOUNT_NOAC)
-               sb_mntdata.mntflags |= SB_SYNCHRONOUS;
+               fc->sb_flags |= SB_SYNCHRONOUS;
 
-       if (mount_info->cloned != NULL && mount_info->cloned->sb != NULL)
-               if (mount_info->cloned->sb->s_flags & SB_SYNCHRONOUS)
-                       sb_mntdata.mntflags |= SB_SYNCHRONOUS;
+       if (ctx->clone_data.sb)
+               if (ctx->clone_data.sb->s_flags & SB_SYNCHRONOUS)
+                       fc->sb_flags |= SB_SYNCHRONOUS;
+
+       if (server->caps & NFS_CAP_SECURITY_LABEL)
+               fc->lsm_flags |= SECURITY_LSM_NATIVE_LABELS;
 
        /* Get a superblock - note that we may end up sharing one that already exists */
-       s = sget(mount_info->nfs_mod->nfs_fs, compare_super, nfs_set_super,
-                flags, &sb_mntdata);
+       fc->s_fs_info = server;
+       s = sget_fc(fc, compare_super, nfs_set_super);
+       fc->s_fs_info = NULL;
        if (IS_ERR(s)) {
-               mntroot = ERR_CAST(s);
+               error = PTR_ERR(s);
+               nfs_errorf(fc, "NFS: Couldn't get superblock");
                goto out_err_nosb;
        }
 
@@ -1297,44 +1216,41 @@ static struct dentry *nfs_fs_mount_common(int flags, const char *dev_name,
        } else {
                error = super_setup_bdi_name(s, "%u:%u", MAJOR(server->s_dev),
                                             MINOR(server->s_dev));
-               if (error) {
-                       mntroot = ERR_PTR(error);
+               if (error)
                        goto error_splat_super;
-               }
                nfs_set_readahead(s->s_bdi, server->rpages);
                server->super = s;
        }
 
        if (!s->s_root) {
-               unsigned bsize = mount_info->inherited_bsize;
+               unsigned bsize = ctx->clone_data.inherited_bsize;
                /* initial superblock/root creation */
-               nfs_fill_super(s, mount_info);
+               nfs_fill_super(s, ctx);
                if (bsize) {
                        s->s_blocksize_bits = bsize;
                        s->s_blocksize = 1U << bsize;
                }
-               nfs_get_cache_cookie(s, mount_info->ctx, mount_info->cloned);
-               if (!(server->flags & NFS_MOUNT_UNSHARED))
-                       s->s_iflags |= SB_I_MULTIROOT;
+               nfs_get_cache_cookie(s, ctx);
        }
 
-       mntroot = nfs_get_root(s, mount_info->mntfh, dev_name);
-       if (IS_ERR(mntroot))
+       error = nfs_get_root(s, fc);
+       if (error < 0) {
+               nfs_errorf(fc, "NFS: Couldn't get root dentry");
                goto error_splat_super;
-
+       }
 
        if (NFS_SB(s)->caps & NFS_CAP_SECURITY_LABEL)
                kflags |= SECURITY_LSM_NATIVE_LABELS;
-       if (mount_info->cloned) {
-               if (d_inode(mntroot)->i_fop != &nfs_dir_operations) {
+       if (ctx->clone_data.sb) {
+               if (d_inode(fc->root)->i_fop != &nfs_dir_operations) {
                        error = -ESTALE;
                        goto error_splat_root;
                }
                /* clone any lsm security options from the parent to the new sb */
-               error = security_sb_clone_mnt_opts(mount_info->cloned->sb, s, kflags,
+               error = security_sb_clone_mnt_opts(ctx->clone_data.sb, s, kflags,
                                &kflags_out);
        } else {
-               error = security_sb_set_mnt_opts(s, mount_info->ctx->lsm_opts,
+               error = security_sb_set_mnt_opts(s, fc->security,
                                                        kflags, &kflags_out);
        }
        if (error)
@@ -1342,67 +1258,25 @@ static struct dentry *nfs_fs_mount_common(int flags, const char *dev_name,
        if (NFS_SB(s)->caps & NFS_CAP_SECURITY_LABEL &&
                !(kflags_out & SECURITY_LSM_NATIVE_LABELS))
                NFS_SB(s)->caps &= ~NFS_CAP_SECURITY_LABEL;
-       if (error)
-               goto error_splat_root;
 
        s->s_flags |= SB_ACTIVE;
+       error = 0;
 
 out:
-       return mntroot;
+       return error;
 
 out_err_nosb:
        nfs_free_server(server);
        goto out;
 
 error_splat_root:
-       dput(mntroot);
-       mntroot = ERR_PTR(error);
+       dput(fc->root);
+       fc->root = NULL;
 error_splat_super:
        deactivate_locked_super(s);
        goto out;
 }
 
-struct dentry *nfs_fs_mount(struct file_system_type *fs_type,
-       int flags, const char *dev_name, void *raw_data)
-{
-       struct nfs_mount_info mount_info = {
-       };
-       struct dentry *mntroot = ERR_PTR(-ENOMEM);
-       struct nfs_subversion *nfs_mod;
-       int error;
-
-       mount_info.ctx = nfs_alloc_parsed_mount_data();
-       mount_info.mntfh = nfs_alloc_fhandle();
-       if (mount_info.ctx == NULL || mount_info.mntfh == NULL)
-               goto out;
-
-       /* Validate the mount data */
-       error = nfs_validate_mount_data(fs_type, raw_data, mount_info.ctx, mount_info.mntfh, dev_name);
-       if (error == NFS_TEXT_DATA)
-               error = nfs_validate_text_mount_data(raw_data,
-                                                    mount_info.ctx, dev_name);
-       if (error < 0) {
-               mntroot = ERR_PTR(error);
-               goto out;
-       }
-
-       nfs_mod = get_nfs_version(mount_info.ctx->version);
-       if (IS_ERR(nfs_mod)) {
-               mntroot = ERR_CAST(nfs_mod);
-               goto out;
-       }
-       mount_info.nfs_mod = nfs_mod;
-
-       mntroot = nfs_mod->rpc_ops->try_mount(flags, dev_name, &mount_info);
-
-       put_nfs_version(nfs_mod);
-out:
-       nfs_free_parsed_mount_data(mount_info.ctx);
-       nfs_free_fhandle(mount_info.mntfh);
-       return mntroot;
-}
-EXPORT_SYMBOL_GPL(nfs_fs_mount);
-
 /*
  * Destroy an NFS2/3 superblock
  */
@@ -1420,17 +1294,6 @@ void nfs_kill_super(struct super_block *s)
 }
 EXPORT_SYMBOL_GPL(nfs_kill_super);
 
-/*
- * Internal use only: mount_info is already set up by caller.
- * Used for mountpoint crossings and for nfs4 root.
- */
-static struct dentry *
-nfs_prepared_mount(struct file_system_type *fs_type, int flags,
-                  const char *dev_name, void *raw_data)
-{
-       return nfs_fs_mount_common(flags, dev_name, raw_data);
-}
-
 #if IS_ENABLED(CONFIG_NFS_V4)
 
 /*