clnt.c 68.1 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2
 *  linux/net/sunrpc/clnt.c
L
Linus Torvalds 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
 *
 *  This file contains the high-level RPC interface.
 *  It is modeled as a finite state machine to support both synchronous
 *  and asynchronous requests.
 *
 *  -	RPC header generation and argument serialization.
 *  -	Credential refresh.
 *  -	TCP connect handling.
 *  -	Retry of operation when it is suspected the operation failed because
 *	of uid squashing on the server, or when the credentials were stale
 *	and need to be refreshed, or when a packet was damaged in transit.
 *	This may be have to be moved to the VFS layer.
 *
 *  Copyright (C) 1992,1993 Rick Sladkey <jrs@world.std.com>
 *  Copyright (C) 1995,1996 Olaf Kirch <okir@monad.swb.de>
 */


#include <linux/module.h>
#include <linux/types.h>
23
#include <linux/kallsyms.h>
L
Linus Torvalds 已提交
24
#include <linux/mm.h>
25 26
#include <linux/namei.h>
#include <linux/mount.h>
L
Linus Torvalds 已提交
27
#include <linux/slab.h>
28
#include <linux/rcupdate.h>
L
Linus Torvalds 已提交
29
#include <linux/utsname.h>
30
#include <linux/workqueue.h>
31
#include <linux/in.h>
32
#include <linux/in6.h>
33
#include <linux/un.h>
L
Linus Torvalds 已提交
34 35

#include <linux/sunrpc/clnt.h>
36
#include <linux/sunrpc/addr.h>
L
Linus Torvalds 已提交
37
#include <linux/sunrpc/rpc_pipe_fs.h>
38
#include <linux/sunrpc/metrics.h>
39
#include <linux/sunrpc/bc_xprt.h>
40
#include <trace/events/sunrpc.h>
L
Linus Torvalds 已提交
41

42
#include "sunrpc.h"
43
#include "netns.h"
L
Linus Torvalds 已提交
44

J
Jeff Layton 已提交
45
#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
L
Linus Torvalds 已提交
46 47 48
# define RPCDBG_FACILITY	RPCDBG_CALL
#endif

49 50
#define dprint_status(t)					\
	dprintk("RPC: %5u %s (status %d)\n", t->tk_pid,		\
51
			__func__, t->tk_status)
52

53 54 55 56
/*
 * All RPC clients are linked into this list
 */

L
Linus Torvalds 已提交
57 58 59 60 61 62 63
static DECLARE_WAIT_QUEUE_HEAD(destroy_wait);


static void	call_start(struct rpc_task *task);
static void	call_reserve(struct rpc_task *task);
static void	call_reserveresult(struct rpc_task *task);
static void	call_allocate(struct rpc_task *task);
64
static void	call_encode(struct rpc_task *task);
L
Linus Torvalds 已提交
65 66
static void	call_decode(struct rpc_task *task);
static void	call_bind(struct rpc_task *task);
67
static void	call_bind_status(struct rpc_task *task);
L
Linus Torvalds 已提交
68
static void	call_transmit(struct rpc_task *task);
69
#if defined(CONFIG_SUNRPC_BACKCHANNEL)
70
static void	call_bc_transmit(struct rpc_task *task);
71
#endif /* CONFIG_SUNRPC_BACKCHANNEL */
L
Linus Torvalds 已提交
72
static void	call_status(struct rpc_task *task);
73
static void	call_transmit_status(struct rpc_task *task);
L
Linus Torvalds 已提交
74 75 76 77 78 79
static void	call_refresh(struct rpc_task *task);
static void	call_refreshresult(struct rpc_task *task);
static void	call_timeout(struct rpc_task *task);
static void	call_connect(struct rpc_task *task);
static void	call_connect_status(struct rpc_task *task);

80 81
static int	rpc_encode_header(struct rpc_task *task,
				  struct xdr_stream *xdr);
82 83
static int	rpc_decode_header(struct rpc_task *task,
				  struct xdr_stream *xdr);
84
static int	rpc_ping(struct rpc_clnt *clnt);
T
Trond Myklebust 已提交
85

86 87
static void rpc_register_client(struct rpc_clnt *clnt)
{
88 89
	struct net *net = rpc_net_ns(clnt);
	struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
90 91 92 93

	spin_lock(&sn->rpc_client_lock);
	list_add(&clnt->cl_clients, &sn->all_clients);
	spin_unlock(&sn->rpc_client_lock);
94 95 96 97
}

static void rpc_unregister_client(struct rpc_clnt *clnt)
{
98 99
	struct net *net = rpc_net_ns(clnt);
	struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
100 101

	spin_lock(&sn->rpc_client_lock);
102
	list_del(&clnt->cl_clients);
103
	spin_unlock(&sn->rpc_client_lock);
104
}
L
Linus Torvalds 已提交
105

106 107
static void __rpc_clnt_remove_pipedir(struct rpc_clnt *clnt)
{
108
	rpc_remove_client_dir(clnt);
109 110 111 112
}

static void rpc_clnt_remove_pipedir(struct rpc_clnt *clnt)
{
113
	struct net *net = rpc_net_ns(clnt);
114 115
	struct super_block *pipefs_sb;

116
	pipefs_sb = rpc_get_sb_net(net);
117 118
	if (pipefs_sb) {
		__rpc_clnt_remove_pipedir(clnt);
119
		rpc_put_sb_net(net);
120 121 122 123
	}
}

static struct dentry *rpc_setup_pipedir_sb(struct super_block *sb,
124
				    struct rpc_clnt *clnt)
L
Linus Torvalds 已提交
125
{
126
	static uint32_t clntid;
127
	const char *dir_name = clnt->cl_program->pipe_dir_name;
128
	char name[15];
129
	struct dentry *dir, *dentry;
L
Linus Torvalds 已提交
130

131
	dir = rpc_d_lookup_sb(sb, dir_name);
132 133
	if (dir == NULL) {
		pr_info("RPC: pipefs directory doesn't exist: %s\n", dir_name);
134
		return dir;
135
	}
136
	for (;;) {
137
		snprintf(name, sizeof(name), "clnt%x", (unsigned int)clntid++);
138
		name[sizeof(name) - 1] = '\0';
139
		dentry = rpc_create_client_dir(dir, name, clnt);
140
		if (!IS_ERR(dentry))
141
			break;
142 143 144 145 146 147
		if (dentry == ERR_PTR(-EEXIST))
			continue;
		printk(KERN_INFO "RPC: Couldn't create pipefs entry"
				" %s/%s, error %ld\n",
				dir_name, name, PTR_ERR(dentry));
		break;
L
Linus Torvalds 已提交
148
	}
149 150 151 152 153
	dput(dir);
	return dentry;
}

static int
154
rpc_setup_pipedir(struct super_block *pipefs_sb, struct rpc_clnt *clnt)
155
{
156
	struct dentry *dentry;
157

158 159 160 161 162
	if (clnt->cl_program->pipe_dir_name != NULL) {
		dentry = rpc_setup_pipedir_sb(pipefs_sb, clnt);
		if (IS_ERR(dentry))
			return PTR_ERR(dentry);
	}
163
	return 0;
L
Linus Torvalds 已提交
164 165
}

166
static int rpc_clnt_skip_event(struct rpc_clnt *clnt, unsigned long event)
167
{
168
	if (clnt->cl_program->pipe_dir_name == NULL)
169
		return 1;
170

171 172 173 174 175 176 177 178 179 180 181 182
	switch (event) {
	case RPC_PIPEFS_MOUNT:
		if (clnt->cl_pipedir_objects.pdh_dentry != NULL)
			return 1;
		if (atomic_read(&clnt->cl_count) == 0)
			return 1;
		break;
	case RPC_PIPEFS_UMOUNT:
		if (clnt->cl_pipedir_objects.pdh_dentry == NULL)
			return 1;
		break;
	}
183 184 185 186 187
	return 0;
}

static int __rpc_clnt_handle_event(struct rpc_clnt *clnt, unsigned long event,
				   struct super_block *sb)
188 189 190 191 192
{
	struct dentry *dentry;

	switch (event) {
	case RPC_PIPEFS_MOUNT:
193
		dentry = rpc_setup_pipedir_sb(sb, clnt);
194 195
		if (!dentry)
			return -ENOENT;
196 197 198 199 200 201 202 203 204 205
		if (IS_ERR(dentry))
			return PTR_ERR(dentry);
		break;
	case RPC_PIPEFS_UMOUNT:
		__rpc_clnt_remove_pipedir(clnt);
		break;
	default:
		printk(KERN_ERR "%s: unknown event: %ld\n", __func__, event);
		return -ENOTSUPP;
	}
206
	return 0;
207 208
}

209 210 211 212 213 214 215 216 217 218 219 220 221 222
static int __rpc_pipefs_event(struct rpc_clnt *clnt, unsigned long event,
				struct super_block *sb)
{
	int error = 0;

	for (;; clnt = clnt->cl_parent) {
		if (!rpc_clnt_skip_event(clnt, event))
			error = __rpc_clnt_handle_event(clnt, event, sb);
		if (error || clnt == clnt->cl_parent)
			break;
	}
	return error;
}

223 224 225 226 227 228 229
static struct rpc_clnt *rpc_get_client_for_event(struct net *net, int event)
{
	struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
	struct rpc_clnt *clnt;

	spin_lock(&sn->rpc_client_lock);
	list_for_each_entry(clnt, &sn->all_clients, cl_clients) {
230
		if (rpc_clnt_skip_event(clnt, event))
231 232 233 234 235 236 237 238
			continue;
		spin_unlock(&sn->rpc_client_lock);
		return clnt;
	}
	spin_unlock(&sn->rpc_client_lock);
	return NULL;
}

239 240 241 242 243 244 245
static int rpc_pipefs_event(struct notifier_block *nb, unsigned long event,
			    void *ptr)
{
	struct super_block *sb = ptr;
	struct rpc_clnt *clnt;
	int error = 0;

246
	while ((clnt = rpc_get_client_for_event(sb->s_fs_info, event))) {
247 248 249 250 251 252 253 254 255
		error = __rpc_pipefs_event(clnt, event, sb);
		if (error)
			break;
	}
	return error;
}

static struct notifier_block rpc_clients_block = {
	.notifier_call	= rpc_pipefs_event,
256
	.priority	= SUNRPC_PIPEFS_RPC_PRIO,
257 258 259 260 261 262 263 264 265 266 267 268
};

int rpc_clients_notifier_register(void)
{
	return rpc_pipefs_notifier_register(&rpc_clients_block);
}

void rpc_clients_notifier_unregister(void)
{
	return rpc_pipefs_notifier_unregister(&rpc_clients_block);
}

269 270 271 272 273 274 275
static struct rpc_xprt *rpc_clnt_set_transport(struct rpc_clnt *clnt,
		struct rpc_xprt *xprt,
		const struct rpc_timeout *timeout)
{
	struct rpc_xprt *old;

	spin_lock(&clnt->cl_lock);
276 277
	old = rcu_dereference_protected(clnt->cl_xprt,
			lockdep_is_held(&clnt->cl_lock));
278 279 280 281 282 283 284 285 286 287 288

	if (!xprt_bound(xprt))
		clnt->cl_autobind = 1;

	clnt->cl_timeout = timeout;
	rcu_assign_pointer(clnt->cl_xprt, xprt);
	spin_unlock(&clnt->cl_lock);

	return old;
}

289 290
static void rpc_clnt_set_nodename(struct rpc_clnt *clnt, const char *nodename)
{
291 292
	clnt->cl_nodelen = strlcpy(clnt->cl_nodename,
			nodename, sizeof(clnt->cl_nodename));
293 294
}

295 296 297
static int rpc_client_register(struct rpc_clnt *clnt,
			       rpc_authflavor_t pseudoflavor,
			       const char *client_name)
298
{
299
	struct rpc_auth_create_args auth_args = {
300 301
		.pseudoflavor = pseudoflavor,
		.target_name = client_name,
302
	};
303 304 305
	struct rpc_auth *auth;
	struct net *net = rpc_net_ns(clnt);
	struct super_block *pipefs_sb;
306
	int err;
307

308
	rpc_clnt_debugfs_register(clnt);
309

310 311
	pipefs_sb = rpc_get_sb_net(net);
	if (pipefs_sb) {
312
		err = rpc_setup_pipedir(pipefs_sb, clnt);
313 314 315 316
		if (err)
			goto out;
	}

317 318 319 320
	rpc_register_client(clnt);
	if (pipefs_sb)
		rpc_put_sb_net(net);

321
	auth = rpcauth_create(&auth_args, clnt);
322 323
	if (IS_ERR(auth)) {
		dprintk("RPC:       Couldn't create auth handle (flavor %u)\n",
324
				pseudoflavor);
325 326 327
		err = PTR_ERR(auth);
		goto err_auth;
	}
328 329 330
	return 0;
err_auth:
	pipefs_sb = rpc_get_sb_net(net);
331
	rpc_unregister_client(clnt);
332
	__rpc_clnt_remove_pipedir(clnt);
333 334 335
out:
	if (pipefs_sb)
		rpc_put_sb_net(net);
336
	rpc_clnt_debugfs_unregister(clnt);
337 338 339
	return err;
}

340 341
static DEFINE_IDA(rpc_clids);

342 343 344 345 346
void rpc_cleanup_clids(void)
{
	ida_destroy(&rpc_clids);
}

347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362
static int rpc_alloc_clid(struct rpc_clnt *clnt)
{
	int clid;

	clid = ida_simple_get(&rpc_clids, 0, 0, GFP_KERNEL);
	if (clid < 0)
		return clid;
	clnt->cl_clid = clid;
	return 0;
}

static void rpc_free_clid(struct rpc_clnt *clnt)
{
	ida_simple_remove(&rpc_clids, clnt->cl_clid);
}

363
static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args,
364
		struct rpc_xprt_switch *xps,
365 366
		struct rpc_xprt *xprt,
		struct rpc_clnt *parent)
