clnt.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:22k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/net/sunrpc/rpcclnt.c
  3.  *
  4.  *  This file contains the high-level RPC interface.
  5.  *  It is modeled as a finite state machine to support both synchronous
  6.  *  and asynchronous requests.
  7.  *
  8.  *  - RPC header generation and argument serialization.
  9.  *  - Credential refresh.
  10.  *  - TCP reconnect handling (when finished).
  11.  *  - Retry of operation when it is suspected the operation failed because
  12.  * of uid squashing on the server, or when the credentials were stale
  13.  * and need to be refreshed, or when a packet was damaged in transit.
  14.  * This may be have to be moved to the VFS layer.
  15.  *
  16.  *  NB: BSD uses a more intelligent approach to guessing when a request
  17.  *  or reply has been lost by keeping the RTO estimate for each procedure.
  18.  *  We currently make do with a constant timeout value.
  19.  *
  20.  *  Copyright (C) 1992,1993 Rick Sladkey <jrs@world.std.com>
  21.  *  Copyright (C) 1995,1996 Olaf Kirch <okir@monad.swb.de>
  22.  */
  23. #include <asm/system.h>
  24. #include <linux/types.h>
  25. #include <linux/mm.h>
  26. #include <linux/slab.h>
  27. #include <linux/in.h>
  28. #include <linux/utsname.h>
  29. #include <linux/sunrpc/clnt.h>
  30. #include <linux/nfs.h>
  31. #define RPC_SLACK_SPACE 512 /* total overkill */
  32. #ifdef RPC_DEBUG
  33. # define RPCDBG_FACILITY RPCDBG_CALL
  34. #endif
  35. static DECLARE_WAIT_QUEUE_HEAD(destroy_wait);
  36. static void call_reserve(struct rpc_task *task);
  37. static void call_reserveresult(struct rpc_task *task);
  38. static void call_allocate(struct rpc_task *task);
  39. static void call_encode(struct rpc_task *task);
  40. static void call_decode(struct rpc_task *task);
  41. static void call_bind(struct rpc_task *task);
  42. static void call_transmit(struct rpc_task *task);
  43. static void call_status(struct rpc_task *task);
  44. static void call_refresh(struct rpc_task *task);
  45. static void call_refreshresult(struct rpc_task *task);
  46. static void call_timeout(struct rpc_task *task);
  47. static void call_reconnect(struct rpc_task *task);
  48. static void child_reconnect(struct rpc_task *);
  49. static void child_reconnect_status(struct rpc_task *);
  50. static u32 * call_header(struct rpc_task *task);
  51. static u32 * call_verify(struct rpc_task *task);
  52. /*
  53.  * Create an RPC client
  54.  * FIXME: This should also take a flags argument (as in task->tk_flags).
  55.  * It's called (among others) from pmap_create_client, which may in
  56.  * turn be called by an async task. In this case, rpciod should not be
  57.  * made to sleep too long.
  58.  */
  59. struct rpc_clnt *
  60. rpc_create_client(struct rpc_xprt *xprt, char *servname,
  61.   struct rpc_program *program, u32 vers, int flavor)
  62. {
  63. struct rpc_version *version;
  64. struct rpc_clnt *clnt = NULL;
  65. dprintk("RPC: creating %s client for %s (xprt %p)n",
  66. program->name, servname, xprt);
  67. if (!xprt)
  68. goto out;
  69. if (vers >= program->nrvers || !(version = program->version[vers]))
  70. goto out;
  71. clnt = (struct rpc_clnt *) rpc_allocate(0, sizeof(*clnt));
  72. if (!clnt)
  73. goto out_no_clnt;
  74. memset(clnt, 0, sizeof(*clnt));
  75. atomic_set(&clnt->cl_users, 0);
  76. clnt->cl_xprt     = xprt;
  77. clnt->cl_procinfo = version->procs;
  78. clnt->cl_maxproc  = version->nrprocs;
  79. clnt->cl_server   = servname;
  80. clnt->cl_protname = program->name;
  81. clnt->cl_port     = xprt->addr.sin_port;
  82. clnt->cl_prog     = program->number;
  83. clnt->cl_vers     = version->number;
  84. clnt->cl_prot     = xprt->prot;
  85. clnt->cl_stats    = program->stats;
  86. INIT_RPC_WAITQ(&clnt->cl_bindwait, "bindwait");
  87. if (!clnt->cl_port)
  88. clnt->cl_autobind = 1;
  89. rpc_init_rtt(&clnt->cl_rtt, xprt->timeout.to_initval);
  90. if (!rpcauth_create(flavor, clnt))
  91. goto out_no_auth;
  92. /* save the nodename */
  93. clnt->cl_nodelen = strlen(system_utsname.nodename);
  94. if (clnt->cl_nodelen > UNX_MAXNODENAME)
  95. clnt->cl_nodelen = UNX_MAXNODENAME;
  96. memcpy(clnt->cl_nodename, system_utsname.nodename, clnt->cl_nodelen);
  97. out:
  98. return clnt;
  99. out_no_clnt:
  100. printk(KERN_INFO "RPC: out of memory in rpc_create_clientn");
  101. goto out;
  102. out_no_auth:
  103. printk(KERN_INFO "RPC: Couldn't create auth handle (flavor %d)n",
  104. flavor);
  105. rpc_free(clnt);
  106. clnt = NULL;
  107. goto out;
  108. }
  109. /*
  110.  * Properly shut down an RPC client, terminating all outstanding
  111.  * requests. Note that we must be certain that cl_oneshot and
  112.  * cl_dead are cleared, or else the client would be destroyed
  113.  * when the last task releases it.
  114.  */
  115. int
  116. rpc_shutdown_client(struct rpc_clnt *clnt)
  117. {
  118. dprintk("RPC: shutting down %s client for %sn",
  119. clnt->cl_protname, clnt->cl_server);
  120. while (atomic_read(&clnt->cl_users)) {
  121. #ifdef RPC_DEBUG
  122. dprintk("RPC: rpc_shutdown_client: client %s, tasks=%dn",
  123. clnt->cl_protname, atomic_read(&clnt->cl_users));
  124. #endif
  125. /* Don't let rpc_release_client destroy us */
  126. clnt->cl_oneshot = 0;
  127. clnt->cl_dead = 0;
  128. rpc_killall_tasks(clnt);
  129. sleep_on_timeout(&destroy_wait, 1*HZ);
  130. }
  131. return rpc_destroy_client(clnt);
  132. }
  133. /*
  134.  * Delete an RPC client
  135.  */
  136. int
  137. rpc_destroy_client(struct rpc_clnt *clnt)
  138. {
  139. dprintk("RPC: destroying %s client for %sn",
  140. clnt->cl_protname, clnt->cl_server);
  141. if (clnt->cl_auth) {
  142. rpcauth_destroy(clnt->cl_auth);
  143. clnt->cl_auth = NULL;
  144. }
  145. if (clnt->cl_xprt) {
  146. xprt_destroy(clnt->cl_xprt);
  147. clnt->cl_xprt = NULL;
  148. }
  149. rpc_free(clnt);
  150. return 0;
  151. }
  152. /*
  153.  * Release an RPC client
  154.  */
  155. void
  156. rpc_release_client(struct rpc_clnt *clnt)
  157. {
  158. dprintk("RPC:      rpc_release_client(%p, %d)n",
  159. clnt, atomic_read(&clnt->cl_users));
  160. if (!atomic_dec_and_test(&clnt->cl_users))
  161. return;
  162. wake_up(&destroy_wait);
  163. if (clnt->cl_oneshot || clnt->cl_dead)
  164. rpc_destroy_client(clnt);
  165. }
  166. /*
  167.  * Default callback for async RPC calls
  168.  */
  169. static void
  170. rpc_default_callback(struct rpc_task *task)
  171. {
  172. }
  173. /*
  174.  * Export the signal mask handling for aysnchronous code that
  175.  * sleeps on RPC calls
  176.  */
  177.  
  178. void rpc_clnt_sigmask(struct rpc_clnt *clnt, sigset_t *oldset)
  179. {
  180. unsigned long sigallow = sigmask(SIGKILL);
  181. unsigned long irqflags;
  182. /* Turn off various signals */
  183. if (clnt->cl_intr) {
  184. struct k_sigaction *action = current->sig->action;
  185. if (action[SIGINT-1].sa.sa_handler == SIG_DFL)
  186. sigallow |= sigmask(SIGINT);
  187. if (action[SIGQUIT-1].sa.sa_handler == SIG_DFL)
  188. sigallow |= sigmask(SIGQUIT);
  189. }
  190. spin_lock_irqsave(&current->sigmask_lock, irqflags);
  191. *oldset = current->blocked;
  192. siginitsetinv(&current->blocked, sigallow & ~oldset->sig[0]);
  193. recalc_sigpending(current);
  194. spin_unlock_irqrestore(&current->sigmask_lock, irqflags);
  195. }
  196. void rpc_clnt_sigunmask(struct rpc_clnt *clnt, sigset_t *oldset)
  197. {
  198. unsigned long irqflags;
  199. spin_lock_irqsave(&current->sigmask_lock, irqflags);
  200. current->blocked = *oldset;
  201. recalc_sigpending(current);
  202. spin_unlock_irqrestore(&current->sigmask_lock, irqflags);
  203. }
  204. /*
  205.  * New rpc_call implementation
  206.  */
  207. int rpc_call_sync(struct rpc_clnt *clnt, struct rpc_message *msg, int flags)
  208. {
  209. struct rpc_task my_task, *task = &my_task;
  210. sigset_t oldset;
  211. int status;
  212. /* If this client is slain all further I/O fails */
  213. if (clnt->cl_dead) 
  214. return -EIO;
  215. if (flags & RPC_TASK_ASYNC) {
  216. printk("rpc_call_sync: Illegal flag combination for synchronous taskn");
  217. flags &= ~RPC_TASK_ASYNC;
  218. }
  219. rpc_clnt_sigmask(clnt, &oldset);
  220. /* Create/initialize a new RPC task */
  221. rpc_init_task(task, clnt, NULL, flags);
  222. rpc_call_setup(task, msg, 0);
  223. /* Set up the call info struct and execute the task */
  224. if (task->tk_status == 0)
  225. status = rpc_execute(task);
  226. else {
  227. status = task->tk_status;
  228. rpc_release_task(task);
  229. }
  230. rpc_clnt_sigunmask(clnt, &oldset);
  231. return status;
  232. }
  233. /*
  234.  * New rpc_call implementation
  235.  */
  236. int
  237. rpc_call_async(struct rpc_clnt *clnt, struct rpc_message *msg, int flags,
  238.        rpc_action callback, void *data)
  239. {
  240. struct rpc_task *task;
  241. sigset_t oldset;
  242. int status;
  243. /* If this client is slain all further I/O fails */
  244. if (clnt->cl_dead) 
  245. return -EIO;
  246. flags |= RPC_TASK_ASYNC;
  247. rpc_clnt_sigmask(clnt, &oldset);
  248. /* Create/initialize a new RPC task */
  249. if (!callback)
  250. callback = rpc_default_callback;
  251. status = -ENOMEM;
  252. if (!(task = rpc_new_task(clnt, callback, flags)))
  253. goto out;
  254. task->tk_calldata = data;
  255. rpc_call_setup(task, msg, 0);
  256. /* Set up the call info struct and execute the task */
  257. if (task->tk_status == 0)
  258. status = rpc_execute(task);
  259. else {
  260. status = task->tk_status;
  261. rpc_release_task(task);
  262. }
  263. out:
  264. rpc_clnt_sigunmask(clnt, &oldset);
  265. return status;
  266. }
  267. void
  268. rpc_call_setup(struct rpc_task *task, struct rpc_message *msg, int flags)
  269. {
  270. task->tk_msg   = *msg;
  271. task->tk_flags |= flags;
  272. /* Bind the user cred */
  273. if (task->tk_msg.rpc_cred != NULL) {
  274. rpcauth_holdcred(task);
  275. } else
  276. rpcauth_bindcred(task);
  277. if (task->tk_status == 0)
  278. task->tk_action = call_reserve;
  279. else
  280. task->tk_action = NULL;
  281. /* Increment call count */
  282. if (task->tk_msg.rpc_proc < task->tk_client->cl_maxproc)
  283. rpcproc_count(task->tk_client, task->tk_msg.rpc_proc)++;
  284. }
  285. void
  286. rpc_setbufsize(struct rpc_clnt *clnt, unsigned int sndsize, unsigned int rcvsize)
  287. {
  288. struct rpc_xprt *xprt = clnt->cl_xprt;
  289. xprt->sndsize = 0;
  290. if (sndsize)
  291. xprt->sndsize = sndsize + RPC_SLACK_SPACE;
  292. xprt->rcvsize = 0;
  293. if (rcvsize)
  294. xprt->rcvsize = rcvsize + RPC_SLACK_SPACE;
  295. xprt_sock_setbufsize(xprt);
  296. }
  297. /*
  298.  * Restart an (async) RPC call. Usually called from within the
  299.  * exit handler.
  300.  */
  301. void
  302. rpc_restart_call(struct rpc_task *task)
  303. {
  304. if (RPC_ASSASSINATED(task))
  305. return;
  306. task->tk_action = call_reserve;
  307. rpcproc_count(task->tk_client, task->tk_msg.rpc_proc)++;
  308. }
  309. /*
  310.  * 1. Reserve an RPC call slot
  311.  */
  312. static void
  313. call_reserve(struct rpc_task *task)
  314. {
  315. struct rpc_clnt *clnt = task->tk_client;
  316. if (task->tk_msg.rpc_proc > clnt->cl_maxproc) {
  317. printk(KERN_WARNING "%s (vers %d): bad procedure number %dn",
  318. clnt->cl_protname, clnt->cl_vers, task->tk_msg.rpc_proc);
  319. rpc_exit(task, -EIO);
  320. return;
  321. }
  322. dprintk("RPC: %4d call_reserven", task->tk_pid);
  323. if (!rpcauth_uptodatecred(task)) {
  324. task->tk_action = call_refresh;
  325. return;
  326. }
  327. task->tk_status  = 0;
  328. task->tk_action  = call_reserveresult;
  329. task->tk_timeout = clnt->cl_timeout.to_resrvval;
  330. clnt->cl_stats->rpccnt++;
  331. xprt_reserve(task);
  332. }
  333. /*
  334.  * 1b. Grok the result of xprt_reserve()
  335.  */
  336. static void
  337. call_reserveresult(struct rpc_task *task)
  338. {
  339. int status = task->tk_status;
  340. dprintk("RPC: %4d call_reserveresult (status %d)n",
  341. task->tk_pid, task->tk_status);
  342. /*
  343.  * After a call to xprt_reserve(), we must have either
  344.  * a request slot or else an error status.
  345.  */
  346. if ((task->tk_status >= 0 && !task->tk_rqstp) ||
  347.     (task->tk_status < 0 && task->tk_rqstp))
  348. printk(KERN_ERR "call_reserveresult: status=%d, request=%p??n",
  349.  task->tk_status, task->tk_rqstp);
  350. if (task->tk_status >= 0) {
  351. task->tk_action = call_allocate;
  352. return;
  353. }
  354. task->tk_status = 0;
  355. switch (status) {
  356. case -EAGAIN:
  357. case -ENOBUFS:
  358. task->tk_timeout = task->tk_client->cl_timeout.to_resrvval;
  359. task->tk_action = call_reserve;
  360. break;
  361. case -ETIMEDOUT:
  362. dprintk("RPC: task timed outn");
  363. task->tk_action = call_timeout;
  364. break;
  365. default:
  366. if (!task->tk_rqstp) {
  367. printk(KERN_INFO "RPC: task has no request, exit EIOn");
  368. rpc_exit(task, -EIO);
  369. } else
  370. rpc_exit(task, status);
  371. }
  372. }
  373. /*
  374.  * 2. Allocate the buffer. For details, see sched.c:rpc_malloc.
  375.  * (Note: buffer memory is freed in rpc_task_release).
  376.  */
  377. static void
  378. call_allocate(struct rpc_task *task)
  379. {
  380. struct rpc_clnt *clnt = task->tk_client;
  381. unsigned int bufsiz;
  382. dprintk("RPC: %4d call_allocate (status %d)n", 
  383. task->tk_pid, task->tk_status);
  384. task->tk_action = call_encode;
  385. if (task->tk_buffer)
  386. return;
  387. /* FIXME: compute buffer requirements more exactly using
  388.  * auth->au_wslack */
  389. bufsiz = rpcproc_bufsiz(clnt, task->tk_msg.rpc_proc) + RPC_SLACK_SPACE;
  390. if ((task->tk_buffer = rpc_malloc(task, bufsiz << 1)) != NULL)
  391. return;
  392. printk(KERN_INFO "RPC: buffer allocation failed for task %pn", task); 
  393. if (RPC_IS_ASYNC(task) || !(task->tk_client->cl_intr && signalled())) {
  394. xprt_release(task);
  395. task->tk_action = call_reserve;
  396. rpc_delay(task, HZ>>4);
  397. return;
  398. }
  399. rpc_exit(task, -ERESTARTSYS);
  400. }
  401. /*
  402.  * 3. Encode arguments of an RPC call
  403.  */
  404. static void
  405. call_encode(struct rpc_task *task)
  406. {
  407. struct rpc_clnt *clnt = task->tk_client;
  408. struct rpc_rqst *req = task->tk_rqstp;
  409. struct xdr_buf *sndbuf = &req->rq_snd_buf;
  410. struct xdr_buf *rcvbuf = &req->rq_rcv_buf;
  411. unsigned int bufsiz;
  412. kxdrproc_t encode;
  413. int status;
  414. u32 *p;
  415. dprintk("RPC: %4d call_encode (status %d)n", 
  416. task->tk_pid, task->tk_status);
  417. task->tk_action = call_bind;
  418. /* Default buffer setup */
  419. bufsiz = rpcproc_bufsiz(clnt, task->tk_msg.rpc_proc)+RPC_SLACK_SPACE;
  420. sndbuf->head[0].iov_base = (void *)task->tk_buffer;
  421. sndbuf->head[0].iov_len  = bufsiz;
  422. sndbuf->tail[0].iov_len  = 0;
  423. sndbuf->page_len  = 0;
  424. sndbuf->len  = 0;
  425. rcvbuf->head[0].iov_base = (void *)((char *)task->tk_buffer + bufsiz);
  426. rcvbuf->head[0].iov_len  = bufsiz;
  427. rcvbuf->tail[0].iov_len  = 0;
  428. rcvbuf->page_len  = 0;
  429. rcvbuf->len  = bufsiz;
  430. /* Zero buffer so we have automatic zero-padding of opaque & string */
  431. memset(task->tk_buffer, 0, bufsiz);
  432. /* Encode header and provided arguments */
  433. encode = rpcproc_encode(clnt, task->tk_msg.rpc_proc);
  434. if (!(p = call_header(task))) {
  435. printk(KERN_INFO "RPC: call_header failed, exit EIOn");
  436. rpc_exit(task, -EIO);
  437. } else
  438. if (encode && (status = encode(req, p, task->tk_msg.rpc_argp)) < 0) {
  439. printk(KERN_WARNING "%s: can't encode arguments: %dn",
  440. clnt->cl_protname, -status);
  441. rpc_exit(task, status);
  442. }
  443. }
  444. /*
  445.  * 4. Get the server port number if not yet set
  446.  */
  447. static void
  448. call_bind(struct rpc_task *task)
  449. {
  450. struct rpc_clnt *clnt = task->tk_client;
  451. struct rpc_xprt *xprt = clnt->cl_xprt;
  452. task->tk_action = (xprt_connected(xprt)) ? call_transmit : call_reconnect;
  453. if (!clnt->cl_port) {
  454. task->tk_action = call_reconnect;
  455. task->tk_timeout = clnt->cl_timeout.to_maxval;
  456. rpc_getport(task, clnt);
  457. }
  458. }
  459. /*
  460.  * 4a. Reconnect to the RPC server (TCP case)
  461.  */
  462. static void
  463. call_reconnect(struct rpc_task *task)
  464. {
  465. struct rpc_clnt *clnt = task->tk_client;
  466. struct rpc_task *child;
  467. dprintk("RPC: %4d call_reconnect status %dn",
  468. task->tk_pid, task->tk_status);
  469. task->tk_action = call_transmit;
  470. if (task->tk_status < 0 || !clnt->cl_xprt->stream)
  471. return;
  472. /* Run as a child to ensure it runs as an rpciod task */
  473. child = rpc_new_child(clnt, task);
  474. if (child) {
  475. child->tk_action = child_reconnect;
  476. rpc_run_child(task, child, NULL);
  477. }
  478. }
  479. static void child_reconnect(struct rpc_task *task)
  480. {
  481. task->tk_client->cl_stats->netreconn++;
  482. task->tk_status = 0;
  483. task->tk_action = child_reconnect_status;
  484. xprt_reconnect(task);
  485. }
  486. static void child_reconnect_status(struct rpc_task *task)
  487. {
  488. if (task->tk_status == -EAGAIN)
  489. task->tk_action = child_reconnect;
  490. else
  491. task->tk_action = NULL;
  492. }
  493. /*
  494.  * 5. Transmit the RPC request, and wait for reply
  495.  */
  496. static void
  497. call_transmit(struct rpc_task *task)
  498. {
  499. struct rpc_clnt *clnt = task->tk_client;
  500. dprintk("RPC: %4d call_transmit (status %d)n", 
  501. task->tk_pid, task->tk_status);
  502. task->tk_action = call_status;
  503. if (task->tk_status < 0)
  504. return;
  505. xprt_transmit(task);
  506. if (!rpcproc_decode(clnt, task->tk_msg.rpc_proc) && task->tk_status >= 0) {
  507. task->tk_action = NULL;
  508. rpc_wake_up_task(task);
  509. }
  510. }
  511. /*
  512.  * 6. Sort out the RPC call status
  513.  */
  514. static void
  515. call_status(struct rpc_task *task)
  516. {
  517. struct rpc_clnt *clnt = task->tk_client;
  518. struct rpc_xprt *xprt = clnt->cl_xprt;
  519. struct rpc_rqst *req = task->tk_rqstp;
  520. int status;
  521. if (req->rq_received != 0)
  522. task->tk_status = req->rq_received;
  523. dprintk("RPC: %4d call_status (status %d)n", 
  524. task->tk_pid, task->tk_status);
  525. status = task->tk_status;
  526. if (status >= 0) {
  527. task->tk_action = call_decode;
  528. return;
  529. }
  530. task->tk_status = 0;
  531. switch(status) {
  532. case -ETIMEDOUT:
  533. task->tk_action = call_timeout;
  534. break;
  535. case -ECONNREFUSED:
  536. case -ENOTCONN:
  537. req->rq_bytes_sent = 0;
  538. if (clnt->cl_autobind || !clnt->cl_port) {
  539. clnt->cl_port = 0;
  540. task->tk_action = call_bind;
  541. break;
  542. }
  543. if (xprt->stream) {
  544. task->tk_action = call_reconnect;
  545. break;
  546. }
  547. /*
  548.  * Sleep and dream of an open connection
  549.  */
  550. task->tk_timeout = 5 * HZ;
  551. rpc_sleep_on(&xprt->sending, task, NULL, NULL);
  552. case -ENOMEM:
  553. case -EAGAIN:
  554. task->tk_action = call_transmit;
  555. clnt->cl_stats->rpcretrans++;
  556. break;
  557. default:
  558. if (clnt->cl_chatty)
  559. printk("%s: RPC call returned error %dn",
  560.        clnt->cl_protname, -status);
  561. rpc_exit(task, status);
  562. }
  563. }
  564. /*
  565.  * 6a. Handle RPC timeout
  566.  *  We do not release the request slot, so we keep using the
  567.  * same XID for all retransmits.
  568.  */
  569. static void
  570. call_timeout(struct rpc_task *task)
  571. {
  572. struct rpc_clnt *clnt = task->tk_client;
  573. struct rpc_rqst *req = task->tk_rqstp;
  574. if (req) {
  575. struct rpc_timeout *to = &req->rq_timeout;
  576. if (xprt_adjust_timeout(to)) {
  577. dprintk("RPC: %4d call_timeout (minor timeo)n",
  578. task->tk_pid);
  579. goto minor_timeout;
  580. }
  581. to->to_retries = clnt->cl_timeout.to_retries;
  582. }
  583. dprintk("RPC: %4d call_timeout (major timeo)n", task->tk_pid);
  584. if (clnt->cl_softrtry) {
  585. if (clnt->cl_chatty && !task->tk_exit)
  586. printk(KERN_NOTICE "%s: server %s not responding, timed outn",
  587. clnt->cl_protname, clnt->cl_server);
  588. rpc_exit(task, -EIO);
  589. return;
  590. }
  591. if (clnt->cl_chatty && !(task->tk_flags & RPC_CALL_MAJORSEEN) && rpc_ntimeo(&clnt->cl_rtt) > 7) {
  592. task->tk_flags |= RPC_CALL_MAJORSEEN;
  593. if (req)
  594. printk(KERN_NOTICE "%s: server %s not responding, still tryingn",
  595. clnt->cl_protname, clnt->cl_server);
  596. #ifdef RPC_DEBUG
  597. else
  598. printk(KERN_NOTICE "%s: task %d can't get a request slotn",
  599. clnt->cl_protname, task->tk_pid);
  600. #endif
  601. }
  602. if (clnt->cl_autobind)
  603. clnt->cl_port = 0;
  604. minor_timeout:
  605. if (!req)
  606. task->tk_action = call_reserve;
  607. else if (!clnt->cl_port) {
  608. task->tk_action = call_bind;
  609. clnt->cl_stats->rpcretrans++;
  610. } else if (!xprt_connected(clnt->cl_xprt)) {
  611. task->tk_action = call_reconnect;
  612. clnt->cl_stats->rpcretrans++;
  613. } else {
  614. task->tk_action = call_transmit;
  615. clnt->cl_stats->rpcretrans++;
  616. }
  617. task->tk_status = 0;
  618. }
  619. /*
  620.  * 7. Decode the RPC reply
  621.  */
  622. static void
  623. call_decode(struct rpc_task *task)
  624. {
  625. struct rpc_clnt *clnt = task->tk_client;
  626. struct rpc_rqst *req = task->tk_rqstp;
  627. kxdrproc_t decode = rpcproc_decode(clnt, task->tk_msg.rpc_proc);
  628. u32 *p;
  629. dprintk("RPC: %4d call_decode (status %d)n", 
  630. task->tk_pid, task->tk_status);
  631. if (clnt->cl_chatty && (task->tk_flags & RPC_CALL_MAJORSEEN)) {
  632. printk(KERN_NOTICE "%s: server %s OKn",
  633. clnt->cl_protname, clnt->cl_server);
  634. task->tk_flags &= ~RPC_CALL_MAJORSEEN;
  635. }
  636. if (task->tk_status < 12) {
  637. if (!clnt->cl_softrtry) {
  638. task->tk_action = call_transmit;
  639. clnt->cl_stats->rpcretrans++;
  640. } else {
  641. printk(KERN_WARNING "%s: too small RPC reply size (%d bytes)n",
  642. clnt->cl_protname, task->tk_status);
  643. rpc_exit(task, -EIO);
  644. }
  645. return;
  646. }
  647. /* Verify the RPC header */
  648. if (!(p = call_verify(task)))
  649. return;
  650. /*
  651.  * The following is an NFS-specific hack to cater for setuid
  652.  * processes whose uid is mapped to nobody on the server.
  653.  */
  654. if (task->tk_client->cl_droppriv && 
  655.             (ntohl(*p) == NFSERR_ACCES || ntohl(*p) == NFSERR_PERM)) {
  656. if (RPC_IS_SETUID(task) && task->tk_suid_retry) {
  657. dprintk("RPC: %4d retry squashed uidn", task->tk_pid);
  658. task->tk_flags ^= RPC_CALL_REALUID;
  659. task->tk_action = call_encode;
  660. task->tk_suid_retry--;
  661. return;
  662. }
  663. }
  664. task->tk_action = NULL;
  665. if (decode)
  666. task->tk_status = decode(req, p, task->tk_msg.rpc_resp);
  667. dprintk("RPC: %4d call_decode result %dn", task->tk_pid,
  668. task->tk_status);
  669. }
  670. /*
  671.  * 8. Refresh the credentials if rejected by the server
  672.  */
  673. static void
  674. call_refresh(struct rpc_task *task)
  675. {
  676. dprintk("RPC: %4d call_refreshn", task->tk_pid);
  677. xprt_release(task); /* Must do to obtain new XID */
  678. task->tk_action = call_refreshresult;
  679. task->tk_status = 0;
  680. task->tk_client->cl_stats->rpcauthrefresh++;
  681. rpcauth_refreshcred(task);
  682. }
  683. /*
  684.  * 8a. Process the results of a credential refresh
  685.  */
  686. static void
  687. call_refreshresult(struct rpc_task *task)
  688. {
  689. dprintk("RPC: %4d call_refreshresult (status %d)n", 
  690. task->tk_pid, task->tk_status);
  691. if (task->tk_status < 0)
  692. rpc_exit(task, -EACCES);
  693. else
  694. task->tk_action = call_reserve;
  695. }
  696. /*
  697.  * Call header serialization
  698.  */
  699. static u32 *
  700. call_header(struct rpc_task *task)
  701. {
  702. struct rpc_clnt *clnt = task->tk_client;
  703. struct rpc_xprt *xprt = clnt->cl_xprt;
  704. struct rpc_rqst *req = task->tk_rqstp;
  705. u32 *p = req->rq_svec[0].iov_base;
  706. /* FIXME: check buffer size? */
  707. if (xprt->stream)
  708. *p++ = 0; /* fill in later */
  709. *p++ = req->rq_xid; /* XID */
  710. *p++ = htonl(RPC_CALL); /* CALL */
  711. *p++ = htonl(RPC_VERSION); /* RPC version */
  712. *p++ = htonl(clnt->cl_prog); /* program number */
  713. *p++ = htonl(clnt->cl_vers); /* program version */
  714. *p++ = htonl(task->tk_msg.rpc_proc); /* procedure */
  715. return rpcauth_marshcred(task, p);
  716. }
  717. /*
  718.  * Reply header verification
  719.  */
  720. static u32 *
  721. call_verify(struct rpc_task *task)
  722. {
  723. u32 *p = task->tk_rqstp->rq_rvec[0].iov_base, n;
  724. p += 1; /* skip XID */
  725. if ((n = ntohl(*p++)) != RPC_REPLY) {
  726. printk(KERN_WARNING "call_verify: not an RPC reply: %xn", n);
  727. goto garbage;
  728. }
  729. if ((n = ntohl(*p++)) != RPC_MSG_ACCEPTED) {
  730. int error = -EACCES;
  731. if ((n = ntohl(*p++)) != RPC_AUTH_ERROR) {
  732. printk(KERN_WARNING "call_verify: RPC call rejected: %xn", n);
  733. } else
  734. switch ((n = ntohl(*p++))) {
  735. case RPC_AUTH_REJECTEDCRED:
  736. case RPC_AUTH_REJECTEDVERF:
  737. if (!task->tk_cred_retry)
  738. break;
  739. task->tk_cred_retry--;
  740. dprintk("RPC: %4d call_verify: retry stale credsn",
  741. task->tk_pid);
  742. rpcauth_invalcred(task);
  743. task->tk_action = call_refresh;
  744. return NULL;
  745. case RPC_AUTH_BADCRED:
  746. case RPC_AUTH_BADVERF:
  747. /* possibly garbled cred/verf? */
  748. if (!task->tk_garb_retry)
  749. break;
  750. task->tk_garb_retry--;
  751. dprintk("RPC: %4d call_verify: retry garbled credsn",
  752. task->tk_pid);
  753. task->tk_action = call_encode;
  754. return NULL;
  755. case RPC_AUTH_TOOWEAK:
  756. printk(KERN_NOTICE "call_verify: server requires stronger "
  757.        "authentication.n");
  758. break;
  759. default:
  760. printk(KERN_WARNING "call_verify: unknown auth error: %xn", n);
  761. error = -EIO;
  762. }
  763. dprintk("RPC: %4d call_verify: call rejected %dn",
  764. task->tk_pid, n);
  765. rpc_exit(task, error);
  766. return NULL;
  767. }
  768. if (!(p = rpcauth_checkverf(task, p))) {
  769. printk(KERN_WARNING "call_verify: auth check failedn");
  770. goto garbage; /* bad verifier, retry */
  771. }
  772. switch ((n = ntohl(*p++))) {
  773. case RPC_SUCCESS:
  774. return p;
  775. case RPC_GARBAGE_ARGS:
  776. break; /* retry */
  777. default:
  778. printk(KERN_WARNING "call_verify: server accept status: %xn", n);
  779. /* Also retry */
  780. }
  781. garbage:
  782. dprintk("RPC: %4d call_verify: server saw garbagen", task->tk_pid);
  783. task->tk_client->cl_stats->rpcgarbage++;
  784. if (task->tk_garb_retry) {
  785. task->tk_garb_retry--;
  786. dprintk(KERN_WARNING "RPC: garbage, retrying %4dn", task->tk_pid);
  787. task->tk_action = call_encode;
  788. return NULL;
  789. }
  790. printk(KERN_WARNING "RPC: garbage, exit EIOn");
  791. rpc_exit(task, -EIO);
  792. return NULL;
  793. }