Lines Matching +full:rpc +full:- +full:if
1 // SPDX-License-Identifier: GPL-2.0-only
5 * This file contains the high-level RPC interface.
9 * - RPC header generation and argument serialization.
10 * - Credential refresh.
11 * - TCP connect handling.
12 * - Retry of operation when it is suspected the operation failed because
46 #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
51 * All RPC clients are linked into this list
85 spin_lock(&sn->rpc_client_lock); in rpc_register_client()
86 list_add(&clnt->cl_clients, &sn->all_clients); in rpc_register_client()
87 spin_unlock(&sn->rpc_client_lock); in rpc_register_client()
95 spin_lock(&sn->rpc_client_lock); in rpc_unregister_client()
96 list_del(&clnt->cl_clients); in rpc_unregister_client()
97 spin_unlock(&sn->rpc_client_lock); in rpc_unregister_client()
111 if (pipefs_sb) { in rpc_clnt_remove_pipedir()
121 const char *dir_name = clnt->cl_program->pipe_dir_name; in rpc_setup_pipedir_sb()
126 if (dir == NULL) { in rpc_setup_pipedir_sb()
127 pr_info("RPC: pipefs directory doesn't exist: %s\n", dir_name); in rpc_setup_pipedir_sb()
132 name[sizeof(name) - 1] = '\0'; in rpc_setup_pipedir_sb()
134 if (!IS_ERR(dentry)) in rpc_setup_pipedir_sb()
136 if (dentry == ERR_PTR(-EEXIST)) in rpc_setup_pipedir_sb()
138 printk(KERN_INFO "RPC: Couldn't create pipefs entry" in rpc_setup_pipedir_sb()
152 if (clnt->cl_program->pipe_dir_name != NULL) { in rpc_setup_pipedir()
154 if (IS_ERR(dentry)) in rpc_setup_pipedir()
162 if (clnt->cl_program->pipe_dir_name == NULL) in rpc_clnt_skip_event()
167 if (clnt->cl_pipedir_objects.pdh_dentry != NULL) in rpc_clnt_skip_event()
169 if (atomic_read(&clnt->cl_count) == 0) in rpc_clnt_skip_event()
173 if (clnt->cl_pipedir_objects.pdh_dentry == NULL) in rpc_clnt_skip_event()
188 if (!dentry) in __rpc_clnt_handle_event()
189 return -ENOENT; in __rpc_clnt_handle_event()
190 if (IS_ERR(dentry)) in __rpc_clnt_handle_event()
198 return -ENOTSUPP; in __rpc_clnt_handle_event()
208 for (;; clnt = clnt->cl_parent) { in __rpc_pipefs_event()
209 if (!rpc_clnt_skip_event(clnt, event)) in __rpc_pipefs_event()
211 if (error || clnt == clnt->cl_parent) in __rpc_pipefs_event()
222 spin_lock(&sn->rpc_client_lock); in rpc_get_client_for_event()
223 list_for_each_entry(clnt, &sn->all_clients, cl_clients) { in rpc_get_client_for_event()
224 if (rpc_clnt_skip_event(clnt, event)) in rpc_get_client_for_event()
226 spin_unlock(&sn->rpc_client_lock); in rpc_get_client_for_event()
229 spin_unlock(&sn->rpc_client_lock); in rpc_get_client_for_event()
240 while ((clnt = rpc_get_client_for_event(sb->s_fs_info, event))) { in rpc_pipefs_event()
242 if (error) in rpc_pipefs_event()
269 spin_lock(&clnt->cl_lock); in rpc_clnt_set_transport()
270 old = rcu_dereference_protected(clnt->cl_xprt, in rpc_clnt_set_transport()
271 lockdep_is_held(&clnt->cl_lock)); in rpc_clnt_set_transport()
273 if (!xprt_bound(xprt)) in rpc_clnt_set_transport()
274 clnt->cl_autobind = 1; in rpc_clnt_set_transport()
276 clnt->cl_timeout = timeout; in rpc_clnt_set_transport()
277 rcu_assign_pointer(clnt->cl_xprt, xprt); in rpc_clnt_set_transport()
278 spin_unlock(&clnt->cl_lock); in rpc_clnt_set_transport()
285 clnt->cl_nodelen = strlcpy(clnt->cl_nodename, in rpc_clnt_set_nodename()
286 nodename, sizeof(clnt->cl_nodename)); in rpc_clnt_set_nodename()
305 if (pipefs_sb) { in rpc_client_register()
307 if (err) in rpc_client_register()
312 if (pipefs_sb) in rpc_client_register()
316 if (IS_ERR(auth)) { in rpc_client_register()
317 dprintk("RPC: Couldn't create auth handle (flavor %u)\n", in rpc_client_register()
328 if (pipefs_sb) in rpc_client_register()
346 if (clid < 0) in rpc_alloc_clid()
348 clnt->cl_clid = clid; in rpc_alloc_clid()
354 ida_simple_remove(&rpc_clids, clnt->cl_clid); in rpc_free_clid()
362 const struct rpc_program *program = args->program; in rpc_new_client()
366 const char *nodename = args->nodename; in rpc_new_client()
370 if (err) in rpc_new_client()
373 err = -EINVAL; in rpc_new_client()
374 if (args->version >= program->nrvers) in rpc_new_client()
376 version = program->version[args->version]; in rpc_new_client()
377 if (version == NULL) in rpc_new_client()
380 err = -ENOMEM; in rpc_new_client()
382 if (!clnt) in rpc_new_client()
384 clnt->cl_parent = parent ? : clnt; in rpc_new_client()
387 if (err) in rpc_new_client()
390 clnt->cl_cred = get_cred(args->cred); in rpc_new_client()
391 clnt->cl_procinfo = version->procs; in rpc_new_client()
392 clnt->cl_maxproc = version->nrprocs; in rpc_new_client()
393 clnt->cl_prog = args->prognumber ? : program->number; in rpc_new_client()
394 clnt->cl_vers = version->number; in rpc_new_client()
395 clnt->cl_stats = program->stats; in rpc_new_client()
396 clnt->cl_metrics = rpc_alloc_iostats(clnt); in rpc_new_client()
397 rpc_init_pipe_dir_head(&clnt->cl_pipedir_objects); in rpc_new_client()
398 err = -ENOMEM; in rpc_new_client()
399 if (clnt->cl_metrics == NULL) in rpc_new_client()
401 clnt->cl_program = program; in rpc_new_client()
402 INIT_LIST_HEAD(&clnt->cl_tasks); in rpc_new_client()
403 spin_lock_init(&clnt->cl_lock); in rpc_new_client()
405 timeout = xprt->timeout; in rpc_new_client()
406 if (args->timeout != NULL) { in rpc_new_client()
407 memcpy(&clnt->cl_timeout_default, args->timeout, in rpc_new_client()
408 sizeof(clnt->cl_timeout_default)); in rpc_new_client()
409 timeout = &clnt->cl_timeout_default; in rpc_new_client()
413 xprt_iter_init(&clnt->cl_xpi, xps); in rpc_new_client()
416 clnt->cl_rtt = &clnt->cl_rtt_default; in rpc_new_client()
417 rpc_init_rtt(&clnt->cl_rtt_default, clnt->cl_timeout->to_initval); in rpc_new_client()
419 atomic_set(&clnt->cl_count, 1); in rpc_new_client()
421 if (nodename == NULL) in rpc_new_client()
422 nodename = utsname()->nodename; in rpc_new_client()
426 err = rpc_client_register(clnt, args->authflavor, args->client_name); in rpc_new_client()
427 if (err) in rpc_new_client()
429 if (parent) in rpc_new_client()
430 atomic_inc(&parent->cl_count); in rpc_new_client()
432 trace_rpc_clnt_new(clnt, xprt, program->name, args->servername); in rpc_new_client()
436 rpc_free_iostats(clnt->cl_metrics); in rpc_new_client()
438 put_cred(clnt->cl_cred); in rpc_new_client()
447 trace_rpc_clnt_new_err(program->name, args->servername, err); in rpc_new_client()
457 if (args->bc_xprt && args->bc_xprt->xpt_bc_xps) { in rpc_create_xprt()
458 WARN_ON_ONCE(!(args->protocol & XPRT_TRANSPORT_BC)); in rpc_create_xprt()
459 xps = args->bc_xprt->xpt_bc_xps; in rpc_create_xprt()
463 if (xps == NULL) { in rpc_create_xprt()
465 return ERR_PTR(-ENOMEM); in rpc_create_xprt()
467 if (xprt->bc_xprt) { in rpc_create_xprt()
469 xprt->bc_xprt->xpt_bc_xps = xps; in rpc_create_xprt()
473 if (IS_ERR(clnt)) in rpc_create_xprt()
476 if (!(args->flags & RPC_CLNT_CREATE_NOPING)) { in rpc_create_xprt()
478 if (err != 0) { in rpc_create_xprt()
484 clnt->cl_softrtry = 1; in rpc_create_xprt()
485 if (args->flags & (RPC_CLNT_CREATE_HARDRTRY|RPC_CLNT_CREATE_SOFTERR)) { in rpc_create_xprt()
486 clnt->cl_softrtry = 0; in rpc_create_xprt()
487 if (args->flags & RPC_CLNT_CREATE_SOFTERR) in rpc_create_xprt()
488 clnt->cl_softerr = 1; in rpc_create_xprt()
491 if (args->flags & RPC_CLNT_CREATE_AUTOBIND) in rpc_create_xprt()
492 clnt->cl_autobind = 1; in rpc_create_xprt()
493 if (args->flags & RPC_CLNT_CREATE_NO_RETRANS_TIMEOUT) in rpc_create_xprt()
494 clnt->cl_noretranstimeo = 1; in rpc_create_xprt()
495 if (args->flags & RPC_CLNT_CREATE_DISCRTRY) in rpc_create_xprt()
496 clnt->cl_discrtry = 1; in rpc_create_xprt()
497 if (!(args->flags & RPC_CLNT_CREATE_QUIET)) in rpc_create_xprt()
498 clnt->cl_chatty = 1; in rpc_create_xprt()
504 * rpc_create - create an RPC client and transport with one call
507 * Creates and initializes an RPC transport and an RPC client.
509 * It can ping the server in order to determine if it is up, and to see if
517 .net = args->net, in rpc_create()
518 .ident = args->protocol, in rpc_create()
519 .srcaddr = args->saddress, in rpc_create()
520 .dstaddr = args->address, in rpc_create()
521 .addrlen = args->addrsize, in rpc_create()
522 .servername = args->servername, in rpc_create()
523 .bc_xprt = args->bc_xprt, in rpc_create()
529 if (args->bc_xprt) { in rpc_create()
530 WARN_ON_ONCE(!(args->protocol & XPRT_TRANSPORT_BC)); in rpc_create()
531 xprt = args->bc_xprt->xpt_bc_xprt; in rpc_create()
532 if (xprt) { in rpc_create()
538 if (args->flags & RPC_CLNT_CREATE_INFINITE_SLOTS) in rpc_create()
540 if (args->flags & RPC_CLNT_CREATE_NO_IDLE_TIMEOUT) in rpc_create()
543 * If the caller chooses not to specify a hostname, whip in rpc_create()
544 * up a string representation of the passed-in address. in rpc_create()
546 if (xprtargs.servername == NULL) { in rpc_create()
548 (struct sockaddr_un *)args->address; in rpc_create()
550 (struct sockaddr_in *)args->address; in rpc_create()
552 (struct sockaddr_in6 *)args->address; in rpc_create()
555 switch (args->address->sa_family) { in rpc_create()
558 sun->sun_path); in rpc_create()
562 &sin->sin_addr.s_addr); in rpc_create()
566 &sin6->sin6_addr); in rpc_create()
571 return ERR_PTR(-EINVAL); in rpc_create()
577 if (IS_ERR(xprt)) in rpc_create()
581 * By default, kernel RPC client connects from a reserved port. in rpc_create()
586 xprt->resvport = 1; in rpc_create()
587 if (args->flags & RPC_CLNT_CREATE_NONPRIVPORT) in rpc_create()
588 xprt->resvport = 0; in rpc_create()
589 xprt->reuseport = 0; in rpc_create()
590 if (args->flags & RPC_CLNT_CREATE_REUSEPORT) in rpc_create()
591 xprt->reuseport = 1; in rpc_create()
594 if (IS_ERR(clnt) || args->nconnect <= 1) in rpc_create()
597 for (i = 0; i < args->nconnect - 1; i++) { in rpc_create()
598 if (rpc_clnt_add_xprt(clnt, &xprtargs, NULL, NULL) < 0) in rpc_create()
606 * This function clones the RPC client structure. It allows us to share the
618 err = -ENOMEM; in __rpc_clone_client()
620 xprt = xprt_get(rcu_dereference(clnt->cl_xprt)); in __rpc_clone_client()
621 xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch)); in __rpc_clone_client()
623 if (xprt == NULL || xps == NULL) { in __rpc_clone_client()
628 args->servername = xprt->servername; in __rpc_clone_client()
629 args->nodename = clnt->cl_nodename; in __rpc_clone_client()
632 if (IS_ERR(new)) in __rpc_clone_client()
636 new->cl_autobind = 0; in __rpc_clone_client()
637 new->cl_softrtry = clnt->cl_softrtry; in __rpc_clone_client()
638 new->cl_softerr = clnt->cl_softerr; in __rpc_clone_client()
639 new->cl_noretranstimeo = clnt->cl_noretranstimeo; in __rpc_clone_client()
640 new->cl_discrtry = clnt->cl_discrtry; in __rpc_clone_client()
641 new->cl_chatty = clnt->cl_chatty; in __rpc_clone_client()
642 new->cl_principal = clnt->cl_principal; in __rpc_clone_client()
651 * rpc_clone_client - Clone an RPC client structure
653 * @clnt: RPC client whose parameters are copied
655 * Returns a fresh RPC client or an ERR_PTR.
660 .program = clnt->cl_program, in rpc_clone_client()
661 .prognumber = clnt->cl_prog, in rpc_clone_client()
662 .version = clnt->cl_vers, in rpc_clone_client()
663 .authflavor = clnt->cl_auth->au_flavor, in rpc_clone_client()
664 .cred = clnt->cl_cred, in rpc_clone_client()
671 * rpc_clone_client_set_auth - Clone an RPC client structure and set its auth
673 * @clnt: RPC client whose parameters are copied
676 * Returns a fresh RPC client or an ERR_PTR.
682 .program = clnt->cl_program, in rpc_clone_client_set_auth()
683 .prognumber = clnt->cl_prog, in rpc_clone_client_set_auth()
684 .version = clnt->cl_vers, in rpc_clone_client_set_auth()
686 .cred = clnt->cl_cred, in rpc_clone_client_set_auth()
693 * rpc_switch_client_transport: switch the RPC transport on the fly
698 * This function allows the caller to switch the RPC transport for the
701 * there are no active RPC tasks by using some form of locking.
703 * Returns zero if "clnt" is now using the new xprt. Otherwise a
719 if (IS_ERR(xprt)) in rpc_switch_client_transport()
723 if (xps == NULL) { in rpc_switch_client_transport()
725 return -ENOMEM; in rpc_switch_client_transport()
728 pseudoflavor = clnt->cl_auth->au_flavor; in rpc_switch_client_transport()
730 old_timeo = clnt->cl_timeout; in rpc_switch_client_transport()
732 oldxps = xprt_iter_xchg_switch(&clnt->cl_xpi, xps); in rpc_switch_client_transport()
741 * children, if it has any, still point to the old xprt. in rpc_switch_client_transport()
743 parent = clnt->cl_parent; in rpc_switch_client_transport()
744 clnt->cl_parent = clnt; in rpc_switch_client_transport()
747 * The old rpc_auth cache cannot be re-used. GSS in rpc_switch_client_transport()
752 if (err) in rpc_switch_client_transport()
756 if (parent != clnt) in rpc_switch_client_transport()
764 xps = xprt_iter_xchg_switch(&clnt->cl_xpi, oldxps); in rpc_switch_client_transport()
766 clnt->cl_parent = parent; in rpc_switch_client_transport()
781 xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch)); in rpc_clnt_xprt_iter_init()
783 if (xps == NULL) in rpc_clnt_xprt_iter_init()
784 return -EAGAIN; in rpc_clnt_xprt_iter_init()
791 * rpc_clnt_iterate_for_each_xprt - Apply a function to all transports
796 * Iterates through the list of RPC transports currently attached to the
809 if (ret) in rpc_clnt_iterate_for_each_xprt()
814 if (!xprt) in rpc_clnt_iterate_for_each_xprt()
818 if (ret < 0) in rpc_clnt_iterate_for_each_xprt()
835 if (list_empty(&clnt->cl_tasks)) in rpc_killall_tasks()
842 spin_lock(&clnt->cl_lock); in rpc_killall_tasks()
843 list_for_each_entry(rovr, &clnt->cl_tasks, tk_task) in rpc_killall_tasks()
845 spin_unlock(&clnt->cl_lock); in rpc_killall_tasks()
850 * Properly shut down an RPC client, terminating all outstanding
859 while (!list_empty(&clnt->cl_tasks)) { in rpc_shutdown_client()
862 list_empty(&clnt->cl_tasks), 1*HZ); in rpc_shutdown_client()
870 * Free an RPC client
885 xprt_put(rcu_dereference_raw(clnt->cl_xprt)); in rpc_free_client_work()
896 if (clnt->cl_parent != clnt) in rpc_free_client()
897 parent = clnt->cl_parent; in rpc_free_client()
899 rpc_free_iostats(clnt->cl_metrics); in rpc_free_client()
900 clnt->cl_metrics = NULL; in rpc_free_client()
901 xprt_iter_destroy(&clnt->cl_xpi); in rpc_free_client()
902 put_cred(clnt->cl_cred); in rpc_free_client()
904 INIT_WORK(&clnt->cl_work, rpc_free_client_work); in rpc_free_client()
905 schedule_work(&clnt->cl_work); in rpc_free_client()
910 * Free an RPC client
915 if (clnt->cl_auth == NULL) in rpc_free_auth()
919 * Note: RPCSEC_GSS may need to send NULL RPC calls in order to in rpc_free_auth()
923 atomic_inc(&clnt->cl_count); in rpc_free_auth()
924 rpcauth_release(clnt->cl_auth); in rpc_free_auth()
925 clnt->cl_auth = NULL; in rpc_free_auth()
926 if (atomic_dec_and_test(&clnt->cl_count)) in rpc_free_auth()
932 * Release reference to the RPC client
938 if (list_empty(&clnt->cl_tasks)) in rpc_release_client()
940 if (!atomic_dec_and_test(&clnt->cl_count)) in rpc_release_client()
948 * rpc_bind_new_program - bind a new RPC program to an existing client
950 * @program: rpc program to set
951 * @vers: rpc program version
953 * Clones the rpc client and sets up a new RPC program. This is mainly
954 * of use for enabling different RPC programs to share the same transport.
963 .prognumber = program->number, in rpc_bind_new_program()
965 .authflavor = old->cl_auth->au_flavor, in rpc_bind_new_program()
966 .cred = old->cl_cred, in rpc_bind_new_program()
972 if (IS_ERR(clnt)) in rpc_bind_new_program()
975 if (err != 0) { in rpc_bind_new_program()
989 if (!xprt) in rpc_task_get_xprt()
992 xps = rcu_dereference(clnt->cl_xpi.xpi_xpswitch); in rpc_task_get_xprt()
993 atomic_long_inc(&xps->xps_queuelen); in rpc_task_get_xprt()
995 atomic_long_inc(&xprt->queuelen); in rpc_task_get_xprt()
1005 atomic_long_dec(&xprt->queuelen); in rpc_task_release_xprt()
1007 xps = rcu_dereference(clnt->cl_xpi.xpi_xpswitch); in rpc_task_release_xprt()
1008 atomic_long_dec(&xps->xps_queuelen); in rpc_task_release_xprt()
1016 struct rpc_xprt *xprt = task->tk_xprt; in rpc_task_release_transport()
1018 if (xprt) { in rpc_task_release_transport()
1019 task->tk_xprt = NULL; in rpc_task_release_transport()
1020 if (task->tk_client) in rpc_task_release_transport()
1021 rpc_task_release_xprt(task->tk_client, xprt); in rpc_task_release_transport()
1030 struct rpc_clnt *clnt = task->tk_client; in rpc_task_release_client()
1033 if (clnt != NULL) { in rpc_task_release_client()
1035 spin_lock(&clnt->cl_lock); in rpc_task_release_client()
1036 list_del(&task->tk_task); in rpc_task_release_client()
1037 spin_unlock(&clnt->cl_lock); in rpc_task_release_client()
1038 task->tk_client = NULL; in rpc_task_release_client()
1050 xprt = xprt_get(rcu_dereference(clnt->cl_xprt)); in rpc_task_get_first_xprt()
1058 return rpc_task_get_xprt(clnt, xprt_iter_get_next(&clnt->cl_xpi)); in rpc_task_get_next_xprt()
1064 if (task->tk_xprt) in rpc_task_set_transport()
1066 if (task->tk_flags & RPC_TASK_NO_ROUND_ROBIN) in rpc_task_set_transport()
1067 task->tk_xprt = rpc_task_get_first_xprt(clnt); in rpc_task_set_transport()
1069 task->tk_xprt = rpc_task_get_next_xprt(clnt); in rpc_task_set_transport()
1076 if (clnt != NULL) { in rpc_task_set_client()
1078 task->tk_client = clnt; in rpc_task_set_client()
1079 atomic_inc(&clnt->cl_count); in rpc_task_set_client()
1080 if (clnt->cl_softrtry) in rpc_task_set_client()
1081 task->tk_flags |= RPC_TASK_SOFT; in rpc_task_set_client()
1082 if (clnt->cl_softerr) in rpc_task_set_client()
1083 task->tk_flags |= RPC_TASK_TIMEOUT; in rpc_task_set_client()
1084 if (clnt->cl_noretranstimeo) in rpc_task_set_client()
1085 task->tk_flags |= RPC_TASK_NO_RETRANS_TIMEOUT; in rpc_task_set_client()
1086 if (atomic_read(&clnt->cl_swapper)) in rpc_task_set_client()
1087 task->tk_flags |= RPC_TASK_SWAPPER; in rpc_task_set_client()
1089 spin_lock(&clnt->cl_lock); in rpc_task_set_client()
1090 list_add_tail(&task->tk_task, &clnt->cl_tasks); in rpc_task_set_client()
1091 spin_unlock(&clnt->cl_lock); in rpc_task_set_client()
1098 if (msg != NULL) { in rpc_task_set_rpc_message()
1099 task->tk_msg.rpc_proc = msg->rpc_proc; in rpc_task_set_rpc_message()
1100 task->tk_msg.rpc_argp = msg->rpc_argp; in rpc_task_set_rpc_message()
1101 task->tk_msg.rpc_resp = msg->rpc_resp; in rpc_task_set_rpc_message()
1102 task->tk_msg.rpc_cred = msg->rpc_cred; in rpc_task_set_rpc_message()
1103 if (!(task->tk_flags & RPC_TASK_CRED_NOREF)) in rpc_task_set_rpc_message()
1104 get_cred(task->tk_msg.rpc_cred); in rpc_task_set_rpc_message()
1109 * Default callback for async RPC calls
1121 * rpc_run_task - Allocate a new RPC task, then run rpc_execute against it
1130 if (!RPC_IS_ASYNC(task)) in rpc_run_task()
1131 task->tk_flags |= RPC_TASK_CRED_NOREF; in rpc_run_task()
1133 rpc_task_set_client(task, task_setup_data->rpc_client); in rpc_run_task()
1134 rpc_task_set_rpc_message(task, task_setup_data->rpc_message); in rpc_run_task()
1136 if (task->tk_action == NULL) in rpc_run_task()
1139 atomic_inc(&task->tk_count); in rpc_run_task()
1146 * rpc_call_sync - Perform a synchronous RPC call
1147 * @clnt: pointer to RPC client
1148 * @msg: RPC call parameters
1149 * @flags: RPC call flags
1163 if (flags & RPC_TASK_ASYNC) { in rpc_call_sync()
1166 return -EINVAL; in rpc_call_sync()
1170 if (IS_ERR(task)) in rpc_call_sync()
1172 status = task->tk_status; in rpc_call_sync()
1179 * rpc_call_async - Perform an asynchronous RPC call
1180 * @clnt: pointer to RPC client
1181 * @msg: RPC call parameters
1182 * @flags: RPC call flags
1183 * @tk_ops: RPC call ops
1200 if (IS_ERR(task)) in rpc_call_async()
1207 #if defined(CONFIG_SUNRPC_BACKCHANNEL)
1211 * rpc_run_bc_task - Allocate a new RPC task for backchannel use, then run
1213 * @req: RPC request
1224 dprintk("RPC: rpc_run_bc_task req= %p\n", req); in rpc_run_bc_task()
1231 task->tk_action = call_bc_encode; in rpc_run_bc_task()
1232 atomic_inc(&task->tk_count); in rpc_run_bc_task()
1233 WARN_ON_ONCE(atomic_read(&task->tk_count) != 2); in rpc_run_bc_task()
1236 dprintk("RPC: rpc_run_bc_task: task= %p\n", task); in rpc_run_bc_task()
1242 * rpc_prepare_reply_pages - Prepare to receive a reply data payload into pages
1243 * @req: RPC request to prepare
1257 hdrsize += RPC_REPHDRSIZE + req->rq_cred->cr_auth->au_ralign - 1; in rpc_prepare_reply_pages()
1259 xdr_inline_pages(&req->rq_rcv_buf, hdrsize << 2, pages, base, len); in rpc_prepare_reply_pages()
1260 trace_rpc_xdr_reply_pages(req->rq_task, &req->rq_rcv_buf); in rpc_prepare_reply_pages()
1267 task->tk_action = call_start; in rpc_call_start()
1272 * rpc_peeraddr - extract remote peer address from clnt's xprt
1273 * @clnt: RPC client structure
1285 xprt = rcu_dereference(clnt->cl_xprt); in rpc_peeraddr()
1287 bytes = xprt->addrlen; in rpc_peeraddr()
1288 if (bytes > bufsize) in rpc_peeraddr()
1290 memcpy(buf, &xprt->addr, bytes); in rpc_peeraddr()
1298 * rpc_peeraddr2str - return remote peer address in printable format
1299 * @clnt: RPC client structure
1311 xprt = rcu_dereference(clnt->cl_xprt); in rpc_peeraddr2str()
1313 if (xprt->address_strings[format] != NULL) in rpc_peeraddr2str()
1314 return xprt->address_strings[format]; in rpc_peeraddr2str()
1335 * Returns zero and fills in "buf" if successful; otherwise, a
1344 err = __sock_create(net, sap->sa_family, in rpc_sockname()
1346 if (err < 0) { in rpc_sockname()
1347 dprintk("RPC: can't create UDP socket (%d)\n", err); in rpc_sockname()
1351 switch (sap->sa_family) { in rpc_sockname()
1363 err = -EAFNOSUPPORT; in rpc_sockname()
1366 if (err < 0) { in rpc_sockname()
1367 dprintk("RPC: can't bind UDP socket (%d)\n", err); in rpc_sockname()
1372 if (err < 0) { in rpc_sockname()
1373 dprintk("RPC: can't connect UDP socket (%d)\n", err); in rpc_sockname()
1378 if (err < 0) { in rpc_sockname()
1379 dprintk("RPC: getsockname failed (%d)\n", err); in rpc_sockname()
1384 if (buf->sa_family == AF_INET6) { in rpc_sockname()
1386 sin6->sin6_scope_id = 0; in rpc_sockname()
1388 dprintk("RPC: %s succeeded\n", __func__); in rpc_sockname()
1401 * Returns zero and fills in "buf" if successful; otherwise, a
1408 if (buflen < sizeof(rpc_inaddr_loopback)) in rpc_anyaddr()
1409 return -EINVAL; in rpc_anyaddr()
1414 if (buflen < sizeof(rpc_in6addr_loopback)) in rpc_anyaddr()
1415 return -EINVAL; in rpc_anyaddr()
1420 dprintk("RPC: %s: address family not supported\n", in rpc_anyaddr()
1422 return -EAFNOSUPPORT; in rpc_anyaddr()
1424 dprintk("RPC: %s: succeeded\n", __func__); in rpc_anyaddr()
1429 * rpc_localaddr - discover local endpoint address for an RPC client
1430 * @clnt: RPC client structure
1434 * Returns zero and fills in "buf" and "buflen" if successful;
1437 * This works even if the underlying transport is not currently connected,
1438 * or if the upper layer never previously provided a source address.
1454 xprt = rcu_dereference(clnt->cl_xprt); in rpc_localaddr()
1455 salen = xprt->addrlen; in rpc_localaddr()
1456 memcpy(sap, &xprt->addr, salen); in rpc_localaddr()
1457 net = get_net(xprt->xprt_net); in rpc_localaddr()
1463 if (err != 0) in rpc_localaddr()
1465 return rpc_anyaddr(sap->sa_family, buf, buflen); in rpc_localaddr()
1476 xprt = rcu_dereference(clnt->cl_xprt); in rpc_setbufsize()
1477 if (xprt->ops->set_buffer_size) in rpc_setbufsize()
1478 xprt->ops->set_buffer_size(xprt, sndsize, rcvsize); in rpc_setbufsize()
1484 * rpc_net_ns - Get the network namespace for this RPC client
1485 * @clnt: RPC client to query
1493 ret = rcu_dereference(clnt->cl_xprt)->xprt_net; in rpc_net_ns()
1500 * rpc_max_payload - Get maximum payload size for a transport, in bytes
1501 * @clnt: RPC client to query
1503 * For stream transports, this is one RPC record fragment (see RFC
1504 * 1831), as we don't support multi-record requests yet. For datagram
1506 * RPC header sizes.
1513 ret = rcu_dereference(clnt->cl_xprt)->max_payload; in rpc_max_payload()
1520 * rpc_max_bc_payload - Get maximum backchannel payload size, in bytes
1521 * @clnt: RPC client to query
1529 xprt = rcu_dereference(clnt->cl_xprt); in rpc_max_bc_payload()
1530 ret = xprt->ops->bc_maxpayload(xprt); in rpc_max_bc_payload()
1542 xprt = rcu_dereference(clnt->cl_xprt); in rpc_num_bc_slots()
1543 ret = xprt->ops->bc_num_slots(xprt); in rpc_num_bc_slots()
1550 * rpc_force_rebind - force transport to check that remote port is unchanged
1556 if (clnt->cl_autobind) { in rpc_force_rebind()
1558 xprt_clear_bound(rcu_dereference(clnt->cl_xprt)); in rpc_force_rebind()
1567 task->tk_status = 0; in __rpc_restart_call()
1568 task->tk_rpc_status = 0; in __rpc_restart_call()
1569 task->tk_action = action; in __rpc_restart_call()
1574 * Restart an (async) RPC call. Usually called from within the
1585 * Restart an (async) RPC call from the call_prepare state.
1591 if (task->tk_ops->rpc_call_prepare != NULL) in rpc_restart_call_prepare()
1600 const struct rpc_procinfo *proc = task->tk_msg.rpc_proc; in rpc_proc_name()
1602 if (proc) { in rpc_proc_name()
1603 if (proc->p_name) in rpc_proc_name()
1604 return proc->p_name; in rpc_proc_name()
1615 task->tk_rpc_status = rpc_status; in __rpc_call_rpcerror()
1629 * this state is visited exactly once for each RPC.
1634 struct rpc_clnt *clnt = task->tk_client; in call_start()
1635 int idx = task->tk_msg.rpc_proc->p_statidx; in call_start()
1640 if (clnt->cl_program->version[clnt->cl_vers]) in call_start()
1641 clnt->cl_program->version[clnt->cl_vers]->counts[idx]++; in call_start()
1642 clnt->cl_stats->rpccnt++; in call_start()
1643 task->tk_action = call_reserve; in call_start()
1648 * 1. Reserve an RPC call slot
1653 task->tk_status = 0; in call_reserve()
1654 task->tk_action = call_reserveresult; in call_reserve()
1666 int status = task->tk_status; in call_reserveresult()
1672 task->tk_status = 0; in call_reserveresult()
1673 if (status >= 0) { in call_reserveresult()
1674 if (task->tk_rqstp) { in call_reserveresult()
1675 task->tk_action = call_refresh; in call_reserveresult()
1679 rpc_call_rpcerror(task, -EIO); in call_reserveresult()
1687 if (task->tk_rqstp) in call_reserveresult()
1691 case -ENOMEM: in call_reserveresult()
1694 case -EAGAIN: /* woken up; retry */ in call_reserveresult()
1695 task->tk_action = call_retry_reserve; in call_reserveresult()
1703 * 1c. Retry reserving an RPC call slot
1708 task->tk_status = 0; in call_retry_reserve()
1709 task->tk_action = call_reserveresult; in call_retry_reserve()
1719 task->tk_action = call_refreshresult; in call_refresh()
1720 task->tk_status = 0; in call_refresh()
1721 task->tk_client->cl_stats->rpcauthrefresh++; in call_refresh()
1731 int status = task->tk_status; in call_refreshresult()
1733 task->tk_status = 0; in call_refreshresult()
1734 task->tk_action = call_refresh; in call_refreshresult()
1737 if (rpcauth_uptodatecred(task)) { in call_refreshresult()
1738 task->tk_action = call_allocate; in call_refreshresult()
1741 /* Use rate-limiting and a max number of retries if refresh in call_refreshresult()
1745 case -ETIMEDOUT: in call_refreshresult()
1748 case -EAGAIN: in call_refreshresult()
1749 status = -EACCES; in call_refreshresult()
1751 case -EKEYEXPIRED: in call_refreshresult()
1752 if (!task->tk_cred_retry) in call_refreshresult()
1754 task->tk_cred_retry--; in call_refreshresult()
1769 const struct rpc_auth *auth = task->tk_rqstp->rq_cred->cr_auth; in call_allocate()
1770 struct rpc_rqst *req = task->tk_rqstp; in call_allocate()
1771 struct rpc_xprt *xprt = req->rq_xprt; in call_allocate()
1772 const struct rpc_procinfo *proc = task->tk_msg.rpc_proc; in call_allocate()
1775 task->tk_status = 0; in call_allocate()
1776 task->tk_action = call_encode; in call_allocate()
1778 if (req->rq_buffer) in call_allocate()
1781 if (proc->p_proc != 0) { in call_allocate()
1782 BUG_ON(proc->p_arglen == 0); in call_allocate()
1783 if (proc->p_decode != NULL) in call_allocate()
1784 BUG_ON(proc->p_replen == 0); in call_allocate()
1788 * Calculate the size (in quads) of the RPC call in call_allocate()
1792 req->rq_callsize = RPC_CALLHDRSIZE + (auth->au_cslack << 1) + in call_allocate()
1793 proc->p_arglen; in call_allocate()
1794 req->rq_callsize <<= 2; in call_allocate()
1799 req->rq_rcvsize = RPC_REPHDRSIZE + auth->au_rslack + \ in call_allocate()
1800 max_t(size_t, proc->p_replen, 2); in call_allocate()
1801 req->rq_rcvsize <<= 2; in call_allocate()
1803 status = xprt->ops->buf_alloc(task); in call_allocate()
1806 if (status == 0) in call_allocate()
1808 if (status != -ENOMEM) { in call_allocate()
1813 if (RPC_IS_ASYNC(task) || !fatal_signal_pending(current)) { in call_allocate()
1814 task->tk_action = call_allocate; in call_allocate()
1819 rpc_call_rpcerror(task, -ERESTARTSYS); in call_allocate()
1825 return test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate) == 0 && in rpc_task_need_encode()
1826 (!(task->tk_flags & RPC_TASK_SENT) || in rpc_task_need_encode()
1827 !(task->tk_flags & RPC_TASK_NO_RETRANS_TIMEOUT) || in rpc_task_need_encode()
1834 struct rpc_rqst *req = task->tk_rqstp; in rpc_xdr_encode()
1837 xdr_buf_init(&req->rq_snd_buf, in rpc_xdr_encode()
1838 req->rq_buffer, in rpc_xdr_encode()
1839 req->rq_callsize); in rpc_xdr_encode()
1840 xdr_buf_init(&req->rq_rcv_buf, in rpc_xdr_encode()
1841 req->rq_rbuffer, in rpc_xdr_encode()
1842 req->rq_rcvsize); in rpc_xdr_encode()
1844 req->rq_reply_bytes_recvd = 0; in rpc_xdr_encode()
1845 req->rq_snd_buf.head[0].iov_len = 0; in rpc_xdr_encode()
1846 xdr_init_encode(&xdr, &req->rq_snd_buf, in rpc_xdr_encode()
1847 req->rq_snd_buf.head[0].iov_base, req); in rpc_xdr_encode()
1848 xdr_free_bvec(&req->rq_snd_buf); in rpc_xdr_encode()
1849 if (rpc_encode_header(task, &xdr)) in rpc_xdr_encode()
1852 task->tk_status = rpcauth_wrap_req(task, &xdr); in rpc_xdr_encode()
1856 * 3. Encode arguments of an RPC call
1861 if (!rpc_task_need_encode(task)) in call_encode()
1869 if (task->tk_status != 0) { in call_encode()
1871 switch (task->tk_status) { in call_encode()
1872 case -EAGAIN: in call_encode()
1873 case -ENOMEM: in call_encode()
1876 case -EKEYEXPIRED: in call_encode()
1877 if (!task->tk_cred_retry) { in call_encode()
1878 rpc_exit(task, task->tk_status); in call_encode()
1880 task->tk_action = call_refresh; in call_encode()
1881 task->tk_cred_retry--; in call_encode()
1886 rpc_call_rpcerror(task, task->tk_status); in call_encode()
1892 if (rpc_reply_expected(task)) in call_encode()
1896 task->tk_action = call_transmit; in call_encode()
1898 if (!xprt_bound(task->tk_xprt)) in call_encode()
1899 task->tk_action = call_bind; in call_encode()
1900 else if (!xprt_connected(task->tk_xprt)) in call_encode()
1901 task->tk_action = call_connect; in call_encode()
1905 * Helpers to check if the task was already transmitted, and
1911 return !test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate); in rpc_task_transmitted()
1918 task->tk_action = call_transmit_status; in rpc_task_handle_transmitted()
1922 * 4. Get the server port number if not yet set
1927 struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; in call_bind()
1929 if (rpc_task_transmitted(task)) { in call_bind()
1934 if (xprt_bound(xprt)) { in call_bind()
1935 task->tk_action = call_connect; in call_bind()
1939 task->tk_action = call_bind_status; in call_bind()
1940 if (!xprt_prepare_transmit(task)) in call_bind()
1943 xprt->ops->rpcbind(task); in call_bind()
1952 struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; in call_bind_status()
1953 int status = -EIO; in call_bind_status()
1955 if (rpc_task_transmitted(task)) { in call_bind_status()
1960 if (task->tk_status >= 0) in call_bind_status()
1962 if (xprt_bound(xprt)) { in call_bind_status()
1963 task->tk_status = 0; in call_bind_status()
1967 switch (task->tk_status) { in call_bind_status()
1968 case -ENOMEM: in call_bind_status()
1971 case -EACCES: in call_bind_status()
1973 /* fail immediately if this is an RPC ping */ in call_bind_status()
1974 if (task->tk_msg.rpc_proc->p_proc == 0) { in call_bind_status()
1975 status = -EOPNOTSUPP; in call_bind_status()
1978 if (task->tk_rebind_retry == 0) in call_bind_status()
1980 task->tk_rebind_retry--; in call_bind_status()
1983 case -ENOBUFS: in call_bind_status()
1986 case -EAGAIN: in call_bind_status()
1988 case -ETIMEDOUT: in call_bind_status()
1991 case -EPFNOSUPPORT: in call_bind_status()
1995 case -EPROTONOSUPPORT: in call_bind_status()
1998 case -ECONNREFUSED: /* connection problems */ in call_bind_status()
1999 case -ECONNRESET: in call_bind_status()
2000 case -ECONNABORTED: in call_bind_status()
2001 case -ENOTCONN: in call_bind_status()
2002 case -EHOSTDOWN: in call_bind_status()
2003 case -ENETDOWN: in call_bind_status()
2004 case -EHOSTUNREACH: in call_bind_status()
2005 case -ENETUNREACH: in call_bind_status()
2006 case -EPIPE: in call_bind_status()
2008 if (!RPC_IS_SOFTCONN(task)) { in call_bind_status()
2012 status = task->tk_status; in call_bind_status()
2021 task->tk_action = call_connect; in call_bind_status()
2024 task->tk_status = 0; in call_bind_status()
2025 task->tk_action = call_bind; in call_bind_status()
2030 * 4b. Connect to the RPC server
2035 struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; in call_connect()
2037 if (rpc_task_transmitted(task)) { in call_connect()
2042 if (xprt_connected(xprt)) { in call_connect()
2043 task->tk_action = call_transmit; in call_connect()
2047 task->tk_action = call_connect_status; in call_connect()
2048 if (task->tk_status < 0) in call_connect()
2050 if (task->tk_flags & RPC_TASK_NOCONNECT) { in call_connect()
2051 rpc_call_rpcerror(task, -ENOTCONN); in call_connect()
2054 if (!xprt_prepare_transmit(task)) in call_connect()
2065 struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; in call_connect_status()
2066 struct rpc_clnt *clnt = task->tk_client; in call_connect_status()
2067 int status = task->tk_status; in call_connect_status()
2069 if (rpc_task_transmitted(task)) { in call_connect_status()
2076 if (task->tk_status == 0) { in call_connect_status()
2077 clnt->cl_stats->netreconn++; in call_connect_status()
2080 if (xprt_connected(xprt)) { in call_connect_status()
2081 task->tk_status = 0; in call_connect_status()
2085 task->tk_status = 0; in call_connect_status()
2087 case -ECONNREFUSED: in call_connect_status()
2089 if (RPC_IS_SOFTCONN(task)) in call_connect_status()
2091 if (clnt->cl_autobind) { in call_connect_status()
2096 case -ECONNRESET: in call_connect_status()
2097 case -ECONNABORTED: in call_connect_status()
2098 case -ENETDOWN: in call_connect_status()
2099 case -ENETUNREACH: in call_connect_status()
2100 case -EHOSTUNREACH: in call_connect_status()
2101 case -EPIPE: in call_connect_status()
2102 case -EPROTO: in call_connect_status()
2103 xprt_conditional_disconnect(task->tk_rqstp->rq_xprt, in call_connect_status()
2104 task->tk_rqstp->rq_connect_cookie); in call_connect_status()
2105 if (RPC_IS_SOFTCONN(task)) in call_connect_status()
2110 case -EADDRINUSE: in call_connect_status()
2111 case -ENOTCONN: in call_connect_status()
2112 case -EAGAIN: in call_connect_status()
2113 case -ETIMEDOUT: in call_connect_status()
2115 case -ENOBUFS: in call_connect_status()
2122 task->tk_action = call_transmit; in call_connect_status()
2126 task->tk_action = call_bind; in call_connect_status()
2131 * 5. Transmit the RPC request, and wait for reply
2136 if (rpc_task_transmitted(task)) { in call_transmit()
2141 task->tk_action = call_transmit_status; in call_transmit()
2142 if (!xprt_prepare_transmit(task)) in call_transmit()
2144 task->tk_status = 0; in call_transmit()
2145 if (test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) { in call_transmit()
2146 if (!xprt_connected(task->tk_xprt)) { in call_transmit()
2147 task->tk_status = -ENOTCONN; in call_transmit()
2161 task->tk_action = call_status; in call_transmit_status()
2167 if (rpc_task_transmitted(task)) { in call_transmit_status()
2168 task->tk_status = 0; in call_transmit_status()
2173 switch (task->tk_status) { in call_transmit_status()
2176 case -EBADMSG: in call_transmit_status()
2177 task->tk_status = 0; in call_transmit_status()
2178 task->tk_action = call_encode; in call_transmit_status()
2181 * Special cases: if we've been waiting on the in call_transmit_status()
2182 * socket's write_space() callback, or if the in call_transmit_status()
2186 case -ENOBUFS: in call_transmit_status()
2189 case -EBADSLT: in call_transmit_status()
2190 case -EAGAIN: in call_transmit_status()
2191 task->tk_action = call_transmit; in call_transmit_status()
2192 task->tk_status = 0; in call_transmit_status()
2194 case -ECONNREFUSED: in call_transmit_status()
2195 case -EHOSTDOWN: in call_transmit_status()
2196 case -ENETDOWN: in call_transmit_status()
2197 case -EHOSTUNREACH: in call_transmit_status()
2198 case -ENETUNREACH: in call_transmit_status()
2199 case -EPERM: in call_transmit_status()
2200 if (RPC_IS_SOFTCONN(task)) { in call_transmit_status()
2201 if (!task->tk_msg.rpc_proc->p_proc) in call_transmit_status()
2202 trace_xprt_ping(task->tk_xprt, in call_transmit_status()
2203 task->tk_status); in call_transmit_status()
2204 rpc_call_rpcerror(task, task->tk_status); in call_transmit_status()
2208 case -ECONNRESET: in call_transmit_status()
2209 case -ECONNABORTED: in call_transmit_status()
2210 case -EADDRINUSE: in call_transmit_status()
2211 case -ENOTCONN: in call_transmit_status()
2212 case -EPIPE: in call_transmit_status()
2213 task->tk_action = call_bind; in call_transmit_status()
2214 task->tk_status = 0; in call_transmit_status()
2220 #if defined(CONFIG_SUNRPC_BACKCHANNEL)
2228 task->tk_action = call_bc_transmit; in call_bc_encode()
2232 * 5b. Send the backchannel RPC reply. On error, drop the reply. In
2238 task->tk_action = call_bc_transmit_status; in call_bc_transmit()
2239 if (test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) { in call_bc_transmit()
2240 if (!xprt_prepare_transmit(task)) in call_bc_transmit()
2242 task->tk_status = 0; in call_bc_transmit()
2251 struct rpc_rqst *req = task->tk_rqstp; in call_bc_transmit_status()
2253 if (rpc_task_transmitted(task)) in call_bc_transmit_status()
2254 task->tk_status = 0; in call_bc_transmit_status()
2256 switch (task->tk_status) { in call_bc_transmit_status()
2259 case -ENETDOWN: in call_bc_transmit_status()
2260 case -EHOSTDOWN: in call_bc_transmit_status()
2261 case -EHOSTUNREACH: in call_bc_transmit_status()
2262 case -ENETUNREACH: in call_bc_transmit_status()
2263 case -ECONNRESET: in call_bc_transmit_status()
2264 case -ECONNREFUSED: in call_bc_transmit_status()
2265 case -EADDRINUSE: in call_bc_transmit_status()
2266 case -ENOTCONN: in call_bc_transmit_status()
2267 case -EPIPE: in call_bc_transmit_status()
2269 case -ENOBUFS: in call_bc_transmit_status()
2272 case -EBADSLT: in call_bc_transmit_status()
2273 case -EAGAIN: in call_bc_transmit_status()
2274 task->tk_status = 0; in call_bc_transmit_status()
2275 task->tk_action = call_bc_transmit; in call_bc_transmit_status()
2277 case -ETIMEDOUT: in call_bc_transmit_status()
2285 printk(KERN_NOTICE "RPC: Could not send backchannel reply " in call_bc_transmit_status()
2286 "error: %d\n", task->tk_status); in call_bc_transmit_status()
2287 xprt_conditional_disconnect(req->rq_xprt, in call_bc_transmit_status()
2288 req->rq_connect_cookie); in call_bc_transmit_status()
2295 printk(KERN_NOTICE "RPC: Could not send backchannel reply " in call_bc_transmit_status()
2296 "error: %d\n", task->tk_status); in call_bc_transmit_status()
2299 task->tk_action = rpc_exit_task; in call_bc_transmit_status()
2304 * 6. Sort out the RPC call status
2309 struct rpc_clnt *clnt = task->tk_client; in call_status()
2312 if (!task->tk_msg.rpc_proc->p_proc) in call_status()
2313 trace_xprt_ping(task->tk_xprt, task->tk_status); in call_status()
2315 status = task->tk_status; in call_status()
2316 if (status >= 0) { in call_status()
2317 task->tk_action = call_decode; in call_status()
2322 task->tk_status = 0; in call_status()
2324 case -EHOSTDOWN: in call_status()
2325 case -ENETDOWN: in call_status()
2326 case -EHOSTUNREACH: in call_status()
2327 case -ENETUNREACH: in call_status()
2328 case -EPERM: in call_status()
2329 if (RPC_IS_SOFTCONN(task)) in call_status()
2332 * Delay any retries for 3 seconds, then handle as if it in call_status()
2337 case -ETIMEDOUT: in call_status()
2339 case -ECONNREFUSED: in call_status()
2340 case -ECONNRESET: in call_status()
2341 case -ECONNABORTED: in call_status()
2342 case -ENOTCONN: in call_status()
2345 case -EADDRINUSE: in call_status()
2348 case -EPIPE: in call_status()
2349 case -EAGAIN: in call_status()
2351 case -EIO: in call_status()
2355 if (clnt->cl_chatty) in call_status()
2356 printk("%s: RPC call returned error %d\n", in call_status()
2357 clnt->cl_program->name, -status); in call_status()
2360 task->tk_action = call_encode; in call_status()
2361 if (status != -ECONNRESET && status != -ECONNABORTED) in call_status()
2372 if (!req || !req->rq_xprt) in rpc_check_connected()
2374 return xprt_connected(req->rq_xprt); in rpc_check_connected()
2380 struct rpc_clnt *clnt = task->tk_client; in rpc_check_timeout()
2382 if (RPC_SIGNALLED(task)) { in rpc_check_timeout()
2383 rpc_call_rpcerror(task, -ERESTARTSYS); in rpc_check_timeout()
2387 if (xprt_adjust_timeout(task->tk_rqstp) == 0) in rpc_check_timeout()
2391 task->tk_timeouts++; in rpc_check_timeout()
2393 if (RPC_IS_SOFTCONN(task) && !rpc_check_connected(task->tk_rqstp)) { in rpc_check_timeout()
2394 rpc_call_rpcerror(task, -ETIMEDOUT); in rpc_check_timeout()
2398 if (RPC_IS_SOFT(task)) { in rpc_check_timeout()
2401 * been sent, it should time out only if the transport in rpc_check_timeout()
2404 if ((task->tk_flags & RPC_TASK_NO_RETRANS_TIMEOUT) && in rpc_check_timeout()
2405 rpc_check_connected(task->tk_rqstp)) in rpc_check_timeout()
2408 if (clnt->cl_chatty) { in rpc_check_timeout()
2411 clnt->cl_program->name, in rpc_check_timeout()
2412 task->tk_xprt->servername); in rpc_check_timeout()
2414 if (task->tk_flags & RPC_TASK_TIMEOUT) in rpc_check_timeout()
2415 rpc_call_rpcerror(task, -ETIMEDOUT); in rpc_check_timeout()
2417 __rpc_call_rpcerror(task, -EIO, -ETIMEDOUT); in rpc_check_timeout()
2421 if (!(task->tk_flags & RPC_CALL_MAJORSEEN)) { in rpc_check_timeout()
2422 task->tk_flags |= RPC_CALL_MAJORSEEN; in rpc_check_timeout()
2423 if (clnt->cl_chatty) { in rpc_check_timeout()
2426 clnt->cl_program->name, in rpc_check_timeout()
2427 task->tk_xprt->servername); in rpc_check_timeout()
2432 * Did our request time out due to an RPCSEC_GSS out-of-sequence in rpc_check_timeout()
2439 * 7. Decode the RPC reply
2444 struct rpc_clnt *clnt = task->tk_client; in call_decode()
2445 struct rpc_rqst *req = task->tk_rqstp; in call_decode()
2449 if (!task->tk_msg.rpc_proc->p_decode) { in call_decode()
2450 task->tk_action = rpc_exit_task; in call_decode()
2454 if (task->tk_flags & RPC_CALL_MAJORSEEN) { in call_decode()
2455 if (clnt->cl_chatty) { in call_decode()
2457 clnt->cl_program->name, in call_decode()
2458 task->tk_xprt->servername); in call_decode()
2460 task->tk_flags &= ~RPC_CALL_MAJORSEEN; in call_decode()
2465 * before it changed req->rq_reply_bytes_recvd. in call_decode()
2470 * Did we ever call xprt_complete_rqst()? If not, we should assume in call_decode()
2473 err = -EAGAIN; in call_decode()
2474 if (!req->rq_reply_bytes_recvd) in call_decode()
2477 req->rq_rcv_buf.len = req->rq_private_buf.len; in call_decode()
2478 trace_rpc_xdr_recvfrom(task, &req->rq_rcv_buf); in call_decode()
2481 WARN_ON(memcmp(&req->rq_rcv_buf, &req->rq_private_buf, in call_decode()
2482 sizeof(req->rq_rcv_buf)) != 0); in call_decode()
2484 xdr_init_decode(&xdr, &req->rq_rcv_buf, in call_decode()
2485 req->rq_rcv_buf.head[0].iov_base, req); in call_decode()
2490 task->tk_action = rpc_exit_task; in call_decode()
2491 task->tk_status = rpcauth_unwrap_resp(task, &xdr); in call_decode()
2493 case -EAGAIN: in call_decode()
2494 task->tk_status = 0; in call_decode()
2495 if (task->tk_client->cl_discrtry) in call_decode()
2496 xprt_conditional_disconnect(req->rq_xprt, in call_decode()
2497 req->rq_connect_cookie); in call_decode()
2498 task->tk_action = call_encode; in call_decode()
2501 case -EKEYREJECTED: in call_decode()
2502 task->tk_action = call_reserve; in call_decode()
2505 /* Ensure we obtain a new XID if we retry! */ in call_decode()
2513 struct rpc_clnt *clnt = task->tk_client; in rpc_encode_header()
2514 struct rpc_rqst *req = task->tk_rqstp; in rpc_encode_header()
2518 error = -EMSGSIZE; in rpc_encode_header()
2520 if (!p) in rpc_encode_header()
2522 *p++ = req->rq_xid; in rpc_encode_header()
2525 *p++ = cpu_to_be32(clnt->cl_prog); in rpc_encode_header()
2526 *p++ = cpu_to_be32(clnt->cl_vers); in rpc_encode_header()
2527 *p = cpu_to_be32(task->tk_msg.rpc_proc->p_proc); in rpc_encode_header()
2530 if (error < 0) in rpc_encode_header()
2542 struct rpc_clnt *clnt = task->tk_client; in rpc_decode_header()
2546 /* RFC-1014 says that the representation of XDR data must be a in rpc_decode_header()
2548 * - if it isn't pointer subtraction in the NFS client may give in rpc_decode_header()
2551 if (task->tk_rqstp->rq_rcv_buf.len & 3) in rpc_decode_header()
2555 if (!p) in rpc_decode_header()
2558 if (*p++ != rpc_reply) in rpc_decode_header()
2560 if (*p++ != rpc_msg_accepted) in rpc_decode_header()
2564 if (error) in rpc_decode_header()
2568 if (!p) in rpc_decode_header()
2575 error = -EPFNOSUPPORT; in rpc_decode_header()
2579 error = -EPROTONOSUPPORT; in rpc_decode_header()
2583 error = -EOPNOTSUPP; in rpc_decode_header()
2588 error = -EIO; in rpc_decode_header()
2595 clnt->cl_stats->rpcgarbage++; in rpc_decode_header()
2596 if (task->tk_garb_retry) { in rpc_decode_header()
2597 task->tk_garb_retry--; in rpc_decode_header()
2598 task->tk_action = call_encode; in rpc_decode_header()
2599 return -EAGAIN; in rpc_decode_header()
2607 error = -EIO; in rpc_decode_header()
2615 error = -EACCES; in rpc_decode_header()
2617 if (!p) in rpc_decode_header()
2624 error = -EPROTONOSUPPORT; in rpc_decode_header()
2631 if (!p) in rpc_decode_header()
2638 if (!task->tk_cred_retry) in rpc_decode_header()
2640 task->tk_cred_retry--; in rpc_decode_header()
2642 return -EKEYREJECTED; in rpc_decode_header()
2646 if (!task->tk_garb_retry) in rpc_decode_header()
2648 task->tk_garb_retry--; in rpc_decode_header()
2650 task->tk_action = call_encode; in rpc_decode_header()
2651 return -EAGAIN; in rpc_decode_header()
2654 pr_warn("RPC: server %s requires stronger authentication.\n", in rpc_decode_header()
2655 task->tk_xprt->servername); in rpc_decode_header()
2727 if (task->tk_status == 0) in rpc_cb_add_xprt_done()
2728 rpc_xprt_switch_add_xprt(data->xps, data->xprt); in rpc_cb_add_xprt_done()
2735 xprt_put(data->xprt); in rpc_cb_add_xprt_release()
2736 xprt_switch_put(data->xps); in rpc_cb_add_xprt_release()
2746 * rpc_clnt_test_and_add_xprt - Test and add a new transport to a rpc_clnt
2760 if (!data) in rpc_clnt_test_and_add_xprt()
2761 return -ENOMEM; in rpc_clnt_test_and_add_xprt()
2762 data->xps = xprt_switch_get(xps); in rpc_clnt_test_and_add_xprt()
2763 data->xprt = xprt_get(xprt); in rpc_clnt_test_and_add_xprt()
2764 if (rpc_xprt_switch_has_addr(data->xps, (struct sockaddr *)&xprt->addr)) { in rpc_clnt_test_and_add_xprt()
2803 int status = -EADDRINUSE; in rpc_clnt_setup_test_and_add_xprt()
2808 if (rpc_xprt_switch_has_addr(xps, (struct sockaddr *)&xprt->addr)) in rpc_clnt_setup_test_and_add_xprt()
2813 if (IS_ERR(task)) { in rpc_clnt_setup_test_and_add_xprt()
2817 status = task->tk_status; in rpc_clnt_setup_test_and_add_xprt()
2820 if (status < 0) in rpc_clnt_setup_test_and_add_xprt()
2824 xtest->add_xprt_test(clnt, xprt, xtest->data); in rpc_clnt_setup_test_and_add_xprt()
2834 pr_info("RPC: rpc_clnt_test_xprt failed: %d addr %s not added\n", in rpc_clnt_setup_test_and_add_xprt()
2835 status, xprt->address_strings[RPC_DISPLAY_ADDR]); in rpc_clnt_setup_test_and_add_xprt()
2841 * rpc_clnt_add_xprt - Add a new transport to a rpc_clnt
2849 * If ping is set, then test that connectivity succeeds before
2869 xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch)); in rpc_clnt_add_xprt()
2870 xprt = xprt_iter_xprt(&clnt->cl_xpi); in rpc_clnt_add_xprt()
2871 if (xps == NULL || xprt == NULL) { in rpc_clnt_add_xprt()
2874 return -EAGAIN; in rpc_clnt_add_xprt()
2876 resvport = xprt->resvport; in rpc_clnt_add_xprt()
2877 reuseport = xprt->reuseport; in rpc_clnt_add_xprt()
2878 connect_timeout = xprt->connect_timeout; in rpc_clnt_add_xprt()
2879 reconnect_timeout = xprt->max_reconnect_timeout; in rpc_clnt_add_xprt()
2883 if (IS_ERR(xprt)) { in rpc_clnt_add_xprt()
2887 xprt->resvport = resvport; in rpc_clnt_add_xprt()
2888 xprt->reuseport = reuseport; in rpc_clnt_add_xprt()
2889 if (xprt->ops->set_connect_timeout != NULL) in rpc_clnt_add_xprt()
2890 xprt->ops->set_connect_timeout(xprt, in rpc_clnt_add_xprt()
2895 if (setup) { in rpc_clnt_add_xprt()
2897 if (ret != 0) in rpc_clnt_add_xprt()
2921 if (xprt->ops->set_connect_timeout) in rpc_xprt_set_connect_timeout()
2922 xprt->ops->set_connect_timeout(xprt, in rpc_xprt_set_connect_timeout()
2923 timeo->connect_timeout, in rpc_xprt_set_connect_timeout()
2924 timeo->reconnect_timeout); in rpc_xprt_set_connect_timeout()
2946 xprt_switch_put(rcu_dereference(clnt->cl_xpi.xpi_xpswitch)); in rpc_clnt_xprt_switch_put()
2954 rpc_xprt_switch_add_xprt(rcu_dereference(clnt->cl_xpi.xpi_xpswitch), in rpc_clnt_xprt_switch_add_xprt()
2967 xps = rcu_dereference(clnt->cl_xpi.xpi_xpswitch); in rpc_clnt_xprt_switch_has_addr()
2974 #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
2977 printk(KERN_INFO "-pid- flgs status -client- --rqstp- " in rpc_show_header()
2978 "-timeout ---ops--\n"); in rpc_show_header()
2986 if (RPC_IS_QUEUED(task)) in rpc_show_task()
2987 rpc_waitq = rpc_qname(task->tk_waitqueue); in rpc_show_task()
2990 task->tk_pid, task->tk_flags, task->tk_status, in rpc_show_task()
2991 clnt, task->tk_rqstp, rpc_task_timeout(task), task->tk_ops, in rpc_show_task()
2992 clnt->cl_program->name, clnt->cl_vers, rpc_proc_name(task), in rpc_show_task()
2993 task->tk_action, rpc_waitq); in rpc_show_task()
3003 spin_lock(&sn->rpc_client_lock); in rpc_show_tasks()
3004 list_for_each_entry(clnt, &sn->all_clients, cl_clients) { in rpc_show_tasks()
3005 spin_lock(&clnt->cl_lock); in rpc_show_tasks()
3006 list_for_each_entry(task, &clnt->cl_tasks, tk_task) { in rpc_show_tasks()
3007 if (!header) { in rpc_show_tasks()
3013 spin_unlock(&clnt->cl_lock); in rpc_show_tasks()
3015 spin_unlock(&sn->rpc_client_lock); in rpc_show_tasks()
3019 #if IS_ENABLED(CONFIG_SUNRPC_SWAP)
3031 if (atomic_inc_return(&clnt->cl_swapper) == 1) in rpc_clnt_swap_activate()
3050 if (atomic_dec_if_positive(&clnt->cl_swapper) == 0) in rpc_clnt_swap_deactivate()