L
Linus Torvalds 已提交
367
{
368 369
	const struct rpc_program *program = args->program;
	const struct rpc_version *version;
370 371
	struct rpc_clnt *clnt = NULL;
	const struct rpc_timeout *timeout;
372
	const char *nodename = args->nodename;
L
Linus Torvalds 已提交
373
	int err;
374 375

	/* sanity check the name before trying to print it */
376
	dprintk("RPC:       creating %s client for %s (xprt %p)\n",
377
			program->name, args->servername, xprt);
L
Linus Torvalds 已提交
378

379 380 381
	err = rpciod_up();
	if (err)
		goto out_no_rpciod;
382

383
	err = -EINVAL;
384 385 386 387
	if (args->version >= program->nrvers)
		goto out_err;
	version = program->version[args->version];
	if (version == NULL)
L
Linus Torvalds 已提交
388 389 390
		goto out_err;

	err = -ENOMEM;
391
	clnt = kzalloc(sizeof(*clnt), GFP_KERNEL);
L
Linus Torvalds 已提交
392 393
	if (!clnt)
		goto out_err;
394
	clnt->cl_parent = parent ? : clnt;
L
Linus Torvalds 已提交
395

396 397 398
	err = rpc_alloc_clid(clnt);
	if (err)
		goto out_no_clid;
L
Linus Torvalds 已提交
399 400 401

	clnt->cl_procinfo = version->procs;
	clnt->cl_maxproc  = version->nrprocs;
402
	clnt->cl_prog     = args->prognumber ? : program->number;
L
Linus Torvalds 已提交
403 404
	clnt->cl_vers     = version->number;
	clnt->cl_stats    = program->stats;
405
	clnt->cl_metrics  = rpc_alloc_iostats(clnt);
406
	rpc_init_pipe_dir_head(&clnt->cl_pipedir_objects);
407 408 409
	err = -ENOMEM;
	if (clnt->cl_metrics == NULL)
		goto out_no_stats;
410
	clnt->cl_program  = program;
411
	INIT_LIST_HEAD(&clnt->cl_tasks);
412
	spin_lock_init(&clnt->cl_lock);
L
Linus Torvalds 已提交
413

414
	timeout = xprt->timeout;
415 416 417
	if (args->timeout != NULL) {
		memcpy(&clnt->cl_timeout_default, args->timeout,
				sizeof(clnt->cl_timeout_default));
418
		timeout = &clnt->cl_timeout_default;
419 420
	}

421
	rpc_clnt_set_transport(clnt, xprt, timeout);
422 423
	xprt_iter_init(&clnt->cl_xpi, xps);
	xprt_switch_put(xps);
424

L
Linus Torvalds 已提交
425
	clnt->cl_rtt = &clnt->cl_rtt_default;
426
	rpc_init_rtt(&clnt->cl_rtt_default, clnt->cl_timeout->to_initval);
L
Linus Torvalds 已提交
427

428
	atomic_set(&clnt->cl_count, 1);
429

430 431
	if (nodename == NULL)
		nodename = utsname()->nodename;
L
Linus Torvalds 已提交
432
	/* save the nodename */
433
	rpc_clnt_set_nodename(clnt, nodename);
434

435
	err = rpc_client_register(clnt, args->authflavor, args->client_name);
436 437
	if (err)
		goto out_no_path;
438 439
	if (parent)
		atomic_inc(&parent->cl_count);
L
Linus Torvalds 已提交
440 441 442
	return clnt;

out_no_path:
443 444
	rpc_free_iostats(clnt->cl_metrics);
out_no_stats:
445 446
	rpc_free_clid(clnt);
out_no_clid:
L
Linus Torvalds 已提交
447 448
	kfree(clnt);
out_err:
449 450
	rpciod_down();
out_no_rpciod:
451
	xprt_switch_put(xps);
452
	xprt_put(xprt);
L
Linus Torvalds 已提交
453 454 455
	return ERR_PTR(err);
}

456
static struct rpc_clnt *rpc_create_xprt(struct rpc_create_args *args,
457 458 459
					struct rpc_xprt *xprt)
{
	struct rpc_clnt *clnt = NULL;
460
	struct rpc_xprt_switch *xps;
461

462
	if (args->bc_xprt && args->bc_xprt->xpt_bc_xps) {
463
		WARN_ON_ONCE(!(args->protocol & XPRT_TRANSPORT_BC));
464 465 466 467 468 469 470 471 472 473 474 475
		xps = args->bc_xprt->xpt_bc_xps;
		xprt_switch_get(xps);
	} else {
		xps = xprt_switch_alloc(xprt, GFP_KERNEL);
		if (xps == NULL) {
			xprt_put(xprt);
			return ERR_PTR(-ENOMEM);
		}
		if (xprt->bc_xprt) {
			xprt_switch_get(xps);
			xprt->bc_xprt->xpt_bc_xps = xps;
		}
476
	}
477
	clnt = rpc_new_client(args, xps, xprt, NULL);
478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494
	if (IS_ERR(clnt))
		return clnt;

	if (!(args->flags & RPC_CLNT_CREATE_NOPING)) {
		int err = rpc_ping(clnt);
		if (err != 0) {
			rpc_shutdown_client(clnt);
			return ERR_PTR(err);
		}
	}

	clnt->cl_softrtry = 1;
	if (args->flags & RPC_CLNT_CREATE_HARDRTRY)
		clnt->cl_softrtry = 0;

	if (args->flags & RPC_CLNT_CREATE_AUTOBIND)
		clnt->cl_autobind = 1;
495 496
	if (args->flags & RPC_CLNT_CREATE_NO_RETRANS_TIMEOUT)
		clnt->cl_noretranstimeo = 1;
497 498 499 500 501 502 503 504
	if (args->flags & RPC_CLNT_CREATE_DISCRTRY)
		clnt->cl_discrtry = 1;
	if (!(args->flags & RPC_CLNT_CREATE_QUIET))
		clnt->cl_chatty = 1;

	return clnt;
}

505
/**
506 507 508 509 510 511 512 513 514 515 516 517
 * rpc_create - create an RPC client and transport with one call
 * @args: rpc_clnt create argument structure
 *
 * Creates and initializes an RPC transport and an RPC client.
 *
 * It can ping the server in order to determine if it is up, and to see if
 * it supports this program and version.  RPC_CLNT_CREATE_NOPING disables
 * this behavior so asynchronous tasks can also use rpc_create.
 */
struct rpc_clnt *rpc_create(struct rpc_create_args *args)
{
	struct rpc_xprt *xprt;
518
	struct xprt_create xprtargs = {
P
Pavel Emelyanov 已提交
519
		.net = args->net,
520
		.ident = args->protocol,
521
		.srcaddr = args->saddress,
522 523
		.dstaddr = args->address,
		.addrlen = args->addrsize,
524
		.servername = args->servername,
525
		.bc_xprt = args->bc_xprt,
526
	};
527
	char servername[48];
528

529
	if (args->bc_xprt) {
530
		WARN_ON_ONCE(!(args->protocol & XPRT_TRANSPORT_BC));
531 532 533 534 535 536 537
		xprt = args->bc_xprt->xpt_bc_xprt;
		if (xprt) {
			xprt_get(xprt);
			return rpc_create_xprt(args, xprt);
		}
	}

538 539
	if (args->flags & RPC_CLNT_CREATE_INFINITE_SLOTS)
		xprtargs.flags |= XPRT_CREATE_INFINITE_SLOTS;
540 541
	if (args->flags & RPC_CLNT_CREATE_NO_IDLE_TIMEOUT)
		xprtargs.flags |= XPRT_CREATE_NO_IDLE_TIMEOUT;
542 543 544 545
	/*
	 * If the caller chooses not to specify a hostname, whip
	 * up a string representation of the passed-in address.
	 */
546
	if (xprtargs.servername == NULL) {
547 548
		struct sockaddr_un *sun =
				(struct sockaddr_un *)args->address;
549 550 551 552 553
		struct sockaddr_in *sin =
				(struct sockaddr_in *)args->address;
		struct sockaddr_in6 *sin6 =
				(struct sockaddr_in6 *)args->address;

554 555
		servername[0] = '\0';
		switch (args->address->sa_family) {
556 557 558 559
		case AF_LOCAL:
			snprintf(servername, sizeof(servername), "%s",
				 sun->sun_path);
			break;
560
		case AF_INET:
H
Harvey Harrison 已提交
561 562
			snprintf(servername, sizeof(servername), "%pI4",
				 &sin->sin_addr.s_addr);
563
			break;
564
		case AF_INET6:
H
Harvey Harrison 已提交
565
			snprintf(servername, sizeof(servername), "%pI6",
566
				 &sin6->sin6_addr);
567 568 569 570 571 572
			break;
		default:
			/* caller wants default server name, but
			 * address family isn't recognized. */
			return ERR_PTR(-EINVAL);
		}
573
		xprtargs.servername = servername;
574 575
	}

576 577 578 579
	xprt = xprt_create_transport(&xprtargs);
	if (IS_ERR(xprt))
		return (struct rpc_clnt *)xprt;

580 581 582 583 584 585 586 587 588 589
	/*
	 * By default, kernel RPC client connects from a reserved port.
	 * CAP_NET_BIND_SERVICE will not be set for unprivileged requesters,
	 * but it is always enabled for rpciod, which handles the connect
	 * operation.
	 */
	xprt->resvport = 1;
	if (args->flags & RPC_CLNT_CREATE_NONPRIVPORT)
		xprt->resvport = 0;

590
	return rpc_create_xprt(args, xprt);
591
}
592
EXPORT_SYMBOL_GPL(rpc_create);
593

L
Linus Torvalds 已提交
594 595 596 597 598
/*
 * This function clones the RPC client structure. It allows us to share the
 * same transport while varying parameters such as the authentication
 * flavour.
 */
C
Chuck Lever 已提交
599 600
static struct rpc_clnt *__rpc_clone_client(struct rpc_create_args *args,
					   struct rpc_clnt *clnt)
L
Linus Torvalds 已提交
601
{
602
	struct rpc_xprt_switch *xps;
603
	struct rpc_xprt *xprt;
C
Chuck Lever 已提交
604 605
	struct rpc_clnt *new;
	int err;
L
Linus Torvalds 已提交
606

C
Chuck Lever 已提交
607
	err = -ENOMEM;
608 609
	rcu_read_lock();
	xprt = xprt_get(rcu_dereference(clnt->cl_xprt));
610
	xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch));
611
	rcu_read_unlock();
612 613 614
	if (xprt == NULL || xps == NULL) {
		xprt_put(xprt);
		xprt_switch_put(xps);
C
Chuck Lever 已提交
615
		goto out_err;
616
	}
C
Chuck Lever 已提交
617
	args->servername = xprt->servername;
618
	args->nodename = clnt->cl_nodename;
C
Chuck Lever 已提交
619

620
	new = rpc_new_client(args, xps, xprt, clnt);
C
Chuck Lever 已提交
621 622
	if (IS_ERR(new)) {
		err = PTR_ERR(new);
C
Chuck Lever 已提交
623
		goto out_err;
C
Chuck Lever 已提交
624 625 626 627 628
	}

	/* Turn off autobind on clones */
	new->cl_autobind = 0;
	new->cl_softrtry = clnt->cl_softrtry;
629
	new->cl_noretranstimeo = clnt->cl_noretranstimeo;
C
Chuck Lever 已提交
630 631
	new->cl_discrtry = clnt->cl_discrtry;
	new->cl_chatty = clnt->cl_chatty;
632
	new->cl_principal = clnt->cl_principal;
L
Linus Torvalds 已提交
633
	return new;
C
Chuck Lever 已提交
634 635

out_err:
636
	dprintk("RPC:       %s: returned error %d\n", __func__, err);
637
	return ERR_PTR(err);
L
Linus Torvalds 已提交
638
}
C
Chuck Lever 已提交
639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656

/**
 * rpc_clone_client - Clone an RPC client structure
 *
 * @clnt: RPC client whose parameters are copied
 *
 * Returns a fresh RPC client or an ERR_PTR.
 */
struct rpc_clnt *rpc_clone_client(struct rpc_clnt *clnt)
{
	struct rpc_create_args args = {
		.program	= clnt->cl_program,
		.prognumber	= clnt->cl_prog,
		.version	= clnt->cl_vers,
		.authflavor	= clnt->cl_auth->au_flavor,
	};
	return __rpc_clone_client(&args, clnt);
}
657
EXPORT_SYMBOL_GPL(rpc_clone_client);
L
Linus Torvalds 已提交
658

659 660 661 662
/**
 * rpc_clone_client_set_auth - Clone an RPC client structure and set its auth
 *
 * @clnt: RPC client whose parameters are copied
663
 * @flavor: security flavor for new client
664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679
 *
 * Returns a fresh RPC client or an ERR_PTR.
 */
struct rpc_clnt *
rpc_clone_client_set_auth(struct rpc_clnt *clnt, rpc_authflavor_t flavor)
{
	struct rpc_create_args args = {
		.program	= clnt->cl_program,
		.prognumber	= clnt->cl_prog,
		.version	= clnt->cl_vers,
		.authflavor	= flavor,
	};
	return __rpc_clone_client(&args, clnt);
}
EXPORT_SYMBOL_GPL(rpc_clone_client_set_auth);

680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700
/**
 * rpc_switch_client_transport: switch the RPC transport on the fly
 * @clnt: pointer to a struct rpc_clnt
 * @args: pointer to the new transport arguments
 * @timeout: pointer to the new timeout parameters
 *
 * This function allows the caller to switch the RPC transport for the
 * rpc_clnt structure 'clnt' to allow it to connect to a mirrored NFS
 * server, for instance.  It assumes that the caller has ensured that
 * there are no active RPC tasks by using some form of locking.
 *
 * Returns zero if "clnt" is now using the new xprt.  Otherwise a
 * negative errno is returned, and "clnt" continues to use the old
 * xprt.
 */
