]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/nfs/client.c
NFS: Additional refactoring for fs_context conversion
[linux.git] / fs / nfs / client.c
index 30838304a0bf2393c214f822c868df07d4945490..8f760f23748c6d5ab47c86f67abe6433c709d8ff 100644 (file)
@@ -312,6 +312,12 @@ static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *dat
                /* Match nfsv4 minorversion */
                if (clp->cl_minorversion != data->minorversion)
                        continue;
+
+               /* Match request for a dedicated DS */
+               if (test_bit(NFS_CS_DS, &data->init_flags) !=
+                   test_bit(NFS_CS_DS, &clp->cl_flags))
+                       continue;
+
                /* Match the full socket address */
                if (!rpc_cmp_addr_port(sap, clap))
                        /* Match all xprt_switch full socket addresses */
@@ -515,6 +521,10 @@ int nfs_create_rpc_client(struct nfs_client *clp,
                args.flags |= RPC_CLNT_CREATE_NONPRIVPORT;
        if (test_bit(NFS_CS_INFINITE_SLOTS, &clp->cl_flags))
                args.flags |= RPC_CLNT_CREATE_INFINITE_SLOTS;
+       if (test_bit(NFS_CS_NOPING, &clp->cl_flags))
+               args.flags |= RPC_CLNT_CREATE_NOPING;
+       if (test_bit(NFS_CS_REUSEPORT, &clp->cl_flags))
+               args.flags |= RPC_CLNT_CREATE_REUSEPORT;
 
        if (!IS_ERR(clp->cl_rpcclient))
                return 0;
@@ -648,27 +658,28 @@ EXPORT_SYMBOL_GPL(nfs_init_client);
  * Create a version 2 or 3 client
  */
 static int nfs_init_server(struct nfs_server *server,
-                          const struct nfs_parsed_mount_data *data,
-                          struct nfs_subversion *nfs_mod)
+                          const struct fs_context *fc)
 {
+       const struct nfs_fs_context *ctx = nfs_fc2context(fc);
        struct rpc_timeout timeparms;
        struct nfs_client_initdata cl_init = {
-               .hostname = data->nfs_server.hostname,
-               .addr = (const struct sockaddr *)&data->nfs_server.address,
-               .addrlen = data->nfs_server.addrlen,
-               .nfs_mod = nfs_mod,
-               .proto = data->nfs_server.protocol,
-               .net = data->net,
+               .hostname = ctx->nfs_server.hostname,
+               .addr = (const struct sockaddr *)&ctx->nfs_server.address,
+               .addrlen = ctx->nfs_server.addrlen,
+               .nfs_mod = ctx->nfs_mod,
+               .proto = ctx->nfs_server.protocol,
+               .net = fc->net_ns,
                .timeparms = &timeparms,
                .cred = server->cred,
-               .nconnect = data->nfs_server.nconnect,
+               .nconnect = ctx->nfs_server.nconnect,
+               .init_flags = (1UL << NFS_CS_REUSEPORT),
        };
        struct nfs_client *clp;
        int error;
 
-       nfs_init_timeout_values(&timeparms, data->nfs_server.protocol,
-                       data->timeo, data->retrans);
-       if (data->flags & NFS_MOUNT_NORESVPORT)
+       nfs_init_timeout_values(&timeparms, ctx->nfs_server.protocol,
+                               ctx->timeo, ctx->retrans);
+       if (ctx->flags & NFS_MOUNT_NORESVPORT)
                set_bit(NFS_CS_NORESVPORT, &cl_init.init_flags);
 
        /* Allocate or find a client reference we can use */
@@ -679,46 +690,46 @@ static int nfs_init_server(struct nfs_server *server,
        server->nfs_client = clp;
 
        /* Initialise the client representation from the mount data */
-       server->flags = data->flags;
-       server->options = data->options;
+       server->flags = ctx->flags;
+       server->options = ctx->options;
        server->caps |= NFS_CAP_HARDLINKS|NFS_CAP_SYMLINKS|NFS_CAP_FILEID|
                NFS_CAP_MODE|NFS_CAP_NLINK|NFS_CAP_OWNER|NFS_CAP_OWNER_GROUP|
                NFS_CAP_ATIME|NFS_CAP_CTIME|NFS_CAP_MTIME;
 
-       if (data->rsize)
-               server->rsize = nfs_block_size(data->rsize, NULL);
-       if (data->wsize)
-               server->wsize = nfs_block_size(data->wsize, NULL);
+       if (ctx->rsize)
+               server->rsize = nfs_block_size(ctx->rsize, NULL);
+       if (ctx->wsize)
+               server->wsize = nfs_block_size(ctx->wsize, NULL);
 
-       server->acregmin = data->acregmin * HZ;
-       server->acregmax = data->acregmax * HZ;
-       server->acdirmin = data->acdirmin * HZ;
-       server->acdirmax = data->acdirmax * HZ;
+       server->acregmin = ctx->acregmin * HZ;
+       server->acregmax = ctx->acregmax * HZ;
+       server->acdirmin = ctx->acdirmin * HZ;
+       server->acdirmax = ctx->acdirmax * HZ;
 
        /* Start lockd here, before we might error out */
        error = nfs_start_lockd(server);
        if (error < 0)
                goto error;
 
-       server->port = data->nfs_server.port;
-       server->auth_info = data->auth_info;
+       server->port = ctx->nfs_server.port;
+       server->auth_info = ctx->auth_info;
 
        error = nfs_init_server_rpcclient(server, &timeparms,
-                                         data->selected_flavor);
+                                         ctx->selected_flavor);
        if (error < 0)
                goto error;
 
        /* Preserve the values of mount_server-related mount options */
-       if (data->mount_server.addrlen) {
-               memcpy(&server->mountd_address, &data->mount_server.address,
-                       data->mount_server.addrlen);
-               server->mountd_addrlen = data->mount_server.addrlen;
+       if (ctx->mount_server.addrlen) {
+               memcpy(&server->mountd_address, &ctx->mount_server.address,
+                       ctx->mount_server.addrlen);
+               server->mountd_addrlen = ctx->mount_server.addrlen;
        }
-       server->mountd_version = data->mount_server.version;
-       server->mountd_port = data->mount_server.port;
-       server->mountd_protocol = data->mount_server.protocol;
+       server->mountd_version = ctx->mount_server.version;
+       server->mountd_port = ctx->mount_server.port;
+       server->mountd_protocol = ctx->mount_server.protocol;
 
-       server->namelen  = data->namlen;
+       server->namelen  = ctx->namlen;
        return 0;
 
 error:
@@ -940,9 +951,9 @@ EXPORT_SYMBOL_GPL(nfs_free_server);
  * Create a version 2 or 3 volume record
  * - keyed on server and FSID
  */
-struct nfs_server *nfs_create_server(struct nfs_mount_info *mount_info,
-                                    struct nfs_subversion *nfs_mod)
+struct nfs_server *nfs_create_server(struct fs_context *fc)
 {
+       struct nfs_fs_context *ctx = nfs_fc2context(fc);
        struct nfs_server *server;
        struct nfs_fattr *fattr;
        int error;
@@ -959,18 +970,18 @@ struct nfs_server *nfs_create_server(struct nfs_mount_info *mount_info,
                goto error;
 
        /* Get a client representation */
-       error = nfs_init_server(server, mount_info->parsed, nfs_mod);
+       error = nfs_init_server(server, fc);
        if (error < 0)
                goto error;
 
        /* Probe the root fh to retrieve its FSID */
-       error = nfs_probe_fsinfo(server, mount_info->mntfh, fattr);
+       error = nfs_probe_fsinfo(server, ctx->mntfh, fattr);
        if (error < 0)
                goto error;
        if (server->nfs_client->rpc_ops->version == 3) {
                if (server->namelen == 0 || server->namelen > NFS3_MAXNAMLEN)
                        server->namelen = NFS3_MAXNAMLEN;
-               if (!(mount_info->parsed->flags & NFS_MOUNT_NORDIRPLUS))
+               if (!(ctx->flags & NFS_MOUNT_NORDIRPLUS))
                        server->caps |= NFS_CAP_READDIRPLUS;
        } else {
                if (server->namelen == 0 || server->namelen > NFS2_MAXNAMLEN)
@@ -978,8 +989,8 @@ struct nfs_server *nfs_create_server(struct nfs_mount_info *mount_info,
        }
 
        if (!(fattr->valid & NFS_ATTR_FATTR)) {
-               error = nfs_mod->rpc_ops->getattr(server, mount_info->mntfh,
-                               fattr, NULL, NULL);
+               error = ctx->nfs_mod->rpc_ops->getattr(server, ctx->mntfh,
+                                                      fattr, NULL, NULL);
                if (error < 0) {
                        dprintk("nfs_create_server: getattr error = %d\n", -error);
                        goto error;