Skip to content

Commit c818ba4

Browse files
Manoj NaikTrond Myklebust
authored andcommitted
NFSv4: Create NFSv4 transport and client
Move existing code into a separate function so that it can be also used by referral code. Signed-off-by: Manoj Naik <manoj@almaden.ibm.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
1 parent 830b8e3 commit c818ba4

File tree

1 file changed

+73
-58
lines changed

1 file changed

+73
-58
lines changed

fs/nfs/inode.c

Lines changed: 73 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -2027,62 +2027,24 @@ static void nfs4_clear_inode(struct inode *inode)
20272027
}
20282028

20292029

2030-
static int nfs4_fill_super(struct super_block *sb, struct nfs4_mount_data *data, int silent)
2030+
static struct rpc_clnt *nfs4_create_client(struct nfs_server *server,
2031+
struct rpc_timeout *timeparms, int proto, rpc_authflavor_t flavor)
20312032
{
2032-
struct nfs_server *server;
2033-
struct nfs4_client *clp = NULL;
2033+
struct nfs4_client *clp;
20342034
struct rpc_xprt *xprt = NULL;
20352035
struct rpc_clnt *clnt = NULL;
2036-
struct rpc_timeout timeparms;
2037-
rpc_authflavor_t authflavour;
20382036
int err = -EIO;
20392037

2040-
sb->s_blocksize_bits = 0;
2041-
sb->s_blocksize = 0;
2042-
server = NFS_SB(sb);
2043-
if (data->rsize != 0)
2044-
server->rsize = nfs_block_size(data->rsize, NULL);
2045-
if (data->wsize != 0)
2046-
server->wsize = nfs_block_size(data->wsize, NULL);
2047-
server->flags = data->flags & NFS_MOUNT_FLAGMASK;
2048-
server->caps = NFS_CAP_ATOMIC_OPEN;
2049-
2050-
server->acregmin = data->acregmin*HZ;
2051-
server->acregmax = data->acregmax*HZ;
2052-
server->acdirmin = data->acdirmin*HZ;
2053-
server->acdirmax = data->acdirmax*HZ;
2054-
2055-
server->rpc_ops = &nfs_v4_clientops;
2056-
2057-
nfs_init_timeout_values(&timeparms, data->proto, data->timeo, data->retrans);
2058-
2059-
server->retrans_timeo = timeparms.to_initval;
2060-
server->retrans_count = timeparms.to_retries;
2061-
20622038
clp = nfs4_get_client(&server->addr.sin_addr);
20632039
if (!clp) {
20642040
dprintk("%s: failed to create NFS4 client.\n", __FUNCTION__);
2065-
return -EIO;
2041+
return ERR_PTR(err);
20662042
}
20672043

20682044
/* Now create transport and client */
2069-
authflavour = RPC_AUTH_UNIX;
2070-
if (data->auth_flavourlen != 0) {
2071-
if (data->auth_flavourlen != 1) {
2072-
dprintk("%s: Invalid number of RPC auth flavours %d.\n",
2073-
__FUNCTION__, data->auth_flavourlen);
2074-
err = -EINVAL;
2075-
goto out_fail;
2076-
}
2077-
if (copy_from_user(&authflavour, data->auth_flavours, sizeof(authflavour))) {
2078-
err = -EFAULT;
2079-
goto out_fail;
2080-
}
2081-
}
2082-
20832045
down_write(&clp->cl_sem);
20842046
if (IS_ERR(clp->cl_rpcclient)) {
2085-
xprt = xprt_create_proto(data->proto, &server->addr, &timeparms);
2047+
xprt = xprt_create_proto(proto, &server->addr, timeparms);
20862048
if (IS_ERR(xprt)) {
20872049
up_write(&clp->cl_sem);
20882050
err = PTR_ERR(xprt);
@@ -2091,7 +2053,7 @@ static int nfs4_fill_super(struct super_block *sb, struct nfs4_mount_data *data,
20912053
goto out_fail;
20922054
}
20932055
clnt = rpc_create_client(xprt, server->hostname, &nfs_program,
2094-
server->rpc_ops->version, authflavour);
2056+
server->rpc_ops->version, flavor);
20952057
if (IS_ERR(clnt)) {
20962058
up_write(&clp->cl_sem);
20972059
err = PTR_ERR(clnt);
@@ -2108,43 +2070,96 @@ static int nfs4_fill_super(struct super_block *sb, struct nfs4_mount_data *data,
21082070
list_add_tail(&server->nfs4_siblings, &clp->cl_superblocks);
21092071
clnt = rpc_clone_client(clp->cl_rpcclient);
21102072
if (!IS_ERR(clnt))
2111-
server->nfs4_state = clp;
2073+
server->nfs4_state = clp;
21122074
up_write(&clp->cl_sem);
21132075
clp = NULL;
21142076

21152077
if (IS_ERR(clnt)) {
2116-
err = PTR_ERR(clnt);
21172078
dprintk("%s: cannot create RPC client. Error = %d\n",
21182079
__FUNCTION__, err);
2119-
return err;
2080+
return clnt;
21202081
}
21212082

2122-
server->client = clnt;
2123-
21242083
if (server->nfs4_state->cl_idmap == NULL) {
21252084
dprintk("%s: failed to create idmapper.\n", __FUNCTION__);
2126-
return -ENOMEM;
2085+
return ERR_PTR(-ENOMEM);
21272086
}
21282087

2129-
if (clnt->cl_auth->au_flavor != authflavour) {
2088+
if (clnt->cl_auth->au_flavor != flavor) {
21302089
struct rpc_auth *auth;
21312090

2132-
auth = rpcauth_create(authflavour, clnt);
2091+
auth = rpcauth_create(flavor, clnt);
21332092
if (IS_ERR(auth)) {
21342093
dprintk("%s: couldn't create credcache!\n", __FUNCTION__);
2135-
return PTR_ERR(auth);
2094+
return (struct rpc_clnt *)auth;
2095+
}
2096+
}
2097+
return clnt;
2098+
2099+
out_fail:
2100+
if (clp)
2101+
nfs4_put_client(clp);
2102+
return ERR_PTR(err);
2103+
}
2104+
2105+
static int nfs4_fill_super(struct super_block *sb, struct nfs4_mount_data *data, int silent)
2106+
{
2107+
struct nfs_server *server;
2108+
struct rpc_timeout timeparms;
2109+
rpc_authflavor_t authflavour;
2110+
int err = -EIO;
2111+
2112+
sb->s_blocksize_bits = 0;
2113+
sb->s_blocksize = 0;
2114+
server = NFS_SB(sb);
2115+
if (data->rsize != 0)
2116+
server->rsize = nfs_block_size(data->rsize, NULL);
2117+
if (data->wsize != 0)
2118+
server->wsize = nfs_block_size(data->wsize, NULL);
2119+
server->flags = data->flags & NFS_MOUNT_FLAGMASK;
2120+
server->caps = NFS_CAP_ATOMIC_OPEN;
2121+
2122+
server->acregmin = data->acregmin*HZ;
2123+
server->acregmax = data->acregmax*HZ;
2124+
server->acdirmin = data->acdirmin*HZ;
2125+
server->acdirmax = data->acdirmax*HZ;
2126+
2127+
server->rpc_ops = &nfs_v4_clientops;
2128+
2129+
nfs_init_timeout_values(&timeparms, data->proto, data->timeo, data->retrans);
2130+
2131+
server->retrans_timeo = timeparms.to_initval;
2132+
server->retrans_count = timeparms.to_retries;
2133+
2134+
/* Now create transport and client */
2135+
authflavour = RPC_AUTH_UNIX;
2136+
if (data->auth_flavourlen != 0) {
2137+
if (data->auth_flavourlen != 1) {
2138+
dprintk("%s: Invalid number of RPC auth flavours %d.\n",
2139+
__FUNCTION__, data->auth_flavourlen);
2140+
err = -EINVAL;
2141+
goto out_fail;
2142+
}
2143+
if (copy_from_user(&authflavour, data->auth_flavours, sizeof(authflavour))) {
2144+
err = -EFAULT;
2145+
goto out_fail;
21362146
}
21372147
}
21382148

2149+
server->client = nfs4_create_client(server, &timeparms, data->proto, authflavour);
2150+
if (IS_ERR(server->client)) {
2151+
err = PTR_ERR(server->client);
2152+
dprintk("%s: cannot create RPC client. Error = %d\n",
2153+
__FUNCTION__, err);
2154+
goto out_fail;
2155+
}
2156+
21392157
sb->s_time_gran = 1;
21402158

21412159
sb->s_op = &nfs4_sops;
21422160
err = nfs_sb_init(sb, authflavour);
2143-
if (err == 0)
2144-
return 0;
2145-
out_fail:
2146-
if (clp)
2147-
nfs4_put_client(clp);
2161+
2162+
out_fail:
21482163
return err;
21492164
}
21502165

0 commit comments

Comments
 (0)