int rpc_switch_client_transport(struct rpc_clnt *clnt,
		struct xprt_create *args,
		const struct rpc_timeout *timeout)
{
	const struct rpc_timeout *old_timeo;
	rpc_authflavor_t pseudoflavor;
701
	struct rpc_xprt_switch *xps, *oldxps;
702 703 704 705 706 707 708 709 710 711 712
	struct rpc_xprt *xprt, *old;
	struct rpc_clnt *parent;
	int err;

	xprt = xprt_create_transport(args);
	if (IS_ERR(xprt)) {
		dprintk("RPC:       failed to create new xprt for clnt %p\n",
			clnt);
		return PTR_ERR(xprt);
	}

713 714 715 716 717 718
	xps = xprt_switch_alloc(xprt, GFP_KERNEL);
	if (xps == NULL) {
		xprt_put(xprt);
		return -ENOMEM;
	}

719 720 721 722
	pseudoflavor = clnt->cl_auth->au_flavor;

	old_timeo = clnt->cl_timeout;
	old = rpc_clnt_set_transport(clnt, xprt, timeout);
723
	oldxps = xprt_iter_xchg_switch(&clnt->cl_xpi, xps);
724 725 726

	rpc_unregister_client(clnt);
	__rpc_clnt_remove_pipedir(clnt);
727
	rpc_clnt_debugfs_unregister(clnt);
728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748

	/*
	 * A new transport was created.  "clnt" therefore
	 * becomes the root of a new cl_parent tree.  clnt's
	 * children, if it has any, still point to the old xprt.
	 */
	parent = clnt->cl_parent;
	clnt->cl_parent = clnt;

	/*
	 * The old rpc_auth cache cannot be re-used.  GSS
	 * contexts in particular are between a single
	 * client and server.
	 */
	err = rpc_client_register(clnt, pseudoflavor, NULL);
	if (err)
		goto out_revert;

	synchronize_rcu();
	if (parent != clnt)
		rpc_release_client(parent);
749
	xprt_switch_put(oldxps);
750 751 752 753 754
	xprt_put(old);
	dprintk("RPC:       replaced xprt for clnt %p\n", clnt);
	return 0;

out_revert:
755
	xps = xprt_iter_xchg_switch(&clnt->cl_xpi, oldxps);
756 757 758
	rpc_clnt_set_transport(clnt, old, old_timeo);
	clnt->cl_parent = parent;
	rpc_client_register(clnt, pseudoflavor, NULL);
759
	xprt_switch_put(xps);
760 761 762 763 764 765
	xprt_put(xprt);
	dprintk("RPC:       failed to switch xprt for clnt %p\n", clnt);
	return err;
}
EXPORT_SYMBOL_GPL(rpc_switch_client_transport);

766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816
static
int rpc_clnt_xprt_iter_init(struct rpc_clnt *clnt, struct rpc_xprt_iter *xpi)
{
	struct rpc_xprt_switch *xps;

	rcu_read_lock();
	xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch));
	rcu_read_unlock();
	if (xps == NULL)
		return -EAGAIN;
	xprt_iter_init_listall(xpi, xps);
	xprt_switch_put(xps);
	return 0;
}

/**
 * rpc_clnt_iterate_for_each_xprt - Apply a function to all transports
 * @clnt: pointer to client
 * @fn: function to apply
 * @data: void pointer to function data
 *
 * Iterates through the list of RPC transports currently attached to the
 * client and applies the function fn(clnt, xprt, data).
 *
 * On error, the iteration stops, and the function returns the error value.
 */
int rpc_clnt_iterate_for_each_xprt(struct rpc_clnt *clnt,
		int (*fn)(struct rpc_clnt *, struct rpc_xprt *, void *),
		void *data)
{
	struct rpc_xprt_iter xpi;
	int ret;

	ret = rpc_clnt_xprt_iter_init(clnt, &xpi);
	if (ret)
		return ret;
	for (;;) {
		struct rpc_xprt *xprt = xprt_iter_get_next(&xpi);

		if (!xprt)
			break;
		ret = fn(clnt, xprt, data);
		xprt_put(xprt);
		if (ret < 0)
			break;
	}
	xprt_iter_destroy(&xpi);
	return ret;
}
EXPORT_SYMBOL_GPL(rpc_clnt_iterate_for_each_xprt);

817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838
/*
 * Kill all tasks for the given client.
 * XXX: kill their descendants as well?
 */
void rpc_killall_tasks(struct rpc_clnt *clnt)
{
	struct rpc_task	*rovr;


	if (list_empty(&clnt->cl_tasks))
		return;
	dprintk("RPC:       killing all tasks for client %p\n", clnt);
	/*
	 * Spin lock all_tasks to prevent changes...
	 */
	spin_lock(&clnt->cl_lock);
	list_for_each_entry(rovr, &clnt->cl_tasks, tk_task) {
		if (!RPC_IS_ACTIVATED(rovr))
			continue;
		if (!(rovr->tk_flags & RPC_TASK_KILLED)) {
			rovr->tk_flags |= RPC_TASK_KILLED;
			rpc_exit(rovr, -EIO);
839 840 841
			if (RPC_IS_QUEUED(rovr))
				rpc_wake_up_queued_task(rovr->tk_waitqueue,
							rovr);
842 843 844 845 846 847
		}
	}
	spin_unlock(&clnt->cl_lock);
}
EXPORT_SYMBOL_GPL(rpc_killall_tasks);

L
Linus Torvalds 已提交
848 849
/*
 * Properly shut down an RPC client, terminating all outstanding
850
 * requests.
L
Linus Torvalds 已提交
851
 */
852
void rpc_shutdown_client(struct rpc_clnt *clnt)
L
Linus Torvalds 已提交
853
{
854 855
	might_sleep();

856
	dprintk_rcu("RPC:       shutting down %s client for %s\n",
857
			clnt->cl_program->name,
858
			rcu_dereference(clnt->cl_xprt)->servername);
L
Linus Torvalds 已提交
859

860
	while (!list_empty(&clnt->cl_tasks)) {
L
Linus Torvalds 已提交
861
		rpc_killall_tasks(clnt);
I
Ingo Molnar 已提交
862
		wait_event_timeout(destroy_wait,
863
			list_empty(&clnt->cl_tasks), 1*HZ);
L
Linus Torvalds 已提交
864 865
	}

866
	rpc_release_client(clnt);
L
Linus Torvalds 已提交
867
}
868
EXPORT_SYMBOL_GPL(rpc_shutdown_client);
L
Linus Torvalds 已提交
869 870

/*
871
 * Free an RPC client
L
Linus Torvalds 已提交
872
 */
873
static struct rpc_clnt *
874
rpc_free_client(struct rpc_clnt *clnt)
L
Linus Torvalds 已提交
875
{
876 877
	struct rpc_clnt *parent = NULL;

878
	dprintk_rcu("RPC:       destroying %s client for %s\n",
879
			clnt->cl_program->name,
880
			rcu_dereference(clnt->cl_xprt)->servername);
881
	if (clnt->cl_parent != clnt)
882
		parent = clnt->cl_parent;
883
	rpc_clnt_debugfs_unregister(clnt);
884
	rpc_clnt_remove_pipedir(clnt);
885
	rpc_unregister_client(clnt);
886 887
	rpc_free_iostats(clnt->cl_metrics);
	clnt->cl_metrics = NULL;
888
	xprt_put(rcu_dereference_raw(clnt->cl_xprt));
889
	xprt_iter_destroy(&clnt->cl_xpi);
890
	rpciod_down();
891
	rpc_free_clid(clnt);
L
Linus Torvalds 已提交
892
	kfree(clnt);
893
	return parent;
L
Linus Torvalds 已提交
894 895
}

896 897 898
/*
 * Free an RPC client
 */
S
Stephen Hemminger 已提交
899
static struct rpc_clnt *
900
rpc_free_auth(struct rpc_clnt *clnt)
901
{
902 903
	if (clnt->cl_auth == NULL)
		return rpc_free_client(clnt);
904 905 906 907 908 909

	/*
	 * Note: RPCSEC_GSS may need to send NULL RPC calls in order to
	 *       release remaining GSS contexts. This mechanism ensures
	 *       that it can do so safely.
	 */
910
	atomic_inc(&clnt->cl_count);
911 912
	rpcauth_release(clnt->cl_auth);
	clnt->cl_auth = NULL;
913
	if (atomic_dec_and_test(&clnt->cl_count))
914 915
		return rpc_free_client(clnt);
	return NULL;
916 917
}

L
Linus Torvalds 已提交
918
/*
919
 * Release reference to the RPC client
L
Linus Torvalds 已提交
920 921 922 923
 */
void
rpc_release_client(struct rpc_clnt *clnt)
{
924
	dprintk("RPC:       rpc_release_client(%p)\n", clnt);
L
Linus Torvalds 已提交
925

926 927 928 929 930 931 932
	do {
		if (list_empty(&clnt->cl_tasks))
			wake_up(&destroy_wait);
		if (!atomic_dec_and_test(&clnt->cl_count))
			break;
		clnt = rpc_free_auth(clnt);
	} while (clnt != NULL);
933
}
934
EXPORT_SYMBOL_GPL(rpc_release_client);
935

936 937
/**
 * rpc_bind_new_program - bind a new RPC program to an existing client
938 939 940
 * @old: old rpc_client
 * @program: rpc program to set
 * @vers: rpc program version
941 942 943 944 945 946
 *
 * Clones the rpc client and sets up a new RPC program. This is mainly
 * of use for enabling different RPC programs to share the same transport.
 * The Sun NFSv2/v3 ACL protocol can do this.
 */
struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *old,
947
				      const struct rpc_program *program,
948
				      u32 vers)
949
{
950 951 952 953 954 955
	struct rpc_create_args args = {
		.program	= program,
		.prognumber	= program->number,
		.version	= vers,
		.authflavor	= old->cl_auth->au_flavor,
	};
956 957 958
	struct rpc_clnt *clnt;
	int err;

959
	clnt = __rpc_clone_client(&args, old);
960 961
	if (IS_ERR(clnt))
		goto out;
962
	err = rpc_ping(clnt);
963 964 965 966
	if (err != 0) {
		rpc_shutdown_client(clnt);
		clnt = ERR_PTR(err);
	}
967
out:
968 969
	return clnt;
}
970
EXPORT_SYMBOL_GPL(rpc_bind_new_program);
971

972 973 974 975 976 977 978 979 980 981 982
void rpc_task_release_transport(struct rpc_task *task)
{
	struct rpc_xprt *xprt = task->tk_xprt;

	if (xprt) {
		task->tk_xprt = NULL;
		xprt_put(xprt);
	}
}
EXPORT_SYMBOL_GPL(rpc_task_release_transport);

983 984 985 986 987 988 989 990 991 992 993 994 995
void rpc_task_release_client(struct rpc_task *task)
{
	struct rpc_clnt *clnt = task->tk_client;

	if (clnt != NULL) {
		/* Remove from client task list */
		spin_lock(&clnt->cl_lock);
		list_del(&task->tk_task);
		spin_unlock(&clnt->cl_lock);
		task->tk_client = NULL;

		rpc_release_client(clnt);
	}
996 997
	rpc_task_release_transport(task);
}
998

999 1000 1001 1002 1003
static
void rpc_task_set_transport(struct rpc_task *task, struct rpc_clnt *clnt)
{
	if (!task->tk_xprt)
		task->tk_xprt = xprt_iter_get_next(&clnt->cl_xpi);
1004 1005 1006 1007 1008
}

static
void rpc_task_set_client(struct rpc_task *task, struct rpc_clnt *clnt)
{
1009

1010
	if (clnt != NULL) {
1011
		rpc_task_set_transport(task, clnt);
1012
		task->tk_client = clnt;
1013
		atomic_inc(&clnt->cl_count);
1014 1015
		if (clnt->cl_softrtry)
			task->tk_flags |= RPC_TASK_SOFT;
1016 1017
		if (clnt->cl_noretranstimeo)
			task->tk_flags |= RPC_TASK_NO_RETRANS_TIMEOUT;
1018 1019
		if (atomic_read(&clnt->cl_swapper))
			task->tk_flags |= RPC_TASK_SWAPPER;
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033
		/* Add to the client's list of all tasks */
		spin_lock(&clnt->cl_lock);
		list_add_tail(&task->tk_task, &clnt->cl_tasks);
		spin_unlock(&clnt->cl_lock);
	}
}

static void
rpc_task_set_rpc_message(struct rpc_task *task, const struct rpc_message *msg)
{
	if (msg != NULL) {
		task->tk_msg.rpc_proc = msg->rpc_proc;
		task->tk_msg.rpc_argp = msg->rpc_argp;
		task->tk_msg.rpc_resp = msg->rpc_resp;
1034
		if (msg->rpc_cred != NULL)
1035
			task->tk_msg.rpc_cred = get_cred(msg->rpc_cred);
1036 1037 1038
	}
}

L
Linus Torvalds 已提交
1039 1040 1041 1042
/*
 * Default callback for async RPC calls
 */
static void
1043
rpc_default_callback(struct rpc_task *task, void *data)
L
Linus Torvalds 已提交
1044 1045 1046
{
}

1047 1048 1049 1050
static const struct rpc_call_ops rpc_default_ops = {
	.rpc_call_done = rpc_default_callback,
};

T
Trond Myklebust 已提交
1051 1052 1053 1054 1055
/**
 * rpc_run_task - Allocate a new RPC task, then run rpc_execute against it
 * @task_setup_data: pointer to task initialisation data
 */
struct rpc_task *rpc_run_task(const struct rpc_task_setup *task_setup_data)
1056
{
1057
	struct rpc_task *task;
1058

1059
	task = rpc_new_task(task_setup_data);
1060

1061 1062 1063 1064 1065 1066
	rpc_task_set_client(task, task_setup_data->rpc_client);
	rpc_task_set_rpc_message(task, task_setup_data->rpc_message);

	if (task->tk_action == NULL)
		rpc_call_start(task);

1067 1068
	atomic_inc(&task->tk_count);
	rpc_execute(task);
1069
	return task;
1070
}
T
Trond Myklebust 已提交
1071
EXPORT_SYMBOL_GPL(rpc_run_task);
1072 1073 1074 1075 1076 1077

