hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/net/sunrpc/rpcb_clnt.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * In-kernel rpcbind client supporting versions 2, 3, and 4 of the rpcbind
34 * protocol
....@@ -30,11 +31,9 @@
3031 #include <linux/sunrpc/sched.h>
3132 #include <linux/sunrpc/xprtsock.h>
3233
33
-#include "netns.h"
34
+#include <trace/events/sunrpc.h>
3435
35
-#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
36
-# define RPCDBG_FACILITY RPCDBG_BIND
37
-#endif
36
+#include "netns.h"
3837
3938 #define RPCBIND_SOCK_PATHNAME "/var/run/rpcbind.sock"
4039
....@@ -215,10 +214,6 @@
215214 sn->rpcb_is_af_local = is_af_local ? 1 : 0;
216215 smp_wmb();
217216 sn->rpcb_users = 1;
218
- dprintk("RPC: created new rpcb local clients (rpcb_local_clnt: "
219
- "%p, rpcb_local_clnt4: %p) for net %x%s\n",
220
- sn->rpcb_local_clnt, sn->rpcb_local_clnt4,
221
- net->ns.inum, (net == &init_net) ? " (init_net)" : "");
222217 }
223218
224219 /*
....@@ -240,6 +235,7 @@
240235 .program = &rpcb_program,
241236 .version = RPCBVERS_2,
242237 .authflavor = RPC_AUTH_NULL,
238
+ .cred = current_cred(),
243239 /*
244240 * We turn off the idle timeout to prevent the kernel
245241 * from automatically disconnecting the socket.
....@@ -259,19 +255,13 @@
259255 */
260256 clnt = rpc_create(&args);
261257 if (IS_ERR(clnt)) {
262
- dprintk("RPC: failed to create AF_LOCAL rpcbind "
263
- "client (errno %ld).\n", PTR_ERR(clnt));
264258 result = PTR_ERR(clnt);
265259 goto out;
266260 }
267261
268262 clnt4 = rpc_bind_new_program(clnt, &rpcb_program, RPCBVERS_4);
269
- if (IS_ERR(clnt4)) {
270
- dprintk("RPC: failed to bind second program to "
271
- "rpcbind v4 client (errno %ld).\n",
272
- PTR_ERR(clnt4));
263
+ if (IS_ERR(clnt4))
273264 clnt4 = NULL;
274
- }
275265
276266 rpcb_set_local(net, clnt, clnt4, true);
277267
....@@ -299,6 +289,7 @@
299289 .program = &rpcb_program,
300290 .version = RPCBVERS_2,
301291 .authflavor = RPC_AUTH_UNIX,
292
+ .cred = current_cred(),
302293 .flags = RPC_CLNT_CREATE_NOPING,
303294 };
304295 struct rpc_clnt *clnt, *clnt4;
....@@ -306,8 +297,6 @@
306297
307298 clnt = rpc_create(&args);
308299 if (IS_ERR(clnt)) {
309
- dprintk("RPC: failed to create local rpcbind "
310
- "client (errno %ld).\n", PTR_ERR(clnt));
311300 result = PTR_ERR(clnt);
312301 goto out;
313302 }
....@@ -318,12 +307,8 @@
318307 * v4 upcalls.
319308 */
320309 clnt4 = rpc_bind_new_program(clnt, &rpcb_program, RPCBVERS_4);
321
- if (IS_ERR(clnt4)) {
322
- dprintk("RPC: failed to bind second program to "
323
- "rpcbind v4 client (errno %ld).\n",
324
- PTR_ERR(clnt4));
310
+ if (IS_ERR(clnt4))
325311 clnt4 = NULL;
326
- }
327312
328313 rpcb_set_local(net, clnt, clnt4, false);
329314
....@@ -358,7 +343,8 @@
358343 static struct rpc_clnt *rpcb_create(struct net *net, const char *nodename,
359344 const char *hostname,
360345 struct sockaddr *srvaddr, size_t salen,
361
- int proto, u32 version)
346
+ int proto, u32 version,
347
+ const struct cred *cred)
362348 {
363349 struct rpc_create_args args = {
364350 .net = net,
....@@ -370,6 +356,7 @@
370356 .program = &rpcb_program,
371357 .version = version,
372358 .authflavor = RPC_AUTH_UNIX,
359
+ .cred = cred,
373360 .flags = (RPC_CLNT_CREATE_NOPING |
374361 RPC_CLNT_CREATE_NONPRIVPORT),
375362 };
....@@ -398,11 +385,8 @@
398385 msg->rpc_resp = &result;
399386
400387 error = rpc_call_sync(clnt, msg, flags);
401
- if (error < 0) {
402
- dprintk("RPC: failed to contact local rpcbind "
403
- "server (errno %d).\n", -error);
388
+ if (error < 0)
404389 return error;
405
- }
406390
407391 if (!result)
408392 return -EACCES;
....@@ -456,9 +440,7 @@
456440 struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
457441 bool is_set = false;
458442
459
- dprintk("RPC: %sregistering (%u, %u, %d, %u) with local "
460
- "rpcbind\n", (port ? "" : "un"),
461
- prog, vers, prot, port);
443
+ trace_pmap_register(prog, vers, prot, port);
462444
463445 msg.rpc_proc = &rpcb_procedures2[RPCBPROC_UNSET];
464446 if (port != 0) {
....@@ -483,11 +465,6 @@
483465 int result;
484466
485467 map->r_addr = rpc_sockaddr2uaddr(sap, GFP_KERNEL);
486
-
487
- dprintk("RPC: %sregistering [%u, %u, %s, '%s'] with "
488
- "local rpcbind\n", (port ? "" : "un"),
489
- map->r_prog, map->r_vers,
490
- map->r_addr, map->r_netid);
491468
492469 msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET];
493470 if (port != 0) {
....@@ -515,11 +492,6 @@
515492
516493 map->r_addr = rpc_sockaddr2uaddr(sap, GFP_KERNEL);
517494
518
- dprintk("RPC: %sregistering [%u, %u, %s, '%s'] with "
519
- "local rpcbind\n", (port ? "" : "un"),
520
- map->r_prog, map->r_vers,
521
- map->r_addr, map->r_netid);
522
-
523495 msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET];
524496 if (port != 0) {
525497 msg->rpc_proc = &rpcb_procedures4[RPCBPROC_SET];
....@@ -536,9 +508,7 @@
536508 {
537509 struct rpcbind_args *map = msg->rpc_argp;
538510
539
- dprintk("RPC: unregistering [%u, %u, '%s'] with "
540
- "local rpcbind\n",
541
- map->r_prog, map->r_vers, map->r_netid);
511
+ trace_rpcb_unregister(map->r_prog, map->r_vers, map->r_netid);
542512
543513 map->r_addr = "";
544514 msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET];
....@@ -609,6 +579,8 @@
609579
610580 if (address == NULL)
611581 return rpcb_unregister_all_protofamilies(sn, &msg);
582
+
583
+ trace_rpcb_register(map.r_prog, map.r_vers, map.r_addr, map.r_netid);
612584
613585 switch (address->sa_family) {
614586 case AF_INET:
....@@ -688,17 +660,12 @@
688660 rcu_read_unlock();
689661 xprt = xprt_get(task->tk_xprt);
690662
691
- dprintk("RPC: %5u %s(%s, %u, %u, %d)\n",
692
- task->tk_pid, __func__,
693
- xprt->servername, clnt->cl_prog, clnt->cl_vers, xprt->prot);
694
-
695663 /* Put self on the wait queue to ensure we get notified if
696664 * some other task is already attempting to bind the port */
697
- rpc_sleep_on(&xprt->binding, task, NULL);
665
+ rpc_sleep_on_timeout(&xprt->binding, task,
666
+ NULL, jiffies + xprt->bind_timeout);
698667
699668 if (xprt_test_and_set_binding(xprt)) {
700
- dprintk("RPC: %5u %s: waiting for another binder\n",
701
- task->tk_pid, __func__);
702669 xprt_put(xprt);
703670 return;
704671 }
....@@ -706,8 +673,6 @@
706673 /* Someone else may have bound if we slept */
707674 if (xprt_bound(xprt)) {
708675 status = 0;
709
- dprintk("RPC: %5u %s: already bound\n",
710
- task->tk_pid, __func__);
711676 goto bailout_nofree;
712677 }
713678
....@@ -726,37 +691,29 @@
726691 break;
727692 default:
728693 status = -EAFNOSUPPORT;
729
- dprintk("RPC: %5u %s: bad address family\n",
730
- task->tk_pid, __func__);
731694 goto bailout_nofree;
732695 }
733696 if (proc == NULL) {
734697 xprt->bind_index = 0;
735698 status = -EPFNOSUPPORT;
736
- dprintk("RPC: %5u %s: no more getport versions available\n",
737
- task->tk_pid, __func__);
738699 goto bailout_nofree;
739700 }
740701
741
- dprintk("RPC: %5u %s: trying rpcbind version %u\n",
742
- task->tk_pid, __func__, bind_version);
702
+ trace_rpcb_getport(clnt, task, bind_version);
743703
744704 rpcb_clnt = rpcb_create(xprt->xprt_net,
745705 clnt->cl_nodename,
746706 xprt->servername, sap, salen,
747
- xprt->prot, bind_version);
707
+ xprt->prot, bind_version,
708
+ clnt->cl_cred);
748709 if (IS_ERR(rpcb_clnt)) {
749710 status = PTR_ERR(rpcb_clnt);
750
- dprintk("RPC: %5u %s: rpcb_create failed, error %ld\n",
751
- task->tk_pid, __func__, PTR_ERR(rpcb_clnt));
752711 goto bailout_nofree;
753712 }
754713
755
- map = kzalloc(sizeof(struct rpcbind_args), GFP_ATOMIC);
714
+ map = kzalloc(sizeof(struct rpcbind_args), GFP_NOFS);
756715 if (!map) {
757716 status = -ENOMEM;
758
- dprintk("RPC: %5u %s: no memory available\n",
759
- task->tk_pid, __func__);
760717 goto bailout_release_client;
761718 }
762719 map->r_prog = clnt->cl_prog;
....@@ -770,11 +727,9 @@
770727 case RPCBVERS_4:
771728 case RPCBVERS_3:
772729 map->r_netid = xprt->address_strings[RPC_DISPLAY_NETID];
773
- map->r_addr = rpc_sockaddr2uaddr(sap, GFP_ATOMIC);
730
+ map->r_addr = rpc_sockaddr2uaddr(sap, GFP_NOFS);
774731 if (!map->r_addr) {
775732 status = -ENOMEM;
776
- dprintk("RPC: %5u %s: no memory available\n",
777
- task->tk_pid, __func__);
778733 goto bailout_free_args;
779734 }
780735 map->r_owner = "";
....@@ -788,12 +743,6 @@
788743
789744 child = rpcb_call_async(rpcb_clnt, map, proc);
790745 rpc_release_client(rpcb_clnt);
791
- if (IS_ERR(child)) {
792
- /* rpcb_map_release() has freed the arguments */
793
- dprintk("RPC: %5u %s: rpc_run_task failed\n",
794
- task->tk_pid, __func__);
795
- return;
796
- }
797746
798747 xprt->stat.bind_count++;
799748 rpc_put_task(child);
....@@ -817,34 +766,33 @@
817766 {
818767 struct rpcbind_args *map = data;
819768 struct rpc_xprt *xprt = map->r_xprt;
820
- int status = child->tk_status;
769
+
770
+ map->r_status = child->tk_status;
821771
822772 /* Garbage reply: retry with a lesser rpcbind version */
823
- if (status == -EIO)
824
- status = -EPROTONOSUPPORT;
773
+ if (map->r_status == -EIO)
774
+ map->r_status = -EPROTONOSUPPORT;
825775
826776 /* rpcbind server doesn't support this rpcbind protocol version */
827
- if (status == -EPROTONOSUPPORT)
777
+ if (map->r_status == -EPROTONOSUPPORT)
828778 xprt->bind_index++;
829779
830
- if (status < 0) {
780
+ if (map->r_status < 0) {
831781 /* rpcbind server not available on remote host? */
832
- xprt->ops->set_port(xprt, 0);
782
+ map->r_port = 0;
783
+
833784 } else if (map->r_port == 0) {
834785 /* Requested RPC service wasn't registered on remote host */
835
- xprt->ops->set_port(xprt, 0);
836
- status = -EACCES;
786
+ map->r_status = -EACCES;
837787 } else {
838788 /* Succeeded */
839
- xprt->ops->set_port(xprt, map->r_port);
840
- xprt_set_bound(xprt);
841
- status = 0;
789
+ map->r_status = 0;
842790 }
843791
844
- dprintk("RPC: %5u rpcb_getport_done(status %d, port %u)\n",
845
- child->tk_pid, status, map->r_port);
846
-
847
- map->r_status = status;
792
+ trace_rpcb_setport(child, map->r_status, map->r_port);
793
+ xprt->ops->set_port(xprt, map->r_port);
794
+ if (map->r_port)
795
+ xprt_set_bound(xprt);
848796 }
849797
850798 /*
....@@ -856,11 +804,6 @@
856804 {
857805 const struct rpcbind_args *rpcb = data;
858806 __be32 *p;
859
-
860
- dprintk("RPC: %5u encoding PMAP_%s call (%u, %u, %d, %u)\n",
861
- req->rq_task->tk_pid,
862
- req->rq_task->tk_msg.rpc_proc->p_name,
863
- rpcb->r_prog, rpcb->r_vers, rpcb->r_prot, rpcb->r_port);
864807
865808 p = xdr_reserve_space(xdr, RPCB_mappingargs_sz << 2);
866809 *p++ = cpu_to_be32(rpcb->r_prog);
....@@ -883,8 +826,6 @@
883826 return -EIO;
884827
885828 port = be32_to_cpup(p);
886
- dprintk("RPC: %5u PMAP_%s result: %lu\n", req->rq_task->tk_pid,
887
- req->rq_task->tk_msg.rpc_proc->p_name, port);
888829 if (unlikely(port > USHRT_MAX))
889830 return -EIO;
890831
....@@ -905,11 +846,6 @@
905846 *boolp = 0;
906847 if (*p != xdr_zero)
907848 *boolp = 1;
908
-
909
- dprintk("RPC: %5u RPCB_%s call %s\n",
910
- req->rq_task->tk_pid,
911
- req->rq_task->tk_msg.rpc_proc->p_name,
912
- (*boolp ? "succeeded" : "failed"));
913849 return 0;
914850 }
915851
....@@ -933,12 +869,6 @@
933869 {
934870 const struct rpcbind_args *rpcb = data;
935871 __be32 *p;
936
-
937
- dprintk("RPC: %5u encoding RPCB_%s call (%u, %u, '%s', '%s')\n",
938
- req->rq_task->tk_pid,
939
- req->rq_task->tk_msg.rpc_proc->p_name,
940
- rpcb->r_prog, rpcb->r_vers,
941
- rpcb->r_netid, rpcb->r_addr);
942872
943873 p = xdr_reserve_space(xdr, (RPCB_program_sz + RPCB_version_sz) << 2);
944874 *p++ = cpu_to_be32(rpcb->r_prog);
....@@ -969,11 +899,8 @@
969899 * If the returned universal address is a null string,
970900 * the requested RPC service was not registered.
971901 */
972
- if (len == 0) {
973
- dprintk("RPC: %5u RPCB reply: program not registered\n",
974
- req->rq_task->tk_pid);
902
+ if (len == 0)
975903 return 0;
976
- }
977904
978905 if (unlikely(len > RPCBIND_MAXUADDRLEN))
979906 goto out_fail;
....@@ -981,8 +908,6 @@
981908 p = xdr_inline_decode(xdr, len);
982909 if (unlikely(p == NULL))
983910 goto out_fail;
984
- dprintk("RPC: %5u RPCB_%s reply: %*pE\n", req->rq_task->tk_pid,
985
- req->rq_task->tk_msg.rpc_proc->p_name, len, (char *)p);
986911
987912 if (rpc_uaddr2sockaddr(req->rq_xprt->xprt_net, (char *)p, len,
988913 sap, sizeof(address)) == 0)
....@@ -992,9 +917,6 @@
992917 return 0;
993918
994919 out_fail:
995
- dprintk("RPC: %5u malformed RPCB_%s reply\n",
996
- req->rq_task->tk_pid,
997
- req->rq_task->tk_msg.rpc_proc->p_name);
998920 return -EIO;
999921 }
1000922