mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-15 00:34:10 +08:00
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: Andy Adamson <andros@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
bf9c1387ca
commit
45a52a0207
@ -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 @@ install_client:
|
|||||||
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,
|
|||||||
/*
|
/*
|
||||||
* 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,
|
|||||||
* - 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,
|
|||||||
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)
|
|||||||
/*
|
/*
|
||||||
* 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,
|
|||||||
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,
|
|||||||
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[];
|
|||||||
|
|
||||||
/* 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 *,
|
|||||||
#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 = {
|
|||||||
.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 = {
|
|||||||
.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 = {
|
|||||||
.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 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
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 {
|
|||||||
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);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user