/**
 * rpc_call_sync - Perform a synchronous RPC call
 * @clnt: pointer to RPC client
 * @msg: RPC call parameters
 * @flags: RPC call flags
L
Linus Torvalds 已提交
1078
 */
1079
int rpc_call_sync(struct rpc_clnt *clnt, const struct rpc_message *msg, int flags)
L
Linus Torvalds 已提交
1080 1081
{
	struct rpc_task	*task;
1082 1083 1084 1085 1086 1087
	struct rpc_task_setup task_setup_data = {
		.rpc_client = clnt,
		.rpc_message = msg,
		.callback_ops = &rpc_default_ops,
		.flags = flags,
	};
1088
	int status;
L
Linus Torvalds 已提交
1089

1090 1091 1092 1093 1094 1095
	WARN_ON_ONCE(flags & RPC_TASK_ASYNC);
	if (flags & RPC_TASK_ASYNC) {
		rpc_release_calldata(task_setup_data.callback_ops,
			task_setup_data.callback_data);
		return -EINVAL;
	}
L
Linus Torvalds 已提交
1096

T
Trond Myklebust 已提交
1097
	task = rpc_run_task(&task_setup_data);
1098 1099
	if (IS_ERR(task))
		return PTR_ERR(task);
1100
	status = task->tk_status;
1101
	rpc_put_task(task);
L
Linus Torvalds 已提交
1102 1103
	return status;
}
1104
EXPORT_SYMBOL_GPL(rpc_call_sync);
L
Linus Torvalds 已提交
1105

1106 1107 1108 1109 1110
/**
 * rpc_call_async - Perform an asynchronous RPC call
 * @clnt: pointer to RPC client
 * @msg: RPC call parameters
 * @flags: RPC call flags
1111
 * @tk_ops: RPC call ops
1112
 * @data: user call data
L
Linus Torvalds 已提交
1113 1114
 */
int
1115
rpc_call_async(struct rpc_clnt *clnt, const struct rpc_message *msg, int flags,
1116
	       const struct rpc_call_ops *tk_ops, void *data)
L
Linus Torvalds 已提交
1117 1118
{
	struct rpc_task	*task;
1119 1120 1121 1122 1123 1124 1125
	struct rpc_task_setup task_setup_data = {
		.rpc_client = clnt,
		.rpc_message = msg,
		.callback_ops = tk_ops,
		.callback_data = data,
		.flags = flags|RPC_TASK_ASYNC,
	};
L
Linus Torvalds 已提交
1126

T
Trond Myklebust 已提交
1127
	task = rpc_run_task(&task_setup_data);
1128 1129 1130 1131
	if (IS_ERR(task))
		return PTR_ERR(task);
	rpc_put_task(task);
	return 0;
L
Linus Torvalds 已提交
1132
}
1133
EXPORT_SYMBOL_GPL(rpc_call_async);
L
Linus Torvalds 已提交
1134

1135
#if defined(CONFIG_SUNRPC_BACKCHANNEL)
1136 1137 1138
/**
 * rpc_run_bc_task - Allocate a new RPC task for backchannel use, then run
 * rpc_execute against it
1139
 * @req: RPC request
1140
 */
1141
struct rpc_task *rpc_run_bc_task(struct rpc_rqst *req)
1142 1143 1144
{
	struct rpc_task *task;
	struct rpc_task_setup task_setup_data = {
1145
		.callback_ops = &rpc_default_ops,
1146 1147
		.flags = RPC_TASK_SOFTCONN |
			RPC_TASK_NO_RETRANS_TIMEOUT,
1148 1149 1150 1151 1152 1153 1154
	};

	dprintk("RPC: rpc_run_bc_task req= %p\n", req);
	/*
	 * Create an rpc_task to send the data
	 */
	task = rpc_new_task(&task_setup_data);
1155
	xprt_init_bc_request(req, task);
1156 1157 1158

	task->tk_action = call_bc_transmit;
	atomic_inc(&task->tk_count);
1159
	WARN_ON_ONCE(atomic_read(&task->tk_count) != 2);
1160 1161 1162 1163 1164
	rpc_execute(task);

	dprintk("RPC: rpc_run_bc_task: task= %p\n", task);
	return task;
}
1165
#endif /* CONFIG_SUNRPC_BACKCHANNEL */
1166

1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185
/**
 * rpc_prepare_reply_pages - Prepare to receive a reply data payload into pages
 * @req: RPC request to prepare
 * @pages: vector of struct page pointers
 * @base: offset in first page where receive should start, in bytes
 * @len: expected size of the upper layer data payload, in bytes
 * @hdrsize: expected size of upper layer reply header, in XDR words
 *
 */
void rpc_prepare_reply_pages(struct rpc_rqst *req, struct page **pages,
			     unsigned int base, unsigned int len,
			     unsigned int hdrsize)
{
	hdrsize += RPC_REPHDRSIZE + req->rq_cred->cr_auth->au_rslack;
	xdr_inline_pages(&req->rq_rcv_buf, hdrsize << 2, pages, base, len);
	trace_rpc_reply_pages(req);
}
EXPORT_SYMBOL_GPL(rpc_prepare_reply_pages);

1186 1187 1188 1189 1190 1191 1192
void
rpc_call_start(struct rpc_task *task)
{
	task->tk_action = call_start;
}
EXPORT_SYMBOL_GPL(rpc_call_start);

1193 1194 1195 1196
/**
 * rpc_peeraddr - extract remote peer address from clnt's xprt
 * @clnt: RPC client structure
 * @buf: target buffer
1197
 * @bufsize: length of target buffer
1198 1199 1200 1201 1202 1203
 *
 * Returns the number of bytes that are actually in the stored address.
 */
size_t rpc_peeraddr(struct rpc_clnt *clnt, struct sockaddr *buf, size_t bufsize)
{
	size_t bytes;
1204 1205 1206 1207
	struct rpc_xprt *xprt;

	rcu_read_lock();
	xprt = rcu_dereference(clnt->cl_xprt);
1208

1209
	bytes = xprt->addrlen;
1210 1211
	if (bytes > bufsize)
		bytes = bufsize;
1212 1213 1214 1215
	memcpy(buf, &xprt->addr, bytes);
	rcu_read_unlock();

	return bytes;
1216
}
1217
EXPORT_SYMBOL_GPL(rpc_peeraddr);
1218

1219 1220 1221 1222 1223
/**
 * rpc_peeraddr2str - return remote peer address in printable format
 * @clnt: RPC client structure
 * @format: address format
 *
1224 1225 1226
 * NB: the lifetime of the memory referenced by the returned pointer is
 * the same as the rpc_xprt itself.  As long as the caller uses this
 * pointer, it must hold the RCU read lock.
1227
 */
1228 1229
const char *rpc_peeraddr2str(struct rpc_clnt *clnt,
			     enum rpc_display_format_t format)
1230
{
1231 1232 1233
	struct rpc_xprt *xprt;

	xprt = rcu_dereference(clnt->cl_xprt);
1234 1235 1236 1237 1238

	if (xprt->address_strings[format] != NULL)
		return xprt->address_strings[format];
	else
		return "unprintable";
1239
}
1240
EXPORT_SYMBOL_GPL(rpc_peeraddr2str);
1241

1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260
static const struct sockaddr_in rpc_inaddr_loopback = {
	.sin_family		= AF_INET,
	.sin_addr.s_addr	= htonl(INADDR_ANY),
};

static const struct sockaddr_in6 rpc_in6addr_loopback = {
	.sin6_family		= AF_INET6,
	.sin6_addr		= IN6ADDR_ANY_INIT,
};

/*
 * Try a getsockname() on a connected datagram socket.  Using a
 * connected datagram socket prevents leaving a socket in TIME_WAIT.
 * This conserves the ephemeral port number space.
 *
 * Returns zero and fills in "buf" if successful; otherwise, a
 * negative errno is returned.
 */
static int rpc_sockname(struct net *net, struct sockaddr *sap, size_t salen,
1261
			struct sockaddr *buf)
1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298
{
	struct socket *sock;
	int err;

	err = __sock_create(net, sap->sa_family,
				SOCK_DGRAM, IPPROTO_UDP, &sock, 1);
	if (err < 0) {
		dprintk("RPC:       can't create UDP socket (%d)\n", err);
		goto out;
	}

	switch (sap->sa_family) {
	case AF_INET:
		err = kernel_bind(sock,
				(struct sockaddr *)&rpc_inaddr_loopback,
				sizeof(rpc_inaddr_loopback));
		break;
	case AF_INET6:
		err = kernel_bind(sock,
				(struct sockaddr *)&rpc_in6addr_loopback,
				sizeof(rpc_in6addr_loopback));
		break;
	default:
		err = -EAFNOSUPPORT;
		goto out;
	}
	if (err < 0) {
		dprintk("RPC:       can't bind UDP socket (%d)\n", err);
		goto out_release;
	}

	err = kernel_connect(sock, sap, salen, 0);
	if (err < 0) {
		dprintk("RPC:       can't connect UDP socket (%d)\n", err);
		goto out_release;
	}

1299
	err = kernel_getsockname(sock, buf);
1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339
	if (err < 0) {
		dprintk("RPC:       getsockname failed (%d)\n", err);
		goto out_release;
	}

	err = 0;
	if (buf->sa_family == AF_INET6) {
		struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)buf;
		sin6->sin6_scope_id = 0;
	}
	dprintk("RPC:       %s succeeded\n", __func__);

out_release:
	sock_release(sock);
out:
	return err;
}

/*
 * Scraping a connected socket failed, so we don't have a useable
 * local address.  Fallback: generate an address that will prevent
 * the server from calling us back.
 *
 * Returns zero and fills in "buf" if successful; otherwise, a
 * negative errno is returned.
 */
static int rpc_anyaddr(int family, struct sockaddr *buf, size_t buflen)
{
	switch (family) {
	case AF_INET:
		if (buflen < sizeof(rpc_inaddr_loopback))
			return -EINVAL;
		memcpy(buf, &rpc_inaddr_loopback,
				sizeof(rpc_inaddr_loopback));
		break;
	case AF_INET6:
		if (buflen < sizeof(rpc_in6addr_loopback))
			return -EINVAL;
		memcpy(buf, &rpc_in6addr_loopback,
				sizeof(rpc_in6addr_loopback));
1340
		break;
1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382
	default:
		dprintk("RPC:       %s: address family not supported\n",
			__func__);
		return -EAFNOSUPPORT;
	}
	dprintk("RPC:       %s: succeeded\n", __func__);
	return 0;
}

/**
 * rpc_localaddr - discover local endpoint address for an RPC client
 * @clnt: RPC client structure
 * @buf: target buffer
 * @buflen: size of target buffer, in bytes
 *
 * Returns zero and fills in "buf" and "buflen" if successful;
 * otherwise, a negative errno is returned.
 *
 * This works even if the underlying transport is not currently connected,
 * or if the upper layer never previously provided a source address.
 *
 * The result of this function call is transient: multiple calls in
 * succession may give different results, depending on how local
 * networking configuration changes over time.
 */
int rpc_localaddr(struct rpc_clnt *clnt, struct sockaddr *buf, size_t buflen)
{
	struct sockaddr_storage address;
	struct sockaddr *sap = (struct sockaddr *)&address;
	struct rpc_xprt *xprt;
	struct net *net;
	size_t salen;
	int err;

	rcu_read_lock();
	xprt = rcu_dereference(clnt->cl_xprt);
	salen = xprt->addrlen;
	memcpy(sap, &xprt->addr, salen);
	net = get_net(xprt->xprt_net);
	rcu_read_unlock();

	rpc_set_port(sap, 0);
1383
	err = rpc_sockname(net, sap, salen, buf);
1384 1385 1386 1387 1388 1389 1390 1391
	put_net(net);
	if (err != 0)
		/* Couldn't discover local address, return ANYADDR */
		return rpc_anyaddr(sap->sa_family, buf, buflen);
	return 0;
}
EXPORT_SYMBOL_GPL(rpc_localaddr);

L
Linus Torvalds 已提交
1392 1393 1394
void
rpc_setbufsize(struct rpc_clnt *clnt, unsigned int sndsize, unsigned int rcvsize)
{
1395 1396 1397 1398
	struct rpc_xprt *xprt;

	rcu_read_lock();
	xprt = rcu_dereference(clnt->cl_xprt);
1399 1400
	if (xprt->ops->set_buffer_size)
		xprt->ops->set_buffer_size(xprt, sndsize, rcvsize);
1401
	rcu_read_unlock();
L
Linus Torvalds 已提交
1402
}
1403
EXPORT_SYMBOL_GPL(rpc_setbufsize);
L
Linus Torvalds 已提交
1404

1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423
/**
 * rpc_net_ns - Get the network namespace for this RPC client
 * @clnt: RPC client to query
 *
 */
struct net *rpc_net_ns(struct rpc_clnt *clnt)
{
	struct net *ret;

	rcu_read_lock();
	ret = rcu_dereference(clnt->cl_xprt)->xprt_net;
	rcu_read_unlock();
	return ret;
}
EXPORT_SYMBOL_GPL(rpc_net_ns);

/**
 * rpc_max_payload - Get maximum payload size for a transport, in bytes
 * @clnt: RPC client to query
L
Linus Torvalds 已提交
1424 1425 1426 1427 1428 1429 1430 1431
 *
 * For stream transports, this is one RPC record fragment (see RFC
 * 1831), as we don't support multi-record requests yet.  For datagram
 * transports, this is the size of an IP packet minus the IP, UDP, and
 * RPC header sizes.
 */
size_t rpc_max_payload(struct rpc_clnt *clnt)
{
1432 1433 1434 1435 1436 1437
	size_t ret;

	rcu_read_lock();
	ret = rcu_dereference(clnt->cl_xprt)->max_payload;
	rcu_read_unlock();
	return ret;
L
Linus Torvalds 已提交
1438
}
1439
EXPORT_SYMBOL_GPL(rpc_max_payload);
L
Linus Torvalds 已提交
1440

1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457
/**
 * rpc_max_bc_payload - Get maximum backchannel payload size, in bytes
 * @clnt: RPC client to query
 */
