• Home
  • Raw
  • Download

Lines Matching +full:rpc +full:- +full:if

2  * In-kernel rpcbind client supporting versions 2, 3, and 4 of the rpcbind
5 * Based on RFC 1833: "Binding Protocols for ONC RPC Version 2" and
35 #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
151 rpc_wake_up_status(&xprt->binding, status); in rpcb_wake_rpcbind_waiters()
158 rpcb_wake_rpcbind_waiters(map->r_xprt, map->r_status); in rpcb_map_release()
159 xprt_put(map->r_xprt); in rpcb_map_release()
160 kfree(map->r_addr); in rpcb_map_release()
169 spin_lock(&sn->rpcb_clnt_lock); in rpcb_get_local()
170 if (sn->rpcb_users) in rpcb_get_local()
171 sn->rpcb_users++; in rpcb_get_local()
172 cnt = sn->rpcb_users; in rpcb_get_local()
173 spin_unlock(&sn->rpcb_clnt_lock); in rpcb_get_local()
181 struct rpc_clnt *clnt = sn->rpcb_local_clnt; in rpcb_put_local()
182 struct rpc_clnt *clnt4 = sn->rpcb_local_clnt4; in rpcb_put_local()
185 spin_lock(&sn->rpcb_clnt_lock); in rpcb_put_local()
186 if (sn->rpcb_users) { in rpcb_put_local()
187 if (--sn->rpcb_users == 0) { in rpcb_put_local()
188 sn->rpcb_local_clnt = NULL; in rpcb_put_local()
189 sn->rpcb_local_clnt4 = NULL; in rpcb_put_local()
191 shutdown = !sn->rpcb_users; in rpcb_put_local()
193 spin_unlock(&sn->rpcb_clnt_lock); in rpcb_put_local()
195 if (shutdown) { in rpcb_put_local()
197 * cleanup_rpcb_clnt - remove xprtsock's sysctls, unregister in rpcb_put_local()
199 if (clnt4) in rpcb_put_local()
201 if (clnt) in rpcb_put_local()
213 sn->rpcb_local_clnt = clnt; in rpcb_set_local()
214 sn->rpcb_local_clnt4 = clnt4; in rpcb_set_local()
215 sn->rpcb_is_af_local = is_af_local ? 1 : 0; in rpcb_set_local()
217 sn->rpcb_users = 1; in rpcb_set_local()
218 dprintk("RPC: created new rpcb local clients (rpcb_local_clnt: " in rpcb_set_local()
220 sn->rpcb_local_clnt, sn->rpcb_local_clnt4, in rpcb_set_local()
221 net->ns.inum, (net == &init_net) ? " (init_net)" : ""); in rpcb_set_local()
256 * Because we requested an RPC PING at transport creation time, in rpcb_create_local_unix()
257 * this works only if the user space portmapper is rpcbind, and in rpcb_create_local_unix()
261 if (IS_ERR(clnt)) { in rpcb_create_local_unix()
262 dprintk("RPC: failed to create AF_LOCAL rpcbind " in rpcb_create_local_unix()
269 if (IS_ERR(clnt4)) { in rpcb_create_local_unix()
270 dprintk("RPC: failed to bind second program to " in rpcb_create_local_unix()
308 if (IS_ERR(clnt)) { in rpcb_create_local_net()
309 dprintk("RPC: failed to create local rpcbind " in rpcb_create_local_net()
316 * This results in an RPC ping. On systems running portmapper, in rpcb_create_local_net()
321 if (IS_ERR(clnt4)) { in rpcb_create_local_net()
322 dprintk("RPC: failed to bind second program to " in rpcb_create_local_net()
343 if (rpcb_get_local(net)) in rpcb_create_local()
347 if (rpcb_get_local(net)) in rpcb_create_local()
350 if (rpcb_create_local_unix(net) != 0) in rpcb_create_local()
377 switch (srvaddr->sa_family) { in rpcb_create()
379 ((struct sockaddr_in *)srvaddr)->sin_port = htons(RPCBIND_PORT); in rpcb_create()
382 ((struct sockaddr_in6 *)srvaddr)->sin6_port = htons(RPCBIND_PORT); in rpcb_create()
385 return ERR_PTR(-EAFNOSUPPORT); in rpcb_create()
396 if (is_set || !sn->rpcb_is_af_local) in rpcb_register_call()
398 msg->rpc_resp = &result; in rpcb_register_call()
401 if (error < 0) { in rpcb_register_call()
402 dprintk("RPC: failed to contact local rpcbind " in rpcb_register_call()
403 "server (errno %d).\n", -error); in rpcb_register_call()
407 if (!result) in rpcb_register_call()
408 return -EACCES; in rpcb_register_call()
413 * rpcb_register - set or unset a port registration with the local rpcbind svc
415 * @prog: RPC program number to bind
416 * @vers: RPC version number to bind
420 * Returns zero if the registration request was dispatched successfully
425 * RPC services invoke this function to advertise their contact
426 * information via the system's rpcbind daemon. RPC services
430 * Callers may also unregister RPC services that are no longer
431 * available by setting the passed-in port to zero. This removes
440 * address. If the local rpcbind daemon is listening on AF_INET6,
459 dprintk("RPC: %sregistering (%u, %u, %d, %u) with local " in rpcb_register()
464 if (port != 0) { in rpcb_register()
469 return rpcb_register_call(sn, sn->rpcb_local_clnt, &msg, is_set); in rpcb_register()
473 * Fill in AF_INET family-specific arguments to register
480 struct rpcbind_args *map = msg->rpc_argp; in rpcb_register_inet4()
481 unsigned short port = ntohs(sin->sin_port); in rpcb_register_inet4()
485 map->r_addr = rpc_sockaddr2uaddr(sap, GFP_KERNEL); in rpcb_register_inet4()
487 dprintk("RPC: %sregistering [%u, %u, %s, '%s'] with " in rpcb_register_inet4()
489 map->r_prog, map->r_vers, in rpcb_register_inet4()
490 map->r_addr, map->r_netid); in rpcb_register_inet4()
492 msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET]; in rpcb_register_inet4()
493 if (port != 0) { in rpcb_register_inet4()
494 msg->rpc_proc = &rpcb_procedures4[RPCBPROC_SET]; in rpcb_register_inet4()
498 result = rpcb_register_call(sn, sn->rpcb_local_clnt4, msg, is_set); in rpcb_register_inet4()
499 kfree(map->r_addr); in rpcb_register_inet4()
504 * Fill in AF_INET6 family-specific arguments to register
511 struct rpcbind_args *map = msg->rpc_argp; in rpcb_register_inet6()
512 unsigned short port = ntohs(sin6->sin6_port); in rpcb_register_inet6()
516 map->r_addr = rpc_sockaddr2uaddr(sap, GFP_KERNEL); in rpcb_register_inet6()
518 dprintk("RPC: %sregistering [%u, %u, %s, '%s'] with " in rpcb_register_inet6()
520 map->r_prog, map->r_vers, in rpcb_register_inet6()
521 map->r_addr, map->r_netid); in rpcb_register_inet6()
523 msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET]; in rpcb_register_inet6()
524 if (port != 0) { in rpcb_register_inet6()
525 msg->rpc_proc = &rpcb_procedures4[RPCBPROC_SET]; in rpcb_register_inet6()
529 result = rpcb_register_call(sn, sn->rpcb_local_clnt4, msg, is_set); in rpcb_register_inet6()
530 kfree(map->r_addr); in rpcb_register_inet6()
537 struct rpcbind_args *map = msg->rpc_argp; in rpcb_unregister_all_protofamilies()
539 dprintk("RPC: unregistering [%u, %u, '%s'] with " in rpcb_unregister_all_protofamilies()
541 map->r_prog, map->r_vers, map->r_netid); in rpcb_unregister_all_protofamilies()
543 map->r_addr = ""; in rpcb_unregister_all_protofamilies()
544 msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET]; in rpcb_unregister_all_protofamilies()
546 return rpcb_register_call(sn, sn->rpcb_local_clnt4, msg, false); in rpcb_unregister_all_protofamilies()
550 * rpcb_v4_register - set or unset a port registration with the local rpcbind
552 * @program: RPC program number of service to (un)register
553 * @version: RPC version number of service to (un)register
557 * Returns zero if the registration request was dispatched successfully
562 * RPC services invoke this function to advertise their contact
563 * information via the system's rpcbind daemon. RPC services
567 * Callers may also unregister RPC services that are registered at a
570 * a service by passing a NULL @address argument. If @netid is ""
584 * as the raw address, but specifying a non-zero address is also
585 * supported by this API if the caller wishes to advertise an RPC
589 * registration as IN6ADDR_ANY. The former advertises an RPC
607 if (sn->rpcb_local_clnt4 == NULL) in rpcb_v4_register()
608 return -EPROTONOSUPPORT; in rpcb_v4_register()
610 if (address == NULL) in rpcb_v4_register()
613 switch (address->sa_family) { in rpcb_v4_register()
620 return -EAFNOSUPPORT; in rpcb_v4_register()
643 * In the case where rpc clients have been cloned, we want to make
651 struct rpc_clnt *parent = clnt->cl_parent; in rpcb_find_transport_owner()
652 struct rpc_xprt_switch *xps = rcu_access_pointer(clnt->cl_xpi.xpi_xpswitch); in rpcb_find_transport_owner()
655 if (rcu_access_pointer(parent->cl_xpi.xpi_xpswitch) != xps) in rpcb_find_transport_owner()
657 if (clnt->cl_autobind) in rpcb_find_transport_owner()
660 parent = parent->cl_parent; in rpcb_find_transport_owner()
666 * rpcb_getport_async - obtain the port for a given RPC service on a given host
669 * This one can be called for an ongoing RPC request, and can be used in
687 clnt = rpcb_find_transport_owner(task->tk_client); in rpcb_getport_async()
689 xprt = xprt_get(task->tk_xprt); in rpcb_getport_async()
691 dprintk("RPC: %5u %s(%s, %u, %u, %d)\n", in rpcb_getport_async()
692 task->tk_pid, __func__, in rpcb_getport_async()
693 xprt->servername, clnt->cl_prog, clnt->cl_vers, xprt->prot); in rpcb_getport_async()
695 /* Put self on the wait queue to ensure we get notified if in rpcb_getport_async()
697 rpc_sleep_on(&xprt->binding, task, NULL); in rpcb_getport_async()
699 if (xprt_test_and_set_binding(xprt)) { in rpcb_getport_async()
700 dprintk("RPC: %5u %s: waiting for another binder\n", in rpcb_getport_async()
701 task->tk_pid, __func__); in rpcb_getport_async()
706 /* Someone else may have bound if we slept */ in rpcb_getport_async()
707 if (xprt_bound(xprt)) { in rpcb_getport_async()
709 dprintk("RPC: %5u %s: already bound\n", in rpcb_getport_async()
710 task->tk_pid, __func__); in rpcb_getport_async()
718 switch (sap->sa_family) { in rpcb_getport_async()
720 proc = rpcb_next_version[xprt->bind_index].rpc_proc; in rpcb_getport_async()
721 bind_version = rpcb_next_version[xprt->bind_index].rpc_vers; in rpcb_getport_async()
724 proc = rpcb_next_version6[xprt->bind_index].rpc_proc; in rpcb_getport_async()
725 bind_version = rpcb_next_version6[xprt->bind_index].rpc_vers; in rpcb_getport_async()
728 status = -EAFNOSUPPORT; in rpcb_getport_async()
729 dprintk("RPC: %5u %s: bad address family\n", in rpcb_getport_async()
730 task->tk_pid, __func__); in rpcb_getport_async()
733 if (proc == NULL) { in rpcb_getport_async()
734 xprt->bind_index = 0; in rpcb_getport_async()
735 status = -EPFNOSUPPORT; in rpcb_getport_async()
736 dprintk("RPC: %5u %s: no more getport versions available\n", in rpcb_getport_async()
737 task->tk_pid, __func__); in rpcb_getport_async()
741 dprintk("RPC: %5u %s: trying rpcbind version %u\n", in rpcb_getport_async()
742 task->tk_pid, __func__, bind_version); in rpcb_getport_async()
744 rpcb_clnt = rpcb_create(xprt->xprt_net, in rpcb_getport_async()
745 clnt->cl_nodename, in rpcb_getport_async()
746 xprt->servername, sap, salen, in rpcb_getport_async()
747 xprt->prot, bind_version); in rpcb_getport_async()
748 if (IS_ERR(rpcb_clnt)) { in rpcb_getport_async()
750 dprintk("RPC: %5u %s: rpcb_create failed, error %ld\n", in rpcb_getport_async()
751 task->tk_pid, __func__, PTR_ERR(rpcb_clnt)); in rpcb_getport_async()
756 if (!map) { in rpcb_getport_async()
757 status = -ENOMEM; in rpcb_getport_async()
758 dprintk("RPC: %5u %s: no memory available\n", in rpcb_getport_async()
759 task->tk_pid, __func__); in rpcb_getport_async()
762 map->r_prog = clnt->cl_prog; in rpcb_getport_async()
763 map->r_vers = clnt->cl_vers; in rpcb_getport_async()
764 map->r_prot = xprt->prot; in rpcb_getport_async()
765 map->r_port = 0; in rpcb_getport_async()
766 map->r_xprt = xprt; in rpcb_getport_async()
767 map->r_status = -EIO; in rpcb_getport_async()
772 map->r_netid = xprt->address_strings[RPC_DISPLAY_NETID]; in rpcb_getport_async()
773 map->r_addr = rpc_sockaddr2uaddr(sap, GFP_ATOMIC); in rpcb_getport_async()
774 if (!map->r_addr) { in rpcb_getport_async()
775 status = -ENOMEM; in rpcb_getport_async()
776 dprintk("RPC: %5u %s: no memory available\n", in rpcb_getport_async()
777 task->tk_pid, __func__); in rpcb_getport_async()
780 map->r_owner = ""; in rpcb_getport_async()
783 map->r_addr = NULL; in rpcb_getport_async()
791 if (IS_ERR(child)) { in rpcb_getport_async()
793 dprintk("RPC: %5u %s: rpc_run_task failed\n", in rpcb_getport_async()
794 task->tk_pid, __func__); in rpcb_getport_async()
798 xprt->stat.bind_count++; in rpcb_getport_async()
808 task->tk_status = status; in rpcb_getport_async()
819 struct rpc_xprt *xprt = map->r_xprt; in rpcb_getport_done()
820 int status = child->tk_status; in rpcb_getport_done()
823 if (status == -EIO) in rpcb_getport_done()
824 status = -EPROTONOSUPPORT; in rpcb_getport_done()
827 if (status == -EPROTONOSUPPORT) in rpcb_getport_done()
828 xprt->bind_index++; in rpcb_getport_done()
830 if (status < 0) { in rpcb_getport_done()
832 xprt->ops->set_port(xprt, 0); in rpcb_getport_done()
833 } else if (map->r_port == 0) { in rpcb_getport_done()
834 /* Requested RPC service wasn't registered on remote host */ in rpcb_getport_done()
835 xprt->ops->set_port(xprt, 0); in rpcb_getport_done()
836 status = -EACCES; in rpcb_getport_done()
839 xprt->ops->set_port(xprt, map->r_port); in rpcb_getport_done()
844 dprintk("RPC: %5u rpcb_getport_done(status %d, port %u)\n", in rpcb_getport_done()
845 child->tk_pid, status, map->r_port); in rpcb_getport_done()
847 map->r_status = status; in rpcb_getport_done()
860 dprintk("RPC: %5u encoding PMAP_%s call (%u, %u, %d, %u)\n", in rpcb_enc_mapping()
861 req->rq_task->tk_pid, in rpcb_enc_mapping()
862 req->rq_task->tk_msg.rpc_proc->p_name, in rpcb_enc_mapping()
863 rpcb->r_prog, rpcb->r_vers, rpcb->r_prot, rpcb->r_port); in rpcb_enc_mapping()
866 *p++ = cpu_to_be32(rpcb->r_prog); in rpcb_enc_mapping()
867 *p++ = cpu_to_be32(rpcb->r_vers); in rpcb_enc_mapping()
868 *p++ = cpu_to_be32(rpcb->r_prot); in rpcb_enc_mapping()
869 *p = cpu_to_be32(rpcb->r_port); in rpcb_enc_mapping()
879 rpcb->r_port = 0; in rpcb_dec_getport()
882 if (unlikely(p == NULL)) in rpcb_dec_getport()
883 return -EIO; in rpcb_dec_getport()
886 dprintk("RPC: %5u PMAP_%s result: %lu\n", req->rq_task->tk_pid, in rpcb_dec_getport()
887 req->rq_task->tk_msg.rpc_proc->p_name, port); in rpcb_dec_getport()
888 if (unlikely(port > USHRT_MAX)) in rpcb_dec_getport()
889 return -EIO; in rpcb_dec_getport()
891 rpcb->r_port = port; in rpcb_dec_getport()
902 if (unlikely(p == NULL)) in rpcb_dec_set()
903 return -EIO; in rpcb_dec_set()
906 if (*p != xdr_zero) in rpcb_dec_set()
909 dprintk("RPC: %5u RPCB_%s call %s\n", in rpcb_dec_set()
910 req->rq_task->tk_pid, in rpcb_dec_set()
911 req->rq_task->tk_msg.rpc_proc->p_name, in rpcb_dec_set()
924 if (len > maxstrlen) in encode_rpcb_string()
937 dprintk("RPC: %5u encoding RPCB_%s call (%u, %u, '%s', '%s')\n", in rpcb_enc_getaddr()
938 req->rq_task->tk_pid, in rpcb_enc_getaddr()
939 req->rq_task->tk_msg.rpc_proc->p_name, in rpcb_enc_getaddr()
940 rpcb->r_prog, rpcb->r_vers, in rpcb_enc_getaddr()
941 rpcb->r_netid, rpcb->r_addr); in rpcb_enc_getaddr()
944 *p++ = cpu_to_be32(rpcb->r_prog); in rpcb_enc_getaddr()
945 *p = cpu_to_be32(rpcb->r_vers); in rpcb_enc_getaddr()
947 encode_rpcb_string(xdr, rpcb->r_netid, RPCBIND_MAXNETIDLEN); in rpcb_enc_getaddr()
948 encode_rpcb_string(xdr, rpcb->r_addr, RPCBIND_MAXUADDRLEN); in rpcb_enc_getaddr()
949 encode_rpcb_string(xdr, rpcb->r_owner, RPCB_MAXOWNERLEN); in rpcb_enc_getaddr()
961 rpcb->r_port = 0; in rpcb_dec_getaddr()
964 if (unlikely(p == NULL)) in rpcb_dec_getaddr()
969 * If the returned universal address is a null string, in rpcb_dec_getaddr()
970 * the requested RPC service was not registered. in rpcb_dec_getaddr()
972 if (len == 0) { in rpcb_dec_getaddr()
973 dprintk("RPC: %5u RPCB reply: program not registered\n", in rpcb_dec_getaddr()
974 req->rq_task->tk_pid); in rpcb_dec_getaddr()
978 if (unlikely(len > RPCBIND_MAXUADDRLEN)) in rpcb_dec_getaddr()
982 if (unlikely(p == NULL)) in rpcb_dec_getaddr()
984 dprintk("RPC: %5u RPCB_%s reply: %*pE\n", req->rq_task->tk_pid, in rpcb_dec_getaddr()
985 req->rq_task->tk_msg.rpc_proc->p_name, len, (char *)p); in rpcb_dec_getaddr()
987 if (rpc_uaddr2sockaddr(req->rq_xprt->xprt_net, (char *)p, len, in rpcb_dec_getaddr()
990 rpcb->r_port = rpc_get_port(sap); in rpcb_dec_getaddr()
995 dprintk("RPC: %5u malformed RPCB_%s reply\n", in rpcb_dec_getaddr()
996 req->rq_task->tk_pid, in rpcb_dec_getaddr()
997 req->rq_task->tk_msg.rpc_proc->p_name); in rpcb_dec_getaddr()
998 return -EIO; in rpcb_dec_getaddr()
1003 * since the Linux kernel RPC code requires only these.