提交 3a498026 编写于 作者: T Trond Myklebust

NFS: Clean up the nfs_client initialisation

Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
上级 bfc69a45
...@@ -93,22 +93,26 @@ struct rpc_program nfsacl_program = { ...@@ -93,22 +93,26 @@ struct rpc_program nfsacl_program = {
}; };
#endif /* CONFIG_NFS_V3_ACL */ #endif /* CONFIG_NFS_V3_ACL */
struct nfs_client_initdata {
const char *hostname;
const struct sockaddr_in *addr;
int version;
};
/* /*
* Allocate a shared client record * Allocate a shared client record
* *
* Since these are allocated/deallocated very rarely, we don't * Since these are allocated/deallocated very rarely, we don't
* bother putting them in a slab cache... * bother putting them in a slab cache...
*/ */
static struct nfs_client *nfs_alloc_client(const char *hostname, static struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init)
const struct sockaddr_in *addr,
int nfsversion)
{ {
struct nfs_client *clp; struct nfs_client *clp;
if ((clp = kzalloc(sizeof(*clp), GFP_KERNEL)) == NULL) if ((clp = kzalloc(sizeof(*clp), GFP_KERNEL)) == NULL)
goto error_0; goto error_0;
if (nfsversion == 4) { if (cl_init->version == 4) {
if (nfs_callback_up() < 0) if (nfs_callback_up() < 0)
goto error_2; goto error_2;
__set_bit(NFS_CS_CALLBACK, &clp->cl_res_state); __set_bit(NFS_CS_CALLBACK, &clp->cl_res_state);
...@@ -117,11 +121,11 @@ static struct nfs_client *nfs_alloc_client(const char *hostname, ...@@ -117,11 +121,11 @@ static struct nfs_client *nfs_alloc_client(const char *hostname,
atomic_set(&clp->cl_count, 1); atomic_set(&clp->cl_count, 1);
clp->cl_cons_state = NFS_CS_INITING; clp->cl_cons_state = NFS_CS_INITING;
clp->cl_nfsversion = nfsversion; clp->cl_nfsversion = cl_init->version;
memcpy(&clp->cl_addr, addr, sizeof(clp->cl_addr)); memcpy(&clp->cl_addr, cl_init->addr, sizeof(clp->cl_addr));
if (hostname) { if (cl_init->hostname) {
clp->cl_hostname = kstrdup(hostname, GFP_KERNEL); clp->cl_hostname = kstrdup(cl_init->hostname, GFP_KERNEL);
if (!clp->cl_hostname) if (!clp->cl_hostname)
goto error_3; goto error_3;
} }
...@@ -256,22 +260,20 @@ struct nfs_client *nfs_find_client(const struct sockaddr_in *addr, int nfsversio ...@@ -256,22 +260,20 @@ struct nfs_client *nfs_find_client(const struct sockaddr_in *addr, int nfsversio
* 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 char *hostname, static struct nfs_client *nfs_get_client(const struct nfs_client_initdata *cl_init)
const struct sockaddr_in *addr,
int nfsversion)
{ {
struct nfs_client *clp, *new = NULL; struct nfs_client *clp, *new = NULL;
int error; int error;
dprintk("--> nfs_get_client(%s,"NIPQUAD_FMT":%d,%d)\n", dprintk("--> nfs_get_client(%s,"NIPQUAD_FMT":%d,%d)\n",
hostname ?: "", NIPQUAD(addr->sin_addr), cl_init->hostname ?: "", NIPQUAD(cl_init->addr->sin_addr),
addr->sin_port, nfsversion); cl_init->addr->sin_port, cl_init->version);
/* see if the client already exists */ /* see if the client already exists */
do { do {
spin_lock(&nfs_client_lock); spin_lock(&nfs_client_lock);
clp = __nfs_find_client(addr, nfsversion, 1); clp = __nfs_find_client(cl_init->addr, cl_init->version, 1);
if (clp) if (clp)
goto found_client; goto found_client;
if (new) if (new)
...@@ -279,7 +281,7 @@ static struct nfs_client *nfs_get_client(const char *hostname, ...@@ -279,7 +281,7 @@ static struct nfs_client *nfs_get_client(const char *hostname,
spin_unlock(&nfs_client_lock); spin_unlock(&nfs_client_lock);
new = nfs_alloc_client(hostname, addr, nfsversion); new = nfs_alloc_client(cl_init);
} while (new); } while (new);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
...@@ -540,19 +542,23 @@ static int nfs_init_client(struct nfs_client *clp, ...@@ -540,19 +542,23 @@ static int nfs_init_client(struct nfs_client *clp,
static int nfs_init_server(struct nfs_server *server, static int nfs_init_server(struct nfs_server *server,
const struct nfs_parsed_mount_data *data) const struct nfs_parsed_mount_data *data)
{ {
struct nfs_client_initdata cl_init = {
.hostname = data->nfs_server.hostname,
.addr = &data->nfs_server.address,
.version = 2,
};
struct nfs_client *clp; struct nfs_client *clp;
int error, nfsvers = 2; int error;
dprintk("--> nfs_init_server()\n"); dprintk("--> nfs_init_server()\n");
#ifdef CONFIG_NFS_V3 #ifdef CONFIG_NFS_V3
if (data->flags & NFS_MOUNT_VER3) if (data->flags & NFS_MOUNT_VER3)
nfsvers = 3; cl_init.version = 3;
#endif #endif
/* Allocate or find a client reference we can use */ /* Allocate or find a client reference we can use */
clp = nfs_get_client(data->nfs_server.hostname, clp = nfs_get_client(&cl_init);
&data->nfs_server.address, nfsvers);
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);
...@@ -889,13 +895,18 @@ static int nfs4_set_client(struct nfs_server *server, ...@@ -889,13 +895,18 @@ static int nfs4_set_client(struct nfs_server *server,
rpc_authflavor_t authflavour, rpc_authflavor_t authflavour,
int proto, int timeo, int retrans) int proto, int timeo, int retrans)
{ {
struct nfs_client_initdata cl_init = {
.hostname = hostname,
.addr = addr,
.version = 4,
};
struct nfs_client *clp; struct nfs_client *clp;
int error; int error;
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(hostname, addr, 4); clp = nfs_get_client(&cl_init);
if (IS_ERR(clp)) { if (IS_ERR(clp)) {
error = PTR_ERR(clp); error = PTR_ERR(clp);
goto error; goto error;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册