size_t rpc_max_bc_payload(struct rpc_clnt *clnt)
{
	struct rpc_xprt *xprt;
	size_t ret;

	rcu_read_lock();
	xprt = rcu_dereference(clnt->cl_xprt);
	ret = xprt->ops->bc_maxpayload(xprt);
	rcu_read_unlock();
	return ret;
}
EXPORT_SYMBOL_GPL(rpc_max_bc_payload);

1458 1459 1460 1461 1462 1463 1464
/**
 * rpc_force_rebind - force transport to check that remote port is unchanged
 * @clnt: client to rebind
 *
 */
void rpc_force_rebind(struct rpc_clnt *clnt)
{
1465 1466 1467 1468 1469
	if (clnt->cl_autobind) {
		rcu_read_lock();
		xprt_clear_bound(rcu_dereference(clnt->cl_xprt));
		rcu_read_unlock();
	}
1470
}
1471
EXPORT_SYMBOL_GPL(rpc_force_rebind);
1472

1473 1474 1475 1476
/*
 * Restart an (async) RPC call from the call_prepare state.
 * Usually called from within the exit handler.
 */
1477
int
1478 1479 1480
rpc_restart_call_prepare(struct rpc_task *task)
{
	if (RPC_ASSASSINATED(task))
1481
		return 0;
1482
	task->tk_action = call_start;
1483
	task->tk_status = 0;
1484 1485
	if (task->tk_ops->rpc_call_prepare != NULL)
		task->tk_action = rpc_prepare_task;
1486
	return 1;
1487 1488 1489
}
EXPORT_SYMBOL_GPL(rpc_restart_call_prepare);

L
Linus Torvalds 已提交
1490 1491 1492 1493
/*
 * Restart an (async) RPC call. Usually called from within the
 * exit handler.
 */
1494
int
L
Linus Torvalds 已提交
1495 1496 1497
rpc_restart_call(struct rpc_task *task)
{
	if (RPC_ASSASSINATED(task))
1498
		return 0;
L
Linus Torvalds 已提交
1499
	task->tk_action = call_start;
1500
	task->tk_status = 0;
1501
	return 1;
L
Linus Torvalds 已提交
1502
}
1503
EXPORT_SYMBOL_GPL(rpc_restart_call);
L
Linus Torvalds 已提交
1504

1505 1506
const char
*rpc_proc_name(const struct rpc_task *task)
1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518
{
	const struct rpc_procinfo *proc = task->tk_msg.rpc_proc;

	if (proc) {
		if (proc->p_name)
			return proc->p_name;
		else
			return "NULL";
	} else
		return "no proc";
}

L
Linus Torvalds 已提交
1519 1520 1521 1522 1523 1524 1525 1526 1527 1528
/*
 * 0.  Initial state
 *
 *     Other FSM states can be visited zero or more times, but
 *     this state is visited exactly once for each RPC.
 */
static void
call_start(struct rpc_task *task)
{
	struct rpc_clnt	*clnt = task->tk_client;
1529
	int idx = task->tk_msg.rpc_proc->p_statidx;
L
Linus Torvalds 已提交
1530

1531
	trace_rpc_request(task);
1532
	dprintk("RPC: %5u call_start %s%d proc %s (%s)\n", task->tk_pid,
1533
			clnt->cl_program->name, clnt->cl_vers,
1534
			rpc_proc_name(task),
1535
			(RPC_IS_ASYNC(task) ? "async" : "sync"));
L
Linus Torvalds 已提交
1536

1537 1538 1539
	/* Increment call count (version might not be valid for ping) */
	if (clnt->cl_program->version[clnt->cl_vers])
		clnt->cl_program->version[clnt->cl_vers]->counts[idx]++;
L
Linus Torvalds 已提交
1540 1541
	clnt->cl_stats->rpccnt++;
	task->tk_action = call_reserve;
1542
	rpc_task_set_transport(task, clnt);
L
Linus Torvalds 已提交
1543 1544 1545 1546 1547 1548 1549 1550
}

/*
 * 1.	Reserve an RPC call slot
 */
static void
call_reserve(struct rpc_task *task)
{
1551
	dprint_status(task);
L
Linus Torvalds 已提交
1552 1553 1554 1555 1556 1557

	task->tk_status  = 0;
	task->tk_action  = call_reserveresult;
	xprt_reserve(task);
}

1558 1559
static void call_retry_reserve(struct rpc_task *task);

L
Linus Torvalds 已提交
1560 1561 1562 1563 1564 1565 1566 1567
/*
 * 1b.	Grok the result of xprt_reserve()
 */
static void
call_reserveresult(struct rpc_task *task)
{
	int status = task->tk_status;

1568
	dprint_status(task);
L
Linus Torvalds 已提交
1569 1570 1571 1572 1573 1574 1575 1576

	/*
	 * After a call to xprt_reserve(), we must have either
	 * a request slot or else an error status.
	 */
	task->tk_status = 0;
	if (status >= 0) {
		if (task->tk_rqstp) {
1577
			task->tk_action = call_refresh;
L
Linus Torvalds 已提交
1578 1579 1580 1581
			return;
		}

		printk(KERN_ERR "%s: status=%d, but no request slot, exiting\n",
1582
				__func__, status);
L
Linus Torvalds 已提交
1583 1584 1585 1586 1587 1588 1589 1590 1591 1592
		rpc_exit(task, -EIO);
		return;
	}

	/*
	 * Even though there was an error, we may have acquired
	 * a request slot somehow.  Make sure not to leak it.
	 */
	if (task->tk_rqstp) {
		printk(KERN_ERR "%s: status=%d, request allocated anyway\n",
1593
				__func__, status);
L
Linus Torvalds 已提交
1594 1595 1596 1597
		xprt_release(task);
	}

	switch (status) {
1598 1599
	case -ENOMEM:
		rpc_delay(task, HZ >> 2);
1600
		/* fall through */
L
Linus Torvalds 已提交
1601
	case -EAGAIN:	/* woken up; retry */
1602
		task->tk_action = call_retry_reserve;
L
Linus Torvalds 已提交
1603 1604 1605 1606 1607
		return;
	case -EIO:	/* probably a shutdown */
		break;
	default:
		printk(KERN_ERR "%s: unrecognized error %d, exiting\n",
1608
				__func__, status);
L
Linus Torvalds 已提交
1609 1610 1611 1612 1613
		break;
	}
	rpc_exit(task, status);
}

1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626
/*
 * 1c.	Retry reserving an RPC call slot
 */
static void
call_retry_reserve(struct rpc_task *task)
{
	dprint_status(task);

	task->tk_status  = 0;
	task->tk_action  = call_reserveresult;
	xprt_retry_reserve(task);
}

L
Linus Torvalds 已提交
1627
/*
1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651
 * 2.	Bind and/or refresh the credentials
 */
static void
call_refresh(struct rpc_task *task)
{
	dprint_status(task);

	task->tk_action = call_refreshresult;
	task->tk_status = 0;
	task->tk_client->cl_stats->rpcauthrefresh++;
	rpcauth_refreshcred(task);
}

/*
 * 2a.	Process the results of a credential refresh
 */
static void
call_refreshresult(struct rpc_task *task)
{
	int status = task->tk_status;

	dprint_status(task);

	task->tk_status = 0;
1652
	task->tk_action = call_refresh;
1653
	switch (status) {
1654
	case 0:
1655
		if (rpcauth_uptodatecred(task)) {
1656
			task->tk_action = call_allocate;
1657 1658 1659 1660 1661
			return;
		}
		/* Use rate-limiting and a max number of retries if refresh
		 * had status 0 but failed to update the cred.
		 */
1662
		/* fall through */
1663 1664
	case -ETIMEDOUT:
		rpc_delay(task, 3*HZ);
1665
		/* fall through */
1666 1667
	case -EAGAIN:
		status = -EACCES;
1668
		/* fall through */
1669
	case -EKEYEXPIRED:
1670 1671 1672 1673 1674 1675
		if (!task->tk_cred_retry)
			break;
		task->tk_cred_retry--;
		dprintk("RPC: %5u %s: retry refresh creds\n",
				task->tk_pid, __func__);
		return;
1676
	}
1677 1678 1679
	dprintk("RPC: %5u %s: refresh creds failed with error %d\n",
				task->tk_pid, __func__, status);
	rpc_exit(task, status);
1680 1681 1682 1683
}

/*
 * 2b.	Allocate the buffer. For details, see sched.c:rpc_malloc.
1684
 *	(Note: buffer memory is freed in xprt_release).
L
Linus Torvalds 已提交
1685 1686 1687 1688
 */
static void
call_allocate(struct rpc_task *task)
{
1689
	unsigned int slack = task->tk_rqstp->rq_cred->cr_auth->au_cslack;
1690
	struct rpc_rqst *req = task->tk_rqstp;
1691
	struct rpc_xprt *xprt = req->rq_xprt;
1692
	const struct rpc_procinfo *proc = task->tk_msg.rpc_proc;
1693
	int status;
L
Linus Torvalds 已提交
1694

1695 1696
	dprint_status(task);

1697
	task->tk_status = 0;
1698
	task->tk_action = call_encode;
1699

1700
	if (req->rq_buffer)
L
Linus Torvalds 已提交
1701 1702
		return;

1703 1704 1705 1706 1707
	if (proc->p_proc != 0) {
		BUG_ON(proc->p_arglen == 0);
		if (proc->p_decode != NULL)
			BUG_ON(proc->p_replen == 0);
	}
L
Linus Torvalds 已提交
1708

1709 1710 1711 1712 1713 1714 1715 1716 1717 1718
	/*
	 * Calculate the size (in quads) of the RPC call
	 * and reply headers, and convert both values
	 * to byte sizes.
	 */
	req->rq_callsize = RPC_CALLHDRSIZE + (slack << 1) + proc->p_arglen;
	req->rq_callsize <<= 2;
	req->rq_rcvsize = RPC_REPHDRSIZE + slack + proc->p_replen;
	req->rq_rcvsize <<= 2;

1719
	status = xprt->ops->buf_alloc(task);
C
Chuck Lever 已提交
1720
	xprt_inject_disconnect(xprt);
1721 1722 1723 1724 1725 1726
	if (status == 0)
		return;
	if (status != -ENOMEM) {
		rpc_exit(task, status);
		return;
	}
1727 1728

	dprintk("RPC: %5u rpc_buffer allocation failed\n", task->tk_pid);
L
Linus Torvalds 已提交
1729

1730
	if (RPC_IS_ASYNC(task) || !fatal_signal_pending(current)) {
1731
		task->tk_action = call_allocate;
L
Linus Torvalds 已提交
1732 1733 1734 1735 1736 1737 1738
		rpc_delay(task, HZ>>4);
		return;
	}

	rpc_exit(task, -ERESTARTSYS);
}

1739
static int
1740 1741
rpc_task_need_encode(struct rpc_task *task)
{
1742 1743 1744 1745
	return test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate) == 0 &&
		(!(task->tk_flags & RPC_TASK_SENT) ||
		 !(task->tk_flags & RPC_TASK_NO_RETRANS_TIMEOUT) ||
		 xprt_request_need_retransmit(task));
1746 1747
}

L
Linus Torvalds 已提交
1748
static void
1749
rpc_xdr_encode(struct rpc_task *task)
L
Linus Torvalds 已提交
1750 1751
{
	struct rpc_rqst	*req = task->tk_rqstp;
1752
	struct xdr_stream xdr;
L
Linus Torvalds 已提交
1753

1754 1755 1756 1757
	xdr_buf_init(&req->rq_snd_buf,
		     req->rq_buffer,
		     req->rq_callsize);
	xdr_buf_init(&req->rq_rcv_buf,
1758
		     req->rq_rbuffer,
1759
		     req->rq_rcvsize);
L
Linus Torvalds 已提交
1760

1761 1762 1763 1764
	req->rq_snd_buf.head[0].iov_len = 0;
	xdr_init_encode(&xdr, &req->rq_snd_buf,
			req->rq_snd_buf.head[0].iov_base, req);
	if (rpc_encode_header(task, &xdr))
L
Linus Torvalds 已提交
1765
		return;
1766

1767
	task->tk_status = rpcauth_wrap_req(task, &xdr);
L
Linus Torvalds 已提交
1768 1769
}

1770 1771 1772 1773 1774 1775 1776 1777
/*
 * 3.	Encode arguments of an RPC call
 */
static void
call_encode(struct rpc_task *task)
{
	if (!rpc_task_need_encode(task))
		goto out;
1778
	dprint_status(task);
1779 1780 1781 1782 1783
	/* Encode here so that rpcsec_gss can use correct sequence number. */
	rpc_xdr_encode(task);
	/* Did the encode result in an error condition? */
	if (task->tk_status != 0) {
		/* Was the error nonfatal? */
1784 1785 1786
		switch (task->tk_status) {
		case -EAGAIN:
		case -ENOMEM:
1787
			rpc_delay(task, HZ >> 4);
1788 1789 1790 1791 1792
			break;
		case -EKEYEXPIRED:
			task->tk_action = call_refresh;
			break;
		default:
1793
			rpc_exit(task, task->tk_status);
1794
		}
1795
		return;
1796 1797
	} else {
		xprt_request_prepare(task->tk_rqstp);
1798 1799 1800 1801 1802 1803 1804 1805 1806 1807
	}

	/* Add task to reply queue before transmission to avoid races */
	if (rpc_reply_expected(task))
		xprt_request_enqueue_receive(task);
	xprt_request_enqueue_transmit(task);
out:
	task->tk_action = call_bind;
}

L
Linus Torvalds 已提交
1808 1809 1810 1811 1812 1813
/*
 * 4.	Get the server port number if not yet set
 */
static void
call_bind(struct rpc_task *task)
{
1814
	struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt;
L
Linus Torvalds 已提交
1815

1816
	dprint_status(task);
L
Linus Torvalds 已提交
1817

1818
	task->tk_action = call_connect;
1819
	if (!xprt_bound(xprt)) {
1820
		task->tk_action = call_bind_status;
1821
		task->tk_timeout = xprt->bind_timeout;
1822
		xprt->ops->rpcbind(task);
L
Linus Torvalds 已提交
1823 1824 1825 1826
	}
}

