aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/clnt.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sunrpc/clnt.c')
-rw-r--r--net/sunrpc/clnt.c88
1 files changed, 43 insertions, 45 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index 7783fc0e7263..e39ace9a4e1d 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -265,15 +265,8 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, stru
265 struct rpc_clnt *clnt = NULL; 265 struct rpc_clnt *clnt = NULL;
266 struct rpc_auth *auth; 266 struct rpc_auth *auth;
267 int err; 267 int err;
268 size_t len;
269 268
270 /* sanity check the name before trying to print it */ 269 /* sanity check the name before trying to print it */
271 err = -EINVAL;
272 len = strlen(args->servername);
273 if (len > RPC_MAXNETNAMELEN)
274 goto out_no_rpciod;
275 len++;
276
277 dprintk("RPC: creating %s client for %s (xprt %p)\n", 270 dprintk("RPC: creating %s client for %s (xprt %p)\n",
278 program->name, args->servername, xprt); 271 program->name, args->servername, xprt);
279 272
@@ -296,10 +289,6 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, stru
296 goto out_err; 289 goto out_err;
297 clnt->cl_parent = clnt; 290 clnt->cl_parent = clnt;
298 291
299 clnt->cl_server = kstrdup(args->servername, GFP_KERNEL);
300 if (clnt->cl_server == NULL)
301 goto out_no_server;
302
303 rcu_assign_pointer(clnt->cl_xprt, xprt); 292 rcu_assign_pointer(clnt->cl_xprt, xprt);
304 clnt->cl_procinfo = version->procs; 293 clnt->cl_procinfo = version->procs;
305 clnt->cl_maxproc = version->nrprocs; 294 clnt->cl_maxproc = version->nrprocs;
@@ -363,8 +352,6 @@ out_no_path:
363out_no_principal: 352out_no_principal:
364 rpc_free_iostats(clnt->cl_metrics); 353 rpc_free_iostats(clnt->cl_metrics);
365out_no_stats: 354out_no_stats:
366 kfree(clnt->cl_server);
367out_no_server:
368 kfree(clnt); 355 kfree(clnt);
369out_err: 356out_err:
370 xprt_put(xprt); 357 xprt_put(xprt);
@@ -394,6 +381,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
394 .srcaddr = args->saddress, 381 .srcaddr = args->saddress,
395 .dstaddr = args->address, 382 .dstaddr = args->address,
396 .addrlen = args->addrsize, 383 .addrlen = args->addrsize,
384 .servername = args->servername,
397 .bc_xprt = args->bc_xprt, 385 .bc_xprt = args->bc_xprt,
398 }; 386 };
399 char servername[48]; 387 char servername[48];
@@ -402,7 +390,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
402 * If the caller chooses not to specify a hostname, whip 390 * If the caller chooses not to specify a hostname, whip
403 * up a string representation of the passed-in address. 391 * up a string representation of the passed-in address.
404 */ 392 */
405 if (args->servername == NULL) { 393 if (xprtargs.servername == NULL) {
406 struct sockaddr_un *sun = 394 struct sockaddr_un *sun =
407 (struct sockaddr_un *)args->address; 395 (struct sockaddr_un *)args->address;
408 struct sockaddr_in *sin = 396 struct sockaddr_in *sin =
@@ -429,7 +417,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
429 * address family isn't recognized. */ 417 * address family isn't recognized. */
430 return ERR_PTR(-EINVAL); 418 return ERR_PTR(-EINVAL);
431 } 419 }
432 args->servername = servername; 420 xprtargs.servername = servername;
433 } 421 }
434 422
435 xprt = xprt_create_transport(&xprtargs); 423 xprt = xprt_create_transport(&xprtargs);
@@ -488,9 +476,6 @@ rpc_clone_client(struct rpc_clnt *clnt)
488 new = kmemdup(clnt, sizeof(*new), GFP_KERNEL); 476 new = kmemdup(clnt, sizeof(*new), GFP_KERNEL);
489 if (!new) 477 if (!new)
490 goto out_no_clnt; 478 goto out_no_clnt;
491 new->cl_server = kstrdup(clnt->cl_server, GFP_KERNEL);
492 if (new->cl_server == NULL)
493 goto out_no_server;
494 new->cl_parent = clnt; 479 new->cl_parent = clnt;
495 /* Turn off autobind on clones */ 480 /* Turn off autobind on clones */
496 new->cl_autobind = 0; 481 new->cl_autobind = 0;
@@ -528,8 +513,6 @@ out_no_transport:
528out_no_principal: 513out_no_principal:
529 rpc_free_iostats(new->cl_metrics); 514 rpc_free_iostats(new->cl_metrics);
530out_no_stats: 515out_no_stats:
531 kfree(new->cl_server);
532out_no_server:
533 kfree(new); 516 kfree(new);
534out_no_clnt: 517out_no_clnt:
535 dprintk("RPC: %s: returned error %d\n", __func__, err); 518 dprintk("RPC: %s: returned error %d\n", __func__, err);
@@ -574,8 +557,9 @@ EXPORT_SYMBOL_GPL(rpc_killall_tasks);
574 */ 557 */
575void rpc_shutdown_client(struct rpc_clnt *clnt) 558void rpc_shutdown_client(struct rpc_clnt *clnt)
576{ 559{
577 dprintk("RPC: shutting down %s client for %s\n", 560 dprintk_rcu("RPC: shutting down %s client for %s\n",
578 clnt->cl_protname, clnt->cl_server); 561 clnt->cl_protname,
562 rcu_dereference(clnt->cl_xprt)->servername);
579 563
580 while (!list_empty(&clnt->cl_tasks)) { 564 while (!list_empty(&clnt->cl_tasks)) {
581 rpc_killall_tasks(clnt); 565 rpc_killall_tasks(clnt);
@@ -593,11 +577,11 @@ EXPORT_SYMBOL_GPL(rpc_shutdown_client);
593static void 577static void
594rpc_free_client(struct rpc_clnt *clnt) 578rpc_free_client(struct rpc_clnt *clnt)
595{ 579{
596 dprintk("RPC: destroying %s client for %s\n", 580 dprintk_rcu("RPC: destroying %s client for %s\n",
597 clnt->cl_protname, clnt->cl_server); 581 clnt->cl_protname,
582 rcu_dereference(clnt->cl_xprt)->servername);
598 if (clnt->cl_parent != clnt) 583 if (clnt->cl_parent != clnt)
599 rpc_release_client(clnt->cl_parent); 584 rpc_release_client(clnt->cl_parent);
600 kfree(clnt->cl_server);
601 rpc_unregister_client(clnt); 585 rpc_unregister_client(clnt);
602 rpc_clnt_remove_pipedir(clnt); 586 rpc_clnt_remove_pipedir(clnt);
603 rpc_free_iostats(clnt->cl_metrics); 587 rpc_free_iostats(clnt->cl_metrics);
@@ -1685,8 +1669,11 @@ call_timeout(struct rpc_task *task)
1685 } 1669 }
1686 if (RPC_IS_SOFT(task)) { 1670 if (RPC_IS_SOFT(task)) {
1687 if (clnt->cl_chatty) 1671 if (clnt->cl_chatty)
1672 rcu_read_lock();
1688 printk(KERN_NOTICE "%s: server %s not responding, timed out\n", 1673 printk(KERN_NOTICE "%s: server %s not responding, timed out\n",
1689 clnt->cl_protname, clnt->cl_server); 1674 clnt->cl_protname,
1675 rcu_dereference(clnt->cl_xprt)->servername);
1676 rcu_read_unlock();
1690 if (task->tk_flags & RPC_TASK_TIMEOUT) 1677 if (task->tk_flags & RPC_TASK_TIMEOUT)
1691 rpc_exit(task, -ETIMEDOUT); 1678 rpc_exit(task, -ETIMEDOUT);
1692 else 1679 else
@@ -1696,9 +1683,13 @@ call_timeout(struct rpc_task *task)
1696 1683
1697 if (!(task->tk_flags & RPC_CALL_MAJORSEEN)) { 1684 if (!(task->tk_flags & RPC_CALL_MAJORSEEN)) {
1698 task->tk_flags |= RPC_CALL_MAJORSEEN; 1685 task->tk_flags |= RPC_CALL_MAJORSEEN;
1699 if (clnt->cl_chatty) 1686 if (clnt->cl_chatty) {
1687 rcu_read_lock();
1700 printk(KERN_NOTICE "%s: server %s not responding, still trying\n", 1688 printk(KERN_NOTICE "%s: server %s not responding, still trying\n",
1701 clnt->cl_protname, clnt->cl_server); 1689 clnt->cl_protname,
1690 rcu_dereference(clnt->cl_xprt)->servername);
1691 rcu_read_unlock();
1692 }
1702 } 1693 }
1703 rpc_force_rebind(clnt); 1694 rpc_force_rebind(clnt);
1704 /* 1695 /*
@@ -1727,9 +1718,13 @@ call_decode(struct rpc_task *task)
1727 dprint_status(task); 1718 dprint_status(task);
1728 1719
1729 if (task->tk_flags & RPC_CALL_MAJORSEEN) { 1720 if (task->tk_flags & RPC_CALL_MAJORSEEN) {
1730 if (clnt->cl_chatty) 1721 if (clnt->cl_chatty) {
1722 rcu_read_lock();
1731 printk(KERN_NOTICE "%s: server %s OK\n", 1723 printk(KERN_NOTICE "%s: server %s OK\n",
1732 clnt->cl_protname, clnt->cl_server); 1724 clnt->cl_protname,
1725 rcu_dereference(clnt->cl_xprt)->servername);
1726 rcu_read_unlock();
1727 }
1733 task->tk_flags &= ~RPC_CALL_MAJORSEEN; 1728 task->tk_flags &= ~RPC_CALL_MAJORSEEN;
1734 } 1729 }
1735 1730
@@ -1807,6 +1802,7 @@ rpc_encode_header(struct rpc_task *task)
1807static __be32 * 1802static __be32 *
1808rpc_verify_header(struct rpc_task *task) 1803rpc_verify_header(struct rpc_task *task)
1809{ 1804{
1805 struct rpc_clnt *clnt = task->tk_client;
1810 struct kvec *iov = &task->tk_rqstp->rq_rcv_buf.head[0]; 1806 struct kvec *iov = &task->tk_rqstp->rq_rcv_buf.head[0];
1811 int len = task->tk_rqstp->rq_rcv_buf.len >> 2; 1807 int len = task->tk_rqstp->rq_rcv_buf.len >> 2;
1812 __be32 *p = iov->iov_base; 1808 __be32 *p = iov->iov_base;
@@ -1879,8 +1875,11 @@ rpc_verify_header(struct rpc_task *task)
1879 task->tk_action = call_bind; 1875 task->tk_action = call_bind;
1880 goto out_retry; 1876 goto out_retry;
1881 case RPC_AUTH_TOOWEAK: 1877 case RPC_AUTH_TOOWEAK:
1878 rcu_read_lock();
1882 printk(KERN_NOTICE "RPC: server %s requires stronger " 1879 printk(KERN_NOTICE "RPC: server %s requires stronger "
1883 "authentication.\n", task->tk_client->cl_server); 1880 "authentication.\n",
1881 rcu_dereference(clnt->cl_xprt)->servername);
1882 rcu_read_unlock();
1884 break; 1883 break;
1885 default: 1884 default:
1886 dprintk("RPC: %5u %s: unknown auth error: %x\n", 1885 dprintk("RPC: %5u %s: unknown auth error: %x\n",
@@ -1903,28 +1902,27 @@ rpc_verify_header(struct rpc_task *task)
1903 case RPC_SUCCESS: 1902 case RPC_SUCCESS:
1904 return p; 1903 return p;
1905 case RPC_PROG_UNAVAIL: 1904 case RPC_PROG_UNAVAIL:
1906 dprintk("RPC: %5u %s: program %u is unsupported by server %s\n", 1905 dprintk_rcu("RPC: %5u %s: program %u is unsupported "
1907 task->tk_pid, __func__, 1906 "by server %s\n", task->tk_pid, __func__,
1908 (unsigned int)task->tk_client->cl_prog, 1907 (unsigned int)clnt->cl_prog,
1909 task->tk_client->cl_server); 1908 rcu_dereference(clnt->cl_xprt)->servername);
1910 error = -EPFNOSUPPORT; 1909 error = -EPFNOSUPPORT;
1911 goto out_err; 1910 goto out_err;
1912 case RPC_PROG_MISMATCH: 1911 case RPC_PROG_MISMATCH:
1913 dprintk("RPC: %5u %s: program %u, version %u unsupported by " 1912 dprintk_rcu("RPC: %5u %s: program %u, version %u unsupported "
1914 "server %s\n", task->tk_pid, __func__, 1913 "by server %s\n", task->tk_pid, __func__,
1915 (unsigned int)task->tk_client->cl_prog, 1914 (unsigned int)clnt->cl_prog,
1916 (unsigned int)task->tk_client->cl_vers, 1915 (unsigned int)clnt->cl_vers,
1917 task->tk_client->cl_server); 1916 rcu_dereference(clnt->cl_xprt)->servername);
1918 error = -EPROTONOSUPPORT; 1917 error = -EPROTONOSUPPORT;
1919 goto out_err; 1918 goto out_err;
1920 case RPC_PROC_UNAVAIL: 1919 case RPC_PROC_UNAVAIL:
1921 dprintk("RPC: %5u %s: proc %s unsupported by program %u, " 1920 dprintk_rcu("RPC: %5u %s: proc %s unsupported by program %u, "
1922 "version %u on server %s\n", 1921 "version %u on server %s\n",
1923 task->tk_pid, __func__, 1922 task->tk_pid, __func__,
1924 rpc_proc_name(task), 1923 rpc_proc_name(task),
1925 task->tk_client->cl_prog, 1924 clnt->cl_prog, clnt->cl_vers,
1926 task->tk_client->cl_vers, 1925 rcu_dereference(clnt->cl_xprt)->servername);
1927 task->tk_client->cl_server);
1928 error = -EOPNOTSUPP; 1926 error = -EOPNOTSUPP;
1929 goto out_err; 1927 goto out_err;
1930 case RPC_GARBAGE_ARGS: 1928 case RPC_GARBAGE_ARGS:
@@ -1938,7 +1936,7 @@ rpc_verify_header(struct rpc_task *task)
1938 } 1936 }
1939 1937
1940out_garbage: 1938out_garbage:
1941 task->tk_client->cl_stats->rpcgarbage++; 1939 clnt->cl_stats->rpcgarbage++;
1942 if (task->tk_garb_retry) { 1940 if (task->tk_garb_retry) {
1943 task->tk_garb_retry--; 1941 task->tk_garb_retry--;
1944 dprintk("RPC: %5u %s: retrying\n", 1942 dprintk("RPC: %5u %s: retrying\n",