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
47 #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
82 spin_lock(&sn->rpc_client_lock); in rpc_register_client()
83 list_add(&clnt->cl_clients, &sn->all_clients); in rpc_register_client()
84 spin_unlock(&sn->rpc_client_lock); in rpc_register_client()
92 spin_lock(&sn->rpc_client_lock); in rpc_unregister_client()
93 list_del(&clnt->cl_clients); in rpc_unregister_client()
94 spin_unlock(&sn->rpc_client_lock); in rpc_unregister_client()
108 if (pipefs_sb) { in rpc_clnt_remove_pipedir()
109 if (pipefs_sb == clnt->pipefs_sb) in rpc_clnt_remove_pipedir()
119 const char *dir_name = clnt->cl_program->pipe_dir_name; in rpc_setup_pipedir_sb()
125 if (dir == NULL) { in rpc_setup_pipedir_sb()
126 pr_info("RPC: pipefs directory doesn't exist: %s\n", dir_name); in rpc_setup_pipedir_sb()
127 return -ENOENT; in rpc_setup_pipedir_sb()
131 name[sizeof(name) - 1] = '\0'; in rpc_setup_pipedir_sb()
133 if (!err) in rpc_setup_pipedir_sb()
135 if (err == -EEXIST) in rpc_setup_pipedir_sb()
137 printk(KERN_INFO "RPC: Couldn't create pipefs entry" in rpc_setup_pipedir_sb()
149 clnt->pipefs_sb = pipefs_sb; in rpc_setup_pipedir()
151 if (clnt->cl_program->pipe_dir_name != NULL) { in rpc_setup_pipedir()
153 if (err && err != -ENOENT) in rpc_setup_pipedir()
161 if (clnt->cl_program->pipe_dir_name == NULL) in rpc_clnt_skip_event()
166 if (clnt->cl_pipedir_objects.pdh_dentry != NULL) in rpc_clnt_skip_event()
168 if (refcount_read(&clnt->cl_count) == 0) in rpc_clnt_skip_event()
172 if (clnt->cl_pipedir_objects.pdh_dentry == NULL) in rpc_clnt_skip_event()
190 return -ENOTSUPP; in __rpc_clnt_handle_event()
200 for (;; clnt = clnt->cl_parent) { in __rpc_pipefs_event()
201 if (!rpc_clnt_skip_event(clnt, event)) in __rpc_pipefs_event()
203 if (error || clnt == clnt->cl_parent) in __rpc_pipefs_event()
214 spin_lock(&sn->rpc_client_lock); in rpc_get_client_for_event()
215 list_for_each_entry(clnt, &sn->all_clients, cl_clients) { in rpc_get_client_for_event()
216 if (rpc_clnt_skip_event(clnt, event)) in rpc_get_client_for_event()
218 spin_unlock(&sn->rpc_client_lock); in rpc_get_client_for_event()
221 spin_unlock(&sn->rpc_client_lock); in rpc_get_client_for_event()
232 while ((clnt = rpc_get_client_for_event(sb->s_fs_info, event))) { in rpc_pipefs_event()
234 if (error) in rpc_pipefs_event()
261 spin_lock(&clnt->cl_lock); in rpc_clnt_set_transport()
262 old = rcu_dereference_protected(clnt->cl_xprt, in rpc_clnt_set_transport()
263 lockdep_is_held(&clnt->cl_lock)); in rpc_clnt_set_transport()
265 clnt->cl_timeout = timeout; in rpc_clnt_set_transport()
266 rcu_assign_pointer(clnt->cl_xprt, xprt); in rpc_clnt_set_transport()
267 spin_unlock(&clnt->cl_lock); in rpc_clnt_set_transport()
276 copied = strscpy(clnt->cl_nodename, in rpc_clnt_set_nodename()
277 nodename, sizeof(clnt->cl_nodename)); in rpc_clnt_set_nodename()
279 clnt->cl_nodelen = copied < 0 in rpc_clnt_set_nodename()
280 ? sizeof(clnt->cl_nodename) - 1 in rpc_clnt_set_nodename()
300 if (pipefs_sb) { in rpc_client_register()
302 if (err) in rpc_client_register()
307 if (pipefs_sb) in rpc_client_register()
311 if (IS_ERR(auth)) { in rpc_client_register()
312 dprintk("RPC: Couldn't create auth handle (flavor %u)\n", in rpc_client_register()
323 if (pipefs_sb) in rpc_client_register()
342 if (clid < 0) in rpc_alloc_clid()
344 clnt->cl_clid = clid; in rpc_alloc_clid()
350 ida_free(&rpc_clids, clnt->cl_clid); in rpc_free_clid()
358 const struct rpc_program *program = args->program; in rpc_new_client()
362 const char *nodename = args->nodename; in rpc_new_client()
366 if (err) in rpc_new_client()
369 err = -EINVAL; in rpc_new_client()
370 if (args->version >= program->nrvers) in rpc_new_client()
372 version = program->version[args->version]; in rpc_new_client()
373 if (version == NULL) in rpc_new_client()
376 err = -ENOMEM; in rpc_new_client()
378 if (!clnt) in rpc_new_client()
380 clnt->cl_parent = parent ? : clnt; in rpc_new_client()
381 clnt->cl_xprtsec = args->xprtsec; in rpc_new_client()
384 if (err) in rpc_new_client()
387 clnt->cl_cred = get_cred(args->cred); in rpc_new_client()
388 clnt->cl_procinfo = version->procs; in rpc_new_client()
389 clnt->cl_maxproc = version->nrprocs; in rpc_new_client()
390 clnt->cl_prog = args->prognumber ? : program->number; in rpc_new_client()
391 clnt->cl_vers = version->number; in rpc_new_client()
392 clnt->cl_stats = args->stats ? : program->stats; in rpc_new_client()
393 clnt->cl_metrics = rpc_alloc_iostats(clnt); in rpc_new_client()
394 rpc_init_pipe_dir_head(&clnt->cl_pipedir_objects); in rpc_new_client()
395 err = -ENOMEM; in rpc_new_client()
396 if (clnt->cl_metrics == NULL) in rpc_new_client()
398 clnt->cl_program = program; in rpc_new_client()
399 INIT_LIST_HEAD(&clnt->cl_tasks); in rpc_new_client()
400 spin_lock_init(&clnt->cl_lock); in rpc_new_client()
402 timeout = xprt->timeout; in rpc_new_client()
403 if (args->timeout != NULL) { in rpc_new_client()
404 memcpy(&clnt->cl_timeout_default, args->timeout, in rpc_new_client()
405 sizeof(clnt->cl_timeout_default)); in rpc_new_client()
406 timeout = &clnt->cl_timeout_default; in rpc_new_client()
410 xprt->main = true; in rpc_new_client()
411 xprt_iter_init(&clnt->cl_xpi, xps); in rpc_new_client()
414 clnt->cl_rtt = &clnt->cl_rtt_default; in rpc_new_client()
415 rpc_init_rtt(&clnt->cl_rtt_default, clnt->cl_timeout->to_initval); in rpc_new_client()
417 refcount_set(&clnt->cl_count, 1); in rpc_new_client()
419 if (nodename == NULL) in rpc_new_client()
420 nodename = utsname()->nodename; in rpc_new_client()
425 err = rpc_client_register(clnt, args->authflavor, args->client_name); in rpc_new_client()
426 if (err) in rpc_new_client()
428 if (parent) in rpc_new_client()
429 refcount_inc(&parent->cl_count); in rpc_new_client()
435 rpc_free_iostats(clnt->cl_metrics); in rpc_new_client()
437 put_cred(clnt->cl_cred); in rpc_new_client()
446 trace_rpc_clnt_new_err(program->name, args->servername, err); in rpc_new_client()
456 if (args->bc_xprt && args->bc_xprt->xpt_bc_xps) { in rpc_create_xprt()
457 WARN_ON_ONCE(!(args->protocol & XPRT_TRANSPORT_BC)); in rpc_create_xprt()
458 xps = args->bc_xprt->xpt_bc_xps; in rpc_create_xprt()
462 if (xps == NULL) { in rpc_create_xprt()
464 return ERR_PTR(-ENOMEM); in rpc_create_xprt()
466 if (xprt->bc_xprt) { in rpc_create_xprt()
468 xprt->bc_xprt->xpt_bc_xps = xps; in rpc_create_xprt()
472 if (IS_ERR(clnt)) in rpc_create_xprt()
475 if (!(args->flags & RPC_CLNT_CREATE_NOPING)) { in rpc_create_xprt()
477 if (err != 0) { in rpc_create_xprt()
481 } else if (args->flags & RPC_CLNT_CREATE_CONNECTED) { in rpc_create_xprt()
483 if (err != 0) { in rpc_create_xprt()
489 clnt->cl_softrtry = 1; in rpc_create_xprt()
490 if (args->flags & (RPC_CLNT_CREATE_HARDRTRY|RPC_CLNT_CREATE_SOFTERR)) { in rpc_create_xprt()
491 clnt->cl_softrtry = 0; in rpc_create_xprt()
492 if (args->flags & RPC_CLNT_CREATE_SOFTERR) in rpc_create_xprt()
493 clnt->cl_softerr = 1; in rpc_create_xprt()
496 if (args->flags & RPC_CLNT_CREATE_AUTOBIND) in rpc_create_xprt()
497 clnt->cl_autobind = 1; in rpc_create_xprt()
498 if (args->flags & RPC_CLNT_CREATE_NO_RETRANS_TIMEOUT) in rpc_create_xprt()
499 clnt->cl_noretranstimeo = 1; in rpc_create_xprt()
500 if (args->flags & RPC_CLNT_CREATE_DISCRTRY) in rpc_create_xprt()
501 clnt->cl_discrtry = 1; in rpc_create_xprt()
502 if (!(args->flags & RPC_CLNT_CREATE_QUIET)) in rpc_create_xprt()
503 clnt->cl_chatty = 1; in rpc_create_xprt()
504 if (args->flags & RPC_CLNT_CREATE_NETUNREACH_FATAL) in rpc_create_xprt()
505 clnt->cl_netunreach_fatal = 1; in rpc_create_xprt()
511 * rpc_create - create an RPC client and transport with one call
514 * Creates and initializes an RPC transport and an RPC client.
516 * It can ping the server in order to determine if it is up, and to see if
524 .net = args->net, in rpc_create()
525 .ident = args->protocol, in rpc_create()
526 .srcaddr = args->saddress, in rpc_create()
527 .dstaddr = args->address, in rpc_create()
528 .addrlen = args->addrsize, in rpc_create()
529 .servername = args->servername, in rpc_create()
530 .bc_xprt = args->bc_xprt, in rpc_create()
531 .xprtsec = args->xprtsec, in rpc_create()
532 .connect_timeout = args->connect_timeout, in rpc_create()
533 .reconnect_timeout = args->reconnect_timeout, in rpc_create()
539 if (args->bc_xprt) { in rpc_create()
540 WARN_ON_ONCE(!(args->protocol & XPRT_TRANSPORT_BC)); in rpc_create()
541 xprt = args->bc_xprt->xpt_bc_xprt; in rpc_create()
542 if (xprt) { in rpc_create()
548 if (args->flags & RPC_CLNT_CREATE_INFINITE_SLOTS) in rpc_create()
550 if (args->flags & RPC_CLNT_CREATE_NO_IDLE_TIMEOUT) in rpc_create()
553 * If the caller chooses not to specify a hostname, whip in rpc_create()
554 * up a string representation of the passed-in address. in rpc_create()
556 if (xprtargs.servername == NULL) { in rpc_create()
558 (struct sockaddr_un *)args->address; in rpc_create()
560 (struct sockaddr_in *)args->address; in rpc_create()
562 (struct sockaddr_in6 *)args->address; in rpc_create()
565 switch (args->address->sa_family) { in rpc_create()
567 if (sun->sun_path[0]) in rpc_create()
569 sun->sun_path); in rpc_create()
572 sun->sun_path+1); in rpc_create()
576 &sin->sin_addr.s_addr); in rpc_create()
580 &sin6->sin6_addr); in rpc_create()
585 return ERR_PTR(-EINVAL); in rpc_create()
591 if (IS_ERR(xprt)) in rpc_create()
595 * By default, kernel RPC client connects from a reserved port. in rpc_create()
600 xprt->resvport = 1; in rpc_create()
601 if (args->flags & RPC_CLNT_CREATE_NONPRIVPORT) in rpc_create()
602 xprt->resvport = 0; in rpc_create()
603 xprt->reuseport = 0; in rpc_create()
604 if (args->flags & RPC_CLNT_CREATE_REUSEPORT) in rpc_create()
605 xprt->reuseport = 1; in rpc_create()
608 if (IS_ERR(clnt) || args->nconnect <= 1) in rpc_create()
611 for (i = 0; i < args->nconnect - 1; i++) { in rpc_create()
612 if (rpc_clnt_add_xprt(clnt, &xprtargs, NULL, NULL) < 0) in rpc_create()
620 * This function clones the RPC client structure. It allows us to share the
632 err = -ENOMEM; in __rpc_clone_client()
634 xprt = xprt_get(rcu_dereference(clnt->cl_xprt)); in __rpc_clone_client()
635 xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch)); in __rpc_clone_client()
637 if (xprt == NULL || xps == NULL) { in __rpc_clone_client()
642 args->servername = xprt->servername; in __rpc_clone_client()
643 args->nodename = clnt->cl_nodename; in __rpc_clone_client()
646 if (IS_ERR(new)) in __rpc_clone_client()
650 new->cl_autobind = 0; in __rpc_clone_client()
651 new->cl_softrtry = clnt->cl_softrtry; in __rpc_clone_client()
652 new->cl_softerr = clnt->cl_softerr; in __rpc_clone_client()
653 new->cl_noretranstimeo = clnt->cl_noretranstimeo; in __rpc_clone_client()
654 new->cl_discrtry = clnt->cl_discrtry; in __rpc_clone_client()
655 new->cl_chatty = clnt->cl_chatty; in __rpc_clone_client()
656 new->cl_netunreach_fatal = clnt->cl_netunreach_fatal; in __rpc_clone_client()
657 new->cl_principal = clnt->cl_principal; in __rpc_clone_client()
658 new->cl_max_connect = clnt->cl_max_connect; in __rpc_clone_client()
667 * rpc_clone_client - Clone an RPC client structure
669 * @clnt: RPC client whose parameters are copied
671 * Returns a fresh RPC client or an ERR_PTR.
676 .program = clnt->cl_program, in rpc_clone_client()
677 .prognumber = clnt->cl_prog, in rpc_clone_client()
678 .version = clnt->cl_vers, in rpc_clone_client()
679 .authflavor = clnt->cl_auth->au_flavor, in rpc_clone_client()
680 .cred = clnt->cl_cred, in rpc_clone_client()
681 .stats = clnt->cl_stats, in rpc_clone_client()
688 * rpc_clone_client_set_auth - Clone an RPC client structure and set its auth
690 * @clnt: RPC client whose parameters are copied
693 * Returns a fresh RPC client or an ERR_PTR.
699 .program = clnt->cl_program, in rpc_clone_client_set_auth()
700 .prognumber = clnt->cl_prog, in rpc_clone_client_set_auth()
701 .version = clnt->cl_vers, in rpc_clone_client_set_auth()
703 .cred = clnt->cl_cred, in rpc_clone_client_set_auth()
704 .stats = clnt->cl_stats, in rpc_clone_client_set_auth()
711 * rpc_switch_client_transport: switch the RPC transport on the fly
716 * This function allows the caller to switch the RPC transport for the
719 * there are no active RPC tasks by using some form of locking.
721 * Returns zero if "clnt" is now using the new xprt. Otherwise a
736 args->xprtsec = clnt->cl_xprtsec; in rpc_switch_client_transport()
738 if (IS_ERR(xprt)) in rpc_switch_client_transport()
742 if (xps == NULL) { in rpc_switch_client_transport()
744 return -ENOMEM; in rpc_switch_client_transport()
747 pseudoflavor = clnt->cl_auth->au_flavor; in rpc_switch_client_transport()
749 old_timeo = clnt->cl_timeout; in rpc_switch_client_transport()
751 oldxps = xprt_iter_xchg_switch(&clnt->cl_xpi, xps); in rpc_switch_client_transport()
761 * children, if it has any, still point to the old xprt. in rpc_switch_client_transport()
763 parent = clnt->cl_parent; in rpc_switch_client_transport()
764 clnt->cl_parent = clnt; in rpc_switch_client_transport()
767 * The old rpc_auth cache cannot be re-used. GSS in rpc_switch_client_transport()
772 if (err) in rpc_switch_client_transport()
776 if (parent != clnt) in rpc_switch_client_transport()
784 xps = xprt_iter_xchg_switch(&clnt->cl_xpi, oldxps); in rpc_switch_client_transport()
786 clnt->cl_parent = parent; in rpc_switch_client_transport()
800 xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch)); in rpc_clnt_xprt_switch_get()
813 if (xps == NULL) in _rpc_clnt_xprt_iter_init()
814 return -EAGAIN; in _rpc_clnt_xprt_iter_init()
834 * rpc_clnt_iterate_for_each_xprt - Apply a function to all transports
839 * Iterates through the list of RPC transports currently attached to the
852 if (ret) in rpc_clnt_iterate_for_each_xprt()
857 if (!xprt) in rpc_clnt_iterate_for_each_xprt()
861 if (ret < 0) in rpc_clnt_iterate_for_each_xprt()
878 if (list_empty(&clnt->cl_tasks)) in rpc_killall_tasks()
885 spin_lock(&clnt->cl_lock); in rpc_killall_tasks()
886 list_for_each_entry(rovr, &clnt->cl_tasks, tk_task) in rpc_killall_tasks()
888 spin_unlock(&clnt->cl_lock); in rpc_killall_tasks()
893 * rpc_cancel_tasks - try to cancel a set of RPC tasks
894 * @clnt: Pointer to RPC client
895 * @error: RPC task error value to set
899 * Uses @fnmatch to define a set of RPC tasks that are to be cancelled.
910 if (list_empty(&clnt->cl_tasks)) in rpc_cancel_tasks()
915 spin_lock(&clnt->cl_lock); in rpc_cancel_tasks()
916 list_for_each_entry(task, &clnt->cl_tasks, tk_task) { in rpc_cancel_tasks()
917 if (!RPC_IS_ACTIVATED(task)) in rpc_cancel_tasks()
919 if (!fnmatch(task, data)) in rpc_cancel_tasks()
924 spin_unlock(&clnt->cl_lock); in rpc_cancel_tasks()
932 if (xprt_connected(xprt)) in rpc_clnt_disconnect_xprt()
944 * Properly shut down an RPC client, terminating all outstanding
953 clnt->cl_shutdown = 1; in rpc_shutdown_client()
954 while (!list_empty(&clnt->cl_tasks)) { in rpc_shutdown_client()
957 list_empty(&clnt->cl_tasks), 1*HZ); in rpc_shutdown_client()
962 atomic_read(&clnt->cl_task_count) == 0, 1 * HZ); in rpc_shutdown_client()
969 * Free an RPC client
985 xprt_put(rcu_dereference_raw(clnt->cl_xprt)); in rpc_free_client_work()
996 if (clnt->cl_parent != clnt) in rpc_free_client()
997 parent = clnt->cl_parent; in rpc_free_client()
999 rpc_free_iostats(clnt->cl_metrics); in rpc_free_client()
1000 clnt->cl_metrics = NULL; in rpc_free_client()
1001 xprt_iter_destroy(&clnt->cl_xpi); in rpc_free_client()
1002 put_cred(clnt->cl_cred); in rpc_free_client()
1004 INIT_WORK(&clnt->cl_work, rpc_free_client_work); in rpc_free_client()
1005 schedule_work(&clnt->cl_work); in rpc_free_client()
1010 * Free an RPC client
1016 * Note: RPCSEC_GSS may need to send NULL RPC calls in order to in rpc_free_auth()
1020 if (clnt->cl_auth != NULL) { in rpc_free_auth()
1021 rpcauth_release(clnt->cl_auth); in rpc_free_auth()
1022 clnt->cl_auth = NULL; in rpc_free_auth()
1024 if (refcount_dec_and_test(&clnt->cl_count)) in rpc_free_auth()
1030 * Release reference to the RPC client
1036 if (list_empty(&clnt->cl_tasks)) in rpc_release_client()
1038 if (refcount_dec_not_one(&clnt->cl_count)) in rpc_release_client()
1046 * rpc_bind_new_program - bind a new RPC program to an existing client
1048 * @program: rpc program to set
1049 * @vers: rpc program version
1051 * Clones the rpc client and sets up a new RPC program. This is mainly
1052 * of use for enabling different RPC programs to share the same transport.
1061 .prognumber = program->number, in rpc_bind_new_program()
1063 .authflavor = old->cl_auth->au_flavor, in rpc_bind_new_program()
1064 .cred = old->cl_cred, in rpc_bind_new_program()
1065 .stats = old->cl_stats, in rpc_bind_new_program()
1066 .timeout = old->cl_timeout, in rpc_bind_new_program()
1072 if (IS_ERR(clnt)) in rpc_bind_new_program()
1075 if (err != 0) { in rpc_bind_new_program()
1089 if (!xprt) in rpc_task_get_xprt()
1092 xps = rcu_dereference(clnt->cl_xpi.xpi_xpswitch); in rpc_task_get_xprt()
1093 atomic_long_inc(&xps->xps_queuelen); in rpc_task_get_xprt()
1095 atomic_long_inc(&xprt->queuelen); in rpc_task_get_xprt()
1105 atomic_long_dec(&xprt->queuelen); in rpc_task_release_xprt()
1107 xps = rcu_dereference(clnt->cl_xpi.xpi_xpswitch); in rpc_task_release_xprt()
1108 atomic_long_dec(&xps->xps_queuelen); in rpc_task_release_xprt()
1116 struct rpc_xprt *xprt = task->tk_xprt; in rpc_task_release_transport()
1118 if (xprt) { in rpc_task_release_transport()
1119 task->tk_xprt = NULL; in rpc_task_release_transport()
1120 if (task->tk_client) in rpc_task_release_transport()
1121 rpc_task_release_xprt(task->tk_client, xprt); in rpc_task_release_transport()
1130 struct rpc_clnt *clnt = task->tk_client; in rpc_task_release_client()
1133 if (clnt != NULL) { in rpc_task_release_client()
1135 spin_lock(&clnt->cl_lock); in rpc_task_release_client()
1136 list_del(&task->tk_task); in rpc_task_release_client()
1137 spin_unlock(&clnt->cl_lock); in rpc_task_release_client()
1138 task->tk_client = NULL; in rpc_task_release_client()
1139 atomic_dec(&clnt->cl_task_count); in rpc_task_release_client()
1151 xprt = xprt_get(rcu_dereference(clnt->cl_xprt)); in rpc_task_get_first_xprt()
1159 return rpc_task_get_xprt(clnt, xprt_iter_get_next(&clnt->cl_xpi)); in rpc_task_get_next_xprt()
1165 if (task->tk_xprt) { in rpc_task_set_transport()
1166 if (!(test_bit(XPRT_OFFLINE, &task->tk_xprt->state) && in rpc_task_set_transport()
1167 (task->tk_flags & RPC_TASK_MOVEABLE))) in rpc_task_set_transport()
1170 xprt_put(task->tk_xprt); in rpc_task_set_transport()
1172 if (task->tk_flags & RPC_TASK_NO_ROUND_ROBIN) in rpc_task_set_transport()
1173 task->tk_xprt = rpc_task_get_first_xprt(clnt); in rpc_task_set_transport()
1175 task->tk_xprt = rpc_task_get_next_xprt(clnt); in rpc_task_set_transport()
1182 task->tk_client = clnt; in rpc_task_set_client()
1183 refcount_inc(&clnt->cl_count); in rpc_task_set_client()
1184 if (clnt->cl_softrtry) in rpc_task_set_client()
1185 task->tk_flags |= RPC_TASK_SOFT; in rpc_task_set_client()
1186 if (clnt->cl_softerr) in rpc_task_set_client()
1187 task->tk_flags |= RPC_TASK_TIMEOUT; in rpc_task_set_client()
1188 if (clnt->cl_noretranstimeo) in rpc_task_set_client()
1189 task->tk_flags |= RPC_TASK_NO_RETRANS_TIMEOUT; in rpc_task_set_client()
1190 if (clnt->cl_netunreach_fatal) in rpc_task_set_client()
1191 task->tk_flags |= RPC_TASK_NETUNREACH_FATAL; in rpc_task_set_client()
1192 atomic_inc(&clnt->cl_task_count); in rpc_task_set_client()
1198 if (msg != NULL) { in rpc_task_set_rpc_message()
1199 task->tk_msg.rpc_proc = msg->rpc_proc; in rpc_task_set_rpc_message()
1200 task->tk_msg.rpc_argp = msg->rpc_argp; in rpc_task_set_rpc_message()
1201 task->tk_msg.rpc_resp = msg->rpc_resp; in rpc_task_set_rpc_message()
1202 task->tk_msg.rpc_cred = msg->rpc_cred; in rpc_task_set_rpc_message()
1203 if (!(task->tk_flags & RPC_TASK_CRED_NOREF)) in rpc_task_set_rpc_message()
1204 get_cred(task->tk_msg.rpc_cred); in rpc_task_set_rpc_message()
1209 * Default callback for async RPC calls
1221 * rpc_run_task - Allocate a new RPC task, then run rpc_execute against it
1229 if (IS_ERR(task)) in rpc_run_task()
1232 if (!RPC_IS_ASYNC(task)) in rpc_run_task()
1233 task->tk_flags |= RPC_TASK_CRED_NOREF; in rpc_run_task()
1235 rpc_task_set_client(task, task_setup_data->rpc_client); in rpc_run_task()
1236 rpc_task_set_rpc_message(task, task_setup_data->rpc_message); in rpc_run_task()
1238 if (task->tk_action == NULL) in rpc_run_task()
1241 atomic_inc(&task->tk_count); in rpc_run_task()
1248 * rpc_call_sync - Perform a synchronous RPC call
1249 * @clnt: pointer to RPC client
1250 * @msg: RPC call parameters
1251 * @flags: RPC call flags
1265 if (flags & RPC_TASK_ASYNC) { in rpc_call_sync()
1268 return -EINVAL; in rpc_call_sync()
1272 if (IS_ERR(task)) in rpc_call_sync()
1274 status = task->tk_status; in rpc_call_sync()
1281 * rpc_call_async - Perform an asynchronous RPC call
1282 * @clnt: pointer to RPC client
1283 * @msg: RPC call parameters
1284 * @flags: RPC call flags
1285 * @tk_ops: RPC call ops
1302 if (IS_ERR(task)) in rpc_call_async()
1309 #if defined(CONFIG_SUNRPC_BACKCHANNEL)
1313 * rpc_run_bc_task - Allocate a new RPC task for backchannel use, then run
1315 * @req: RPC request
1328 dprintk("RPC: rpc_run_bc_task req= %p\n", req); in rpc_run_bc_task()
1333 if (IS_ERR(task)) { in rpc_run_bc_task()
1340 task->tk_action = call_bc_encode; in rpc_run_bc_task()
1341 atomic_inc(&task->tk_count); in rpc_run_bc_task()
1342 WARN_ON_ONCE(atomic_read(&task->tk_count) != 2); in rpc_run_bc_task()
1345 dprintk("RPC: rpc_run_bc_task: task= %p\n", task); in rpc_run_bc_task()
1351 * rpc_prepare_reply_pages - Prepare to receive a reply data payload into pages
1352 * @req: RPC request to prepare
1363 hdrsize += RPC_REPHDRSIZE + req->rq_cred->cr_auth->au_ralign; in rpc_prepare_reply_pages()
1365 xdr_inline_pages(&req->rq_rcv_buf, hdrsize << 2, pages, base, len); in rpc_prepare_reply_pages()
1366 trace_rpc_xdr_reply_pages(req->rq_task, &req->rq_rcv_buf); in rpc_prepare_reply_pages()
1373 task->tk_action = call_start; in rpc_call_start()
1378 * rpc_peeraddr - extract remote peer address from clnt's xprt
1379 * @clnt: RPC client structure
1391 xprt = rcu_dereference(clnt->cl_xprt); in rpc_peeraddr()
1393 bytes = xprt->addrlen; in rpc_peeraddr()
1394 if (bytes > bufsize) in rpc_peeraddr()
1396 memcpy(buf, &xprt->addr, bytes); in rpc_peeraddr()
1404 * rpc_peeraddr2str - return remote peer address in printable format
1405 * @clnt: RPC client structure
1417 xprt = rcu_dereference(clnt->cl_xprt); in rpc_peeraddr2str()
1419 if (xprt->address_strings[format] != NULL) in rpc_peeraddr2str()
1420 return xprt->address_strings[format]; in rpc_peeraddr2str()
1441 * Returns zero and fills in "buf" if successful; otherwise, a
1450 err = __sock_create(net, sap->sa_family, in rpc_sockname()
1452 if (err < 0) { in rpc_sockname()
1453 dprintk("RPC: can't create UDP socket (%d)\n", err); in rpc_sockname()
1457 switch (sap->sa_family) { in rpc_sockname()
1469 err = -EAFNOSUPPORT; in rpc_sockname()
1472 if (err < 0) { in rpc_sockname()
1473 dprintk("RPC: can't bind UDP socket (%d)\n", err); in rpc_sockname()
1478 if (err < 0) { in rpc_sockname()
1479 dprintk("RPC: can't connect UDP socket (%d)\n", err); in rpc_sockname()
1484 if (err < 0) { in rpc_sockname()
1485 dprintk("RPC: getsockname failed (%d)\n", err); in rpc_sockname()
1490 if (buf->sa_family == AF_INET6) { in rpc_sockname()
1492 sin6->sin6_scope_id = 0; in rpc_sockname()
1494 dprintk("RPC: %s succeeded\n", __func__); in rpc_sockname()
1507 * Returns zero and fills in "buf" if successful; otherwise, a
1514 if (buflen < sizeof(rpc_inaddr_loopback)) in rpc_anyaddr()
1515 return -EINVAL; in rpc_anyaddr()
1520 if (buflen < sizeof(rpc_in6addr_loopback)) in rpc_anyaddr()
1521 return -EINVAL; in rpc_anyaddr()
1526 dprintk("RPC: %s: address family not supported\n", in rpc_anyaddr()
1528 return -EAFNOSUPPORT; in rpc_anyaddr()
1530 dprintk("RPC: %s: succeeded\n", __func__); in rpc_anyaddr()
1535 * rpc_localaddr - discover local endpoint address for an RPC client
1536 * @clnt: RPC client structure
1540 * Returns zero and fills in "buf" and "buflen" if successful;
1543 * This works even if the underlying transport is not currently connected,
1544 * or if the upper layer never previously provided a source address.
1560 xprt = rcu_dereference(clnt->cl_xprt); in rpc_localaddr()
1561 salen = xprt->addrlen; in rpc_localaddr()
1562 memcpy(sap, &xprt->addr, salen); in rpc_localaddr()
1563 net = get_net(xprt->xprt_net); in rpc_localaddr()
1569 if (err != 0) in rpc_localaddr()
1571 return rpc_anyaddr(sap->sa_family, buf, buflen); in rpc_localaddr()
1582 xprt = rcu_dereference(clnt->cl_xprt); in rpc_setbufsize()
1583 if (xprt->ops->set_buffer_size) in rpc_setbufsize()
1584 xprt->ops->set_buffer_size(xprt, sndsize, rcvsize); in rpc_setbufsize()
1590 * rpc_net_ns - Get the network namespace for this RPC client
1591 * @clnt: RPC client to query
1599 ret = rcu_dereference(clnt->cl_xprt)->xprt_net; in rpc_net_ns()
1606 * rpc_max_payload - Get maximum payload size for a transport, in bytes
1607 * @clnt: RPC client to query
1609 * For stream transports, this is one RPC record fragment (see RFC
1610 * 1831), as we don't support multi-record requests yet. For datagram
1612 * RPC header sizes.
1619 ret = rcu_dereference(clnt->cl_xprt)->max_payload; in rpc_max_payload()
1626 * rpc_max_bc_payload - Get maximum backchannel payload size, in bytes
1627 * @clnt: RPC client to query
1635 xprt = rcu_dereference(clnt->cl_xprt); in rpc_max_bc_payload()
1636 ret = xprt->ops->bc_maxpayload(xprt); in rpc_max_bc_payload()
1648 xprt = rcu_dereference(clnt->cl_xprt); in rpc_num_bc_slots()
1649 ret = xprt->ops->bc_num_slots(xprt); in rpc_num_bc_slots()
1656 * rpc_force_rebind - force transport to check that remote port is unchanged
1662 if (clnt->cl_autobind) { in rpc_force_rebind()
1664 xprt_clear_bound(rcu_dereference(clnt->cl_xprt)); in rpc_force_rebind()
1673 task->tk_status = 0; in __rpc_restart_call()
1674 task->tk_rpc_status = 0; in __rpc_restart_call()
1675 task->tk_action = action; in __rpc_restart_call()
1680 * Restart an (async) RPC call. Usually called from within the
1691 * Restart an (async) RPC call from the call_prepare state.
1697 if (task->tk_ops->rpc_call_prepare != NULL) in rpc_restart_call_prepare()
1706 const struct rpc_procinfo *proc = task->tk_msg.rpc_proc; in rpc_proc_name()
1708 if (proc) { in rpc_proc_name()
1709 if (proc->p_name) in rpc_proc_name()
1710 return proc->p_name; in rpc_proc_name()
1735 * this state is visited exactly once for each RPC.
1740 struct rpc_clnt *clnt = task->tk_client; in call_start()
1741 int idx = task->tk_msg.rpc_proc->p_statidx; in call_start()
1745 if (task->tk_client->cl_shutdown) { in call_start()
1746 rpc_call_rpcerror(task, -EIO); in call_start()
1751 if (clnt->cl_program->version[clnt->cl_vers]) in call_start()
1752 clnt->cl_program->version[clnt->cl_vers]->counts[idx]++; in call_start()
1753 clnt->cl_stats->rpccnt++; in call_start()
1754 task->tk_action = call_reserve; in call_start()
1759 * 1. Reserve an RPC call slot
1764 task->tk_status = 0; in call_reserve()
1765 task->tk_action = call_reserveresult; in call_reserve()
1777 int status = task->tk_status; in call_reserveresult()
1783 task->tk_status = 0; in call_reserveresult()
1784 if (status >= 0) { in call_reserveresult()
1785 if (task->tk_rqstp) { in call_reserveresult()
1786 task->tk_action = call_refresh; in call_reserveresult()
1789 spin_lock(&task->tk_client->cl_lock); in call_reserveresult()
1790 if (list_empty(&task->tk_task)) in call_reserveresult()
1791 list_add_tail(&task->tk_task, &task->tk_client->cl_tasks); in call_reserveresult()
1792 spin_unlock(&task->tk_client->cl_lock); in call_reserveresult()
1795 rpc_call_rpcerror(task, -EIO); in call_reserveresult()
1800 case -ENOMEM: in call_reserveresult()
1803 case -EAGAIN: /* woken up; retry */ in call_reserveresult()
1804 task->tk_action = call_retry_reserve; in call_reserveresult()
1812 * 1c. Retry reserving an RPC call slot
1817 task->tk_status = 0; in call_retry_reserve()
1818 task->tk_action = call_reserveresult; in call_retry_reserve()
1828 task->tk_action = call_refreshresult; in call_refresh()
1829 task->tk_status = 0; in call_refresh()
1830 task->tk_client->cl_stats->rpcauthrefresh++; in call_refresh()
1840 int status = task->tk_status; in call_refreshresult()
1842 task->tk_status = 0; in call_refreshresult()
1843 task->tk_action = call_refresh; in call_refreshresult()
1846 if (rpcauth_uptodatecred(task)) { in call_refreshresult()
1847 task->tk_action = call_allocate; in call_refreshresult()
1850 /* Use rate-limiting and a max number of retries if refresh in call_refreshresult()
1854 case -ETIMEDOUT: in call_refreshresult()
1857 case -EAGAIN: in call_refreshresult()
1858 status = -EACCES; in call_refreshresult()
1859 if (!task->tk_cred_retry) in call_refreshresult()
1861 task->tk_cred_retry--; in call_refreshresult()
1864 case -EKEYEXPIRED: in call_refreshresult()
1866 case -ENOMEM: in call_refreshresult()
1881 const struct rpc_auth *auth = task->tk_rqstp->rq_cred->cr_auth; in call_allocate()
1882 struct rpc_rqst *req = task->tk_rqstp; in call_allocate()
1883 struct rpc_xprt *xprt = req->rq_xprt; in call_allocate()
1884 const struct rpc_procinfo *proc = task->tk_msg.rpc_proc; in call_allocate()
1887 task->tk_status = 0; in call_allocate()
1888 task->tk_action = call_encode; in call_allocate()
1890 if (req->rq_buffer) in call_allocate()
1894 * Calculate the size (in quads) of the RPC call in call_allocate()
1898 req->rq_callsize = RPC_CALLHDRSIZE + (auth->au_cslack << 1) + in call_allocate()
1899 proc->p_arglen; in call_allocate()
1900 req->rq_callsize <<= 2; in call_allocate()
1905 req->rq_rcvsize = RPC_REPHDRSIZE + auth->au_rslack + \ in call_allocate()
1906 max_t(size_t, proc->p_replen, 2); in call_allocate()
1907 req->rq_rcvsize <<= 2; in call_allocate()
1909 status = xprt->ops->buf_alloc(task); in call_allocate()
1911 if (status == 0) in call_allocate()
1913 if (status != -ENOMEM) { in call_allocate()
1918 if (RPC_IS_ASYNC(task) || !fatal_signal_pending(current)) { in call_allocate()
1919 task->tk_action = call_allocate; in call_allocate()
1924 rpc_call_rpcerror(task, -ERESTARTSYS); in call_allocate()
1930 return test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate) == 0 && in rpc_task_need_encode()
1931 (!(task->tk_flags & RPC_TASK_SENT) || in rpc_task_need_encode()
1932 !(task->tk_flags & RPC_TASK_NO_RETRANS_TIMEOUT) || in rpc_task_need_encode()
1939 struct rpc_rqst *req = task->tk_rqstp; in rpc_xdr_encode()
1942 xdr_buf_init(&req->rq_snd_buf, in rpc_xdr_encode()
1943 req->rq_buffer, in rpc_xdr_encode()
1944 req->rq_callsize); in rpc_xdr_encode()
1945 xdr_buf_init(&req->rq_rcv_buf, in rpc_xdr_encode()
1946 req->rq_rbuffer, in rpc_xdr_encode()
1947 req->rq_rcvsize); in rpc_xdr_encode()
1949 req->rq_reply_bytes_recvd = 0; in rpc_xdr_encode()
1950 req->rq_snd_buf.head[0].iov_len = 0; in rpc_xdr_encode()
1951 xdr_init_encode(&xdr, &req->rq_snd_buf, in rpc_xdr_encode()
1952 req->rq_snd_buf.head[0].iov_base, req); in rpc_xdr_encode()
1953 if (rpc_encode_header(task, &xdr)) in rpc_xdr_encode()
1956 task->tk_status = rpcauth_wrap_req(task, &xdr); in rpc_xdr_encode()
1960 * 3. Encode arguments of an RPC call
1965 if (!rpc_task_need_encode(task)) in call_encode()
1973 if (task->tk_status == 0 && rpc_reply_expected(task)) in call_encode()
1974 task->tk_status = xprt_request_enqueue_receive(task); in call_encode()
1976 if (task->tk_status != 0) { in call_encode()
1978 switch (task->tk_status) { in call_encode()
1979 case -EAGAIN: in call_encode()
1980 case -ENOMEM: in call_encode()
1983 case -EKEYEXPIRED: in call_encode()
1984 if (!task->tk_cred_retry) { in call_encode()
1985 rpc_call_rpcerror(task, task->tk_status); in call_encode()
1987 task->tk_action = call_refresh; in call_encode()
1988 task->tk_cred_retry--; in call_encode()
1993 rpc_call_rpcerror(task, task->tk_status); in call_encode()
2000 task->tk_action = call_transmit; in call_encode()
2002 if (!xprt_bound(task->tk_xprt)) in call_encode()
2003 task->tk_action = call_bind; in call_encode()
2004 else if (!xprt_connected(task->tk_xprt)) in call_encode()
2005 task->tk_action = call_connect; in call_encode()
2009 * Helpers to check if the task was already transmitted, and
2015 return !test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate); in rpc_task_transmitted()
2022 task->tk_action = call_transmit_status; in rpc_task_handle_transmitted()
2026 * 4. Get the server port number if not yet set
2031 struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; in call_bind()
2033 if (rpc_task_transmitted(task)) { in call_bind()
2038 if (xprt_bound(xprt)) { in call_bind()
2039 task->tk_action = call_connect; in call_bind()
2043 task->tk_action = call_bind_status; in call_bind()
2044 if (!xprt_prepare_transmit(task)) in call_bind()
2047 xprt->ops->rpcbind(task); in call_bind()
2056 struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; in call_bind_status()
2057 int status = -EIO; in call_bind_status()
2059 if (rpc_task_transmitted(task)) { in call_bind_status()
2064 if (task->tk_status >= 0) in call_bind_status()
2066 if (xprt_bound(xprt)) { in call_bind_status()
2067 task->tk_status = 0; in call_bind_status()
2071 switch (task->tk_status) { in call_bind_status()
2072 case -ENOMEM: in call_bind_status()
2075 case -EACCES: in call_bind_status()
2077 /* fail immediately if this is an RPC ping */ in call_bind_status()
2078 if (task->tk_msg.rpc_proc->p_proc == 0) { in call_bind_status()
2079 status = -EOPNOTSUPP; in call_bind_status()
2084 case -ENOBUFS: in call_bind_status()
2087 case -EAGAIN: in call_bind_status()
2089 case -ETIMEDOUT: in call_bind_status()
2092 case -EPFNOSUPPORT: in call_bind_status()
2096 case -EPROTONOSUPPORT: in call_bind_status()
2099 case -ENETDOWN: in call_bind_status()
2100 case -ENETUNREACH: in call_bind_status()
2101 if (task->tk_flags & RPC_TASK_NETUNREACH_FATAL) in call_bind_status()
2104 case -ECONNREFUSED: /* connection problems */ in call_bind_status()
2105 case -ECONNRESET: in call_bind_status()
2106 case -ECONNABORTED: in call_bind_status()
2107 case -ENOTCONN: in call_bind_status()
2108 case -EHOSTDOWN: in call_bind_status()
2109 case -EHOSTUNREACH: in call_bind_status()
2110 case -EPIPE: in call_bind_status()
2112 if (!RPC_IS_SOFTCONN(task)) { in call_bind_status()
2116 status = task->tk_status; in call_bind_status()
2125 task->tk_action = call_connect; in call_bind_status()
2128 task->tk_status = 0; in call_bind_status()
2129 task->tk_action = call_bind; in call_bind_status()
2134 * 4b. Connect to the RPC server
2139 struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; in call_connect()
2141 if (rpc_task_transmitted(task)) { in call_connect()
2146 if (xprt_connected(xprt)) { in call_connect()
2147 task->tk_action = call_transmit; in call_connect()
2151 task->tk_action = call_connect_status; in call_connect()
2152 if (task->tk_status < 0) in call_connect()
2154 if (task->tk_flags & RPC_TASK_NOCONNECT) { in call_connect()
2155 rpc_call_rpcerror(task, -ENOTCONN); in call_connect()
2158 if (!xprt_prepare_transmit(task)) in call_connect()
2169 struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; in call_connect_status()
2170 struct rpc_clnt *clnt = task->tk_client; in call_connect_status()
2171 int status = task->tk_status; in call_connect_status()
2173 if (rpc_task_transmitted(task)) { in call_connect_status()
2180 if (task->tk_status == 0) { in call_connect_status()
2181 clnt->cl_stats->netreconn++; in call_connect_status()
2184 if (xprt_connected(xprt)) { in call_connect_status()
2185 task->tk_status = 0; in call_connect_status()
2189 task->tk_status = 0; in call_connect_status()
2191 case -ENETDOWN: in call_connect_status()
2192 case -ENETUNREACH: in call_connect_status()
2193 if (task->tk_flags & RPC_TASK_NETUNREACH_FATAL) in call_connect_status()
2196 case -ECONNREFUSED: in call_connect_status()
2197 case -ECONNRESET: in call_connect_status()
2199 if (clnt->cl_autobind) { in call_connect_status()
2201 if (RPC_IS_SOFTCONN(task)) in call_connect_status()
2206 case -ECONNABORTED: in call_connect_status()
2207 case -EHOSTUNREACH: in call_connect_status()
2208 case -EPIPE: in call_connect_status()
2209 case -EPROTO: in call_connect_status()
2210 xprt_conditional_disconnect(task->tk_rqstp->rq_xprt, in call_connect_status()
2211 task->tk_rqstp->rq_connect_cookie); in call_connect_status()
2212 if (RPC_IS_SOFTCONN(task)) in call_connect_status()
2217 case -EADDRINUSE: in call_connect_status()
2218 case -ENOTCONN: in call_connect_status()
2219 case -EAGAIN: in call_connect_status()
2220 case -ETIMEDOUT: in call_connect_status()
2221 if (!(task->tk_flags & RPC_TASK_NO_ROUND_ROBIN) && in call_connect_status()
2222 (task->tk_flags & RPC_TASK_MOVEABLE) && in call_connect_status()
2223 test_bit(XPRT_REMOVE, &xprt->state)) { in call_connect_status()
2224 struct rpc_xprt *saved = task->tk_xprt; in call_connect_status()
2228 if (xps->xps_nxprts > 1) { in call_connect_status()
2232 value = atomic_long_dec_return(&xprt->queuelen); in call_connect_status()
2233 if (value == 0) in call_connect_status()
2237 task->tk_xprt = NULL; in call_connect_status()
2238 task->tk_action = call_start; in call_connect_status()
2241 if (!task->tk_xprt) in call_connect_status()
2245 case -ENOBUFS: in call_connect_status()
2252 task->tk_action = call_transmit; in call_connect_status()
2256 task->tk_action = call_bind; in call_connect_status()
2262 * 5. Transmit the RPC request, and wait for reply
2267 if (rpc_task_transmitted(task)) { in call_transmit()
2272 task->tk_action = call_transmit_status; in call_transmit()
2273 if (!xprt_prepare_transmit(task)) in call_transmit()
2275 task->tk_status = 0; in call_transmit()
2276 if (test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) { in call_transmit()
2277 if (!xprt_connected(task->tk_xprt)) { in call_transmit()
2278 task->tk_status = -ENOTCONN; in call_transmit()
2292 task->tk_action = call_status; in call_transmit_status()
2298 if (rpc_task_transmitted(task)) { in call_transmit_status()
2299 task->tk_status = 0; in call_transmit_status()
2304 switch (task->tk_status) { in call_transmit_status()
2307 case -EBADMSG: in call_transmit_status()
2308 task->tk_status = 0; in call_transmit_status()
2309 task->tk_action = call_encode; in call_transmit_status()
2312 * Special cases: if we've been waiting on the in call_transmit_status()
2313 * socket's write_space() callback, or if the in call_transmit_status()
2317 case -ENOMEM: in call_transmit_status()
2318 case -ENOBUFS: in call_transmit_status()
2321 case -EBADSLT: in call_transmit_status()
2322 case -EAGAIN: in call_transmit_status()
2323 task->tk_action = call_transmit; in call_transmit_status()
2324 task->tk_status = 0; in call_transmit_status()
2326 case -EHOSTDOWN: in call_transmit_status()
2327 case -ENETDOWN: in call_transmit_status()
2328 case -EHOSTUNREACH: in call_transmit_status()
2329 case -ENETUNREACH: in call_transmit_status()
2330 case -EPERM: in call_transmit_status()
2332 case -ECONNREFUSED: in call_transmit_status()
2333 if (RPC_IS_SOFTCONN(task)) { in call_transmit_status()
2334 if (!task->tk_msg.rpc_proc->p_proc) in call_transmit_status()
2335 trace_xprt_ping(task->tk_xprt, in call_transmit_status()
2336 task->tk_status); in call_transmit_status()
2337 rpc_call_rpcerror(task, task->tk_status); in call_transmit_status()
2341 case -ECONNRESET: in call_transmit_status()
2342 case -ECONNABORTED: in call_transmit_status()
2343 case -EADDRINUSE: in call_transmit_status()
2344 case -ENOTCONN: in call_transmit_status()
2345 case -EPIPE: in call_transmit_status()
2346 task->tk_action = call_bind; in call_transmit_status()
2347 task->tk_status = 0; in call_transmit_status()
2353 #if defined(CONFIG_SUNRPC_BACKCHANNEL)
2361 task->tk_action = call_bc_transmit; in call_bc_encode()
2365 * 5b. Send the backchannel RPC reply. On error, drop the reply. In
2371 task->tk_action = call_bc_transmit_status; in call_bc_transmit()
2372 if (test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) { in call_bc_transmit()
2373 if (!xprt_prepare_transmit(task)) in call_bc_transmit()
2375 task->tk_status = 0; in call_bc_transmit()
2384 struct rpc_rqst *req = task->tk_rqstp; in call_bc_transmit_status()
2386 if (rpc_task_transmitted(task)) in call_bc_transmit_status()
2387 task->tk_status = 0; in call_bc_transmit_status()
2389 switch (task->tk_status) { in call_bc_transmit_status()
2392 case -ENETDOWN: in call_bc_transmit_status()
2393 case -EHOSTDOWN: in call_bc_transmit_status()
2394 case -EHOSTUNREACH: in call_bc_transmit_status()
2395 case -ENETUNREACH: in call_bc_transmit_status()
2396 case -ECONNRESET: in call_bc_transmit_status()
2397 case -ECONNREFUSED: in call_bc_transmit_status()
2398 case -EADDRINUSE: in call_bc_transmit_status()
2399 case -ENOTCONN: in call_bc_transmit_status()
2400 case -EPIPE: in call_bc_transmit_status()
2402 case -ENOMEM: in call_bc_transmit_status()
2403 case -ENOBUFS: in call_bc_transmit_status()
2406 case -EBADSLT: in call_bc_transmit_status()
2407 case -EAGAIN: in call_bc_transmit_status()
2408 task->tk_status = 0; in call_bc_transmit_status()
2409 task->tk_action = call_bc_transmit; in call_bc_transmit_status()
2411 case -ETIMEDOUT: in call_bc_transmit_status()
2419 printk(KERN_NOTICE "RPC: Could not send backchannel reply " in call_bc_transmit_status()
2420 "error: %d\n", task->tk_status); in call_bc_transmit_status()
2421 xprt_conditional_disconnect(req->rq_xprt, in call_bc_transmit_status()
2422 req->rq_connect_cookie); in call_bc_transmit_status()
2429 printk(KERN_NOTICE "RPC: Could not send backchannel reply " in call_bc_transmit_status()
2430 "error: %d\n", task->tk_status); in call_bc_transmit_status()
2433 task->tk_action = rpc_exit_task; in call_bc_transmit_status()
2438 * 6. Sort out the RPC call status
2443 struct rpc_clnt *clnt = task->tk_client; in call_status()
2446 if (!task->tk_msg.rpc_proc->p_proc) in call_status()
2447 trace_xprt_ping(task->tk_xprt, task->tk_status); in call_status()
2449 status = task->tk_status; in call_status()
2450 if (status >= 0) { in call_status()
2451 task->tk_action = call_decode; in call_status()
2456 task->tk_status = 0; in call_status()
2458 case -ENETDOWN: in call_status()
2459 case -ENETUNREACH: in call_status()
2460 if (task->tk_flags & RPC_TASK_NETUNREACH_FATAL) in call_status()
2463 case -EHOSTDOWN: in call_status()
2464 case -EHOSTUNREACH: in call_status()
2465 case -EPERM: in call_status()
2466 if (RPC_IS_SOFTCONN(task)) in call_status()
2469 * Delay any retries for 3 seconds, then handle as if it in call_status()
2474 case -ETIMEDOUT: in call_status()
2476 case -ECONNREFUSED: in call_status()
2477 case -ECONNRESET: in call_status()
2478 case -ECONNABORTED: in call_status()
2479 case -ENOTCONN: in call_status()
2482 case -EADDRINUSE: in call_status()
2485 case -EPIPE: in call_status()
2486 case -EAGAIN: in call_status()
2488 case -ENFILE: in call_status()
2489 case -ENOBUFS: in call_status()
2490 case -ENOMEM: in call_status()
2493 case -EIO: in call_status()
2497 if (clnt->cl_chatty) in call_status()
2498 printk("%s: RPC call returned error %d\n", in call_status()
2499 clnt->cl_program->name, -status); in call_status()
2502 task->tk_action = call_encode; in call_status()
2513 if (!req || !req->rq_xprt) in rpc_check_connected()
2515 return xprt_connected(req->rq_xprt); in rpc_check_connected()
2521 struct rpc_clnt *clnt = task->tk_client; in rpc_check_timeout()
2523 if (RPC_SIGNALLED(task)) in rpc_check_timeout()
2526 if (xprt_adjust_timeout(task->tk_rqstp) == 0) in rpc_check_timeout()
2530 task->tk_timeouts++; in rpc_check_timeout()
2532 if (RPC_IS_SOFTCONN(task) && !rpc_check_connected(task->tk_rqstp)) { in rpc_check_timeout()
2533 rpc_call_rpcerror(task, -ETIMEDOUT); in rpc_check_timeout()
2537 if (RPC_IS_SOFT(task)) { in rpc_check_timeout()
2540 * been sent, it should time out only if the transport in rpc_check_timeout()
2543 if ((task->tk_flags & RPC_TASK_NO_RETRANS_TIMEOUT) && in rpc_check_timeout()
2544 rpc_check_connected(task->tk_rqstp)) in rpc_check_timeout()
2547 if (clnt->cl_chatty) { in rpc_check_timeout()
2550 clnt->cl_program->name, in rpc_check_timeout()
2551 task->tk_xprt->servername); in rpc_check_timeout()
2553 if (task->tk_flags & RPC_TASK_TIMEOUT) in rpc_check_timeout()
2554 rpc_call_rpcerror(task, -ETIMEDOUT); in rpc_check_timeout()
2556 __rpc_call_rpcerror(task, -EIO, -ETIMEDOUT); in rpc_check_timeout()
2560 if (!(task->tk_flags & RPC_CALL_MAJORSEEN)) { in rpc_check_timeout()
2561 task->tk_flags |= RPC_CALL_MAJORSEEN; in rpc_check_timeout()
2562 if (clnt->cl_chatty) { in rpc_check_timeout()
2565 clnt->cl_program->name, in rpc_check_timeout()
2566 task->tk_xprt->servername); in rpc_check_timeout()
2571 * Did our request time out due to an RPCSEC_GSS out-of-sequence in rpc_check_timeout()
2578 * 7. Decode the RPC reply
2583 struct rpc_clnt *clnt = task->tk_client; in call_decode()
2584 struct rpc_rqst *req = task->tk_rqstp; in call_decode()
2588 if (!task->tk_msg.rpc_proc->p_decode) { in call_decode()
2589 task->tk_action = rpc_exit_task; in call_decode()
2593 if (task->tk_flags & RPC_CALL_MAJORSEEN) { in call_decode()
2594 if (clnt->cl_chatty) { in call_decode()
2596 clnt->cl_program->name, in call_decode()
2597 task->tk_xprt->servername); in call_decode()
2599 task->tk_flags &= ~RPC_CALL_MAJORSEEN; in call_decode()
2603 * Did we ever call xprt_complete_rqst()? If not, we should assume in call_decode()
2606 err = -EAGAIN; in call_decode()
2607 if (!req->rq_reply_bytes_recvd) in call_decode()
2611 * before it changed req->rq_reply_bytes_recvd. in call_decode()
2615 req->rq_rcv_buf.len = req->rq_private_buf.len; in call_decode()
2616 trace_rpc_xdr_recvfrom(task, &req->rq_rcv_buf); in call_decode()
2619 WARN_ON(memcmp(&req->rq_rcv_buf, &req->rq_private_buf, in call_decode()
2620 sizeof(req->rq_rcv_buf)) != 0); in call_decode()
2622 xdr_init_decode(&xdr, &req->rq_rcv_buf, in call_decode()
2623 req->rq_rcv_buf.head[0].iov_base, req); in call_decode()
2628 task->tk_action = rpc_exit_task; in call_decode()
2629 task->tk_status = rpcauth_unwrap_resp(task, &xdr); in call_decode()
2632 case -EAGAIN: in call_decode()
2633 task->tk_status = 0; in call_decode()
2634 if (task->tk_client->cl_discrtry) in call_decode()
2635 xprt_conditional_disconnect(req->rq_xprt, in call_decode()
2636 req->rq_connect_cookie); in call_decode()
2637 task->tk_action = call_encode; in call_decode()
2640 case -EKEYREJECTED: in call_decode()
2641 task->tk_action = call_reserve; in call_decode()
2644 /* Ensure we obtain a new XID if we retry! */ in call_decode()
2652 struct rpc_clnt *clnt = task->tk_client; in rpc_encode_header()
2653 struct rpc_rqst *req = task->tk_rqstp; in rpc_encode_header()
2657 error = -EMSGSIZE; in rpc_encode_header()
2659 if (!p) in rpc_encode_header()
2661 *p++ = req->rq_xid; in rpc_encode_header()
2664 *p++ = cpu_to_be32(clnt->cl_prog); in rpc_encode_header()
2665 *p++ = cpu_to_be32(clnt->cl_vers); in rpc_encode_header()
2666 *p = cpu_to_be32(task->tk_msg.rpc_proc->p_proc); in rpc_encode_header()
2669 if (error < 0) in rpc_encode_header()
2681 struct rpc_clnt *clnt = task->tk_client; in rpc_decode_header()
2685 /* RFC-1014 says that the representation of XDR data must be a in rpc_decode_header()
2687 * - if it isn't pointer subtraction in the NFS client may give in rpc_decode_header()
2690 if (task->tk_rqstp->rq_rcv_buf.len & 3) in rpc_decode_header()
2694 if (!p) in rpc_decode_header()
2697 if (*p++ != rpc_reply) in rpc_decode_header()
2699 if (*p++ != rpc_msg_accepted) in rpc_decode_header()
2703 if (error) { in rpc_decode_header()
2704 struct rpc_cred *cred = task->tk_rqstp->rq_cred; in rpc_decode_header()
2706 if (!test_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags)) { in rpc_decode_header()
2708 if (!task->tk_cred_retry) in rpc_decode_header()
2710 task->tk_cred_retry--; in rpc_decode_header()
2712 return -EKEYREJECTED; in rpc_decode_header()
2718 if (!p) in rpc_decode_header()
2725 error = -EPFNOSUPPORT; in rpc_decode_header()
2729 error = -EPROTONOSUPPORT; in rpc_decode_header()
2733 error = -EOPNOTSUPP; in rpc_decode_header()
2738 error = -EIO; in rpc_decode_header()
2745 clnt->cl_stats->rpcgarbage++; in rpc_decode_header()
2746 if (task->tk_garb_retry) { in rpc_decode_header()
2747 task->tk_garb_retry--; in rpc_decode_header()
2748 task->tk_action = call_encode; in rpc_decode_header()
2749 return -EAGAIN; in rpc_decode_header()
2757 error = -EIO; in rpc_decode_header()
2763 case -EPROTONOSUPPORT: in rpc_decode_header()
2765 case -EACCES: in rpc_decode_header()
2766 /* possible RPCSEC_GSS out-of-sequence event (RFC2203), in rpc_decode_header()
2769 task->tk_rqstp->rq_reply_bytes_recvd = 0; in rpc_decode_header()
2770 task->tk_status = xprt_request_enqueue_receive(task); in rpc_decode_header()
2771 task->tk_action = call_transmit_status; in rpc_decode_header()
2772 return -EBADMSG; in rpc_decode_header()
2778 error = -EACCES; in rpc_decode_header()
2780 if (!p) in rpc_decode_header()
2787 error = -EPROTONOSUPPORT; in rpc_decode_header()
2794 if (!p) in rpc_decode_header()
2802 if (!task->tk_cred_retry) in rpc_decode_header()
2804 task->tk_cred_retry--; in rpc_decode_header()
2806 return -EKEYREJECTED; in rpc_decode_header()
2810 if (!task->tk_garb_retry) in rpc_decode_header()
2812 task->tk_garb_retry--; in rpc_decode_header()
2814 task->tk_action = call_encode; in rpc_decode_header()
2815 return -EAGAIN; in rpc_decode_header()
2818 pr_warn("RPC: server %s requires stronger authentication.\n", in rpc_decode_header()
2819 task->tk_xprt->servername); in rpc_decode_header()
2850 task->tk_flags &= ~RPC_TASK_NO_RETRANS_TIMEOUT; in rpc_null_call_prepare()
2892 if (clnt->cl_auth->au_ops->ping) in rpc_ping()
2893 return clnt->cl_auth->au_ops->ping(clnt); in rpc_ping()
2896 if (IS_ERR(task)) in rpc_ping()
2898 status = task->tk_status; in rpc_ping()
2918 if (IS_ERR(task)) in rpc_ping_noreply()
2920 status = task->tk_status; in rpc_ping_noreply()
2934 if (task->tk_status == 0) in rpc_cb_add_xprt_done()
2935 rpc_xprt_switch_add_xprt(data->xps, data->xprt); in rpc_cb_add_xprt_done()
2942 xprt_put(data->xprt); in rpc_cb_add_xprt_release()
2943 xprt_switch_put(data->xps); in rpc_cb_add_xprt_release()
2954 * rpc_clnt_test_and_add_xprt - Test and add a new transport to a rpc_clnt
2966 int max_connect = clnt->cl_max_connect; in rpc_clnt_test_and_add_xprt()
2968 if (in_max_connect) in rpc_clnt_test_and_add_xprt()
2970 if (xps->xps_nunique_destaddr_xprts + 1 > max_connect) { in rpc_clnt_test_and_add_xprt()
2976 return -EINVAL; in rpc_clnt_test_and_add_xprt()
2980 if (!data) in rpc_clnt_test_and_add_xprt()
2981 return -ENOMEM; in rpc_clnt_test_and_add_xprt()
2982 data->xps = xprt_switch_get(xps); in rpc_clnt_test_and_add_xprt()
2983 data->xprt = xprt_get(xprt); in rpc_clnt_test_and_add_xprt()
2984 if (rpc_xprt_switch_has_addr(data->xps, (struct sockaddr *)&xprt->addr)) { in rpc_clnt_test_and_add_xprt()
2991 if (IS_ERR(task)) in rpc_clnt_test_and_add_xprt()
2994 data->xps->xps_nunique_destaddr_xprts++; in rpc_clnt_test_and_add_xprt()
3006 int status = -EADDRINUSE; in rpc_clnt_add_xprt_helper()
3010 if (IS_ERR(task)) in rpc_clnt_add_xprt_helper()
3013 status = task->tk_status; in rpc_clnt_add_xprt_helper()
3016 if (status < 0) in rpc_clnt_add_xprt_helper()
3020 data->add_xprt_test(clnt, xprt, data->data); in rpc_clnt_add_xprt_helper()
3048 int status = -EADDRINUSE; in rpc_clnt_setup_test_and_add_xprt()
3053 if (rpc_xprt_switch_has_addr(xps, (struct sockaddr *)&xprt->addr)) in rpc_clnt_setup_test_and_add_xprt()
3057 if (status < 0) in rpc_clnt_setup_test_and_add_xprt()
3064 if (status < 0) in rpc_clnt_setup_test_and_add_xprt()
3065 pr_info("RPC: rpc_clnt_test_xprt failed: %d addr %s not " in rpc_clnt_setup_test_and_add_xprt()
3067 xprt->address_strings[RPC_DISPLAY_ADDR]); in rpc_clnt_setup_test_and_add_xprt()
3074 * rpc_clnt_add_xprt - Add a new transport to a rpc_clnt
3082 * If ping is set, then test that connectivity succeeds before
3102 xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch)); in rpc_clnt_add_xprt()
3103 xprt = xprt_iter_xprt(&clnt->cl_xpi); in rpc_clnt_add_xprt()
3104 if (xps == NULL || xprt == NULL) { in rpc_clnt_add_xprt()
3107 return -EAGAIN; in rpc_clnt_add_xprt()
3109 resvport = xprt->resvport; in rpc_clnt_add_xprt()
3110 reuseport = xprt->reuseport; in rpc_clnt_add_xprt()
3111 connect_timeout = xprt->connect_timeout; in rpc_clnt_add_xprt()
3112 reconnect_timeout = xprt->max_reconnect_timeout; in rpc_clnt_add_xprt()
3113 ident = xprt->xprt_class->ident; in rpc_clnt_add_xprt()
3116 if (!xprtargs->ident) in rpc_clnt_add_xprt()
3117 xprtargs->ident = ident; in rpc_clnt_add_xprt()
3118 xprtargs->xprtsec = clnt->cl_xprtsec; in rpc_clnt_add_xprt()
3120 if (IS_ERR(xprt)) { in rpc_clnt_add_xprt()
3124 xprt->resvport = resvport; in rpc_clnt_add_xprt()
3125 xprt->reuseport = reuseport; in rpc_clnt_add_xprt()
3127 if (xprtargs->connect_timeout) in rpc_clnt_add_xprt()
3128 connect_timeout = xprtargs->connect_timeout; in rpc_clnt_add_xprt()
3129 if (xprtargs->reconnect_timeout) in rpc_clnt_add_xprt()
3130 reconnect_timeout = xprtargs->reconnect_timeout; in rpc_clnt_add_xprt()
3131 if (xprt->ops->set_connect_timeout != NULL) in rpc_clnt_add_xprt()
3132 xprt->ops->set_connect_timeout(xprt, in rpc_clnt_add_xprt()
3137 if (setup) { in rpc_clnt_add_xprt()
3139 if (ret != 0) in rpc_clnt_add_xprt()
3161 main_xprt = xprt_get(rcu_dereference(clnt->cl_xprt)); in rpc_xprt_probe_trunked()
3162 status = rpc_cmp_addr_port((struct sockaddr *)&xprt->addr, in rpc_xprt_probe_trunked()
3163 (struct sockaddr *)&main_xprt->addr); in rpc_xprt_probe_trunked()
3166 if (status || !test_bit(XPRT_OFFLINE, &xprt->state)) in rpc_xprt_probe_trunked()
3175 /* rpc_clnt_probe_trunked_xprt -- probe offlined transport for session trunking
3179 * the function rpc_xprt_probe_trunked() which will determine if this
3189 if (ret) in rpc_clnt_probe_trunked_xprts()
3194 if (!xprt) in rpc_clnt_probe_trunked_xprts()
3198 if (ret < 0) in rpc_clnt_probe_trunked_xprts()
3217 main_xprt = xprt_get(rcu_dereference(clnt->cl_xprt)); in rpc_xprt_offline()
3218 xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch)); in rpc_xprt_offline()
3219 err = rpc_cmp_addr_port((struct sockaddr *)&xprt->addr, in rpc_xprt_offline()
3220 (struct sockaddr *)&main_xprt->addr); in rpc_xprt_offline()
3223 if (err) in rpc_xprt_offline()
3226 if (wait_on_bit_lock(&xprt->state, XPRT_LOCKED, TASK_KILLABLE)) { in rpc_xprt_offline()
3227 err = -EINTR; in rpc_xprt_offline()
3239 /* rpc_clnt_manage_trunked_xprts -- offline trunked transports
3264 if (xprt->ops->set_connect_timeout) in rpc_xprt_set_connect_timeout()
3265 xprt->ops->set_connect_timeout(xprt, in rpc_xprt_set_connect_timeout()
3266 timeo->connect_timeout, in rpc_xprt_set_connect_timeout()
3267 timeo->reconnect_timeout); in rpc_xprt_set_connect_timeout()
3299 if (rpc_clnt_xprt_switch_has_addr(clnt, in rpc_clnt_xprt_switch_add_xprt()
3300 (const struct sockaddr *)&xprt->addr)) { in rpc_clnt_xprt_switch_add_xprt()
3315 xps = rcu_dereference(clnt->cl_xpi.xpi_xpswitch); in rpc_clnt_xprt_switch_remove_xprt()
3316 rpc_xprt_switch_remove_xprt(rcu_dereference(clnt->cl_xpi.xpi_xpswitch), in rpc_clnt_xprt_switch_remove_xprt()
3318 xps->xps_nunique_destaddr_xprts--; in rpc_clnt_xprt_switch_remove_xprt()
3330 xps = rcu_dereference(clnt->cl_xpi.xpi_xpswitch); in rpc_clnt_xprt_switch_has_addr()
3337 #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
3340 printk(KERN_INFO "clnt[%pISpc] RPC tasks[%d]\n", in rpc_show_header()
3341 (struct sockaddr *)&clnt->cl_xprt->addr, in rpc_show_header()
3342 atomic_read(&clnt->cl_task_count)); in rpc_show_header()
3343 printk(KERN_INFO "-pid- flgs status -client- --rqstp- " in rpc_show_header()
3344 "-timeout ---ops--\n"); in rpc_show_header()
3352 if (RPC_IS_QUEUED(task)) in rpc_show_task()
3353 rpc_waitq = rpc_qname(task->tk_waitqueue); in rpc_show_task()
3356 task->tk_pid, task->tk_flags, task->tk_status, in rpc_show_task()
3357 clnt, task->tk_rqstp, rpc_task_timeout(task), task->tk_ops, in rpc_show_task()
3358 clnt->cl_program->name, clnt->cl_vers, rpc_proc_name(task), in rpc_show_task()
3359 task->tk_action, rpc_waitq); in rpc_show_task()
3369 spin_lock(&sn->rpc_client_lock); in rpc_show_tasks()
3370 list_for_each_entry(clnt, &sn->all_clients, cl_clients) { in rpc_show_tasks()
3371 spin_lock(&clnt->cl_lock); in rpc_show_tasks()
3372 list_for_each_entry(task, &clnt->cl_tasks, tk_task) { in rpc_show_tasks()
3373 if (!header) { in rpc_show_tasks()
3379 spin_unlock(&clnt->cl_lock); in rpc_show_tasks()
3381 spin_unlock(&sn->rpc_client_lock); in rpc_show_tasks()
3385 #if IS_ENABLED(CONFIG_SUNRPC_SWAP)
3397 while (clnt != clnt->cl_parent) in rpc_clnt_swap_activate()
3398 clnt = clnt->cl_parent; in rpc_clnt_swap_activate()
3399 if (atomic_inc_return(&clnt->cl_swapper) == 1) in rpc_clnt_swap_activate()
3418 while (clnt != clnt->cl_parent) in rpc_clnt_swap_deactivate()
3419 clnt = clnt->cl_parent; in rpc_clnt_swap_deactivate()
3420 if (atomic_dec_if_positive(&clnt->cl_swapper) == 0) in rpc_clnt_swap_deactivate()