/*
1827 1828 1829 1830 1831
 * 4a.	Sort out bind result
 */
static void
call_bind_status(struct rpc_task *task)
{
1832
	int status = -EIO;
1833 1834

	if (task->tk_status >= 0) {
1835
		dprint_status(task);
1836 1837 1838 1839 1840
		task->tk_status = 0;
		task->tk_action = call_connect;
		return;
	}

1841
	trace_rpc_bind_status(task);
1842
	switch (task->tk_status) {
1843 1844 1845
	case -ENOMEM:
		dprintk("RPC: %5u rpcbind out of memory\n", task->tk_pid);
		rpc_delay(task, HZ >> 2);
1846
		goto retry_timeout;
1847
	case -EACCES:
1848 1849
		dprintk("RPC: %5u remote rpcbind: RPC program/version "
				"unavailable\n", task->tk_pid);
1850 1851 1852 1853 1854
		/* fail immediately if this is an RPC ping */
		if (task->tk_msg.rpc_proc->p_proc == 0) {
			status = -EOPNOTSUPP;
			break;
		}
1855 1856 1857
		if (task->tk_rebind_retry == 0)
			break;
		task->tk_rebind_retry--;
1858
		rpc_delay(task, 3*HZ);
1859
		goto retry_timeout;
1860
	case -ETIMEDOUT:
1861
		dprintk("RPC: %5u rpcbind request timed out\n",
1862
				task->tk_pid);
1863
		goto retry_timeout;
1864
	case -EPFNOSUPPORT:
1865
		/* server doesn't support any rpcbind version we know of */
1866
		dprintk("RPC: %5u unrecognized remote rpcbind service\n",
1867 1868 1869
				task->tk_pid);
		break;
	case -EPROTONOSUPPORT:
1870
		dprintk("RPC: %5u remote rpcbind version unavailable, retrying\n",
1871
				task->tk_pid);
1872
		goto retry_timeout;
1873 1874
	case -ECONNREFUSED:		/* connection problems */
	case -ECONNRESET:
1875
	case -ECONNABORTED:
1876 1877
	case -ENOTCONN:
	case -EHOSTDOWN:
T
Trond Myklebust 已提交
1878
	case -ENETDOWN:
1879 1880
	case -EHOSTUNREACH:
	case -ENETUNREACH:
1881
	case -ENOBUFS:
1882 1883 1884 1885 1886 1887 1888 1889 1890
	case -EPIPE:
		dprintk("RPC: %5u remote rpcbind unreachable: %d\n",
				task->tk_pid, task->tk_status);
		if (!RPC_IS_SOFTCONN(task)) {
			rpc_delay(task, 5*HZ);
			goto retry_timeout;
		}
		status = task->tk_status;
		break;
1891
	default:
1892
		dprintk("RPC: %5u unrecognized rpcbind error (%d)\n",
1893 1894 1895 1896 1897 1898
				task->tk_pid, -task->tk_status);
	}

	rpc_exit(task, status);
	return;

1899
retry_timeout:
1900
	task->tk_status = 0;
1901
	task->tk_action = call_timeout;
1902 1903 1904 1905
}

/*
 * 4b.	Connect to the RPC server
L
Linus Torvalds 已提交
1906 1907 1908 1909
 */
static void
call_connect(struct rpc_task *task)
{
1910
	struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt;
L
Linus Torvalds 已提交
1911

1912
	dprintk("RPC: %5u call_connect xprt %p %s connected\n",
1913 1914
			task->tk_pid, xprt,
			(xprt_connected(xprt) ? "is" : "is not"));
L
Linus Torvalds 已提交
1915

1916 1917 1918 1919 1920
	task->tk_action = call_transmit;
	if (!xprt_connected(xprt)) {
		task->tk_action = call_connect_status;
		if (task->tk_status < 0)
			return;
1921 1922 1923 1924
		if (task->tk_flags & RPC_TASK_NOCONNECT) {
			rpc_exit(task, -ENOTCONN);
			return;
		}
1925
		xprt_connect(task);
L
Linus Torvalds 已提交
1926 1927 1928 1929
	}
}

/*
1930
 * 4c.	Sort out connect result
L
Linus Torvalds 已提交
1931 1932 1933 1934 1935 1936 1937
 */
static void
call_connect_status(struct rpc_task *task)
{
	struct rpc_clnt *clnt = task->tk_client;
	int status = task->tk_status;

1938 1939 1940 1941 1942 1943 1944
	/* Check if the task was already transmitted */
	if (!test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) {
		xprt_end_transmit(task);
		task->tk_action = call_transmit_status;
		return;
	}

1945
	dprint_status(task);
1946

1947
	trace_rpc_connect_status(task);
1948
	task->tk_status = 0;
L
Linus Torvalds 已提交
1949
	switch (status) {
1950
	case -ECONNREFUSED:
1951 1952 1953 1954 1955 1956 1957 1958
		/* A positive refusal suggests a rebind is needed. */
		if (RPC_IS_SOFTCONN(task))
			break;
		if (clnt->cl_autobind) {
			rpc_force_rebind(clnt);
			task->tk_action = call_bind;
			return;
		}
1959
		/* fall through */
1960
	case -ECONNRESET:
1961
	case -ECONNABORTED:
T
Trond Myklebust 已提交
1962
	case -ENETDOWN:
1963
	case -ENETUNREACH:
1964
	case -EHOSTUNREACH:
1965
	case -EADDRINUSE:
1966
	case -ENOBUFS:
1967
	case -EPIPE:
1968 1969
		xprt_conditional_disconnect(task->tk_rqstp->rq_xprt,
					    task->tk_rqstp->rq_connect_cookie);
1970 1971
		if (RPC_IS_SOFTCONN(task))
			break;
1972 1973
		/* retry with existing socket, after a delay */
		rpc_delay(task, 3*HZ);
1974
		/* fall through */
T
Trond Myklebust 已提交
1975
	case -ENOTCONN:
1976
	case -EAGAIN:
1977 1978 1979
		/* Check for timeouts before looping back to call_bind */
	case -ETIMEDOUT:
		task->tk_action = call_timeout;
1980 1981
		return;
	case 0:
1982 1983 1984
		clnt->cl_stats->netreconn++;
		task->tk_action = call_transmit;
		return;
L
Linus Torvalds 已提交
1985
	}
1986
	rpc_exit(task, status);
L
Linus Torvalds 已提交
1987 1988 1989 1990 1991 1992 1993 1994
}

/*
 * 5.	Transmit the RPC request, and wait for reply
 */
static void
call_transmit(struct rpc_task *task)
{
1995
	dprint_status(task);
L
Linus Torvalds 已提交
1996

1997 1998 1999 2000 2001 2002
	task->tk_status = 0;
	if (test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) {
		if (!xprt_prepare_transmit(task))
			return;
		xprt_transmit(task);
	}
2003
	task->tk_action = call_transmit_status;
2004
	xprt_end_transmit(task);
2005 2006 2007 2008 2009 2010 2011 2012 2013
}

/*
 * 5a.	Handle cleanup after a transmission
 */
static void
call_transmit_status(struct rpc_task *task)
{
	task->tk_action = call_status;
2014 2015 2016 2017 2018 2019

	/*
	 * Common case: success.  Force the compiler to put this
	 * test first.
	 */
	if (task->tk_status == 0) {
2020
		xprt_request_wait_receive(task);
2021 2022 2023
		return;
	}

2024 2025
	switch (task->tk_status) {
	default:
2026
		dprint_status(task);
2027
		break;
2028
	case -EBADMSG:
2029 2030
		task->tk_status = 0;
		task->tk_action = call_encode;
2031
		break;
2032 2033 2034 2035 2036 2037
		/*
		 * Special cases: if we've been waiting on the
		 * socket's write_space() callback, or if the
		 * socket just returned a connection error,
		 * then hold onto the transport lock.
		 */
2038 2039 2040
	case -ENOBUFS:
		rpc_delay(task, HZ>>2);
		/* fall through */
2041
	case -EBADSLT:
2042 2043 2044 2045
	case -EAGAIN:
		task->tk_action = call_transmit;
		task->tk_status = 0;
		break;
2046 2047
	case -ECONNREFUSED:
	case -EHOSTDOWN:
T
Trond Myklebust 已提交
2048
	case -ENETDOWN:
2049 2050
	case -EHOSTUNREACH:
	case -ENETUNREACH:
2051
	case -EPERM:
2052
		if (RPC_IS_SOFTCONN(task)) {
2053 2054 2055
			if (!task->tk_msg.rpc_proc->p_proc)
				trace_xprt_ping(task->tk_xprt,
						task->tk_status);
2056 2057 2058
			rpc_exit(task, task->tk_status);
			break;
		}
2059
		/* fall through */
2060
	case -ECONNRESET:
2061
	case -ECONNABORTED:
2062
	case -EADDRINUSE:
2063
	case -ENOTCONN:
2064
	case -EPIPE:
2065
		break;
2066
	}
L
Linus Torvalds 已提交
2067 2068
}

2069
#if defined(CONFIG_SUNRPC_BACKCHANNEL)
2070 2071 2072 2073 2074 2075 2076 2077 2078
/*
 * 5b.	Send the backchannel RPC reply.  On error, drop the reply.  In
 * addition, disconnect on connectivity errors.
 */
static void
call_bc_transmit(struct rpc_task *task)
{
	struct rpc_rqst *req = task->tk_rqstp;

2079 2080
	if (rpc_task_need_encode(task))
		xprt_request_enqueue_transmit(task);
2081 2082
	if (!test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate))
		goto out_wakeup;
2083

2084 2085
	if (!xprt_prepare_transmit(task))
		goto out_retry;
2086 2087 2088 2089

	if (task->tk_status < 0) {
		printk(KERN_NOTICE "RPC: Could not send backchannel reply "
			"error: %d\n", task->tk_status);
2090
		goto out_done;
2091 2092 2093
	}

	xprt_transmit(task);
2094

2095 2096 2097 2098 2099
	xprt_end_transmit(task);
	dprint_status(task);
	switch (task->tk_status) {
	case 0:
		/* Success */
T
Trond Myklebust 已提交
2100
	case -ENETDOWN:
2101 2102 2103
	case -EHOSTDOWN:
	case -EHOSTUNREACH:
	case -ENETUNREACH:
2104 2105 2106 2107 2108 2109
	case -ECONNRESET:
	case -ECONNREFUSED:
	case -EADDRINUSE:
	case -ENOTCONN:
	case -EPIPE:
		break;
2110 2111
	case -EAGAIN:
		goto out_retry;
2112 2113 2114 2115 2116 2117 2118 2119 2120 2121
	case -ETIMEDOUT:
		/*
		 * Problem reaching the server.  Disconnect and let the
		 * forechannel reestablish the connection.  The server will
		 * have to retransmit the backchannel request and we'll
		 * reprocess it.  Since these ops are idempotent, there's no
		 * need to cache our reply at this time.
		 */
		printk(KERN_NOTICE "RPC: Could not send backchannel reply "
			"error: %d\n", task->tk_status);
2122
		xprt_conditional_disconnect(req->rq_xprt,
2123 2124 2125 2126 2127 2128 2129
			req->rq_connect_cookie);
		break;
	default:
		/*
		 * We were unable to reply and will have to drop the
		 * request.  The server should reconnect and retransmit.
		 */
2130
		WARN_ON_ONCE(task->tk_status == -EAGAIN);
2131 2132 2133 2134
		printk(KERN_NOTICE "RPC: Could not send backchannel reply "
			"error: %d\n", task->tk_status);
		break;
	}
2135
out_wakeup:
2136
	rpc_wake_up_queued_task(&req->rq_xprt->pending, task);
2137 2138 2139 2140 2141
out_done:
	task->tk_action = rpc_exit_task;
	return;
out_retry:
	task->tk_status = 0;
2142
}
2143
#endif /* CONFIG_SUNRPC_BACKCHANNEL */
2144

L
Linus Torvalds 已提交
2145 2146 2147 2148 2149 2150 2151 2152 2153
/*
 * 6.	Sort out the RPC call status
 */
static void
call_status(struct rpc_task *task)
{
	struct rpc_clnt	*clnt = task->tk_client;
	int		status;

2154 2155 2156
	if (!task->tk_msg.rpc_proc->p_proc)
		trace_xprt_ping(task->tk_xprt, task->tk_status);

2157
	dprint_status(task);
L
Linus Torvalds 已提交
2158 2159 2160 2161 2162 2163 2164

	status = task->tk_status;
	if (status >= 0) {
		task->tk_action = call_decode;
		return;
	}

2165
	trace_rpc_call_status(task);
L
Linus Torvalds 已提交
2166 2167
	task->tk_status = 0;
	switch(status) {
2168
	case -EHOSTDOWN:
T
Trond Myklebust 已提交
2169
	case -ENETDOWN:
2170 2171
	case -EHOSTUNREACH:
	case -ENETUNREACH:
2172
	case -EPERM:
2173 2174 2175 2176
		if (RPC_IS_SOFTCONN(task)) {
			rpc_exit(task, status);
			break;
		}
2177 2178 2179 2180 2181
		/*
		 * Delay any retries for 3 seconds, then handle as if it
		 * were a timeout.
		 */
		rpc_delay(task, 3*HZ);
2182
		/* fall through */
L
Linus Torvalds 已提交
2183 2184 2185 2186
	case -ETIMEDOUT:
		task->tk_action = call_timeout;
		break;
	case -ECONNREFUSED:
2187 2188
	case -ECONNRESET:
	case -ECONNABORTED:
2189
		rpc_force_rebind(clnt);
2190
		/* fall through */
2191
	case -EADDRINUSE:
2192
		rpc_delay(task, 3*HZ);
2193
		/* fall through */
2194 2195
	case -EPIPE:
	case -ENOTCONN:
L
Linus Torvalds 已提交
2196
	case -EAGAIN:
2197
		task->tk_action = call_encode;
L
Linus Torvalds 已提交
2198 2199 2200 2201 2202 2203
		break;
	case -EIO:
		/* shutdown or soft timeout */
		rpc_exit(task, status);
		break;
	default:
O
Olga Kornievskaia 已提交
2204 2205
		if (clnt->cl_chatty)
			printk("%s: RPC call returned error %d\n",
2206
			       clnt->cl_program->name, -status);
L
Linus Torvalds 已提交
2207 2208 2209 2210 2211
		rpc_exit(task, status);
	}
}

