Lines Matching +full:rpc +full:- +full:if
4 * This file contains the high-level RPC interface.
8 * - RPC header generation and argument serialization.
9 * - Credential refresh.
10 * - TCP connect handling.
11 * - Retry of operation when it is suspected the operation failed because
45 #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
50 dprintk("RPC: %5u %s (status %d)\n", t->tk_pid, \
51 __func__, t->tk_status)
54 * All RPC clients are linked into this list
68 #if defined(CONFIG_SUNRPC_BACKCHANNEL)
88 spin_lock(&sn->rpc_client_lock); in rpc_register_client()
89 list_add(&clnt->cl_clients, &sn->all_clients); in rpc_register_client()
90 spin_unlock(&sn->rpc_client_lock); in rpc_register_client()
98 spin_lock(&sn->rpc_client_lock); in rpc_unregister_client()
99 list_del(&clnt->cl_clients); in rpc_unregister_client()
100 spin_unlock(&sn->rpc_client_lock); in rpc_unregister_client()
114 if (pipefs_sb) { in rpc_clnt_remove_pipedir()
124 const char *dir_name = clnt->cl_program->pipe_dir_name; in rpc_setup_pipedir_sb()
129 if (dir == NULL) { in rpc_setup_pipedir_sb()
130 pr_info("RPC: pipefs directory doesn't exist: %s\n", dir_name); in rpc_setup_pipedir_sb()
135 name[sizeof(name) - 1] = '\0'; in rpc_setup_pipedir_sb()
137 if (!IS_ERR(dentry)) in rpc_setup_pipedir_sb()
139 if (dentry == ERR_PTR(-EEXIST)) in rpc_setup_pipedir_sb()
141 printk(KERN_INFO "RPC: Couldn't create pipefs entry" in rpc_setup_pipedir_sb()
155 if (clnt->cl_program->pipe_dir_name != NULL) { in rpc_setup_pipedir()
157 if (IS_ERR(dentry)) in rpc_setup_pipedir()
165 if (clnt->cl_program->pipe_dir_name == NULL) in rpc_clnt_skip_event()
170 if (clnt->cl_pipedir_objects.pdh_dentry != NULL) in rpc_clnt_skip_event()
172 if (atomic_read(&clnt->cl_count) == 0) in rpc_clnt_skip_event()
176 if (clnt->cl_pipedir_objects.pdh_dentry == NULL) in rpc_clnt_skip_event()
191 if (!dentry) in __rpc_clnt_handle_event()
192 return -ENOENT; in __rpc_clnt_handle_event()
193 if (IS_ERR(dentry)) in __rpc_clnt_handle_event()
201 return -ENOTSUPP; in __rpc_clnt_handle_event()
211 for (;; clnt = clnt->cl_parent) { in __rpc_pipefs_event()
212 if (!rpc_clnt_skip_event(clnt, event)) in __rpc_pipefs_event()
214 if (error || clnt == clnt->cl_parent) in __rpc_pipefs_event()
225 spin_lock(&sn->rpc_client_lock); in rpc_get_client_for_event()
226 list_for_each_entry(clnt, &sn->all_clients, cl_clients) { in rpc_get_client_for_event()
227 if (rpc_clnt_skip_event(clnt, event)) in rpc_get_client_for_event()
229 spin_unlock(&sn->rpc_client_lock); in rpc_get_client_for_event()
232 spin_unlock(&sn->rpc_client_lock); in rpc_get_client_for_event()
243 while ((clnt = rpc_get_client_for_event(sb->s_fs_info, event))) { in rpc_pipefs_event()
245 if (error) in rpc_pipefs_event()
272 spin_lock(&clnt->cl_lock); in rpc_clnt_set_transport()
273 old = rcu_dereference_protected(clnt->cl_xprt, in rpc_clnt_set_transport()
274 lockdep_is_held(&clnt->cl_lock)); in rpc_clnt_set_transport()
276 if (!xprt_bound(xprt)) in rpc_clnt_set_transport()
277 clnt->cl_autobind = 1; in rpc_clnt_set_transport()
279 clnt->cl_timeout = timeout; in rpc_clnt_set_transport()
280 rcu_assign_pointer(clnt->cl_xprt, xprt); in rpc_clnt_set_transport()
281 spin_unlock(&clnt->cl_lock); in rpc_clnt_set_transport()
288 clnt->cl_nodelen = strlcpy(clnt->cl_nodename, in rpc_clnt_set_nodename()
289 nodename, sizeof(clnt->cl_nodename)); in rpc_clnt_set_nodename()
308 if (pipefs_sb) { in rpc_client_register()
310 if (err) in rpc_client_register()
315 if (pipefs_sb) in rpc_client_register()
319 if (IS_ERR(auth)) { in rpc_client_register()
320 dprintk("RPC: Couldn't create auth handle (flavor %u)\n", in rpc_client_register()
331 if (pipefs_sb) in rpc_client_register()
349 if (clid < 0) in rpc_alloc_clid()
351 clnt->cl_clid = clid; in rpc_alloc_clid()
357 ida_simple_remove(&rpc_clids, clnt->cl_clid); in rpc_free_clid()
365 const struct rpc_program *program = args->program; in rpc_new_client()
369 const char *nodename = args->nodename; in rpc_new_client()
373 dprintk("RPC: creating %s client for %s (xprt %p)\n", in rpc_new_client()
374 program->name, args->servername, xprt); in rpc_new_client()
377 if (err) in rpc_new_client()
380 err = -EINVAL; in rpc_new_client()
381 if (args->version >= program->nrvers) in rpc_new_client()
383 version = program->version[args->version]; in rpc_new_client()
384 if (version == NULL) in rpc_new_client()
387 err = -ENOMEM; in rpc_new_client()
389 if (!clnt) in rpc_new_client()
391 clnt->cl_parent = parent ? : clnt; in rpc_new_client()
394 if (err) in rpc_new_client()
397 clnt->cl_procinfo = version->procs; in rpc_new_client()
398 clnt->cl_maxproc = version->nrprocs; in rpc_new_client()
399 clnt->cl_prog = args->prognumber ? : program->number; in rpc_new_client()
400 clnt->cl_vers = version->number; in rpc_new_client()
401 clnt->cl_stats = program->stats; in rpc_new_client()
402 clnt->cl_metrics = rpc_alloc_iostats(clnt); in rpc_new_client()
403 rpc_init_pipe_dir_head(&clnt->cl_pipedir_objects); in rpc_new_client()
404 err = -ENOMEM; in rpc_new_client()
405 if (clnt->cl_metrics == NULL) in rpc_new_client()
407 clnt->cl_program = program; in rpc_new_client()
408 INIT_LIST_HEAD(&clnt->cl_tasks); in rpc_new_client()
409 spin_lock_init(&clnt->cl_lock); in rpc_new_client()
411 timeout = xprt->timeout; in rpc_new_client()
412 if (args->timeout != NULL) { in rpc_new_client()
413 memcpy(&clnt->cl_timeout_default, args->timeout, in rpc_new_client()
414 sizeof(clnt->cl_timeout_default)); in rpc_new_client()
415 timeout = &clnt->cl_timeout_default; in rpc_new_client()
419 xprt_iter_init(&clnt->cl_xpi, xps); in rpc_new_client()
422 clnt->cl_rtt = &clnt->cl_rtt_default; in rpc_new_client()
423 rpc_init_rtt(&clnt->cl_rtt_default, clnt->cl_timeout->to_initval); in rpc_new_client()
425 atomic_set(&clnt->cl_count, 1); in rpc_new_client()
427 if (nodename == NULL) in rpc_new_client()
428 nodename = utsname()->nodename; in rpc_new_client()
432 err = rpc_client_register(clnt, args->authflavor, args->client_name); in rpc_new_client()
433 if (err) in rpc_new_client()
435 if (parent) in rpc_new_client()
436 atomic_inc(&parent->cl_count); in rpc_new_client()
440 rpc_free_iostats(clnt->cl_metrics); in rpc_new_client()
459 if (args->bc_xprt && args->bc_xprt->xpt_bc_xps) { in rpc_create_xprt()
460 WARN_ON_ONCE(!(args->protocol & XPRT_TRANSPORT_BC)); in rpc_create_xprt()
461 xps = args->bc_xprt->xpt_bc_xps; in rpc_create_xprt()
465 if (xps == NULL) { in rpc_create_xprt()
467 return ERR_PTR(-ENOMEM); in rpc_create_xprt()
469 if (xprt->bc_xprt) { in rpc_create_xprt()
471 xprt->bc_xprt->xpt_bc_xps = xps; in rpc_create_xprt()
475 if (IS_ERR(clnt)) in rpc_create_xprt()
478 if (!(args->flags & RPC_CLNT_CREATE_NOPING)) { in rpc_create_xprt()
480 if (err != 0) { in rpc_create_xprt()
486 clnt->cl_softrtry = 1; in rpc_create_xprt()
487 if (args->flags & RPC_CLNT_CREATE_HARDRTRY) in rpc_create_xprt()
488 clnt->cl_softrtry = 0; in rpc_create_xprt()
490 if (args->flags & RPC_CLNT_CREATE_AUTOBIND) in rpc_create_xprt()
491 clnt->cl_autobind = 1; in rpc_create_xprt()
492 if (args->flags & RPC_CLNT_CREATE_NO_RETRANS_TIMEOUT) in rpc_create_xprt()
493 clnt->cl_noretranstimeo = 1; in rpc_create_xprt()
494 if (args->flags & RPC_CLNT_CREATE_DISCRTRY) in rpc_create_xprt()
495 clnt->cl_discrtry = 1; in rpc_create_xprt()
496 if (!(args->flags & RPC_CLNT_CREATE_QUIET)) in rpc_create_xprt()
497 clnt->cl_chatty = 1; in rpc_create_xprt()
503 * rpc_create - create an RPC client and transport with one call
506 * Creates and initializes an RPC transport and an RPC client.
508 * It can ping the server in order to determine if it is up, and to see if
516 .net = args->net, in rpc_create()
517 .ident = args->protocol, in rpc_create()
518 .srcaddr = args->saddress, in rpc_create()
519 .dstaddr = args->address, in rpc_create()
520 .addrlen = args->addrsize, in rpc_create()
521 .servername = args->servername, in rpc_create()
522 .bc_xprt = args->bc_xprt, in rpc_create()
526 if (args->bc_xprt) { in rpc_create()
527 WARN_ON_ONCE(!(args->protocol & XPRT_TRANSPORT_BC)); in rpc_create()
528 xprt = args->bc_xprt->xpt_bc_xprt; in rpc_create()
529 if (xprt) { in rpc_create()
535 if (args->flags & RPC_CLNT_CREATE_INFINITE_SLOTS) in rpc_create()
537 if (args->flags & RPC_CLNT_CREATE_NO_IDLE_TIMEOUT) in rpc_create()
540 * If the caller chooses not to specify a hostname, whip in rpc_create()
541 * up a string representation of the passed-in address. in rpc_create()
543 if (xprtargs.servername == NULL) { in rpc_create()
545 (struct sockaddr_un *)args->address; in rpc_create()
547 (struct sockaddr_in *)args->address; in rpc_create()
549 (struct sockaddr_in6 *)args->address; in rpc_create()
552 switch (args->address->sa_family) { in rpc_create()
555 sun->sun_path); in rpc_create()
559 &sin->sin_addr.s_addr); in rpc_create()
563 &sin6->sin6_addr); in rpc_create()
568 return ERR_PTR(-EINVAL); in rpc_create()
574 if (IS_ERR(xprt)) in rpc_create()
578 * By default, kernel RPC client connects from a reserved port. in rpc_create()
583 xprt->resvport = 1; in rpc_create()
584 if (args->flags & RPC_CLNT_CREATE_NONPRIVPORT) in rpc_create()
585 xprt->resvport = 0; in rpc_create()
592 * This function clones the RPC client structure. It allows us to share the
604 err = -ENOMEM; in __rpc_clone_client()
606 xprt = xprt_get(rcu_dereference(clnt->cl_xprt)); in __rpc_clone_client()
607 xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch)); in __rpc_clone_client()
609 if (xprt == NULL || xps == NULL) { in __rpc_clone_client()
614 args->servername = xprt->servername; in __rpc_clone_client()
615 args->nodename = clnt->cl_nodename; in __rpc_clone_client()
618 if (IS_ERR(new)) { in __rpc_clone_client()
624 new->cl_autobind = 0; in __rpc_clone_client()
625 new->cl_softrtry = clnt->cl_softrtry; in __rpc_clone_client()
626 new->cl_noretranstimeo = clnt->cl_noretranstimeo; in __rpc_clone_client()
627 new->cl_discrtry = clnt->cl_discrtry; in __rpc_clone_client()
628 new->cl_chatty = clnt->cl_chatty; in __rpc_clone_client()
632 dprintk("RPC: %s: returned error %d\n", __func__, err); in __rpc_clone_client()
637 * rpc_clone_client - Clone an RPC client structure
639 * @clnt: RPC client whose parameters are copied
641 * Returns a fresh RPC client or an ERR_PTR.
646 .program = clnt->cl_program, in rpc_clone_client()
647 .prognumber = clnt->cl_prog, in rpc_clone_client()
648 .version = clnt->cl_vers, in rpc_clone_client()
649 .authflavor = clnt->cl_auth->au_flavor, in rpc_clone_client()
656 * rpc_clone_client_set_auth - Clone an RPC client structure and set its auth
658 * @clnt: RPC client whose parameters are copied
661 * Returns a fresh RPC client or an ERR_PTR.
667 .program = clnt->cl_program, in rpc_clone_client_set_auth()
668 .prognumber = clnt->cl_prog, in rpc_clone_client_set_auth()
669 .version = clnt->cl_vers, in rpc_clone_client_set_auth()
677 * rpc_switch_client_transport: switch the RPC transport on the fly
682 * This function allows the caller to switch the RPC transport for the
685 * there are no active RPC tasks by using some form of locking.
687 * Returns zero if "clnt" is now using the new xprt. Otherwise a
703 if (IS_ERR(xprt)) { in rpc_switch_client_transport()
704 dprintk("RPC: failed to create new xprt for clnt %p\n", in rpc_switch_client_transport()
710 if (xps == NULL) { in rpc_switch_client_transport()
712 return -ENOMEM; in rpc_switch_client_transport()
715 pseudoflavor = clnt->cl_auth->au_flavor; in rpc_switch_client_transport()
717 old_timeo = clnt->cl_timeout; in rpc_switch_client_transport()
719 oldxps = xprt_iter_xchg_switch(&clnt->cl_xpi, xps); in rpc_switch_client_transport()
728 * children, if it has any, still point to the old xprt. in rpc_switch_client_transport()
730 parent = clnt->cl_parent; in rpc_switch_client_transport()
731 clnt->cl_parent = clnt; in rpc_switch_client_transport()
734 * The old rpc_auth cache cannot be re-used. GSS in rpc_switch_client_transport()
739 if (err) in rpc_switch_client_transport()
743 if (parent != clnt) in rpc_switch_client_transport()
747 dprintk("RPC: replaced xprt for clnt %p\n", clnt); in rpc_switch_client_transport()
751 xps = xprt_iter_xchg_switch(&clnt->cl_xpi, oldxps); in rpc_switch_client_transport()
753 clnt->cl_parent = parent; in rpc_switch_client_transport()
757 dprintk("RPC: failed to switch xprt for clnt %p\n", clnt); in rpc_switch_client_transport()
768 xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch)); in rpc_clnt_xprt_iter_init()
770 if (xps == NULL) in rpc_clnt_xprt_iter_init()
771 return -EAGAIN; in rpc_clnt_xprt_iter_init()
778 * rpc_clnt_iterate_for_each_xprt - Apply a function to all transports
783 * Iterates through the list of RPC transports currently attached to the
796 if (ret) in rpc_clnt_iterate_for_each_xprt()
801 if (!xprt) in rpc_clnt_iterate_for_each_xprt()
805 if (ret < 0) in rpc_clnt_iterate_for_each_xprt()
822 if (list_empty(&clnt->cl_tasks)) in rpc_killall_tasks()
824 dprintk("RPC: killing all tasks for client %p\n", clnt); in rpc_killall_tasks()
828 spin_lock(&clnt->cl_lock); in rpc_killall_tasks()
829 list_for_each_entry(rovr, &clnt->cl_tasks, tk_task) { in rpc_killall_tasks()
830 if (!RPC_IS_ACTIVATED(rovr)) in rpc_killall_tasks()
832 if (!(rovr->tk_flags & RPC_TASK_KILLED)) { in rpc_killall_tasks()
833 rovr->tk_flags |= RPC_TASK_KILLED; in rpc_killall_tasks()
834 rpc_exit(rovr, -EIO); in rpc_killall_tasks()
835 if (RPC_IS_QUEUED(rovr)) in rpc_killall_tasks()
836 rpc_wake_up_queued_task(rovr->tk_waitqueue, in rpc_killall_tasks()
840 spin_unlock(&clnt->cl_lock); in rpc_killall_tasks()
845 * Properly shut down an RPC client, terminating all outstanding
852 dprintk_rcu("RPC: shutting down %s client for %s\n", in rpc_shutdown_client()
853 clnt->cl_program->name, in rpc_shutdown_client()
854 rcu_dereference(clnt->cl_xprt)->servername); in rpc_shutdown_client()
856 while (!list_empty(&clnt->cl_tasks)) { in rpc_shutdown_client()
859 list_empty(&clnt->cl_tasks), 1*HZ); in rpc_shutdown_client()
867 * Free an RPC client
874 dprintk_rcu("RPC: destroying %s client for %s\n", in rpc_free_client()
875 clnt->cl_program->name, in rpc_free_client()
876 rcu_dereference(clnt->cl_xprt)->servername); in rpc_free_client()
877 if (clnt->cl_parent != clnt) in rpc_free_client()
878 parent = clnt->cl_parent; in rpc_free_client()
882 rpc_free_iostats(clnt->cl_metrics); in rpc_free_client()
883 clnt->cl_metrics = NULL; in rpc_free_client()
884 xprt_put(rcu_dereference_raw(clnt->cl_xprt)); in rpc_free_client()
885 xprt_iter_destroy(&clnt->cl_xpi); in rpc_free_client()
893 * Free an RPC client
898 if (clnt->cl_auth == NULL) in rpc_free_auth()
902 * Note: RPCSEC_GSS may need to send NULL RPC calls in order to in rpc_free_auth()
906 atomic_inc(&clnt->cl_count); in rpc_free_auth()
907 rpcauth_release(clnt->cl_auth); in rpc_free_auth()
908 clnt->cl_auth = NULL; in rpc_free_auth()
909 if (atomic_dec_and_test(&clnt->cl_count)) in rpc_free_auth()
915 * Release reference to the RPC client
920 dprintk("RPC: rpc_release_client(%p)\n", clnt); in rpc_release_client()
923 if (list_empty(&clnt->cl_tasks)) in rpc_release_client()
925 if (!atomic_dec_and_test(&clnt->cl_count)) in rpc_release_client()
933 * rpc_bind_new_program - bind a new RPC program to an existing client
935 * @program: rpc program to set
936 * @vers: rpc program version
938 * Clones the rpc client and sets up a new RPC program. This is mainly
939 * of use for enabling different RPC programs to share the same transport.
948 .prognumber = program->number, in rpc_bind_new_program()
950 .authflavor = old->cl_auth->au_flavor, in rpc_bind_new_program()
956 if (IS_ERR(clnt)) in rpc_bind_new_program()
959 if (err != 0) { in rpc_bind_new_program()
970 struct rpc_xprt *xprt = task->tk_xprt; in rpc_task_release_transport()
972 if (xprt) { in rpc_task_release_transport()
973 task->tk_xprt = NULL; in rpc_task_release_transport()
981 struct rpc_clnt *clnt = task->tk_client; in rpc_task_release_client()
983 if (clnt != NULL) { in rpc_task_release_client()
985 spin_lock(&clnt->cl_lock); in rpc_task_release_client()
986 list_del(&task->tk_task); in rpc_task_release_client()
987 spin_unlock(&clnt->cl_lock); in rpc_task_release_client()
988 task->tk_client = NULL; in rpc_task_release_client()
998 if (!task->tk_xprt) in rpc_task_set_transport()
999 task->tk_xprt = xprt_iter_get_next(&clnt->cl_xpi); in rpc_task_set_transport()
1006 if (clnt != NULL) { in rpc_task_set_client()
1008 task->tk_client = clnt; in rpc_task_set_client()
1009 atomic_inc(&clnt->cl_count); in rpc_task_set_client()
1010 if (clnt->cl_softrtry) in rpc_task_set_client()
1011 task->tk_flags |= RPC_TASK_SOFT; in rpc_task_set_client()
1012 if (clnt->cl_noretranstimeo) in rpc_task_set_client()
1013 task->tk_flags |= RPC_TASK_NO_RETRANS_TIMEOUT; in rpc_task_set_client()
1014 if (atomic_read(&clnt->cl_swapper)) in rpc_task_set_client()
1015 task->tk_flags |= RPC_TASK_SWAPPER; in rpc_task_set_client()
1017 spin_lock(&clnt->cl_lock); in rpc_task_set_client()
1018 list_add_tail(&task->tk_task, &clnt->cl_tasks); in rpc_task_set_client()
1019 spin_unlock(&clnt->cl_lock); in rpc_task_set_client()
1026 if (msg != NULL) { in rpc_task_set_rpc_message()
1027 task->tk_msg.rpc_proc = msg->rpc_proc; in rpc_task_set_rpc_message()
1028 task->tk_msg.rpc_argp = msg->rpc_argp; in rpc_task_set_rpc_message()
1029 task->tk_msg.rpc_resp = msg->rpc_resp; in rpc_task_set_rpc_message()
1030 if (msg->rpc_cred != NULL) in rpc_task_set_rpc_message()
1031 task->tk_msg.rpc_cred = get_rpccred(msg->rpc_cred); in rpc_task_set_rpc_message()
1036 * Default callback for async RPC calls
1048 * rpc_run_task - Allocate a new RPC task, then run rpc_execute against it
1057 rpc_task_set_client(task, task_setup_data->rpc_client); in rpc_run_task()
1058 rpc_task_set_rpc_message(task, task_setup_data->rpc_message); in rpc_run_task()
1060 if (task->tk_action == NULL) in rpc_run_task()
1063 atomic_inc(&task->tk_count); in rpc_run_task()
1070 * rpc_call_sync - Perform a synchronous RPC call
1071 * @clnt: pointer to RPC client
1072 * @msg: RPC call parameters
1073 * @flags: RPC call flags
1087 if (flags & RPC_TASK_ASYNC) { in rpc_call_sync()
1090 return -EINVAL; in rpc_call_sync()
1094 if (IS_ERR(task)) in rpc_call_sync()
1096 status = task->tk_status; in rpc_call_sync()
1103 * rpc_call_async - Perform an asynchronous RPC call
1104 * @clnt: pointer to RPC client
1105 * @msg: RPC call parameters
1106 * @flags: RPC call flags
1107 * @tk_ops: RPC call ops
1124 if (IS_ERR(task)) in rpc_call_async()
1131 #if defined(CONFIG_SUNRPC_BACKCHANNEL)
1133 * rpc_run_bc_task - Allocate a new RPC task for backchannel use, then run
1135 * @req: RPC request
1140 struct xdr_buf *xbufp = &req->rq_snd_buf; in rpc_run_bc_task()
1146 dprintk("RPC: rpc_run_bc_task req= %p\n", req); in rpc_run_bc_task()
1151 task->tk_rqstp = req; in rpc_run_bc_task()
1157 xbufp->len = xbufp->head[0].iov_len + xbufp->page_len + in rpc_run_bc_task()
1158 xbufp->tail[0].iov_len; in rpc_run_bc_task()
1160 task->tk_action = call_bc_transmit; in rpc_run_bc_task()
1161 atomic_inc(&task->tk_count); in rpc_run_bc_task()
1162 WARN_ON_ONCE(atomic_read(&task->tk_count) != 2); in rpc_run_bc_task()
1165 dprintk("RPC: rpc_run_bc_task: task= %p\n", task); in rpc_run_bc_task()
1173 task->tk_action = call_start; in rpc_call_start()
1178 * rpc_peeraddr - extract remote peer address from clnt's xprt
1179 * @clnt: RPC client structure
1191 xprt = rcu_dereference(clnt->cl_xprt); in rpc_peeraddr()
1193 bytes = xprt->addrlen; in rpc_peeraddr()
1194 if (bytes > bufsize) in rpc_peeraddr()
1196 memcpy(buf, &xprt->addr, bytes); in rpc_peeraddr()
1204 * rpc_peeraddr2str - return remote peer address in printable format
1205 * @clnt: RPC client structure
1217 xprt = rcu_dereference(clnt->cl_xprt); in rpc_peeraddr2str()
1219 if (xprt->address_strings[format] != NULL) in rpc_peeraddr2str()
1220 return xprt->address_strings[format]; in rpc_peeraddr2str()
1241 * Returns zero and fills in "buf" if successful; otherwise, a
1250 err = __sock_create(net, sap->sa_family, in rpc_sockname()
1252 if (err < 0) { in rpc_sockname()
1253 dprintk("RPC: can't create UDP socket (%d)\n", err); in rpc_sockname()
1257 switch (sap->sa_family) { in rpc_sockname()
1269 err = -EAFNOSUPPORT; in rpc_sockname()
1272 if (err < 0) { in rpc_sockname()
1273 dprintk("RPC: can't bind UDP socket (%d)\n", err); in rpc_sockname()
1278 if (err < 0) { in rpc_sockname()
1279 dprintk("RPC: can't connect UDP socket (%d)\n", err); in rpc_sockname()
1284 if (err < 0) { in rpc_sockname()
1285 dprintk("RPC: getsockname failed (%d)\n", err); in rpc_sockname()
1290 if (buf->sa_family == AF_INET6) { in rpc_sockname()
1292 sin6->sin6_scope_id = 0; in rpc_sockname()
1294 dprintk("RPC: %s succeeded\n", __func__); in rpc_sockname()
1307 * Returns zero and fills in "buf" if successful; otherwise, a
1314 if (buflen < sizeof(rpc_inaddr_loopback)) in rpc_anyaddr()
1315 return -EINVAL; in rpc_anyaddr()
1320 if (buflen < sizeof(rpc_in6addr_loopback)) in rpc_anyaddr()
1321 return -EINVAL; in rpc_anyaddr()
1326 dprintk("RPC: %s: address family not supported\n", in rpc_anyaddr()
1328 return -EAFNOSUPPORT; in rpc_anyaddr()
1330 dprintk("RPC: %s: succeeded\n", __func__); in rpc_anyaddr()
1335 * rpc_localaddr - discover local endpoint address for an RPC client
1336 * @clnt: RPC client structure
1340 * Returns zero and fills in "buf" and "buflen" if successful;
1343 * This works even if the underlying transport is not currently connected,
1344 * or if the upper layer never previously provided a source address.
1360 xprt = rcu_dereference(clnt->cl_xprt); in rpc_localaddr()
1361 salen = xprt->addrlen; in rpc_localaddr()
1362 memcpy(sap, &xprt->addr, salen); in rpc_localaddr()
1363 net = get_net(xprt->xprt_net); in rpc_localaddr()
1369 if (err != 0) in rpc_localaddr()
1371 return rpc_anyaddr(sap->sa_family, buf, buflen); in rpc_localaddr()
1382 xprt = rcu_dereference(clnt->cl_xprt); in rpc_setbufsize()
1383 if (xprt->ops->set_buffer_size) in rpc_setbufsize()
1384 xprt->ops->set_buffer_size(xprt, sndsize, rcvsize); in rpc_setbufsize()
1390 * rpc_net_ns - Get the network namespace for this RPC client
1391 * @clnt: RPC client to query
1399 ret = rcu_dereference(clnt->cl_xprt)->xprt_net; in rpc_net_ns()
1406 * rpc_max_payload - Get maximum payload size for a transport, in bytes
1407 * @clnt: RPC client to query
1409 * For stream transports, this is one RPC record fragment (see RFC
1410 * 1831), as we don't support multi-record requests yet. For datagram
1412 * RPC header sizes.
1419 ret = rcu_dereference(clnt->cl_xprt)->max_payload; in rpc_max_payload()
1426 * rpc_max_bc_payload - Get maximum backchannel payload size, in bytes
1427 * @clnt: RPC client to query
1435 xprt = rcu_dereference(clnt->cl_xprt); in rpc_max_bc_payload()
1436 ret = xprt->ops->bc_maxpayload(xprt); in rpc_max_bc_payload()
1443 * rpc_force_rebind - force transport to check that remote port is unchanged
1449 if (clnt->cl_autobind) { in rpc_force_rebind()
1451 xprt_clear_bound(rcu_dereference(clnt->cl_xprt)); in rpc_force_rebind()
1458 * Restart an (async) RPC call from the call_prepare state.
1464 if (RPC_ASSASSINATED(task)) in rpc_restart_call_prepare()
1466 task->tk_action = call_start; in rpc_restart_call_prepare()
1467 task->tk_status = 0; in rpc_restart_call_prepare()
1468 if (task->tk_ops->rpc_call_prepare != NULL) in rpc_restart_call_prepare()
1469 task->tk_action = rpc_prepare_task; in rpc_restart_call_prepare()
1475 * Restart an (async) RPC call. Usually called from within the
1481 if (RPC_ASSASSINATED(task)) in rpc_restart_call()
1483 task->tk_action = call_start; in rpc_restart_call()
1484 task->tk_status = 0; in rpc_restart_call()
1492 const struct rpc_procinfo *proc = task->tk_msg.rpc_proc; in rpc_proc_name()
1494 if (proc) { in rpc_proc_name()
1495 if (proc->p_name) in rpc_proc_name()
1496 return proc->p_name; in rpc_proc_name()
1507 * this state is visited exactly once for each RPC.
1512 struct rpc_clnt *clnt = task->tk_client; in call_start()
1513 int idx = task->tk_msg.rpc_proc->p_statidx; in call_start()
1516 dprintk("RPC: %5u call_start %s%d proc %s (%s)\n", task->tk_pid, in call_start()
1517 clnt->cl_program->name, clnt->cl_vers, in call_start()
1522 if (clnt->cl_program->version[clnt->cl_vers]) in call_start()
1523 clnt->cl_program->version[clnt->cl_vers]->counts[idx]++; in call_start()
1524 clnt->cl_stats->rpccnt++; in call_start()
1525 task->tk_action = call_reserve; in call_start()
1530 * 1. Reserve an RPC call slot
1537 task->tk_status = 0; in call_reserve()
1538 task->tk_action = call_reserveresult; in call_reserve()
1550 int status = task->tk_status; in call_reserveresult()
1558 task->tk_status = 0; in call_reserveresult()
1559 if (status >= 0) { in call_reserveresult()
1560 if (task->tk_rqstp) { in call_reserveresult()
1561 task->tk_action = call_refresh; in call_reserveresult()
1567 rpc_exit(task, -EIO); in call_reserveresult()
1575 if (task->tk_rqstp) { in call_reserveresult()
1582 case -ENOMEM: in call_reserveresult()
1585 case -EAGAIN: /* woken up; retry */ in call_reserveresult()
1586 task->tk_action = call_retry_reserve; in call_reserveresult()
1588 case -EIO: /* probably a shutdown */ in call_reserveresult()
1599 * 1c. Retry reserving an RPC call slot
1606 task->tk_status = 0; in call_retry_reserve()
1607 task->tk_action = call_reserveresult; in call_retry_reserve()
1619 task->tk_action = call_refreshresult; in call_refresh()
1620 task->tk_status = 0; in call_refresh()
1621 task->tk_client->cl_stats->rpcauthrefresh++; in call_refresh()
1631 int status = task->tk_status; in call_refreshresult()
1635 task->tk_status = 0; in call_refreshresult()
1636 task->tk_action = call_refresh; in call_refreshresult()
1639 if (rpcauth_uptodatecred(task)) { in call_refreshresult()
1640 task->tk_action = call_allocate; in call_refreshresult()
1643 /* Use rate-limiting and a max number of retries if refresh in call_refreshresult()
1647 case -ETIMEDOUT: in call_refreshresult()
1650 case -EAGAIN: in call_refreshresult()
1651 status = -EACCES; in call_refreshresult()
1653 case -EKEYEXPIRED: in call_refreshresult()
1654 if (!task->tk_cred_retry) in call_refreshresult()
1656 task->tk_cred_retry--; in call_refreshresult()
1657 dprintk("RPC: %5u %s: retry refresh creds\n", in call_refreshresult()
1658 task->tk_pid, __func__); in call_refreshresult()
1661 dprintk("RPC: %5u %s: refresh creds failed with error %d\n", in call_refreshresult()
1662 task->tk_pid, __func__, status); in call_refreshresult()
1673 unsigned int slack = task->tk_rqstp->rq_cred->cr_auth->au_cslack; in call_allocate()
1674 struct rpc_rqst *req = task->tk_rqstp; in call_allocate()
1675 struct rpc_xprt *xprt = req->rq_xprt; in call_allocate()
1676 const struct rpc_procinfo *proc = task->tk_msg.rpc_proc; in call_allocate()
1681 task->tk_status = 0; in call_allocate()
1682 task->tk_action = call_bind; in call_allocate()
1684 if (req->rq_buffer) in call_allocate()
1687 if (proc->p_proc != 0) { in call_allocate()
1688 BUG_ON(proc->p_arglen == 0); in call_allocate()
1689 if (proc->p_decode != NULL) in call_allocate()
1690 BUG_ON(proc->p_replen == 0); in call_allocate()
1694 * Calculate the size (in quads) of the RPC call in call_allocate()
1698 req->rq_callsize = RPC_CALLHDRSIZE + (slack << 1) + proc->p_arglen; in call_allocate()
1699 req->rq_callsize <<= 2; in call_allocate()
1700 req->rq_rcvsize = RPC_REPHDRSIZE + slack + proc->p_replen; in call_allocate()
1701 req->rq_rcvsize <<= 2; in call_allocate()
1703 status = xprt->ops->buf_alloc(task); in call_allocate()
1705 if (status == 0) in call_allocate()
1707 if (status != -ENOMEM) { in call_allocate()
1712 dprintk("RPC: %5u rpc_buffer allocation failed\n", task->tk_pid); in call_allocate()
1714 if (RPC_IS_ASYNC(task) || !fatal_signal_pending(current)) { in call_allocate()
1715 task->tk_action = call_allocate; in call_allocate()
1720 rpc_exit(task, -ERESTARTSYS); in call_allocate()
1726 return task->tk_rqstp->rq_snd_buf.len == 0; in rpc_task_need_encode()
1732 task->tk_rqstp->rq_snd_buf.len = 0; in rpc_task_force_reencode()
1733 task->tk_rqstp->rq_bytes_sent = 0; in rpc_task_force_reencode()
1737 * 3. Encode arguments of an RPC call
1742 struct rpc_rqst *req = task->tk_rqstp; in rpc_xdr_encode()
1748 xdr_buf_init(&req->rq_snd_buf, in rpc_xdr_encode()
1749 req->rq_buffer, in rpc_xdr_encode()
1750 req->rq_callsize); in rpc_xdr_encode()
1751 xdr_buf_init(&req->rq_rcv_buf, in rpc_xdr_encode()
1752 req->rq_rbuffer, in rpc_xdr_encode()
1753 req->rq_rcvsize); in rpc_xdr_encode()
1756 if (p == NULL) { in rpc_xdr_encode()
1757 printk(KERN_INFO "RPC: couldn't encode RPC header, exit EIO\n"); in rpc_xdr_encode()
1758 rpc_exit(task, -EIO); in rpc_xdr_encode()
1762 encode = task->tk_msg.rpc_proc->p_encode; in rpc_xdr_encode()
1763 if (encode == NULL) in rpc_xdr_encode()
1766 task->tk_status = rpcauth_wrap_req(task, encode, req, p, in rpc_xdr_encode()
1767 task->tk_msg.rpc_argp); in rpc_xdr_encode()
1771 * 4. Get the server port number if not yet set
1776 struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; in call_bind()
1780 task->tk_action = call_connect; in call_bind()
1781 if (!xprt_bound(xprt)) { in call_bind()
1782 task->tk_action = call_bind_status; in call_bind()
1783 task->tk_timeout = xprt->bind_timeout; in call_bind()
1784 xprt->ops->rpcbind(task); in call_bind()
1794 int status = -EIO; in call_bind_status()
1796 if (task->tk_status >= 0) { in call_bind_status()
1798 task->tk_status = 0; in call_bind_status()
1799 task->tk_action = call_connect; in call_bind_status()
1804 switch (task->tk_status) { in call_bind_status()
1805 case -ENOMEM: in call_bind_status()
1806 dprintk("RPC: %5u rpcbind out of memory\n", task->tk_pid); in call_bind_status()
1809 case -EACCES: in call_bind_status()
1810 dprintk("RPC: %5u remote rpcbind: RPC program/version " in call_bind_status()
1811 "unavailable\n", task->tk_pid); in call_bind_status()
1812 /* fail immediately if this is an RPC ping */ in call_bind_status()
1813 if (task->tk_msg.rpc_proc->p_proc == 0) { in call_bind_status()
1814 status = -EOPNOTSUPP; in call_bind_status()
1817 if (task->tk_rebind_retry == 0) in call_bind_status()
1819 task->tk_rebind_retry--; in call_bind_status()
1822 case -ETIMEDOUT: in call_bind_status()
1823 dprintk("RPC: %5u rpcbind request timed out\n", in call_bind_status()
1824 task->tk_pid); in call_bind_status()
1826 case -EPFNOSUPPORT: in call_bind_status()
1828 dprintk("RPC: %5u unrecognized remote rpcbind service\n", in call_bind_status()
1829 task->tk_pid); in call_bind_status()
1831 case -EPROTONOSUPPORT: in call_bind_status()
1832 dprintk("RPC: %5u remote rpcbind version unavailable, retrying\n", in call_bind_status()
1833 task->tk_pid); in call_bind_status()
1835 case -ECONNREFUSED: /* connection problems */ in call_bind_status()
1836 case -ECONNRESET: in call_bind_status()
1837 case -ECONNABORTED: in call_bind_status()
1838 case -ENOTCONN: in call_bind_status()
1839 case -EHOSTDOWN: in call_bind_status()
1840 case -ENETDOWN: in call_bind_status()
1841 case -EHOSTUNREACH: in call_bind_status()
1842 case -ENETUNREACH: in call_bind_status()
1843 case -ENOBUFS: in call_bind_status()
1844 case -EPIPE: in call_bind_status()
1845 dprintk("RPC: %5u remote rpcbind unreachable: %d\n", in call_bind_status()
1846 task->tk_pid, task->tk_status); in call_bind_status()
1847 if (!RPC_IS_SOFTCONN(task)) { in call_bind_status()
1851 status = task->tk_status; in call_bind_status()
1854 dprintk("RPC: %5u unrecognized rpcbind error (%d)\n", in call_bind_status()
1855 task->tk_pid, -task->tk_status); in call_bind_status()
1862 task->tk_status = 0; in call_bind_status()
1863 task->tk_action = call_timeout; in call_bind_status()
1867 * 4b. Connect to the RPC server
1872 struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; in call_connect()
1874 dprintk("RPC: %5u call_connect xprt %p %s connected\n", in call_connect()
1875 task->tk_pid, xprt, in call_connect()
1878 task->tk_action = call_transmit; in call_connect()
1879 if (!xprt_connected(xprt)) { in call_connect()
1880 task->tk_action = call_connect_status; in call_connect()
1881 if (task->tk_status < 0) in call_connect()
1883 if (task->tk_flags & RPC_TASK_NOCONNECT) { in call_connect()
1884 rpc_exit(task, -ENOTCONN); in call_connect()
1897 struct rpc_clnt *clnt = task->tk_client; in call_connect_status()
1898 int status = task->tk_status; in call_connect_status()
1903 task->tk_status = 0; in call_connect_status()
1905 case -ECONNREFUSED: in call_connect_status()
1907 if (RPC_IS_SOFTCONN(task)) in call_connect_status()
1909 if (clnt->cl_autobind) { in call_connect_status()
1911 task->tk_action = call_bind; in call_connect_status()
1915 case -ECONNRESET: in call_connect_status()
1916 case -ECONNABORTED: in call_connect_status()
1917 case -ENETDOWN: in call_connect_status()
1918 case -ENETUNREACH: in call_connect_status()
1919 case -EHOSTUNREACH: in call_connect_status()
1920 case -EADDRINUSE: in call_connect_status()
1921 case -ENOBUFS: in call_connect_status()
1922 case -EPIPE: in call_connect_status()
1923 xprt_conditional_disconnect(task->tk_rqstp->rq_xprt, in call_connect_status()
1924 task->tk_rqstp->rq_connect_cookie); in call_connect_status()
1925 if (RPC_IS_SOFTCONN(task)) in call_connect_status()
1930 case -EAGAIN: in call_connect_status()
1932 case -ETIMEDOUT: in call_connect_status()
1933 task->tk_action = call_timeout; in call_connect_status()
1936 clnt->cl_stats->netreconn++; in call_connect_status()
1937 task->tk_action = call_transmit; in call_connect_status()
1944 * 5. Transmit the RPC request, and wait for reply
1953 task->tk_action = call_status; in call_transmit()
1954 if (task->tk_status < 0) in call_transmit()
1956 if (!xprt_prepare_transmit(task)) in call_transmit()
1958 task->tk_action = call_transmit_status; in call_transmit()
1960 if (rpc_task_need_encode(task)) { in call_transmit()
1963 if (task->tk_status != 0) { in call_transmit()
1965 if (task->tk_status == -EAGAIN) in call_transmit()
1968 rpc_exit(task, task->tk_status); in call_transmit()
1973 if (task->tk_status < 0) in call_transmit()
1975 if (is_retrans) in call_transmit()
1976 task->tk_client->cl_stats->rpcretrans++; in call_transmit()
1979 * in order to allow access to the socket to other RPC requests. in call_transmit()
1982 if (rpc_reply_expected(task)) in call_transmit()
1984 task->tk_action = rpc_exit_task; in call_transmit()
1985 rpc_wake_up_queued_task(&task->tk_rqstp->rq_xprt->pending, task); in call_transmit()
1994 struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; in call_transmit_status()
1995 task->tk_action = call_status; in call_transmit_status()
1999 * test first. Or, if any error and xprt_close_wait, in call_transmit_status()
2002 if (task->tk_status == 0 || xprt_close_wait(xprt)) { in call_transmit_status()
2008 switch (task->tk_status) { in call_transmit_status()
2009 case -EAGAIN: in call_transmit_status()
2010 case -ENOBUFS: in call_transmit_status()
2018 * Special cases: if we've been waiting on the in call_transmit_status()
2019 * socket's write_space() callback, or if the in call_transmit_status()
2023 case -ECONNREFUSED: in call_transmit_status()
2024 case -EHOSTDOWN: in call_transmit_status()
2025 case -ENETDOWN: in call_transmit_status()
2026 case -EHOSTUNREACH: in call_transmit_status()
2027 case -ENETUNREACH: in call_transmit_status()
2028 case -EPERM: in call_transmit_status()
2029 if (RPC_IS_SOFTCONN(task)) { in call_transmit_status()
2031 if (!task->tk_msg.rpc_proc->p_proc) in call_transmit_status()
2032 trace_xprt_ping(task->tk_xprt, in call_transmit_status()
2033 task->tk_status); in call_transmit_status()
2034 rpc_exit(task, task->tk_status); in call_transmit_status()
2038 case -ECONNRESET: in call_transmit_status()
2039 case -ECONNABORTED: in call_transmit_status()
2040 case -EADDRINUSE: in call_transmit_status()
2041 case -ENOTCONN: in call_transmit_status()
2042 case -EPIPE: in call_transmit_status()
2047 #if defined(CONFIG_SUNRPC_BACKCHANNEL)
2049 * 5b. Send the backchannel RPC reply. On error, drop the reply. In
2055 struct rpc_rqst *req = task->tk_rqstp; in call_bc_transmit()
2057 if (!xprt_prepare_transmit(task)) in call_bc_transmit()
2060 if (task->tk_status < 0) { in call_bc_transmit()
2061 printk(KERN_NOTICE "RPC: Could not send backchannel reply " in call_bc_transmit()
2062 "error: %d\n", task->tk_status); in call_bc_transmit()
2065 if (req->rq_connect_cookie != req->rq_xprt->connect_cookie) in call_bc_transmit()
2066 req->rq_bytes_sent = 0; in call_bc_transmit()
2070 if (task->tk_status == -EAGAIN) in call_bc_transmit()
2075 switch (task->tk_status) { in call_bc_transmit()
2078 case -ENETDOWN: in call_bc_transmit()
2079 case -EHOSTDOWN: in call_bc_transmit()
2080 case -EHOSTUNREACH: in call_bc_transmit()
2081 case -ENETUNREACH: in call_bc_transmit()
2082 case -ECONNRESET: in call_bc_transmit()
2083 case -ECONNREFUSED: in call_bc_transmit()
2084 case -EADDRINUSE: in call_bc_transmit()
2085 case -ENOTCONN: in call_bc_transmit()
2086 case -EPIPE: in call_bc_transmit()
2088 case -ETIMEDOUT: in call_bc_transmit()
2096 printk(KERN_NOTICE "RPC: Could not send backchannel reply " in call_bc_transmit()
2097 "error: %d\n", task->tk_status); in call_bc_transmit()
2098 xprt_conditional_disconnect(req->rq_xprt, in call_bc_transmit()
2099 req->rq_connect_cookie); in call_bc_transmit()
2106 WARN_ON_ONCE(task->tk_status == -EAGAIN); in call_bc_transmit()
2107 printk(KERN_NOTICE "RPC: Could not send backchannel reply " in call_bc_transmit()
2108 "error: %d\n", task->tk_status); in call_bc_transmit()
2111 rpc_wake_up_queued_task(&req->rq_xprt->pending, task); in call_bc_transmit()
2113 task->tk_action = rpc_exit_task; in call_bc_transmit()
2116 req->rq_connect_cookie = req->rq_xprt->connect_cookie; in call_bc_transmit()
2118 task->tk_status = 0; in call_bc_transmit()
2123 * 6. Sort out the RPC call status
2128 struct rpc_clnt *clnt = task->tk_client; in call_status()
2129 struct rpc_rqst *req = task->tk_rqstp; in call_status()
2132 if (!task->tk_msg.rpc_proc->p_proc) in call_status()
2133 trace_xprt_ping(task->tk_xprt, task->tk_status); in call_status()
2135 if (req->rq_reply_bytes_recvd > 0 && !req->rq_bytes_sent) in call_status()
2136 task->tk_status = req->rq_reply_bytes_recvd; in call_status()
2140 status = task->tk_status; in call_status()
2141 if (status >= 0) { in call_status()
2142 task->tk_action = call_decode; in call_status()
2147 task->tk_status = 0; in call_status()
2149 case -EHOSTDOWN: in call_status()
2150 case -ENETDOWN: in call_status()
2151 case -EHOSTUNREACH: in call_status()
2152 case -ENETUNREACH: in call_status()
2153 case -EPERM: in call_status()
2154 if (RPC_IS_SOFTCONN(task)) { in call_status()
2159 * Delay any retries for 3 seconds, then handle as if it in call_status()
2164 case -ETIMEDOUT: in call_status()
2165 task->tk_action = call_timeout; in call_status()
2167 case -ECONNREFUSED: in call_status()
2168 case -ECONNRESET: in call_status()
2169 case -ECONNABORTED: in call_status()
2172 case -EADDRINUSE: in call_status()
2175 case -EPIPE: in call_status()
2176 case -ENOTCONN: in call_status()
2177 task->tk_action = call_bind; in call_status()
2179 case -ENOBUFS: in call_status()
2182 case -EAGAIN: in call_status()
2183 task->tk_action = call_transmit; in call_status()
2185 case -EIO: in call_status()
2190 if (clnt->cl_chatty) in call_status()
2191 printk("%s: RPC call returned error %d\n", in call_status()
2192 clnt->cl_program->name, -status); in call_status()
2198 * 6a. Handle RPC timeout
2205 struct rpc_clnt *clnt = task->tk_client; in call_timeout()
2207 if (xprt_adjust_timeout(task->tk_rqstp) == 0) { in call_timeout()
2208 dprintk("RPC: %5u call_timeout (minor)\n", task->tk_pid); in call_timeout()
2212 dprintk("RPC: %5u call_timeout (major)\n", task->tk_pid); in call_timeout()
2213 task->tk_timeouts++; in call_timeout()
2215 if (RPC_IS_SOFTCONN(task)) { in call_timeout()
2216 rpc_exit(task, -ETIMEDOUT); in call_timeout()
2219 if (RPC_IS_SOFT(task)) { in call_timeout()
2220 if (clnt->cl_chatty) { in call_timeout()
2222 clnt->cl_program->name, in call_timeout()
2223 task->tk_xprt->servername); in call_timeout()
2225 if (task->tk_flags & RPC_TASK_TIMEOUT) in call_timeout()
2226 rpc_exit(task, -ETIMEDOUT); in call_timeout()
2228 rpc_exit(task, -EIO); in call_timeout()
2232 if (!(task->tk_flags & RPC_CALL_MAJORSEEN)) { in call_timeout()
2233 task->tk_flags |= RPC_CALL_MAJORSEEN; in call_timeout()
2234 if (clnt->cl_chatty) { in call_timeout()
2236 clnt->cl_program->name, in call_timeout()
2237 task->tk_xprt->servername); in call_timeout()
2242 * Did our request time out due to an RPCSEC_GSS out-of-sequence in call_timeout()
2248 task->tk_action = call_bind; in call_timeout()
2249 task->tk_status = 0; in call_timeout()
2253 * 7. Decode the RPC reply
2258 struct rpc_clnt *clnt = task->tk_client; in call_decode()
2259 struct rpc_rqst *req = task->tk_rqstp; in call_decode()
2260 kxdrdproc_t decode = task->tk_msg.rpc_proc->p_decode; in call_decode()
2265 if (task->tk_flags & RPC_CALL_MAJORSEEN) { in call_decode()
2266 if (clnt->cl_chatty) { in call_decode()
2268 clnt->cl_program->name, in call_decode()
2269 task->tk_xprt->servername); in call_decode()
2271 task->tk_flags &= ~RPC_CALL_MAJORSEEN; in call_decode()
2276 * before it changed req->rq_reply_bytes_recvd. in call_decode()
2279 req->rq_rcv_buf.len = req->rq_private_buf.len; in call_decode()
2282 WARN_ON(memcmp(&req->rq_rcv_buf, &req->rq_private_buf, in call_decode()
2283 sizeof(req->rq_rcv_buf)) != 0); in call_decode()
2285 if (req->rq_rcv_buf.len < 12) { in call_decode()
2286 if (!RPC_IS_SOFT(task)) { in call_decode()
2287 task->tk_action = call_bind; in call_decode()
2290 dprintk("RPC: %s: too small RPC reply size (%d bytes)\n", in call_decode()
2291 clnt->cl_program->name, task->tk_status); in call_decode()
2292 task->tk_action = call_timeout; in call_decode()
2297 if (IS_ERR(p)) { in call_decode()
2298 if (p == ERR_PTR(-EAGAIN)) in call_decode()
2303 task->tk_action = rpc_exit_task; in call_decode()
2305 if (decode) { in call_decode()
2306 task->tk_status = rpcauth_unwrap_resp(task, decode, req, p, in call_decode()
2307 task->tk_msg.rpc_resp); in call_decode()
2309 dprintk("RPC: %5u call_decode result %d\n", task->tk_pid, in call_decode()
2310 task->tk_status); in call_decode()
2313 task->tk_status = 0; in call_decode()
2314 /* Note: rpc_verify_header() may have freed the RPC slot */ in call_decode()
2315 if (task->tk_rqstp == req) { in call_decode()
2316 req->rq_reply_bytes_recvd = req->rq_rcv_buf.len = 0; in call_decode()
2317 if (task->tk_client->cl_discrtry) in call_decode()
2318 xprt_conditional_disconnect(req->rq_xprt, in call_decode()
2319 req->rq_connect_cookie); in call_decode()
2326 struct rpc_clnt *clnt = task->tk_client; in rpc_encode_header()
2327 struct rpc_rqst *req = task->tk_rqstp; in rpc_encode_header()
2328 __be32 *p = req->rq_svec[0].iov_base; in rpc_encode_header()
2332 p = xprt_skip_transport_header(req->rq_xprt, p); in rpc_encode_header()
2333 *p++ = req->rq_xid; /* XID */ in rpc_encode_header()
2335 *p++ = htonl(RPC_VERSION); /* RPC version */ in rpc_encode_header()
2336 *p++ = htonl(clnt->cl_prog); /* program number */ in rpc_encode_header()
2337 *p++ = htonl(clnt->cl_vers); /* program version */ in rpc_encode_header()
2338 *p++ = htonl(task->tk_msg.rpc_proc->p_proc); /* procedure */ in rpc_encode_header()
2340 req->rq_slen = xdr_adjust_iovec(&req->rq_svec[0], p); in rpc_encode_header()
2347 struct rpc_clnt *clnt = task->tk_client; in rpc_verify_header()
2348 struct kvec *iov = &task->tk_rqstp->rq_rcv_buf.head[0]; in rpc_verify_header()
2349 int len = task->tk_rqstp->rq_rcv_buf.len >> 2; in rpc_verify_header()
2350 __be32 *p = iov->iov_base; in rpc_verify_header()
2352 int error = -EACCES; in rpc_verify_header()
2354 if ((task->tk_rqstp->rq_rcv_buf.len & 3) != 0) { in rpc_verify_header()
2355 /* RFC-1014 says that the representation of XDR data must be a in rpc_verify_header()
2357 * - if it isn't pointer subtraction in the NFS client may give in rpc_verify_header()
2360 dprintk("RPC: %5u %s: XDR representation not a multiple of" in rpc_verify_header()
2361 " 4 bytes: 0x%x\n", task->tk_pid, __func__, in rpc_verify_header()
2362 task->tk_rqstp->rq_rcv_buf.len); in rpc_verify_header()
2363 error = -EIO; in rpc_verify_header()
2366 if ((len -= 3) < 0) in rpc_verify_header()
2370 if ((n = ntohl(*p++)) != RPC_REPLY) { in rpc_verify_header()
2371 dprintk("RPC: %5u %s: not an RPC reply: %x\n", in rpc_verify_header()
2372 task->tk_pid, __func__, n); in rpc_verify_header()
2373 error = -EIO; in rpc_verify_header()
2377 if ((n = ntohl(*p++)) != RPC_MSG_ACCEPTED) { in rpc_verify_header()
2378 if (--len < 0) in rpc_verify_header()
2384 dprintk("RPC: %5u %s: RPC call version mismatch!\n", in rpc_verify_header()
2385 task->tk_pid, __func__); in rpc_verify_header()
2386 error = -EPROTONOSUPPORT; in rpc_verify_header()
2389 dprintk("RPC: %5u %s: RPC call rejected, " in rpc_verify_header()
2391 task->tk_pid, __func__, n); in rpc_verify_header()
2392 error = -EIO; in rpc_verify_header()
2395 if (--len < 0) in rpc_verify_header()
2402 if (!task->tk_cred_retry) in rpc_verify_header()
2404 task->tk_cred_retry--; in rpc_verify_header()
2405 dprintk("RPC: %5u %s: retry stale creds\n", in rpc_verify_header()
2406 task->tk_pid, __func__); in rpc_verify_header()
2410 task->tk_action = call_reserve; in rpc_verify_header()
2415 if (!task->tk_garb_retry) in rpc_verify_header()
2417 task->tk_garb_retry--; in rpc_verify_header()
2418 dprintk("RPC: %5u %s: retry garbled creds\n", in rpc_verify_header()
2419 task->tk_pid, __func__); in rpc_verify_header()
2420 task->tk_action = call_bind; in rpc_verify_header()
2423 printk(KERN_NOTICE "RPC: server %s requires stronger " in rpc_verify_header()
2425 task->tk_xprt->servername); in rpc_verify_header()
2428 dprintk("RPC: %5u %s: unknown auth error: %x\n", in rpc_verify_header()
2429 task->tk_pid, __func__, n); in rpc_verify_header()
2430 error = -EIO; in rpc_verify_header()
2432 dprintk("RPC: %5u %s: call rejected %d\n", in rpc_verify_header()
2433 task->tk_pid, __func__, n); in rpc_verify_header()
2437 if (IS_ERR(p)) { in rpc_verify_header()
2439 dprintk("RPC: %5u %s: auth check failed with %d\n", in rpc_verify_header()
2440 task->tk_pid, __func__, error); in rpc_verify_header()
2443 len = p - (__be32 *)iov->iov_base - 1; in rpc_verify_header()
2444 if (len < 0) in rpc_verify_header()
2450 dprintk("RPC: %5u %s: program %u is unsupported " in rpc_verify_header()
2451 "by server %s\n", task->tk_pid, __func__, in rpc_verify_header()
2452 (unsigned int)clnt->cl_prog, in rpc_verify_header()
2453 task->tk_xprt->servername); in rpc_verify_header()
2454 error = -EPFNOSUPPORT; in rpc_verify_header()
2457 dprintk("RPC: %5u %s: program %u, version %u unsupported " in rpc_verify_header()
2458 "by server %s\n", task->tk_pid, __func__, in rpc_verify_header()
2459 (unsigned int)clnt->cl_prog, in rpc_verify_header()
2460 (unsigned int)clnt->cl_vers, in rpc_verify_header()
2461 task->tk_xprt->servername); in rpc_verify_header()
2462 error = -EPROTONOSUPPORT; in rpc_verify_header()
2465 dprintk("RPC: %5u %s: proc %s unsupported by program %u, " in rpc_verify_header()
2467 task->tk_pid, __func__, in rpc_verify_header()
2469 clnt->cl_prog, clnt->cl_vers, in rpc_verify_header()
2470 task->tk_xprt->servername); in rpc_verify_header()
2471 error = -EOPNOTSUPP; in rpc_verify_header()
2474 dprintk("RPC: %5u %s: server saw garbage\n", in rpc_verify_header()
2475 task->tk_pid, __func__); in rpc_verify_header()
2478 dprintk("RPC: %5u %s: server accept status: %x\n", in rpc_verify_header()
2479 task->tk_pid, __func__, n); in rpc_verify_header()
2484 clnt->cl_stats->rpcgarbage++; in rpc_verify_header()
2485 if (task->tk_garb_retry) { in rpc_verify_header()
2486 task->tk_garb_retry--; in rpc_verify_header()
2487 dprintk("RPC: %5u %s: retrying\n", in rpc_verify_header()
2488 task->tk_pid, __func__); in rpc_verify_header()
2489 task->tk_action = call_bind; in rpc_verify_header()
2491 return ERR_PTR(-EAGAIN); in rpc_verify_header()
2495 dprintk("RPC: %5u %s: call failed with error %d\n", task->tk_pid, in rpc_verify_header()
2499 dprintk("RPC: %5u %s: server reply was truncated.\n", task->tk_pid, in rpc_verify_header()
2568 if (task->tk_status == 0) in rpc_cb_add_xprt_done()
2569 rpc_xprt_switch_add_xprt(data->xps, data->xprt); in rpc_cb_add_xprt_done()
2576 xprt_put(data->xprt); in rpc_cb_add_xprt_release()
2577 xprt_switch_put(data->xps); in rpc_cb_add_xprt_release()
2587 * rpc_clnt_test_and_add_xprt - Test and add a new transport to a rpc_clnt
2602 if (!data) in rpc_clnt_test_and_add_xprt()
2603 return -ENOMEM; in rpc_clnt_test_and_add_xprt()
2604 data->xps = xprt_switch_get(xps); in rpc_clnt_test_and_add_xprt()
2605 data->xprt = xprt_get(xprt); in rpc_clnt_test_and_add_xprt()
2612 if (IS_ERR(task)) in rpc_clnt_test_and_add_xprt()
2645 int status = -EADDRINUSE; in rpc_clnt_setup_test_and_add_xprt()
2650 if (rpc_xprt_switch_has_addr(xps, (struct sockaddr *)&xprt->addr)) in rpc_clnt_setup_test_and_add_xprt()
2659 if (IS_ERR(task)) { in rpc_clnt_setup_test_and_add_xprt()
2663 status = task->tk_status; in rpc_clnt_setup_test_and_add_xprt()
2666 if (status < 0) in rpc_clnt_setup_test_and_add_xprt()
2670 xtest->add_xprt_test(clnt, xprt, xtest->data); in rpc_clnt_setup_test_and_add_xprt()
2677 pr_info("RPC: rpc_clnt_test_xprt failed: %d addr %s not added\n", in rpc_clnt_setup_test_and_add_xprt()
2678 status, xprt->address_strings[RPC_DISPLAY_ADDR]); in rpc_clnt_setup_test_and_add_xprt()
2684 * rpc_clnt_add_xprt - Add a new transport to a rpc_clnt
2692 * If ping is set, then test that connectivity succeeds before
2712 xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch)); in rpc_clnt_add_xprt()
2713 xprt = xprt_iter_xprt(&clnt->cl_xpi); in rpc_clnt_add_xprt()
2714 if (xps == NULL || xprt == NULL) { in rpc_clnt_add_xprt()
2717 return -EAGAIN; in rpc_clnt_add_xprt()
2719 resvport = xprt->resvport; in rpc_clnt_add_xprt()
2720 connect_timeout = xprt->connect_timeout; in rpc_clnt_add_xprt()
2721 reconnect_timeout = xprt->max_reconnect_timeout; in rpc_clnt_add_xprt()
2725 if (IS_ERR(xprt)) { in rpc_clnt_add_xprt()
2729 xprt->resvport = resvport; in rpc_clnt_add_xprt()
2730 if (xprt->ops->set_connect_timeout != NULL) in rpc_clnt_add_xprt()
2731 xprt->ops->set_connect_timeout(xprt, in rpc_clnt_add_xprt()
2736 if (setup) { in rpc_clnt_add_xprt()
2738 if (ret != 0) in rpc_clnt_add_xprt()
2762 if (xprt->ops->set_connect_timeout) in rpc_xprt_set_connect_timeout()
2763 xprt->ops->set_connect_timeout(xprt, in rpc_xprt_set_connect_timeout()
2764 timeo->connect_timeout, in rpc_xprt_set_connect_timeout()
2765 timeo->reconnect_timeout); in rpc_xprt_set_connect_timeout()
2787 xprt_switch_put(rcu_dereference(clnt->cl_xpi.xpi_xpswitch)); in rpc_clnt_xprt_switch_put()
2795 rpc_xprt_switch_add_xprt(rcu_dereference(clnt->cl_xpi.xpi_xpswitch), in rpc_clnt_xprt_switch_add_xprt()
2808 xps = rcu_dereference(clnt->cl_xpi.xpi_xpswitch); in rpc_clnt_xprt_switch_has_addr()
2815 #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
2818 printk(KERN_INFO "-pid- flgs status -client- --rqstp- " in rpc_show_header()
2819 "-timeout ---ops--\n"); in rpc_show_header()
2827 if (RPC_IS_QUEUED(task)) in rpc_show_task()
2828 rpc_waitq = rpc_qname(task->tk_waitqueue); in rpc_show_task()
2831 task->tk_pid, task->tk_flags, task->tk_status, in rpc_show_task()
2832 clnt, task->tk_rqstp, task->tk_timeout, task->tk_ops, in rpc_show_task()
2833 clnt->cl_program->name, clnt->cl_vers, rpc_proc_name(task), in rpc_show_task()
2834 task->tk_action, rpc_waitq); in rpc_show_task()
2844 spin_lock(&sn->rpc_client_lock); in rpc_show_tasks()
2845 list_for_each_entry(clnt, &sn->all_clients, cl_clients) { in rpc_show_tasks()
2846 spin_lock(&clnt->cl_lock); in rpc_show_tasks()
2847 list_for_each_entry(task, &clnt->cl_tasks, tk_task) { in rpc_show_tasks()
2848 if (!header) { in rpc_show_tasks()
2854 spin_unlock(&clnt->cl_lock); in rpc_show_tasks()
2856 spin_unlock(&sn->rpc_client_lock); in rpc_show_tasks()
2860 #if IS_ENABLED(CONFIG_SUNRPC_SWAP)
2872 if (atomic_inc_return(&clnt->cl_swapper) == 1) in rpc_clnt_swap_activate()
2891 if (atomic_dec_if_positive(&clnt->cl_swapper) == 0) in rpc_clnt_swap_deactivate()