Commit 4e0038b6 authored by Trond Myklebust's avatar Trond Myklebust

SUNRPC: Move clnt->cl_server into struct rpc_xprt

When the cl_xprt field is updated, the cl_server field will also have
to change.  Since the contents of cl_server follow the remote endpoint
of cl_xprt, just move that field to the rpc_xprt.
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
[ cel: simplify check_gss_callback_principal(), whitespace changes ]
[ cel: forward ported to 3.4 ]
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 2446ab60
...@@ -332,7 +332,6 @@ void nfs_callback_down(int minorversion) ...@@ -332,7 +332,6 @@ void nfs_callback_down(int minorversion)
int int
check_gss_callback_principal(struct nfs_client *clp, struct svc_rqst *rqstp) check_gss_callback_principal(struct nfs_client *clp, struct svc_rqst *rqstp)
{ {
struct rpc_clnt *r = clp->cl_rpcclient;
char *p = svc_gss_principal(rqstp); char *p = svc_gss_principal(rqstp);
if (rqstp->rq_authop->flavour != RPC_AUTH_GSS) if (rqstp->rq_authop->flavour != RPC_AUTH_GSS)
...@@ -353,7 +352,7 @@ check_gss_callback_principal(struct nfs_client *clp, struct svc_rqst *rqstp) ...@@ -353,7 +352,7 @@ check_gss_callback_principal(struct nfs_client *clp, struct svc_rqst *rqstp)
if (memcmp(p, "nfs@", 4) != 0) if (memcmp(p, "nfs@", 4) != 0)
return 0; return 0;
p += 4; p += 4;
if (strcmp(p, r->cl_server) != 0) if (strcmp(p, clp->cl_hostname) != 0)
return 0; return 0;
return 1; return 1;
} }
......
...@@ -1100,6 +1100,7 @@ static struct nfs4_state *nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data ...@@ -1100,6 +1100,7 @@ static struct nfs4_state *nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data
if (state == NULL) if (state == NULL)
goto err_put_inode; goto err_put_inode;
if (data->o_res.delegation_type != 0) { if (data->o_res.delegation_type != 0) {
struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
int delegation_flags = 0; int delegation_flags = 0;
rcu_read_lock(); rcu_read_lock();
...@@ -1111,7 +1112,7 @@ static struct nfs4_state *nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data ...@@ -1111,7 +1112,7 @@ static struct nfs4_state *nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data
pr_err_ratelimited("NFS: Broken NFSv4 server %s is " pr_err_ratelimited("NFS: Broken NFSv4 server %s is "
"returning a delegation for " "returning a delegation for "
"OPEN(CLAIM_DELEGATE_CUR)\n", "OPEN(CLAIM_DELEGATE_CUR)\n",
NFS_CLIENT(inode)->cl_server); clp->cl_hostname);
} else if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0) } else if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0)
nfs_inode_set_delegation(state->inode, nfs_inode_set_delegation(state->inode,
data->owner->so_cred, data->owner->so_cred,
......
...@@ -41,7 +41,6 @@ struct rpc_clnt { ...@@ -41,7 +41,6 @@ struct rpc_clnt {
cl_vers, /* RPC version number */ cl_vers, /* RPC version number */
cl_maxproc; /* max procedure number */ cl_maxproc; /* max procedure number */
const char * cl_server; /* server machine name */
const char * cl_protname; /* protocol name */ const char * cl_protname; /* protocol name */
struct rpc_auth * cl_auth; /* authenticator */ struct rpc_auth * cl_auth; /* authenticator */
struct rpc_stat * cl_stats; /* per-program statistics */ struct rpc_stat * cl_stats; /* per-program statistics */
......
...@@ -229,6 +229,7 @@ struct rpc_xprt { ...@@ -229,6 +229,7 @@ struct rpc_xprt {
} stat; } stat;
struct net *xprt_net; struct net *xprt_net;
const char *servername;
const char *address_strings[RPC_DISPLAY_MAX]; const char *address_strings[RPC_DISPLAY_MAX];
}; };
...@@ -258,6 +259,7 @@ struct xprt_create { ...@@ -258,6 +259,7 @@ struct xprt_create {
struct sockaddr * srcaddr; /* optional local address */ struct sockaddr * srcaddr; /* optional local address */
struct sockaddr * dstaddr; /* remote peer address */ struct sockaddr * dstaddr; /* remote peer address */
size_t addrlen; size_t addrlen;
const char *servername;
struct svc_xprt *bc_xprt; /* NFSv4.1 backchannel */ struct svc_xprt *bc_xprt; /* NFSv4.1 backchannel */
}; };
......
...@@ -265,15 +265,8 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, stru ...@@ -265,15 +265,8 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, stru
struct rpc_clnt *clnt = NULL; struct rpc_clnt *clnt = NULL;
struct rpc_auth *auth; struct rpc_auth *auth;
int err; int err;
size_t len;
/* sanity check the name before trying to print it */ /* sanity check the name before trying to print it */
err = -EINVAL;
len = strlen(args->servername);
if (len > RPC_MAXNETNAMELEN)
goto out_no_rpciod;
len++;
dprintk("RPC: creating %s client for %s (xprt %p)\n", dprintk("RPC: creating %s client for %s (xprt %p)\n",
program->name, args->servername, xprt); program->name, args->servername, xprt);
...@@ -296,10 +289,6 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, stru ...@@ -296,10 +289,6 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, stru
goto out_err; goto out_err;
clnt->cl_parent = clnt; clnt->cl_parent = clnt;
clnt->cl_server = kstrdup(args->servername, GFP_KERNEL);
if (clnt->cl_server == NULL)
goto out_no_server;
rcu_assign_pointer(clnt->cl_xprt, xprt); rcu_assign_pointer(clnt->cl_xprt, xprt);
clnt->cl_procinfo = version->procs; clnt->cl_procinfo = version->procs;
clnt->cl_maxproc = version->nrprocs; clnt->cl_maxproc = version->nrprocs;
...@@ -363,8 +352,6 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, stru ...@@ -363,8 +352,6 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, stru
out_no_principal: out_no_principal:
rpc_free_iostats(clnt->cl_metrics); rpc_free_iostats(clnt->cl_metrics);
out_no_stats: out_no_stats:
kfree(clnt->cl_server);
out_no_server:
kfree(clnt); kfree(clnt);
out_err: out_err:
xprt_put(xprt); xprt_put(xprt);
...@@ -394,6 +381,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args) ...@@ -394,6 +381,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
.srcaddr = args->saddress, .srcaddr = args->saddress,
.dstaddr = args->address, .dstaddr = args->address,
.addrlen = args->addrsize, .addrlen = args->addrsize,
.servername = args->servername,
.bc_xprt = args->bc_xprt, .bc_xprt = args->bc_xprt,
}; };
char servername[48]; char servername[48];
...@@ -402,7 +390,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args) ...@@ -402,7 +390,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
* If the caller chooses not to specify a hostname, whip * If the caller chooses not to specify a hostname, whip
* up a string representation of the passed-in address. * up a string representation of the passed-in address.
*/ */
if (args->servername == NULL) { if (xprtargs.servername == NULL) {
struct sockaddr_un *sun = struct sockaddr_un *sun =
(struct sockaddr_un *)args->address; (struct sockaddr_un *)args->address;
struct sockaddr_in *sin = struct sockaddr_in *sin =
...@@ -429,7 +417,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args) ...@@ -429,7 +417,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
* address family isn't recognized. */ * address family isn't recognized. */
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
args->servername = servername; xprtargs.servername = servername;
} }
xprt = xprt_create_transport(&xprtargs); xprt = xprt_create_transport(&xprtargs);
...@@ -488,9 +476,6 @@ rpc_clone_client(struct rpc_clnt *clnt) ...@@ -488,9 +476,6 @@ rpc_clone_client(struct rpc_clnt *clnt)
new = kmemdup(clnt, sizeof(*new), GFP_KERNEL); new = kmemdup(clnt, sizeof(*new), GFP_KERNEL);
if (!new) if (!new)
goto out_no_clnt; goto out_no_clnt;
new->cl_server = kstrdup(clnt->cl_server, GFP_KERNEL);
if (new->cl_server == NULL)
goto out_no_server;
new->cl_parent = clnt; new->cl_parent = clnt;
/* Turn off autobind on clones */ /* Turn off autobind on clones */
new->cl_autobind = 0; new->cl_autobind = 0;
...@@ -528,8 +513,6 @@ rpc_clone_client(struct rpc_clnt *clnt) ...@@ -528,8 +513,6 @@ rpc_clone_client(struct rpc_clnt *clnt)
out_no_principal: out_no_principal:
rpc_free_iostats(new->cl_metrics); rpc_free_iostats(new->cl_metrics);
out_no_stats: out_no_stats:
kfree(new->cl_server);
out_no_server:
kfree(new); kfree(new);
out_no_clnt: out_no_clnt:
dprintk("RPC: %s: returned error %d\n", __func__, err); dprintk("RPC: %s: returned error %d\n", __func__, err);
...@@ -574,8 +557,9 @@ EXPORT_SYMBOL_GPL(rpc_killall_tasks); ...@@ -574,8 +557,9 @@ EXPORT_SYMBOL_GPL(rpc_killall_tasks);
*/ */
void rpc_shutdown_client(struct rpc_clnt *clnt) void rpc_shutdown_client(struct rpc_clnt *clnt)
{ {
dprintk("RPC: shutting down %s client for %s\n", dprintk_rcu("RPC: shutting down %s client for %s\n",
clnt->cl_protname, clnt->cl_server); clnt->cl_protname,
rcu_dereference(clnt->cl_xprt)->servername);
while (!list_empty(&clnt->cl_tasks)) { while (!list_empty(&clnt->cl_tasks)) {
rpc_killall_tasks(clnt); rpc_killall_tasks(clnt);
...@@ -593,11 +577,11 @@ EXPORT_SYMBOL_GPL(rpc_shutdown_client); ...@@ -593,11 +577,11 @@ EXPORT_SYMBOL_GPL(rpc_shutdown_client);
static void static void
rpc_free_client(struct rpc_clnt *clnt) rpc_free_client(struct rpc_clnt *clnt)
{ {
dprintk("RPC: destroying %s client for %s\n", dprintk_rcu("RPC: destroying %s client for %s\n",
clnt->cl_protname, clnt->cl_server); clnt->cl_protname,
rcu_dereference(clnt->cl_xprt)->servername);
if (clnt->cl_parent != clnt) if (clnt->cl_parent != clnt)
rpc_release_client(clnt->cl_parent); rpc_release_client(clnt->cl_parent);
kfree(clnt->cl_server);
rpc_unregister_client(clnt); rpc_unregister_client(clnt);
rpc_clnt_remove_pipedir(clnt); rpc_clnt_remove_pipedir(clnt);
rpc_free_iostats(clnt->cl_metrics); rpc_free_iostats(clnt->cl_metrics);
...@@ -1685,8 +1669,11 @@ call_timeout(struct rpc_task *task) ...@@ -1685,8 +1669,11 @@ call_timeout(struct rpc_task *task)
} }
if (RPC_IS_SOFT(task)) { if (RPC_IS_SOFT(task)) {
if (clnt->cl_chatty) if (clnt->cl_chatty)
rcu_read_lock();
printk(KERN_NOTICE "%s: server %s not responding, timed out\n", printk(KERN_NOTICE "%s: server %s not responding, timed out\n",
clnt->cl_protname, clnt->cl_server); clnt->cl_protname,
rcu_dereference(clnt->cl_xprt)->servername);
rcu_read_unlock();
if (task->tk_flags & RPC_TASK_TIMEOUT) if (task->tk_flags & RPC_TASK_TIMEOUT)
rpc_exit(task, -ETIMEDOUT); rpc_exit(task, -ETIMEDOUT);
else else
...@@ -1696,9 +1683,13 @@ call_timeout(struct rpc_task *task) ...@@ -1696,9 +1683,13 @@ call_timeout(struct rpc_task *task)
if (!(task->tk_flags & RPC_CALL_MAJORSEEN)) { if (!(task->tk_flags & RPC_CALL_MAJORSEEN)) {
task->tk_flags |= RPC_CALL_MAJORSEEN; task->tk_flags |= RPC_CALL_MAJORSEEN;
if (clnt->cl_chatty) if (clnt->cl_chatty) {
rcu_read_lock();
printk(KERN_NOTICE "%s: server %s not responding, still trying\n", printk(KERN_NOTICE "%s: server %s not responding, still trying\n",
clnt->cl_protname, clnt->cl_server); clnt->cl_protname,
rcu_dereference(clnt->cl_xprt)->servername);
rcu_read_unlock();
}
} }
rpc_force_rebind(clnt); rpc_force_rebind(clnt);
/* /*
...@@ -1727,9 +1718,13 @@ call_decode(struct rpc_task *task) ...@@ -1727,9 +1718,13 @@ call_decode(struct rpc_task *task)
dprint_status(task); dprint_status(task);
if (task->tk_flags & RPC_CALL_MAJORSEEN) { if (task->tk_flags & RPC_CALL_MAJORSEEN) {
if (clnt->cl_chatty) if (clnt->cl_chatty) {
rcu_read_lock();
printk(KERN_NOTICE "%s: server %s OK\n", printk(KERN_NOTICE "%s: server %s OK\n",
clnt->cl_protname, clnt->cl_server); clnt->cl_protname,
rcu_dereference(clnt->cl_xprt)->servername);
rcu_read_unlock();
}
task->tk_flags &= ~RPC_CALL_MAJORSEEN; task->tk_flags &= ~RPC_CALL_MAJORSEEN;
} }
...@@ -1807,6 +1802,7 @@ rpc_encode_header(struct rpc_task *task) ...@@ -1807,6 +1802,7 @@ rpc_encode_header(struct rpc_task *task)
static __be32 * static __be32 *
rpc_verify_header(struct rpc_task *task) rpc_verify_header(struct rpc_task *task)
{ {
struct rpc_clnt *clnt = task->tk_client;
struct kvec *iov = &task->tk_rqstp->rq_rcv_buf.head[0]; struct kvec *iov = &task->tk_rqstp->rq_rcv_buf.head[0];
int len = task->tk_rqstp->rq_rcv_buf.len >> 2; int len = task->tk_rqstp->rq_rcv_buf.len >> 2;
__be32 *p = iov->iov_base; __be32 *p = iov->iov_base;
...@@ -1879,8 +1875,11 @@ rpc_verify_header(struct rpc_task *task) ...@@ -1879,8 +1875,11 @@ rpc_verify_header(struct rpc_task *task)
task->tk_action = call_bind; task->tk_action = call_bind;
goto out_retry; goto out_retry;
case RPC_AUTH_TOOWEAK: case RPC_AUTH_TOOWEAK:
rcu_read_lock();
printk(KERN_NOTICE "RPC: server %s requires stronger " printk(KERN_NOTICE "RPC: server %s requires stronger "
"authentication.\n", task->tk_client->cl_server); "authentication.\n",
rcu_dereference(clnt->cl_xprt)->servername);
rcu_read_unlock();
break; break;
default: default:
dprintk("RPC: %5u %s: unknown auth error: %x\n", dprintk("RPC: %5u %s: unknown auth error: %x\n",
...@@ -1903,28 +1902,27 @@ rpc_verify_header(struct rpc_task *task) ...@@ -1903,28 +1902,27 @@ rpc_verify_header(struct rpc_task *task)
case RPC_SUCCESS: case RPC_SUCCESS:
return p; return p;
case RPC_PROG_UNAVAIL: case RPC_PROG_UNAVAIL:
dprintk("RPC: %5u %s: program %u is unsupported by server %s\n", dprintk_rcu("RPC: %5u %s: program %u is unsupported "
task->tk_pid, __func__, "by server %s\n", task->tk_pid, __func__,
(unsigned int)task->tk_client->cl_prog, (unsigned int)clnt->cl_prog,
task->tk_client->cl_server); rcu_dereference(clnt->cl_xprt)->servername);
error = -EPFNOSUPPORT; error = -EPFNOSUPPORT;
goto out_err; goto out_err;
case RPC_PROG_MISMATCH: case RPC_PROG_MISMATCH:
dprintk("RPC: %5u %s: program %u, version %u unsupported by " dprintk_rcu("RPC: %5u %s: program %u, version %u unsupported "
"server %s\n", task->tk_pid, __func__, "by server %s\n", task->tk_pid, __func__,
(unsigned int)task->tk_client->cl_prog, (unsigned int)clnt->cl_prog,
(unsigned int)task->tk_client->cl_vers, (unsigned int)clnt->cl_vers,
task->tk_client->cl_server); rcu_dereference(clnt->cl_xprt)->servername);
error = -EPROTONOSUPPORT; error = -EPROTONOSUPPORT;
goto out_err; goto out_err;
case RPC_PROC_UNAVAIL: case RPC_PROC_UNAVAIL:
dprintk("RPC: %5u %s: proc %s unsupported by program %u, " dprintk_rcu("RPC: %5u %s: proc %s unsupported by program %u, "
"version %u on server %s\n", "version %u on server %s\n",
task->tk_pid, __func__, task->tk_pid, __func__,
rpc_proc_name(task), rpc_proc_name(task),
task->tk_client->cl_prog, clnt->cl_prog, clnt->cl_vers,
task->tk_client->cl_vers, rcu_dereference(clnt->cl_xprt)->servername);
task->tk_client->cl_server);
error = -EOPNOTSUPP; error = -EOPNOTSUPP;
goto out_err; goto out_err;
case RPC_GARBAGE_ARGS: case RPC_GARBAGE_ARGS:
...@@ -1938,7 +1936,7 @@ rpc_verify_header(struct rpc_task *task) ...@@ -1938,7 +1936,7 @@ rpc_verify_header(struct rpc_task *task)
} }
out_garbage: out_garbage:
task->tk_client->cl_stats->rpcgarbage++; clnt->cl_stats->rpcgarbage++;
if (task->tk_garb_retry) { if (task->tk_garb_retry) {
task->tk_garb_retry--; task->tk_garb_retry--;
dprintk("RPC: %5u %s: retrying\n", dprintk("RPC: %5u %s: retrying\n",
......
...@@ -404,7 +404,8 @@ rpc_show_info(struct seq_file *m, void *v) ...@@ -404,7 +404,8 @@ rpc_show_info(struct seq_file *m, void *v)
struct rpc_clnt *clnt = m->private; struct rpc_clnt *clnt = m->private;
rcu_read_lock(); rcu_read_lock();
seq_printf(m, "RPC server: %s\n", clnt->cl_server); seq_printf(m, "RPC server: %s\n",
rcu_dereference(clnt->cl_xprt)->servername);
seq_printf(m, "service: %s (%d) version %d\n", clnt->cl_protname, seq_printf(m, "service: %s (%d) version %d\n", clnt->cl_protname,
clnt->cl_prog, clnt->cl_vers); clnt->cl_prog, clnt->cl_vers);
seq_printf(m, "address: %s\n", rpc_peeraddr2str(clnt, RPC_DISPLAY_ADDR)); seq_printf(m, "address: %s\n", rpc_peeraddr2str(clnt, RPC_DISPLAY_ADDR));
......
...@@ -663,7 +663,7 @@ void rpcb_getport_async(struct rpc_task *task) ...@@ -663,7 +663,7 @@ void rpcb_getport_async(struct rpc_task *task)
dprintk("RPC: %5u %s(%s, %u, %u, %d)\n", dprintk("RPC: %5u %s(%s, %u, %u, %d)\n",
task->tk_pid, __func__, task->tk_pid, __func__,
clnt->cl_server, clnt->cl_prog, clnt->cl_vers, xprt->prot); xprt->servername, clnt->cl_prog, clnt->cl_vers, xprt->prot);
/* Put self on the wait queue to ensure we get notified if /* Put self on the wait queue to ensure we get notified if
* some other task is already attempting to bind the port */ * some other task is already attempting to bind the port */
...@@ -714,7 +714,7 @@ void rpcb_getport_async(struct rpc_task *task) ...@@ -714,7 +714,7 @@ void rpcb_getport_async(struct rpc_task *task)
dprintk("RPC: %5u %s: trying rpcbind version %u\n", dprintk("RPC: %5u %s: trying rpcbind version %u\n",
task->tk_pid, __func__, bind_version); task->tk_pid, __func__, bind_version);
rpcb_clnt = rpcb_create(xprt->xprt_net, clnt->cl_server, sap, salen, rpcb_clnt = rpcb_create(xprt->xprt_net, xprt->servername, sap, salen,
xprt->prot, bind_version); xprt->prot, bind_version);
if (IS_ERR(rpcb_clnt)) { if (IS_ERR(rpcb_clnt)) {
status = PTR_ERR(rpcb_clnt); status = PTR_ERR(rpcb_clnt);
......
...@@ -66,6 +66,7 @@ static void xprt_init(struct rpc_xprt *xprt, struct net *net); ...@@ -66,6 +66,7 @@ static void xprt_init(struct rpc_xprt *xprt, struct net *net);
static void xprt_request_init(struct rpc_task *, struct rpc_xprt *); static void xprt_request_init(struct rpc_task *, struct rpc_xprt *);
static void xprt_connect_status(struct rpc_task *task); static void xprt_connect_status(struct rpc_task *task);
static int __xprt_get_cong(struct rpc_xprt *, struct rpc_task *); static int __xprt_get_cong(struct rpc_xprt *, struct rpc_task *);
static void xprt_destroy(struct rpc_xprt *xprt);
static DEFINE_SPINLOCK(xprt_list_lock); static DEFINE_SPINLOCK(xprt_list_lock);
static LIST_HEAD(xprt_list); static LIST_HEAD(xprt_list);
...@@ -751,7 +752,7 @@ static void xprt_connect_status(struct rpc_task *task) ...@@ -751,7 +752,7 @@ static void xprt_connect_status(struct rpc_task *task)
default: default:
dprintk("RPC: %5u xprt_connect_status: error %d connecting to " dprintk("RPC: %5u xprt_connect_status: error %d connecting to "
"server %s\n", task->tk_pid, -task->tk_status, "server %s\n", task->tk_pid, -task->tk_status,
task->tk_client->cl_server); xprt->servername);
xprt_release_write(xprt, task); xprt_release_write(xprt, task);
task->tk_status = -EIO; task->tk_status = -EIO;
} }
...@@ -1229,6 +1230,17 @@ struct rpc_xprt *xprt_create_transport(struct xprt_create *args) ...@@ -1229,6 +1230,17 @@ struct rpc_xprt *xprt_create_transport(struct xprt_create *args)
(unsigned long)xprt); (unsigned long)xprt);
else else
init_timer(&xprt->timer); init_timer(&xprt->timer);
if (strlen(args->servername) > RPC_MAXNETNAMELEN) {
xprt_destroy(xprt);
return ERR_PTR(-EINVAL);
}
xprt->servername = kstrdup(args->servername, GFP_KERNEL);
if (xprt->servername == NULL) {
xprt_destroy(xprt);
return ERR_PTR(-ENOMEM);
}
dprintk("RPC: created transport %p with %u slots\n", xprt, dprintk("RPC: created transport %p with %u slots\n", xprt,
xprt->max_reqs); xprt->max_reqs);
out: out:
...@@ -1251,6 +1263,7 @@ static void xprt_destroy(struct rpc_xprt *xprt) ...@@ -1251,6 +1263,7 @@ static void xprt_destroy(struct rpc_xprt *xprt)
rpc_destroy_wait_queue(&xprt->sending); rpc_destroy_wait_queue(&xprt->sending);
rpc_destroy_wait_queue(&xprt->backlog); rpc_destroy_wait_queue(&xprt->backlog);
cancel_work_sync(&xprt->task_cleanup); cancel_work_sync(&xprt->task_cleanup);
kfree(xprt->servername);
/* /*
* Tear down transport state and free the rpc_xprt * Tear down transport state and free the rpc_xprt
*/ */
......
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