/*
2212
 * 6a.	Handle RPC timeout
L
Linus Torvalds 已提交
2213 2214 2215 2216 2217 2218 2219 2220 2221
 * 	We do not release the request slot, so we keep using the
 *	same XID for all retransmits.
 */
static void
call_timeout(struct rpc_task *task)
{
	struct rpc_clnt	*clnt = task->tk_client;

	if (xprt_adjust_timeout(task->tk_rqstp) == 0) {
2222
		dprintk("RPC: %5u call_timeout (minor)\n", task->tk_pid);
L
Linus Torvalds 已提交
2223 2224 2225
		goto retry;
	}

2226
	dprintk("RPC: %5u call_timeout (major)\n", task->tk_pid);
2227 2228
	task->tk_timeouts++;

2229 2230 2231 2232
	if (RPC_IS_SOFTCONN(task)) {
		rpc_exit(task, -ETIMEDOUT);
		return;
	}
L
Linus Torvalds 已提交
2233
	if (RPC_IS_SOFT(task)) {
J
Joe Perches 已提交
2234
		if (clnt->cl_chatty) {
O
Olga Kornievskaia 已提交
2235
			printk(KERN_NOTICE "%s: server %s not responding, timed out\n",
2236
				clnt->cl_program->name,
2237
				task->tk_xprt->servername);
J
Joe Perches 已提交
2238
		}
2239 2240 2241 2242
		if (task->tk_flags & RPC_TASK_TIMEOUT)
			rpc_exit(task, -ETIMEDOUT);
		else
			rpc_exit(task, -EIO);
L
Linus Torvalds 已提交
2243 2244 2245
		return;
	}

C
Chuck Lever 已提交
2246
	if (!(task->tk_flags & RPC_CALL_MAJORSEEN)) {
L
Linus Torvalds 已提交
2247
		task->tk_flags |= RPC_CALL_MAJORSEEN;
2248
		if (clnt->cl_chatty) {
O
Olga Kornievskaia 已提交
2249
			printk(KERN_NOTICE "%s: server %s not responding, still trying\n",
2250
			clnt->cl_program->name,
2251
			task->tk_xprt->servername);
2252
		}
L
Linus Torvalds 已提交
2253
	}
2254
	rpc_force_rebind(clnt);
2255 2256 2257 2258 2259
	/*
	 * Did our request time out due to an RPCSEC_GSS out-of-sequence
	 * event? RFC2203 requires the server to drop all such requests.
	 */
	rpcauth_invalcred(task);
L
Linus Torvalds 已提交
2260 2261

retry:
2262
	task->tk_action = call_encode;
L
Linus Torvalds 已提交
2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273
	task->tk_status = 0;
}

/*
 * 7.	Decode the RPC reply
 */
static void
call_decode(struct rpc_task *task)
{
	struct rpc_clnt	*clnt = task->tk_client;
	struct rpc_rqst	*req = task->tk_rqstp;
2274
	struct xdr_stream xdr;
L
Linus Torvalds 已提交
2275

2276
	dprint_status(task);
L
Linus Torvalds 已提交
2277

2278
	if (!task->tk_msg.rpc_proc->p_decode) {
2279 2280 2281 2282
		task->tk_action = rpc_exit_task;
		return;
	}

C
Chuck Lever 已提交
2283
	if (task->tk_flags & RPC_CALL_MAJORSEEN) {
2284
		if (clnt->cl_chatty) {
O
Olga Kornievskaia 已提交
2285
			printk(KERN_NOTICE "%s: server %s OK\n",
2286
				clnt->cl_program->name,
2287
				task->tk_xprt->servername);
2288
		}
L
Linus Torvalds 已提交
2289 2290 2291
		task->tk_flags &= ~RPC_CALL_MAJORSEEN;
	}

2292 2293
	/*
	 * Ensure that we see all writes made by xprt_complete_rqst()
2294
	 * before it changed req->rq_reply_bytes_recvd.
2295 2296
	 */
	smp_rmb();
L
Linus Torvalds 已提交
2297 2298 2299 2300 2301 2302
	req->rq_rcv_buf.len = req->rq_private_buf.len;

	/* Check that the softirq receive buffer is valid */
	WARN_ON(memcmp(&req->rq_rcv_buf, &req->rq_private_buf,
				sizeof(req->rq_rcv_buf)) != 0);

2303 2304
	if (req->rq_rcv_buf.len < 12) {
		if (!RPC_IS_SOFT(task)) {
2305
			task->tk_action = call_encode;
2306 2307 2308
			goto out_retry;
		}
		dprintk("RPC:       %s: too small RPC reply size (%d bytes)\n",
2309
				clnt->cl_program->name, task->tk_status);
2310 2311 2312 2313
		task->tk_action = call_timeout;
		goto out_retry;
	}

2314 2315 2316 2317 2318 2319 2320 2321
	xdr_init_decode(&xdr, &req->rq_rcv_buf,
			req->rq_rcv_buf.head[0].iov_base, req);
	switch (rpc_decode_header(task, &xdr)) {
	case 0:
		task->tk_action = rpc_exit_task;
		task->tk_status = rpcauth_unwrap_resp(task, &xdr);
		dprintk("RPC: %5u %s result %d\n",
			task->tk_pid, __func__, task->tk_status);
T
Trond Myklebust 已提交
2322
		return;
2323
	case -EAGAIN:
L
Linus Torvalds 已提交
2324
out_retry:
2325 2326 2327 2328 2329 2330 2331 2332 2333 2334
		task->tk_status = 0;
		/* Note: rpc_decode_header() may have freed the RPC slot */
		if (task->tk_rqstp == req) {
			xdr_free_bvec(&req->rq_rcv_buf);
			req->rq_reply_bytes_recvd = 0;
			req->rq_rcv_buf.len = 0;
			if (task->tk_client->cl_discrtry)
				xprt_conditional_disconnect(req->rq_xprt,
							    req->rq_connect_cookie);
		}
2335
	}
L
Linus Torvalds 已提交
2336 2337
}

2338 2339
static int
rpc_encode_header(struct rpc_task *task, struct xdr_stream *xdr)
L
Linus Torvalds 已提交
2340 2341 2342
{
	struct rpc_clnt *clnt = task->tk_client;
	struct rpc_rqst	*req = task->tk_rqstp;
2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364
	__be32 *p;
	int error;

	error = -EMSGSIZE;
	p = xdr_reserve_space(xdr, RPC_CALLHDRSIZE << 2);
	if (!p)
		goto out_fail;
	*p++ = req->rq_xid;
	*p++ = rpc_call;
	*p++ = cpu_to_be32(RPC_VERSION);
	*p++ = cpu_to_be32(clnt->cl_prog);
	*p++ = cpu_to_be32(clnt->cl_vers);
	*p   = cpu_to_be32(task->tk_msg.rpc_proc->p_proc);

	error = rpcauth_marshcred(task, xdr);
	if (error < 0)
		goto out_fail;
	return 0;
out_fail:
	trace_rpc_bad_callhdr(task);
	rpc_exit(task, error);
	return error;
L
Linus Torvalds 已提交
2365 2366
}

2367 2368
static noinline int
rpc_decode_header(struct rpc_task *task, struct xdr_stream *xdr)
L
Linus Torvalds 已提交
2369
{
2370
	struct rpc_clnt *clnt = task->tk_client;
L
Linus Torvalds 已提交
2371
	int error = -EACCES;
2372
	__be32 *p;
L
Linus Torvalds 已提交
2373

2374 2375 2376 2377 2378 2379 2380
	/* RFC-1014 says that the representation of XDR data must be a
	 * multiple of four bytes
	 * - if it isn't pointer subtraction in the NFS client may give
	 *   undefined results
	 */
	if (task->tk_rqstp->rq_rcv_buf.len & 3)
		goto out_badlen;
L
Linus Torvalds 已提交
2381

2382 2383 2384
	p = xdr_inline_decode(xdr, 3 * sizeof(*p));
	if (!p)
		goto out_unparsable;
2385 2386 2387 2388 2389
	p++;	/* skip XID */
	if (*p++ != rpc_reply)
		goto out_unparsable;
	if (*p++ != rpc_msg_accepted)
		goto out_msg_denied;
2390

2391 2392
	error = rpcauth_checkverf(task, xdr);
	if (error)
2393 2394
		goto out_verifier;

2395 2396
	p = xdr_inline_decode(xdr, sizeof(*p));
	if (!p)
2397
		goto out_unparsable;
2398
	switch (*p) {
2399
	case rpc_success:
2400
		return 0;
2401 2402
	case rpc_prog_unavail:
		trace_rpc__prog_unavail(task);
2403 2404
		error = -EPFNOSUPPORT;
		goto out_err;
2405 2406
	case rpc_prog_mismatch:
		trace_rpc__prog_mismatch(task);
2407 2408
		error = -EPROTONOSUPPORT;
		goto out_err;
2409 2410
	case rpc_proc_unavail:
		trace_rpc__proc_unavail(task);
2411 2412
		error = -EOPNOTSUPP;
		goto out_err;
2413 2414 2415
	case rpc_garbage_args:
		trace_rpc__garbage_args(task);
		break;
L
Linus Torvalds 已提交
2416
	default:
2417
		trace_rpc__unparsable(task);
L
Linus Torvalds 已提交
2418 2419
	}

T
Trond Myklebust 已提交
2420
out_garbage:
2421
	clnt->cl_stats->rpcgarbage++;
L
Linus Torvalds 已提交
2422 2423
	if (task->tk_garb_retry) {
		task->tk_garb_retry--;
2424
		task->tk_action = call_encode;
2425
		return -EAGAIN;
L
Linus Torvalds 已提交
2426 2427 2428
	}
out_err:
	rpc_exit(task, error);
2429
	return error;
2430 2431 2432 2433 2434 2435 2436 2437 2438

out_badlen:
	trace_rpc__unparsable(task);
	error = -EIO;
	goto out_err;

out_unparsable:
	trace_rpc__unparsable(task);
	error = -EIO;
T
Trond Myklebust 已提交
2439
	goto out_garbage;
2440 2441 2442 2443 2444 2445

out_verifier:
	trace_rpc_bad_verifier(task);
	goto out_garbage;

out_msg_denied:
2446 2447 2448
	p = xdr_inline_decode(xdr, sizeof(*p));
	if (!p)
		goto out_unparsable;
2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461
	switch (*p++) {
	case rpc_auth_error:
		break;
	case rpc_mismatch:
		trace_rpc__mismatch(task);
		error = -EPROTONOSUPPORT;
		goto out_err;
	default:
		trace_rpc__unparsable(task);
		error = -EIO;
		goto out_err;
	}

2462 2463 2464
	p = xdr_inline_decode(xdr, sizeof(*p));
	if (!p)
		goto out_unparsable;
2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477
	switch (*p++) {
	case rpc_autherr_rejectedcred:
	case rpc_autherr_rejectedverf:
	case rpcsec_gsserr_credproblem:
	case rpcsec_gsserr_ctxproblem:
		if (!task->tk_cred_retry)
			break;
		task->tk_cred_retry--;
		trace_rpc__stale_creds(task);
		rpcauth_invalcred(task);
		/* Ensure we obtain a new XID! */
		xprt_release(task);
		task->tk_action = call_reserve;
2478
		return -EAGAIN;
2479 2480 2481 2482 2483 2484 2485 2486
	case rpc_autherr_badcred:
	case rpc_autherr_badverf:
		/* possibly garbled cred/verf? */
		if (!task->tk_garb_retry)
			break;
		task->tk_garb_retry--;
		trace_rpc__bad_creds(task);
		task->tk_action = call_encode;
2487
		return -EAGAIN;
2488 2489 2490 2491 2492 2493 2494 2495 2496 2497
	case rpc_autherr_tooweak:
		trace_rpc__auth_tooweak(task);
		pr_warn("RPC: server %s requires stronger authentication.\n",
			task->tk_xprt->servername);
		break;
	default:
		trace_rpc__unparsable(task);
		error = -EIO;
	}
	goto out_err;
L
Linus Torvalds 已提交
2498
}
2499

2500 2501
static void rpcproc_encode_null(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
		const void *obj)
2502 2503 2504
{
}

2505 2506
static int rpcproc_decode_null(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
		void *obj)
2507 2508 2509 2510
{
	return 0;
}

2511
static const struct rpc_procinfo rpcproc_null = {
2512 2513 2514 2515
	.p_encode = rpcproc_encode_null,
	.p_decode = rpcproc_decode_null,
};

2516
static int rpc_ping(struct rpc_clnt *clnt)
2517 2518 2519 2520 2521
{
	struct rpc_message msg = {
		.rpc_proc = &rpcproc_null,
	};
	int err;
2522 2523
	err = rpc_call_sync(clnt, &msg, RPC_TASK_SOFT | RPC_TASK_SOFTCONN |
			    RPC_TASK_NULLCREDS);
2524 2525
	return err;
}
2526

2527 2528 2529 2530
static
struct rpc_task *rpc_call_null_helper(struct rpc_clnt *clnt,
		struct rpc_xprt *xprt, struct rpc_cred *cred, int flags,
		const struct rpc_call_ops *ops, void *data)
2531 2532 2533 2534
{
	struct rpc_message msg = {
		.rpc_proc = &rpcproc_null,
	};
2535 2536
	struct rpc_task_setup task_setup_data = {
		.rpc_client = clnt,
2537
		.rpc_xprt = xprt,
2538
		.rpc_message = &msg,
2539
		.rpc_op_cred = cred,
2540 2541
		.callback_ops = (ops != NULL) ? ops : &rpc_default_ops,
		.callback_data = data,
2542
		.flags = flags | RPC_TASK_NULLCREDS,
2543
	};
2544

T
Trond Myklebust 已提交
2545
	return rpc_run_task(&task_setup_data);
2546
}
2547 2548 2549 2550 2551

struct rpc_task *rpc_call_null(struct rpc_clnt *clnt, struct rpc_cred *cred, int flags)
{
	return rpc_call_null_helper(clnt, NULL, cred, flags, NULL, NULL);
}
2552
EXPORT_SYMBOL_GPL(rpc_call_null);
2553

2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575
struct rpc_cb_add_xprt_calldata {
	struct rpc_xprt_switch *xps;
	struct rpc_xprt *xprt;
};

static void rpc_cb_add_xprt_done(struct rpc_task *task, void *calldata)
{
	struct rpc_cb_add_xprt_calldata *data = calldata;

	if (task->tk_status == 0)
		rpc_xprt_switch_add_xprt(data->xps, data->xprt);
}

static void rpc_cb_add_xprt_release(void *calldata)
{
	struct rpc_cb_add_xprt_calldata *data = calldata;

	xprt_put(data->xprt);
	xprt_switch_put(data->xps);
	kfree(data);
}

2576
static const struct rpc_call_ops rpc_cb_add_xprt_call_ops = {
2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600
	.rpc_call_done = rpc_cb_add_xprt_done,
	.rpc_release = rpc_cb_add_xprt_release,
};

/**
 * rpc_clnt_test_and_add_xprt - Test and add a new transport to a rpc_clnt
 * @clnt: pointer to struct rpc_clnt
 * @xps: pointer to struct rpc_xprt_switch,
 * @xprt: pointer struct rpc_xprt
 * @dummy: unused
 */
int rpc_clnt_test_and_add_xprt(struct rpc_clnt *clnt,
		struct rpc_xprt_switch *xps, struct rpc_xprt *xprt,
		void *dummy)
{
	struct rpc_cb_add_xprt_calldata *data;
	struct rpc_task *task;

	data = kmalloc(sizeof(*data), GFP_NOFS);
	if (!data)
		return -ENOMEM;
	data->xps = xprt_switch_get(xps);
	data->xprt = xprt_get(xprt);

2601 2602
	task = rpc_call_null_helper(clnt, xprt, NULL,
			RPC_TASK_SOFT|RPC_TASK_SOFTCONN|RPC_TASK_ASYNC|RPC_TASK_NULLCREDS,
2603 2604 2605 2606 2607 2608 2609 2610
			&rpc_cb_add_xprt_call_ops, data);
	if (IS_ERR(task))
		return PTR_ERR(task);
	rpc_put_task(task);
	return 1;
}
EXPORT_SYMBOL_GPL(rpc_clnt_test_and_add_xprt);

2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644
/**
 * rpc_clnt_setup_test_and_add_xprt()
 *
 * This is an rpc_clnt_add_xprt setup() function which returns 1 so:
 *   1) caller of the test function must dereference the rpc_xprt_switch
 *   and the rpc_xprt.
 *   2) test function must call rpc_xprt_switch_add_xprt, usually in
 *   the rpc_call_done routine.
 *
 * Upon success (return of 1), the test function adds the new
 * transport to the rpc_clnt xprt switch
 *
 * @clnt: struct rpc_clnt to get the new transport
 * @xps:  the rpc_xprt_switch to hold the new transport
 * @xprt: the rpc_xprt to test
 * @data: a struct rpc_add_xprt_test pointer that holds the test function
 *        and test function call data
 */
int rpc_clnt_setup_test_and_add_xprt(struct rpc_clnt *clnt,
				     struct rpc_xprt_switch *xps,
				     struct rpc_xprt *xprt,
				     void *data)
{
	struct rpc_task *task;
	struct rpc_add_xprt_test *xtest = (struct rpc_add_xprt_test *)data;
	int status = -EADDRINUSE;

	xprt = xprt_get(xprt);
	xprt_switch_get(xps);

	if (rpc_xprt_switch_has_addr(xps, (struct sockaddr *)&xprt->addr))
		goto out_err;

	/* Test the connection */
2645 2646
	task = rpc_call_null_helper(clnt, xprt, NULL,
				    RPC_TASK_SOFT | RPC_TASK_SOFTCONN | RPC_TASK_NULLCREDS,
2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660
				    NULL, NULL);
	if (IS_ERR(task)) {
		status = PTR_ERR(task);
		goto out_err;
	}
	status = task->tk_status;
	rpc_put_task(task);

	if (status < 0)
		goto out_err;

	/* rpc_xprt_switch and rpc_xprt are deferrenced by add_xprt_test() */
	xtest->add_xprt_test(clnt, xprt, xtest->data);

2661 2662 2663
	xprt_put(xprt);
	xprt_switch_put(xps);

2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674
	/* so that rpc_clnt_add_xprt does not call rpc_xprt_switch_add_xprt */
	return 1;
out_err:
	xprt_put(xprt);
	xprt_switch_put(xps);
	pr_info("RPC:   rpc_clnt_test_xprt failed: %d addr %s not added\n",
		status, xprt->address_strings[RPC_DISPLAY_ADDR]);
	return status;
}
EXPORT_SYMBOL_GPL(rpc_clnt_setup_test_and_add_xprt);

2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697
/**
 * rpc_clnt_add_xprt - Add a new transport to a rpc_clnt
 * @clnt: pointer to struct rpc_clnt
 * @xprtargs: pointer to struct xprt_create
 * @setup: callback to test and/or set up the connection
 * @data: pointer to setup function data
 *
 * Creates a new transport using the parameters set in args and
 * adds it to clnt.
 * If ping is set, then test that connectivity succeeds before
 * adding the new transport.
 *
 */
int rpc_clnt_add_xprt(struct rpc_clnt *clnt,
		struct xprt_create *xprtargs,
		int (*setup)(struct rpc_clnt *,
			struct rpc_xprt_switch *,
			struct rpc_xprt *,
			void *),
		void *data)
{
	struct rpc_xprt_switch *xps;
	struct rpc_xprt *xprt;
2698
	unsigned long connect_timeout;
2699
	unsigned long reconnect_timeout;
2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710
	unsigned char resvport;
	int ret = 0;

	rcu_read_lock();
	xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch));
	xprt = xprt_iter_xprt(&clnt->cl_xpi);
	if (xps == NULL || xprt == NULL) {
		rcu_read_unlock();
		return -EAGAIN;
	}
	resvport = xprt->resvport;
2711
	connect_timeout = xprt->connect_timeout;
2712
	reconnect_timeout = xprt->max_reconnect_timeout;
2713 2714 2715 2716 2717 2718 2719 2720
	rcu_read_unlock();

	xprt = xprt_create_transport(xprtargs);
	if (IS_ERR(xprt)) {
		ret = PTR_ERR(xprt);
		goto out_put_switch;
	}
	xprt->resvport = resvport;
2721 2722 2723 2724
	if (xprt->ops->set_connect_timeout != NULL)
		xprt->ops->set_connect_timeout(xprt,
				connect_timeout,
				reconnect_timeout);
2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740

	rpc_xprt_switch_set_roundrobin(xps);
	if (setup) {
		ret = setup(clnt, xps, xprt, data);
		if (ret != 0)
			goto out_put_xprt;
	}
	rpc_xprt_switch_add_xprt(xps, xprt);
out_put_xprt:
	xprt_put(xprt);
out_put_switch:
	xprt_switch_put(xps);
	return ret;
}
EXPORT_SYMBOL_GPL(rpc_clnt_add_xprt);

2741 2742 2743 2744 2745
struct connect_timeout_data {
	unsigned long connect_timeout;
	unsigned long reconnect_timeout;
};

2746
static int
2747
rpc_xprt_set_connect_timeout(struct rpc_clnt *clnt,
2748 2749 2750
		struct rpc_xprt *xprt,
		void *data)
{
2751
	struct connect_timeout_data *timeo = data;
2752

2753 2754 2755 2756
	if (xprt->ops->set_connect_timeout)
		xprt->ops->set_connect_timeout(xprt,
				timeo->connect_timeout,
				timeo->reconnect_timeout);
2757 2758 2759 2760
	return 0;
}

void
2761 2762 2763
rpc_set_connect_timeout(struct rpc_clnt *clnt,
		unsigned long connect_timeout,
		unsigned long reconnect_timeout)
2764
{
2765
	struct connect_timeout_data timeout = {
2766 2767
		.connect_timeout = connect_timeout,
		.reconnect_timeout = reconnect_timeout,
2768
	};
2769
	rpc_clnt_iterate_for_each_xprt(clnt,
2770 2771
			rpc_xprt_set_connect_timeout,
			&timeout);
2772
}
2773
EXPORT_SYMBOL_GPL(rpc_set_connect_timeout);
2774

A
Andy Adamson 已提交
2775 2776
void rpc_clnt_xprt_switch_put(struct rpc_clnt *clnt)
{
A
Anna Schumaker 已提交
2777
	rcu_read_lock();
A
Andy Adamson 已提交
2778
	xprt_switch_put(rcu_dereference(clnt->cl_xpi.xpi_xpswitch));
A
Anna Schumaker 已提交
2779
	rcu_read_unlock();
A
Andy Adamson 已提交
2780 2781 2782
}
EXPORT_SYMBOL_GPL(rpc_clnt_xprt_switch_put);

2783 2784
void rpc_clnt_xprt_switch_add_xprt(struct rpc_clnt *clnt, struct rpc_xprt *xprt)
{
A
Anna Schumaker 已提交
2785
	rcu_read_lock();
2786 2787
	rpc_xprt_switch_add_xprt(rcu_dereference(clnt->cl_xpi.xpi_xpswitch),
				 xprt);
A
Anna Schumaker 已提交
2788
	rcu_read_unlock();
2789 2790 2791
}
EXPORT_SYMBOL_GPL(rpc_clnt_xprt_switch_add_xprt);

2792 2793 2794 2795 2796 2797 2798
bool rpc_clnt_xprt_switch_has_addr(struct rpc_clnt *clnt,
				   const struct sockaddr *sap)
{
	struct rpc_xprt_switch *xps;
	bool ret;

	rcu_read_lock();
A
Anna Schumaker 已提交
2799
	xps = rcu_dereference(clnt->cl_xpi.xpi_xpswitch);
2800 2801 2802 2803 2804 2805
	ret = rpc_xprt_switch_has_addr(xps, sap);
	rcu_read_unlock();
	return ret;
}
EXPORT_SYMBOL_GPL(rpc_clnt_xprt_switch_has_addr);

J
Jeff Layton 已提交
2806
#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
2807 2808
static void rpc_show_header(void)
{
2809 2810
	printk(KERN_INFO "-pid- flgs status -client- --rqstp- "
		"-timeout ---ops--\n");
2811 2812
}

C
Chuck Lever 已提交
2813 2814 2815 2816 2817 2818 2819 2820
static void rpc_show_task(const struct rpc_clnt *clnt,
			  const struct rpc_task *task)
{
	const char *rpc_waitq = "none";

	if (RPC_IS_QUEUED(task))
		rpc_waitq = rpc_qname(task->tk_waitqueue);

2821
	printk(KERN_INFO "%5u %04x %6d %8p %8p %8ld %8p %sv%u %s a:%ps q:%s\n",
2822 2823
		task->tk_pid, task->tk_flags, task->tk_status,
		clnt, task->tk_rqstp, task->tk_timeout, task->tk_ops,
2824
		clnt->cl_program->name, clnt->cl_vers, rpc_proc_name(task),
2825
		task->tk_action, rpc_waitq);
C
Chuck Lever 已提交
2826 2827
}

2828
void rpc_show_tasks(struct net *net)
2829 2830
{
	struct rpc_clnt *clnt;
C
Chuck Lever 已提交
2831
	struct rpc_task *task;
2832
	int header = 0;
2833
	struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
2834

2835 2836
	spin_lock(&sn->rpc_client_lock);
	list_for_each_entry(clnt, &sn->all_clients, cl_clients) {
2837
		spin_lock(&clnt->cl_lock);
C
Chuck Lever 已提交
2838
		list_for_each_entry(task, &clnt->cl_tasks, tk_task) {
2839 2840 2841 2842
			if (!header) {
				rpc_show_header();
				header++;
			}
C
Chuck Lever 已提交
2843
			rpc_show_task(clnt, task);
2844 2845 2846
		}
		spin_unlock(&clnt->cl_lock);
	}
2847
	spin_unlock(&sn->rpc_client_lock);
2848 2849
}
#endif
2850 2851

#if IS_ENABLED(CONFIG_SUNRPC_SWAP)
2852 2853 2854 2855 2856 2857 2858 2859
static int
rpc_clnt_swap_activate_callback(struct rpc_clnt *clnt,
		struct rpc_xprt *xprt,
		void *dummy)
{
	return xprt_enable_swap(xprt);
}

2860 2861 2862
int
rpc_clnt_swap_activate(struct rpc_clnt *clnt)
{
2863 2864 2865 2866
	if (atomic_inc_return(&clnt->cl_swapper) == 1)
		return rpc_clnt_iterate_for_each_xprt(clnt,
				rpc_clnt_swap_activate_callback, NULL);
	return 0;
2867 2868 2869
}
EXPORT_SYMBOL_GPL(rpc_clnt_swap_activate);

2870 2871 2872 2873 2874 2875 2876 2877 2878
static int
rpc_clnt_swap_deactivate_callback(struct rpc_clnt *clnt,
		struct rpc_xprt *xprt,
		void *dummy)
{
	xprt_disable_swap(xprt);
	return 0;
}

2879 2880 2881
void
rpc_clnt_swap_deactivate(struct rpc_clnt *clnt)
{
2882 2883 2884
	if (atomic_dec_if_positive(&clnt->cl_swapper) == 0)
		rpc_clnt_iterate_for_each_xprt(clnt,
				rpc_clnt_swap_deactivate_callback, NULL);
2885 2886 2887
}
EXPORT_SYMBOL_GPL(rpc_clnt_swap_deactivate);
#endif /* CONFIG_SUNRPC_SWAP */