Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: Trond Myklebust <Trond.Myklebust@netapp.com>
[ cel: simplify check_gss_callback_principal(), whitespace changes ]
[ cel: forward ported to 3.4 ]
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>

+66 -53
+1 -2
fs/nfs/callback.c
··· 332 332 int 333 333 check_gss_callback_principal(struct nfs_client *clp, struct svc_rqst *rqstp) 334 334 { 335 - struct rpc_clnt *r = clp->cl_rpcclient; 336 335 char *p = svc_gss_principal(rqstp); 337 336 338 337 if (rqstp->rq_authop->flavour != RPC_AUTH_GSS) ··· 352 353 if (memcmp(p, "nfs@", 4) != 0) 353 354 return 0; 354 355 p += 4; 355 - if (strcmp(p, r->cl_server) != 0) 356 + if (strcmp(p, clp->cl_hostname) != 0) 356 357 return 0; 357 358 return 1; 358 359 }
+2 -1
fs/nfs/nfs4proc.c
··· 1100 1100 if (state == NULL) 1101 1101 goto err_put_inode; 1102 1102 if (data->o_res.delegation_type != 0) { 1103 + struct nfs_client *clp = NFS_SERVER(inode)->nfs_client; 1103 1104 int delegation_flags = 0; 1104 1105 1105 1106 rcu_read_lock(); ··· 1112 1111 pr_err_ratelimited("NFS: Broken NFSv4 server %s is " 1113 1112 "returning a delegation for " 1114 1113 "OPEN(CLAIM_DELEGATE_CUR)\n", 1115 - NFS_CLIENT(inode)->cl_server); 1114 + clp->cl_hostname); 1116 1115 } else if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0) 1117 1116 nfs_inode_set_delegation(state->inode, 1118 1117 data->owner->so_cred,
-1
include/linux/sunrpc/clnt.h
··· 41 41 cl_vers, /* RPC version number */ 42 42 cl_maxproc; /* max procedure number */ 43 43 44 - const char * cl_server; /* server machine name */ 45 44 const char * cl_protname; /* protocol name */ 46 45 struct rpc_auth * cl_auth; /* authenticator */ 47 46 struct rpc_stat * cl_stats; /* per-program statistics */
+2
include/linux/sunrpc/xprt.h
··· 229 229 } stat; 230 230 231 231 struct net *xprt_net; 232 + const char *servername; 232 233 const char *address_strings[RPC_DISPLAY_MAX]; 233 234 }; 234 235 ··· 259 258 struct sockaddr * srcaddr; /* optional local address */ 260 259 struct sockaddr * dstaddr; /* remote peer address */ 261 260 size_t addrlen; 261 + const char *servername; 262 262 struct svc_xprt *bc_xprt; /* NFSv4.1 backchannel */ 263 263 }; 264 264
+43 -45
net/sunrpc/clnt.c
··· 265 265 struct rpc_clnt *clnt = NULL; 266 266 struct rpc_auth *auth; 267 267 int err; 268 - size_t len; 269 268 270 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 270 dprintk("RPC: creating %s client for %s (xprt %p)\n", 278 271 program->name, args->servername, xprt); 279 272 ··· 288 295 if (!clnt) 289 296 goto out_err; 290 297 clnt->cl_parent = clnt; 291 - 292 - clnt->cl_server = kstrdup(args->servername, GFP_KERNEL); 293 - if (clnt->cl_server == NULL) 294 - goto out_no_server; 295 298 296 299 rcu_assign_pointer(clnt->cl_xprt, xprt); 297 300 clnt->cl_procinfo = version->procs; ··· 352 363 out_no_principal: 353 364 rpc_free_iostats(clnt->cl_metrics); 354 365 out_no_stats: 355 - kfree(clnt->cl_server); 356 - out_no_server: 357 366 kfree(clnt); 358 367 out_err: 359 368 xprt_put(xprt); ··· 381 394 .srcaddr = args->saddress, 382 395 .dstaddr = args->address, 383 396 .addrlen = args->addrsize, 397 + .servername = args->servername, 384 398 .bc_xprt = args->bc_xprt, 385 399 }; 386 400 char servername[48]; ··· 390 402 * If the caller chooses not to specify a hostname, whip 391 403 * up a string representation of the passed-in address. 392 404 */ 393 - if (args->servername == NULL) { 405 + if (xprtargs.servername == NULL) { 394 406 struct sockaddr_un *sun = 395 407 (struct sockaddr_un *)args->address; 396 408 struct sockaddr_in *sin = ··· 417 429 * address family isn't recognized. */ 418 430 return ERR_PTR(-EINVAL); 419 431 } 420 - args->servername = servername; 432 + xprtargs.servername = servername; 421 433 } 422 434 423 435 xprt = xprt_create_transport(&xprtargs); ··· 476 488 new = kmemdup(clnt, sizeof(*new), GFP_KERNEL); 477 489 if (!new) 478 490 goto out_no_clnt; 479 - new->cl_server = kstrdup(clnt->cl_server, GFP_KERNEL); 480 - if (new->cl_server == NULL) 481 - goto out_no_server; 482 491 new->cl_parent = clnt; 483 492 /* Turn off autobind on clones */ 484 493 new->cl_autobind = 0; ··· 513 528 out_no_principal: 514 529 rpc_free_iostats(new->cl_metrics); 515 530 out_no_stats: 516 - kfree(new->cl_server); 517 - out_no_server: 518 531 kfree(new); 519 532 out_no_clnt: 520 533 dprintk("RPC: %s: returned error %d\n", __func__, err); ··· 557 574 */ 558 575 void rpc_shutdown_client(struct rpc_clnt *clnt) 559 576 { 560 - dprintk("RPC: shutting down %s client for %s\n", 561 - clnt->cl_protname, clnt->cl_server); 577 + dprintk_rcu("RPC: shutting down %s client for %s\n", 578 + clnt->cl_protname, 579 + rcu_dereference(clnt->cl_xprt)->servername); 562 580 563 581 while (!list_empty(&clnt->cl_tasks)) { 564 582 rpc_killall_tasks(clnt); ··· 577 593 static void 578 594 rpc_free_client(struct rpc_clnt *clnt) 579 595 { 580 - dprintk("RPC: destroying %s client for %s\n", 581 - clnt->cl_protname, clnt->cl_server); 596 + dprintk_rcu("RPC: destroying %s client for %s\n", 597 + clnt->cl_protname, 598 + rcu_dereference(clnt->cl_xprt)->servername); 582 599 if (clnt->cl_parent != clnt) 583 600 rpc_release_client(clnt->cl_parent); 584 - kfree(clnt->cl_server); 585 601 rpc_unregister_client(clnt); 586 602 rpc_clnt_remove_pipedir(clnt); 587 603 rpc_free_iostats(clnt->cl_metrics); ··· 1669 1685 } 1670 1686 if (RPC_IS_SOFT(task)) { 1671 1687 if (clnt->cl_chatty) 1688 + rcu_read_lock(); 1672 1689 printk(KERN_NOTICE "%s: server %s not responding, timed out\n", 1673 - clnt->cl_protname, clnt->cl_server); 1690 + clnt->cl_protname, 1691 + rcu_dereference(clnt->cl_xprt)->servername); 1692 + rcu_read_unlock(); 1674 1693 if (task->tk_flags & RPC_TASK_TIMEOUT) 1675 1694 rpc_exit(task, -ETIMEDOUT); 1676 1695 else ··· 1683 1696 1684 1697 if (!(task->tk_flags & RPC_CALL_MAJORSEEN)) { 1685 1698 task->tk_flags |= RPC_CALL_MAJORSEEN; 1686 - if (clnt->cl_chatty) 1699 + if (clnt->cl_chatty) { 1700 + rcu_read_lock(); 1687 1701 printk(KERN_NOTICE "%s: server %s not responding, still trying\n", 1688 - clnt->cl_protname, clnt->cl_server); 1702 + clnt->cl_protname, 1703 + rcu_dereference(clnt->cl_xprt)->servername); 1704 + rcu_read_unlock(); 1705 + } 1689 1706 } 1690 1707 rpc_force_rebind(clnt); 1691 1708 /* ··· 1718 1727 dprint_status(task); 1719 1728 1720 1729 if (task->tk_flags & RPC_CALL_MAJORSEEN) { 1721 - if (clnt->cl_chatty) 1730 + if (clnt->cl_chatty) { 1731 + rcu_read_lock(); 1722 1732 printk(KERN_NOTICE "%s: server %s OK\n", 1723 - clnt->cl_protname, clnt->cl_server); 1733 + clnt->cl_protname, 1734 + rcu_dereference(clnt->cl_xprt)->servername); 1735 + rcu_read_unlock(); 1736 + } 1724 1737 task->tk_flags &= ~RPC_CALL_MAJORSEEN; 1725 1738 } 1726 1739 ··· 1802 1807 static __be32 * 1803 1808 rpc_verify_header(struct rpc_task *task) 1804 1809 { 1810 + struct rpc_clnt *clnt = task->tk_client; 1805 1811 struct kvec *iov = &task->tk_rqstp->rq_rcv_buf.head[0]; 1806 1812 int len = task->tk_rqstp->rq_rcv_buf.len >> 2; 1807 1813 __be32 *p = iov->iov_base; ··· 1875 1879 task->tk_action = call_bind; 1876 1880 goto out_retry; 1877 1881 case RPC_AUTH_TOOWEAK: 1882 + rcu_read_lock(); 1878 1883 printk(KERN_NOTICE "RPC: server %s requires stronger " 1879 - "authentication.\n", task->tk_client->cl_server); 1884 + "authentication.\n", 1885 + rcu_dereference(clnt->cl_xprt)->servername); 1886 + rcu_read_unlock(); 1880 1887 break; 1881 1888 default: 1882 1889 dprintk("RPC: %5u %s: unknown auth error: %x\n", ··· 1902 1903 case RPC_SUCCESS: 1903 1904 return p; 1904 1905 case RPC_PROG_UNAVAIL: 1905 - dprintk("RPC: %5u %s: program %u is unsupported by server %s\n", 1906 - task->tk_pid, __func__, 1907 - (unsigned int)task->tk_client->cl_prog, 1908 - task->tk_client->cl_server); 1906 + dprintk_rcu("RPC: %5u %s: program %u is unsupported " 1907 + "by server %s\n", task->tk_pid, __func__, 1908 + (unsigned int)clnt->cl_prog, 1909 + rcu_dereference(clnt->cl_xprt)->servername); 1909 1910 error = -EPFNOSUPPORT; 1910 1911 goto out_err; 1911 1912 case RPC_PROG_MISMATCH: 1912 - dprintk("RPC: %5u %s: program %u, version %u unsupported by " 1913 - "server %s\n", task->tk_pid, __func__, 1914 - (unsigned int)task->tk_client->cl_prog, 1915 - (unsigned int)task->tk_client->cl_vers, 1916 - task->tk_client->cl_server); 1913 + dprintk_rcu("RPC: %5u %s: program %u, version %u unsupported " 1914 + "by server %s\n", task->tk_pid, __func__, 1915 + (unsigned int)clnt->cl_prog, 1916 + (unsigned int)clnt->cl_vers, 1917 + rcu_dereference(clnt->cl_xprt)->servername); 1917 1918 error = -EPROTONOSUPPORT; 1918 1919 goto out_err; 1919 1920 case RPC_PROC_UNAVAIL: 1920 - dprintk("RPC: %5u %s: proc %s unsupported by program %u, " 1921 + dprintk_rcu("RPC: %5u %s: proc %s unsupported by program %u, " 1921 1922 "version %u on server %s\n", 1922 1923 task->tk_pid, __func__, 1923 1924 rpc_proc_name(task), 1924 - task->tk_client->cl_prog, 1925 - task->tk_client->cl_vers, 1926 - task->tk_client->cl_server); 1925 + clnt->cl_prog, clnt->cl_vers, 1926 + rcu_dereference(clnt->cl_xprt)->servername); 1927 1927 error = -EOPNOTSUPP; 1928 1928 goto out_err; 1929 1929 case RPC_GARBAGE_ARGS: ··· 1936 1938 } 1937 1939 1938 1940 out_garbage: 1939 - task->tk_client->cl_stats->rpcgarbage++; 1941 + clnt->cl_stats->rpcgarbage++; 1940 1942 if (task->tk_garb_retry) { 1941 1943 task->tk_garb_retry--; 1942 1944 dprintk("RPC: %5u %s: retrying\n",
+2 -1
net/sunrpc/rpc_pipe.c
··· 404 404 struct rpc_clnt *clnt = m->private; 405 405 406 406 rcu_read_lock(); 407 - seq_printf(m, "RPC server: %s\n", clnt->cl_server); 407 + seq_printf(m, "RPC server: %s\n", 408 + rcu_dereference(clnt->cl_xprt)->servername); 408 409 seq_printf(m, "service: %s (%d) version %d\n", clnt->cl_protname, 409 410 clnt->cl_prog, clnt->cl_vers); 410 411 seq_printf(m, "address: %s\n", rpc_peeraddr2str(clnt, RPC_DISPLAY_ADDR));
+2 -2
net/sunrpc/rpcb_clnt.c
··· 663 663 664 664 dprintk("RPC: %5u %s(%s, %u, %u, %d)\n", 665 665 task->tk_pid, __func__, 666 - clnt->cl_server, clnt->cl_prog, clnt->cl_vers, xprt->prot); 666 + xprt->servername, clnt->cl_prog, clnt->cl_vers, xprt->prot); 667 667 668 668 /* Put self on the wait queue to ensure we get notified if 669 669 * some other task is already attempting to bind the port */ ··· 714 714 dprintk("RPC: %5u %s: trying rpcbind version %u\n", 715 715 task->tk_pid, __func__, bind_version); 716 716 717 - rpcb_clnt = rpcb_create(xprt->xprt_net, clnt->cl_server, sap, salen, 717 + rpcb_clnt = rpcb_create(xprt->xprt_net, xprt->servername, sap, salen, 718 718 xprt->prot, bind_version); 719 719 if (IS_ERR(rpcb_clnt)) { 720 720 status = PTR_ERR(rpcb_clnt);
+14 -1
net/sunrpc/xprt.c
··· 66 66 static void xprt_request_init(struct rpc_task *, struct rpc_xprt *); 67 67 static void xprt_connect_status(struct rpc_task *task); 68 68 static int __xprt_get_cong(struct rpc_xprt *, struct rpc_task *); 69 + static void xprt_destroy(struct rpc_xprt *xprt); 69 70 70 71 static DEFINE_SPINLOCK(xprt_list_lock); 71 72 static LIST_HEAD(xprt_list); ··· 752 751 default: 753 752 dprintk("RPC: %5u xprt_connect_status: error %d connecting to " 754 753 "server %s\n", task->tk_pid, -task->tk_status, 755 - task->tk_client->cl_server); 754 + xprt->servername); 756 755 xprt_release_write(xprt, task); 757 756 task->tk_status = -EIO; 758 757 } ··· 1230 1229 (unsigned long)xprt); 1231 1230 else 1232 1231 init_timer(&xprt->timer); 1232 + 1233 + if (strlen(args->servername) > RPC_MAXNETNAMELEN) { 1234 + xprt_destroy(xprt); 1235 + return ERR_PTR(-EINVAL); 1236 + } 1237 + xprt->servername = kstrdup(args->servername, GFP_KERNEL); 1238 + if (xprt->servername == NULL) { 1239 + xprt_destroy(xprt); 1240 + return ERR_PTR(-ENOMEM); 1241 + } 1242 + 1233 1243 dprintk("RPC: created transport %p with %u slots\n", xprt, 1234 1244 xprt->max_reqs); 1235 1245 out: ··· 1263 1251 rpc_destroy_wait_queue(&xprt->sending); 1264 1252 rpc_destroy_wait_queue(&xprt->backlog); 1265 1253 cancel_work_sync(&xprt->task_cleanup); 1254 + kfree(xprt->servername); 1266 1255 /* 1267 1256 * Tear down transport state and free the rpc_xprt 1268 1257 */