Commit 45a52a02 authored by Andy Adamson's avatar Andy Adamson Committed by Trond Myklebust

NFS move nfs_client initialization into nfs_get_client

Now nfs_get_client returns an nfs_client ready to be used no matter if it was
found or created.
Signed-off-by: default avatarAndy Adamson <andros@netapp.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent bf9c1387
...@@ -481,7 +481,12 @@ static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *dat ...@@ -481,7 +481,12 @@ static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *dat
* Look up a client by IP address and protocol version * Look up a client by IP address and protocol version
* - creates a new record if one doesn't yet exist * - creates a new record if one doesn't yet exist
*/ */
static struct nfs_client *nfs_get_client(const struct nfs_client_initdata *cl_init) static struct nfs_client *
nfs_get_client(const struct nfs_client_initdata *cl_init,
const struct rpc_timeout *timeparms,
const char *ip_addr,
rpc_authflavor_t authflavour,
int noresvport)
{ {
struct nfs_client *clp, *new = NULL; struct nfs_client *clp, *new = NULL;
int error; int error;
...@@ -512,6 +517,13 @@ static struct nfs_client *nfs_get_client(const struct nfs_client_initdata *cl_in ...@@ -512,6 +517,13 @@ static struct nfs_client *nfs_get_client(const struct nfs_client_initdata *cl_in
clp = new; clp = new;
list_add(&clp->cl_share_link, &nfs_client_list); list_add(&clp->cl_share_link, &nfs_client_list);
spin_unlock(&nfs_client_lock); spin_unlock(&nfs_client_lock);
error = cl_init->rpc_ops->init_client(clp, timeparms, ip_addr,
authflavour, noresvport);
if (error < 0) {
nfs_put_client(clp);
return ERR_PTR(error);
}
dprintk("--> nfs_get_client() = %p [new]\n", clp); dprintk("--> nfs_get_client() = %p [new]\n", clp);
return clp; return clp;
...@@ -767,9 +779,9 @@ static int nfs_init_server_rpcclient(struct nfs_server *server, ...@@ -767,9 +779,9 @@ static int nfs_init_server_rpcclient(struct nfs_server *server,
/* /*
* Initialise an NFS2 or NFS3 client * Initialise an NFS2 or NFS3 client
*/ */
static int nfs_init_client(struct nfs_client *clp, int nfs_init_client(struct nfs_client *clp, const struct rpc_timeout *timeparms,
const struct rpc_timeout *timeparms, const char *ip_addr, rpc_authflavor_t authflavour,
const struct nfs_parsed_mount_data *data) int noresvport)
{ {
int error; int error;
...@@ -784,7 +796,7 @@ static int nfs_init_client(struct nfs_client *clp, ...@@ -784,7 +796,7 @@ static int nfs_init_client(struct nfs_client *clp,
* - RFC 2623, sec 2.3.2 * - RFC 2623, sec 2.3.2
*/ */
error = nfs_create_rpc_client(clp, timeparms, RPC_AUTH_UNIX, error = nfs_create_rpc_client(clp, timeparms, RPC_AUTH_UNIX,
0, data->flags & NFS_MOUNT_NORESVPORT); 0, noresvport);
if (error < 0) if (error < 0)
goto error; goto error;
nfs_mark_client_ready(clp, NFS_CS_READY); nfs_mark_client_ready(clp, NFS_CS_READY);
...@@ -820,19 +832,17 @@ static int nfs_init_server(struct nfs_server *server, ...@@ -820,19 +832,17 @@ static int nfs_init_server(struct nfs_server *server,
cl_init.rpc_ops = &nfs_v3_clientops; cl_init.rpc_ops = &nfs_v3_clientops;
#endif #endif
nfs_init_timeout_values(&timeparms, data->nfs_server.protocol,
data->timeo, data->retrans);
/* Allocate or find a client reference we can use */ /* Allocate or find a client reference we can use */
clp = nfs_get_client(&cl_init); clp = nfs_get_client(&cl_init, &timeparms, NULL, RPC_AUTH_UNIX,
data->flags & NFS_MOUNT_NORESVPORT);
if (IS_ERR(clp)) { if (IS_ERR(clp)) {
dprintk("<-- nfs_init_server() = error %ld\n", PTR_ERR(clp)); dprintk("<-- nfs_init_server() = error %ld\n", PTR_ERR(clp));
return PTR_ERR(clp); return PTR_ERR(clp);
} }
nfs_init_timeout_values(&timeparms, data->nfs_server.protocol,
data->timeo, data->retrans);
error = nfs_init_client(clp, &timeparms, data);
if (error < 0)
goto error;
server->nfs_client = clp; server->nfs_client = clp;
/* Initialise the client representation from the mount data */ /* Initialise the client representation from the mount data */
...@@ -1307,11 +1317,11 @@ static int nfs4_init_client_minor_version(struct nfs_client *clp) ...@@ -1307,11 +1317,11 @@ static int nfs4_init_client_minor_version(struct nfs_client *clp)
/* /*
* Initialise an NFS4 client record * Initialise an NFS4 client record
*/ */
static int nfs4_init_client(struct nfs_client *clp, int nfs4_init_client(struct nfs_client *clp,
const struct rpc_timeout *timeparms, const struct rpc_timeout *timeparms,
const char *ip_addr, const char *ip_addr,
rpc_authflavor_t authflavour, rpc_authflavor_t authflavour,
int flags) int noresvport)
{ {
int error; int error;
...@@ -1325,7 +1335,7 @@ static int nfs4_init_client(struct nfs_client *clp, ...@@ -1325,7 +1335,7 @@ static int nfs4_init_client(struct nfs_client *clp,
clp->rpc_ops = &nfs_v4_clientops; clp->rpc_ops = &nfs_v4_clientops;
error = nfs_create_rpc_client(clp, timeparms, authflavour, error = nfs_create_rpc_client(clp, timeparms, authflavour,
1, flags & NFS_MOUNT_NORESVPORT); 1, noresvport);
if (error < 0) if (error < 0)
goto error; goto error;
strlcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr)); strlcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr));
...@@ -1378,22 +1388,16 @@ static int nfs4_set_client(struct nfs_server *server, ...@@ -1378,22 +1388,16 @@ static int nfs4_set_client(struct nfs_server *server,
dprintk("--> nfs4_set_client()\n"); dprintk("--> nfs4_set_client()\n");
/* Allocate or find a client reference we can use */ /* Allocate or find a client reference we can use */
clp = nfs_get_client(&cl_init); clp = nfs_get_client(&cl_init, timeparms, ip_addr, authflavour,
server->flags & NFS_MOUNT_NORESVPORT);
if (IS_ERR(clp)) { if (IS_ERR(clp)) {
error = PTR_ERR(clp); error = PTR_ERR(clp);
goto error; goto error;
} }
error = nfs4_init_client(clp, timeparms, ip_addr, authflavour,
server->flags);
if (error < 0)
goto error_put;
server->nfs_client = clp; server->nfs_client = clp;
dprintk("<-- nfs4_set_client() = 0 [new %p]\n", clp); dprintk("<-- nfs4_set_client() = 0 [new %p]\n", clp);
return 0; return 0;
error_put:
nfs_put_client(clp);
error: error:
dprintk("<-- nfs4_set_client() = xerror %d\n", error); dprintk("<-- nfs4_set_client() = xerror %d\n", error);
return error; return error;
......
...@@ -215,6 +215,10 @@ extern struct rpc_procinfo nfs4_procedures[]; ...@@ -215,6 +215,10 @@ extern struct rpc_procinfo nfs4_procedures[];
/* proc.c */ /* proc.c */
void nfs_close_context(struct nfs_open_context *ctx, int is_sync); void nfs_close_context(struct nfs_open_context *ctx, int is_sync);
extern int nfs_init_client(struct nfs_client *clp,
const struct rpc_timeout *timeparms,
const char *ip_addr, rpc_authflavor_t authflavour,
int noresvport);
/* dir.c */ /* dir.c */
extern int nfs_access_cache_shrinker(struct shrinker *shrink, extern int nfs_access_cache_shrinker(struct shrinker *shrink,
...@@ -274,6 +278,11 @@ extern int nfs_migrate_page(struct address_space *, ...@@ -274,6 +278,11 @@ extern int nfs_migrate_page(struct address_space *,
#endif #endif
/* nfs4proc.c */ /* nfs4proc.c */
extern int nfs4_init_client(struct nfs_client *clp,
const struct rpc_timeout *timeparms,
const char *ip_addr,
rpc_authflavor_t authflavour,
int noresvport);
extern int _nfs4_call_sync(struct nfs_server *server, extern int _nfs4_call_sync(struct nfs_server *server,
struct rpc_message *msg, struct rpc_message *msg,
struct nfs4_sequence_args *args, struct nfs4_sequence_args *args,
......
...@@ -885,4 +885,5 @@ const struct nfs_rpc_ops nfs_v3_clientops = { ...@@ -885,4 +885,5 @@ const struct nfs_rpc_ops nfs_v3_clientops = {
.lock = nfs3_proc_lock, .lock = nfs3_proc_lock,
.clear_acl_cache = nfs3_forget_cached_acls, .clear_acl_cache = nfs3_forget_cached_acls,
.close_context = nfs_close_context, .close_context = nfs_close_context,
.init_client = nfs_init_client,
}; };
...@@ -5648,6 +5648,7 @@ const struct nfs_rpc_ops nfs_v4_clientops = { ...@@ -5648,6 +5648,7 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
.clear_acl_cache = nfs4_zap_acl_attr, .clear_acl_cache = nfs4_zap_acl_attr,
.close_context = nfs4_close_context, .close_context = nfs4_close_context,
.open_context = nfs4_atomic_open, .open_context = nfs4_atomic_open,
.init_client = nfs4_init_client,
}; };
static const struct xattr_handler nfs4_xattr_nfs4_acl_handler = { static const struct xattr_handler nfs4_xattr_nfs4_acl_handler = {
......
...@@ -741,4 +741,5 @@ const struct nfs_rpc_ops nfs_v2_clientops = { ...@@ -741,4 +741,5 @@ const struct nfs_rpc_ops nfs_v2_clientops = {
.lock = nfs_proc_lock, .lock = nfs_proc_lock,
.lock_check_bounds = nfs_lock_check_bounds, .lock_check_bounds = nfs_lock_check_bounds,
.close_context = nfs_close_context, .close_context = nfs_close_context,
.init_client = nfs_init_client,
}; };
...@@ -1040,6 +1040,7 @@ struct nfs_write_data { ...@@ -1040,6 +1040,7 @@ struct nfs_write_data {
}; };
struct nfs_access_entry; struct nfs_access_entry;
struct nfs_client;
/* /*
* RPC procedure vector for NFSv2/NFSv3 demuxing * RPC procedure vector for NFSv2/NFSv3 demuxing
...@@ -1104,6 +1105,8 @@ struct nfs_rpc_ops { ...@@ -1104,6 +1105,8 @@ struct nfs_rpc_ops {
struct nfs_open_context *ctx, struct nfs_open_context *ctx,
int open_flags, int open_flags,
struct iattr *iattr); struct iattr *iattr);
int (*init_client) (struct nfs_client *, const struct rpc_timeout *,
const char *, rpc_authflavor_t, int);
}; };
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment