linux/net/sunrpc/clnt.c
<<
>>
Prefs
   1/*
   2 *  linux/net/sunrpc/clnt.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 connect handling.
  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
  24#include <asm/system.h>
  25
  26#include <linux/module.h>
  27#include <linux/types.h>
  28#include <linux/kallsyms.h>
  29#include <linux/mm.h>
  30#include <linux/namei.h>
  31#include <linux/mount.h>
  32#include <linux/slab.h>
  33#include <linux/utsname.h>
  34#include <linux/workqueue.h>
  35#include <linux/in6.h>
  36
  37#include <linux/sunrpc/clnt.h>
  38#include <linux/sunrpc/rpc_pipe_fs.h>
  39#include <linux/sunrpc/metrics.h>
  40#include <linux/sunrpc/bc_xprt.h>
  41
  42#include "sunrpc.h"
  43
  44#ifdef RPC_DEBUG
  45# define RPCDBG_FACILITY        RPCDBG_CALL
  46#endif
  47
  48#define dprint_status(t)                                        \
  49        dprintk("RPC: %5u %s (status %d)\n", t->tk_pid,         \
  50                        __func__, t->tk_status)
  51
  52/*
  53 * All RPC clients are linked into this list
  54 */
  55static LIST_HEAD(all_clients);
  56static DEFINE_SPINLOCK(rpc_client_lock);
  57
  58static DECLARE_WAIT_QUEUE_HEAD(destroy_wait);
  59
  60
  61static void     call_start(struct rpc_task *task);
  62static void     call_reserve(struct rpc_task *task);
  63static void     call_reserveresult(struct rpc_task *task);
  64static void     call_allocate(struct rpc_task *task);
  65static void     call_decode(struct rpc_task *task);
  66static void     call_bind(struct rpc_task *task);
  67static void     call_bind_status(struct rpc_task *task);
  68static void     call_transmit(struct rpc_task *task);
  69#if defined(CONFIG_NFS_V4_1)
  70static void     call_bc_transmit(struct rpc_task *task);
  71#endif /* CONFIG_NFS_V4_1 */
  72static void     call_status(struct rpc_task *task);
  73static void     call_transmit_status(struct rpc_task *task);
  74static void     call_refresh(struct rpc_task *task);
  75static void     call_refreshresult(struct rpc_task *task);
  76static void     call_timeout(struct rpc_task *task);
  77static void     call_connect(struct rpc_task *task);
  78static void     call_connect_status(struct rpc_task *task);
  79
  80static __be32   *rpc_encode_header(struct rpc_task *task);
  81static __be32   *rpc_verify_header(struct rpc_task *task);
  82static int      rpc_ping(struct rpc_clnt *clnt);
  83
  84static void rpc_register_client(struct rpc_clnt *clnt)
  85{
  86        spin_lock(&rpc_client_lock);
  87        list_add(&clnt->cl_clients, &all_clients);
  88        spin_unlock(&rpc_client_lock);
  89}
  90
  91static void rpc_unregister_client(struct rpc_clnt *clnt)
  92{
  93        spin_lock(&rpc_client_lock);
  94        list_del(&clnt->cl_clients);
  95        spin_unlock(&rpc_client_lock);
  96}
  97
  98static int
  99rpc_setup_pipedir(struct rpc_clnt *clnt, char *dir_name)
 100{
 101        static uint32_t clntid;
 102        struct nameidata nd;
 103        struct path path;
 104        char name[15];
 105        struct qstr q = {
 106                .name = name,
 107        };
 108        int error;
 109
 110        clnt->cl_path.mnt = ERR_PTR(-ENOENT);
 111        clnt->cl_path.dentry = ERR_PTR(-ENOENT);
 112        if (dir_name == NULL)
 113                return 0;
 114
 115        path.mnt = rpc_get_mount();
 116        if (IS_ERR(path.mnt))
 117                return PTR_ERR(path.mnt);
 118        error = vfs_path_lookup(path.mnt->mnt_root, path.mnt, dir_name, 0, &nd);
 119        if (error)
 120                goto err;
 121
 122        for (;;) {
 123                q.len = snprintf(name, sizeof(name), "clnt%x", (unsigned int)clntid++);
 124                name[sizeof(name) - 1] = '\0';
 125                q.hash = full_name_hash(q.name, q.len);
 126                path.dentry = rpc_create_client_dir(nd.path.dentry, &q, clnt);
 127                if (!IS_ERR(path.dentry))
 128                        break;
 129                error = PTR_ERR(path.dentry);
 130                if (error != -EEXIST) {
 131                        printk(KERN_INFO "RPC: Couldn't create pipefs entry"
 132                                        " %s/%s, error %d\n",
 133                                        dir_name, name, error);
 134                        goto err_path_put;
 135                }
 136        }
 137        path_put(&nd.path);
 138        clnt->cl_path = path;
 139        return 0;
 140err_path_put:
 141        path_put(&nd.path);
 142err:
 143        rpc_put_mount();
 144        return error;
 145}
 146
 147static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, struct rpc_xprt *xprt)
 148{
 149        struct rpc_program      *program = args->program;
 150        struct rpc_version      *version;
 151        struct rpc_clnt         *clnt = NULL;
 152        struct rpc_auth         *auth;
 153        int err;
 154        size_t len;
 155
 156        /* sanity check the name before trying to print it */
 157        err = -EINVAL;
 158        len = strlen(args->servername);
 159        if (len > RPC_MAXNETNAMELEN)
 160                goto out_no_rpciod;
 161        len++;
 162
 163        dprintk("RPC:       creating %s client for %s (xprt %p)\n",
 164                        program->name, args->servername, xprt);
 165
 166        err = rpciod_up();
 167        if (err)
 168                goto out_no_rpciod;
 169        err = -EINVAL;
 170        if (!xprt)
 171                goto out_no_xprt;
 172
 173        if (args->version >= program->nrvers)
 174                goto out_err;
 175        version = program->version[args->version];
 176        if (version == NULL)
 177                goto out_err;
 178
 179        err = -ENOMEM;
 180        clnt = kzalloc(sizeof(*clnt), GFP_KERNEL);
 181        if (!clnt)
 182                goto out_err;
 183        clnt->cl_parent = clnt;
 184
 185        clnt->cl_server = clnt->cl_inline_name;
 186        if (len > sizeof(clnt->cl_inline_name)) {
 187                char *buf = kmalloc(len, GFP_KERNEL);
 188                if (buf != NULL)
 189                        clnt->cl_server = buf;
 190                else
 191                        len = sizeof(clnt->cl_inline_name);
 192        }
 193        strlcpy(clnt->cl_server, args->servername, len);
 194
 195        clnt->cl_xprt     = xprt;
 196        clnt->cl_procinfo = version->procs;
 197        clnt->cl_maxproc  = version->nrprocs;
 198        clnt->cl_protname = program->name;
 199        clnt->cl_prog     = args->prognumber ? : program->number;
 200        clnt->cl_vers     = version->number;
 201        clnt->cl_stats    = program->stats;
 202        clnt->cl_metrics  = rpc_alloc_iostats(clnt);
 203        err = -ENOMEM;
 204        if (clnt->cl_metrics == NULL)
 205                goto out_no_stats;
 206        clnt->cl_program  = program;
 207        INIT_LIST_HEAD(&clnt->cl_tasks);
 208        spin_lock_init(&clnt->cl_lock);
 209
 210        if (!xprt_bound(clnt->cl_xprt))
 211                clnt->cl_autobind = 1;
 212
 213        clnt->cl_timeout = xprt->timeout;
 214        if (args->timeout != NULL) {
 215                memcpy(&clnt->cl_timeout_default, args->timeout,
 216                                sizeof(clnt->cl_timeout_default));
 217                clnt->cl_timeout = &clnt->cl_timeout_default;
 218        }
 219
 220        clnt->cl_rtt = &clnt->cl_rtt_default;
 221        rpc_init_rtt(&clnt->cl_rtt_default, clnt->cl_timeout->to_initval);
 222        clnt->cl_principal = NULL;
 223        if (args->client_name) {
 224                clnt->cl_principal = kstrdup(args->client_name, GFP_KERNEL);
 225                if (!clnt->cl_principal)
 226                        goto out_no_principal;
 227        }
 228
 229        kref_init(&clnt->cl_kref);
 230
 231        err = rpc_setup_pipedir(clnt, program->pipe_dir_name);
 232        if (err < 0)
 233                goto out_no_path;
 234
 235        auth = rpcauth_create(args->authflavor, clnt);
 236        if (IS_ERR(auth)) {
 237                printk(KERN_INFO "RPC: Couldn't create auth handle (flavor %u)\n",
 238                                args->authflavor);
 239                err = PTR_ERR(auth);
 240                goto out_no_auth;
 241        }
 242
 243        /* save the nodename */
 244        clnt->cl_nodelen = strlen(init_utsname()->nodename);
 245        if (clnt->cl_nodelen > UNX_MAXNODENAME)
 246                clnt->cl_nodelen = UNX_MAXNODENAME;
 247        memcpy(clnt->cl_nodename, init_utsname()->nodename, clnt->cl_nodelen);
 248        rpc_register_client(clnt);
 249        return clnt;
 250
 251out_no_auth:
 252        if (!IS_ERR(clnt->cl_path.dentry)) {
 253                rpc_remove_client_dir(clnt->cl_path.dentry);
 254                rpc_put_mount();
 255        }
 256out_no_path:
 257        kfree(clnt->cl_principal);
 258out_no_principal:
 259        rpc_free_iostats(clnt->cl_metrics);
 260out_no_stats:
 261        if (clnt->cl_server != clnt->cl_inline_name)
 262                kfree(clnt->cl_server);
 263        kfree(clnt);
 264out_err:
 265        xprt_put(xprt);
 266out_no_xprt:
 267        rpciod_down();
 268out_no_rpciod:
 269        return ERR_PTR(err);
 270}
 271
 272/*
 273 * rpc_create - create an RPC client and transport with one call
 274 * @args: rpc_clnt create argument structure
 275 *
 276 * Creates and initializes an RPC transport and an RPC client.
 277 *
 278 * It can ping the server in order to determine if it is up, and to see if
 279 * it supports this program and version.  RPC_CLNT_CREATE_NOPING disables
 280 * this behavior so asynchronous tasks can also use rpc_create.
 281 */
 282struct rpc_clnt *rpc_create(struct rpc_create_args *args)
 283{
 284        struct rpc_xprt *xprt;
 285        struct rpc_clnt *clnt;
 286        struct xprt_create xprtargs = {
 287                .ident = args->protocol,
 288                .srcaddr = args->saddress,
 289                .dstaddr = args->address,
 290                .addrlen = args->addrsize,
 291                .bc_xprt = args->bc_xprt,
 292        };
 293        char servername[48];
 294
 295        /*
 296         * If the caller chooses not to specify a hostname, whip
 297         * up a string representation of the passed-in address.
 298         */
 299        if (args->servername == NULL) {
 300                servername[0] = '\0';
 301                switch (args->address->sa_family) {
 302                case AF_INET: {
 303                        struct sockaddr_in *sin =
 304                                        (struct sockaddr_in *)args->address;
 305                        snprintf(servername, sizeof(servername), "%pI4",
 306                                 &sin->sin_addr.s_addr);
 307                        break;
 308                }
 309                case AF_INET6: {
 310                        struct sockaddr_in6 *sin =
 311                                        (struct sockaddr_in6 *)args->address;
 312                        snprintf(servername, sizeof(servername), "%pI6",
 313                                 &sin->sin6_addr);
 314                        break;
 315                }
 316                default:
 317                        /* caller wants default server name, but
 318                         * address family isn't recognized. */
 319                        return ERR_PTR(-EINVAL);
 320                }
 321                args->servername = servername;
 322        }
 323
 324        xprt = xprt_create_transport(&xprtargs);
 325        if (IS_ERR(xprt))
 326                return (struct rpc_clnt *)xprt;
 327
 328        /*
 329         * By default, kernel RPC client connects from a reserved port.
 330         * CAP_NET_BIND_SERVICE will not be set for unprivileged requesters,
 331         * but it is always enabled for rpciod, which handles the connect
 332         * operation.
 333         */
 334        xprt->resvport = 1;
 335        if (args->flags & RPC_CLNT_CREATE_NONPRIVPORT)
 336                xprt->resvport = 0;
 337
 338        clnt = rpc_new_client(args, xprt);
 339        if (IS_ERR(clnt))
 340                return clnt;
 341
 342        if (!(args->flags & RPC_CLNT_CREATE_NOPING)) {
 343                int err = rpc_ping(clnt);
 344                if (err != 0) {
 345                        rpc_shutdown_client(clnt);
 346                        return ERR_PTR(err);
 347                }
 348        }
 349
 350        clnt->cl_softrtry = 1;
 351        if (args->flags & RPC_CLNT_CREATE_HARDRTRY)
 352                clnt->cl_softrtry = 0;
 353
 354        if (args->flags & RPC_CLNT_CREATE_AUTOBIND)
 355                clnt->cl_autobind = 1;
 356        if (args->flags & RPC_CLNT_CREATE_DISCRTRY)
 357                clnt->cl_discrtry = 1;
 358        if (!(args->flags & RPC_CLNT_CREATE_QUIET))
 359                clnt->cl_chatty = 1;
 360
 361        return clnt;
 362}
 363EXPORT_SYMBOL_GPL(rpc_create);
 364
 365/*
 366 * This function clones the RPC client structure. It allows us to share the
 367 * same transport while varying parameters such as the authentication
 368 * flavour.
 369 */
 370struct rpc_clnt *
 371rpc_clone_client(struct rpc_clnt *clnt)
 372{
 373        struct rpc_clnt *new;
 374        int err = -ENOMEM;
 375
 376        new = kmemdup(clnt, sizeof(*new), GFP_KERNEL);
 377        if (!new)
 378                goto out_no_clnt;
 379        new->cl_parent = clnt;
 380        /* Turn off autobind on clones */
 381        new->cl_autobind = 0;
 382        INIT_LIST_HEAD(&new->cl_tasks);
 383        spin_lock_init(&new->cl_lock);
 384        rpc_init_rtt(&new->cl_rtt_default, clnt->cl_timeout->to_initval);
 385        new->cl_metrics = rpc_alloc_iostats(clnt);
 386        if (new->cl_metrics == NULL)
 387                goto out_no_stats;
 388        if (clnt->cl_principal) {
 389                new->cl_principal = kstrdup(clnt->cl_principal, GFP_KERNEL);
 390                if (new->cl_principal == NULL)
 391                        goto out_no_principal;
 392        }
 393        kref_init(&new->cl_kref);
 394        err = rpc_setup_pipedir(new, clnt->cl_program->pipe_dir_name);
 395        if (err != 0)
 396                goto out_no_path;
 397        if (new->cl_auth)
 398                atomic_inc(&new->cl_auth->au_count);
 399        xprt_get(clnt->cl_xprt);
 400        kref_get(&clnt->cl_kref);
 401        rpc_register_client(new);
 402        rpciod_up();
 403        return new;
 404out_no_path:
 405        kfree(new->cl_principal);
 406out_no_principal:
 407        rpc_free_iostats(new->cl_metrics);
 408out_no_stats:
 409        kfree(new);
 410out_no_clnt:
 411        dprintk("RPC:       %s: returned error %d\n", __func__, err);
 412        return ERR_PTR(err);
 413}
 414EXPORT_SYMBOL_GPL(rpc_clone_client);
 415
 416/*
 417 * Properly shut down an RPC client, terminating all outstanding
 418 * requests.
 419 */
 420void rpc_shutdown_client(struct rpc_clnt *clnt)
 421{
 422        dprintk("RPC:       shutting down %s client for %s\n",
 423                        clnt->cl_protname, clnt->cl_server);
 424
 425        while (!list_empty(&clnt->cl_tasks)) {
 426                rpc_killall_tasks(clnt);
 427                wait_event_timeout(destroy_wait,
 428                        list_empty(&clnt->cl_tasks), 1*HZ);
 429        }
 430
 431        rpc_release_client(clnt);
 432}
 433EXPORT_SYMBOL_GPL(rpc_shutdown_client);
 434
 435/*
 436 * Free an RPC client
 437 */
 438static void
 439rpc_free_client(struct kref *kref)
 440{
 441        struct rpc_clnt *clnt = container_of(kref, struct rpc_clnt, cl_kref);
 442
 443        dprintk("RPC:       destroying %s client for %s\n",
 444                        clnt->cl_protname, clnt->cl_server);
 445        if (!IS_ERR(clnt->cl_path.dentry)) {
 446                rpc_remove_client_dir(clnt->cl_path.dentry);
 447                rpc_put_mount();
 448        }
 449        if (clnt->cl_parent != clnt) {
 450                rpc_release_client(clnt->cl_parent);
 451                goto out_free;
 452        }
 453        if (clnt->cl_server != clnt->cl_inline_name)
 454                kfree(clnt->cl_server);
 455out_free:
 456        rpc_unregister_client(clnt);
 457        rpc_free_iostats(clnt->cl_metrics);
 458        kfree(clnt->cl_principal);
 459        clnt->cl_metrics = NULL;
 460        xprt_put(clnt->cl_xprt);
 461        rpciod_down();
 462        kfree(clnt);
 463}
 464
 465/*
 466 * Free an RPC client
 467 */
 468static void
 469rpc_free_auth(struct kref *kref)
 470{
 471        struct rpc_clnt *clnt = container_of(kref, struct rpc_clnt, cl_kref);
 472
 473        if (clnt->cl_auth == NULL) {
 474                rpc_free_client(kref);
 475                return;
 476        }
 477
 478        /*
 479         * Note: RPCSEC_GSS may need to send NULL RPC calls in order to
 480         *       release remaining GSS contexts. This mechanism ensures
 481         *       that it can do so safely.
 482         */
 483        kref_init(kref);
 484        rpcauth_release(clnt->cl_auth);
 485        clnt->cl_auth = NULL;
 486        kref_put(kref, rpc_free_client);
 487}
 488
 489/*
 490 * Release reference to the RPC client
 491 */
 492void
 493rpc_release_client(struct rpc_clnt *clnt)
 494{
 495        dprintk("RPC:       rpc_release_client(%p)\n", clnt);
 496
 497        if (list_empty(&clnt->cl_tasks))
 498                wake_up(&destroy_wait);
 499        kref_put(&clnt->cl_kref, rpc_free_auth);
 500}
 501
 502/**
 503 * rpc_bind_new_program - bind a new RPC program to an existing client
 504 * @old: old rpc_client
 505 * @program: rpc program to set
 506 * @vers: rpc program version
 507 *
 508 * Clones the rpc client and sets up a new RPC program. This is mainly
 509 * of use for enabling different RPC programs to share the same transport.
 510 * The Sun NFSv2/v3 ACL protocol can do this.
 511 */
 512struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *old,
 513                                      struct rpc_program *program,
 514                                      u32 vers)
 515{
 516        struct rpc_clnt *clnt;
 517        struct rpc_version *version;
 518        int err;
 519
 520        BUG_ON(vers >= program->nrvers || !program->version[vers]);
 521        version = program->version[vers];
 522        clnt = rpc_clone_client(old);
 523        if (IS_ERR(clnt))
 524                goto out;
 525        clnt->cl_procinfo = version->procs;
 526        clnt->cl_maxproc  = version->nrprocs;
 527        clnt->cl_protname = program->name;
 528        clnt->cl_prog     = program->number;
 529        clnt->cl_vers     = version->number;
 530        clnt->cl_stats    = program->stats;
 531        err = rpc_ping(clnt);
 532        if (err != 0) {
 533                rpc_shutdown_client(clnt);
 534                clnt = ERR_PTR(err);
 535        }
 536out:
 537        return clnt;
 538}
 539EXPORT_SYMBOL_GPL(rpc_bind_new_program);
 540
 541/*
 542 * Default callback for async RPC calls
 543 */
 544static void
 545rpc_default_callback(struct rpc_task *task, void *data)
 546{
 547}
 548
 549static const struct rpc_call_ops rpc_default_ops = {
 550        .rpc_call_done = rpc_default_callback,
 551};
 552
 553/**
 554 * rpc_run_task - Allocate a new RPC task, then run rpc_execute against it
 555 * @task_setup_data: pointer to task initialisation data
 556 */
 557struct rpc_task *rpc_run_task(const struct rpc_task_setup *task_setup_data)
 558{
 559        struct rpc_task *task;
 560
 561        task = rpc_new_task(task_setup_data);
 562        if (IS_ERR(task))
 563                goto out;
 564
 565        atomic_inc(&task->tk_count);
 566        rpc_execute(task);
 567out:
 568        return task;
 569}
 570EXPORT_SYMBOL_GPL(rpc_run_task);
 571
 572/**
 573 * rpc_call_sync - Perform a synchronous RPC call
 574 * @clnt: pointer to RPC client
 575 * @msg: RPC call parameters
 576 * @flags: RPC call flags
 577 */
 578int rpc_call_sync(struct rpc_clnt *clnt, const struct rpc_message *msg, int flags)
 579{
 580        struct rpc_task *task;
 581        struct rpc_task_setup task_setup_data = {
 582                .rpc_client = clnt,
 583                .rpc_message = msg,
 584                .callback_ops = &rpc_default_ops,
 585                .flags = flags,
 586        };
 587        int status;
 588
 589        BUG_ON(flags & RPC_TASK_ASYNC);
 590
 591        task = rpc_run_task(&task_setup_data);
 592        if (IS_ERR(task))
 593                return PTR_ERR(task);
 594        status = task->tk_status;
 595        rpc_put_task(task);
 596        return status;
 597}
 598EXPORT_SYMBOL_GPL(rpc_call_sync);
 599
 600/**
 601 * rpc_call_async - Perform an asynchronous RPC call
 602 * @clnt: pointer to RPC client
 603 * @msg: RPC call parameters
 604 * @flags: RPC call flags
 605 * @tk_ops: RPC call ops
 606 * @data: user call data
 607 */
 608int
 609rpc_call_async(struct rpc_clnt *clnt, const struct rpc_message *msg, int flags,
 610               const struct rpc_call_ops *tk_ops, void *data)
 611{
 612        struct rpc_task *task;
 613        struct rpc_task_setup task_setup_data = {
 614                .rpc_client = clnt,
 615                .rpc_message = msg,
 616                .callback_ops = tk_ops,
 617                .callback_data = data,
 618                .flags = flags|RPC_TASK_ASYNC,
 619        };
 620
 621        task = rpc_run_task(&task_setup_data);
 622        if (IS_ERR(task))
 623                return PTR_ERR(task);
 624        rpc_put_task(task);
 625        return 0;
 626}
 627EXPORT_SYMBOL_GPL(rpc_call_async);
 628
 629#if defined(CONFIG_NFS_V4_1)
 630/**
 631 * rpc_run_bc_task - Allocate a new RPC task for backchannel use, then run
 632 * rpc_execute against it
 633 * @req: RPC request
 634 * @tk_ops: RPC call ops
 635 */
 636struct rpc_task *rpc_run_bc_task(struct rpc_rqst *req,
 637                                const struct rpc_call_ops *tk_ops)
 638{
 639        struct rpc_task *task;
 640        struct xdr_buf *xbufp = &req->rq_snd_buf;
 641        struct rpc_task_setup task_setup_data = {
 642                .callback_ops = tk_ops,
 643        };
 644
 645        dprintk("RPC: rpc_run_bc_task req= %p\n", req);
 646        /*
 647         * Create an rpc_task to send the data
 648         */
 649        task = rpc_new_task(&task_setup_data);
 650        if (IS_ERR(task)) {
 651                xprt_free_bc_request(req);
 652                goto out;
 653        }
 654        task->tk_rqstp = req;
 655
 656        /*
 657         * Set up the xdr_buf length.
 658         * This also indicates that the buffer is XDR encoded already.
 659         */
 660        xbufp->len = xbufp->head[0].iov_len + xbufp->page_len +
 661                        xbufp->tail[0].iov_len;
 662
 663        task->tk_action = call_bc_transmit;
 664        atomic_inc(&task->tk_count);
 665        BUG_ON(atomic_read(&task->tk_count) != 2);
 666        rpc_execute(task);
 667
 668out:
 669        dprintk("RPC: rpc_run_bc_task: task= %p\n", task);
 670        return task;
 671}
 672#endif /* CONFIG_NFS_V4_1 */
 673
 674void
 675rpc_call_start(struct rpc_task *task)
 676{
 677        task->tk_action = call_start;
 678}
 679EXPORT_SYMBOL_GPL(rpc_call_start);
 680
 681/**
 682 * rpc_peeraddr - extract remote peer address from clnt's xprt
 683 * @clnt: RPC client structure
 684 * @buf: target buffer
 685 * @bufsize: length of target buffer
 686 *
 687 * Returns the number of bytes that are actually in the stored address.
 688 */
 689size_t rpc_peeraddr(struct rpc_clnt *clnt, struct sockaddr *buf, size_t bufsize)
 690{
 691        size_t bytes;
 692        struct rpc_xprt *xprt = clnt->cl_xprt;
 693
 694        bytes = sizeof(xprt->addr);
 695        if (bytes > bufsize)
 696                bytes = bufsize;
 697        memcpy(buf, &clnt->cl_xprt->addr, bytes);
 698        return xprt->addrlen;
 699}
 700EXPORT_SYMBOL_GPL(rpc_peeraddr);
 701
 702/**
 703 * rpc_peeraddr2str - return remote peer address in printable format
 704 * @clnt: RPC client structure
 705 * @format: address format
 706 *
 707 */
 708const char *rpc_peeraddr2str(struct rpc_clnt *clnt,
 709                             enum rpc_display_format_t format)
 710{
 711        struct rpc_xprt *xprt = clnt->cl_xprt;
 712
 713        if (xprt->address_strings[format] != NULL)
 714                return xprt->address_strings[format];
 715        else
 716                return "unprintable";
 717}
 718EXPORT_SYMBOL_GPL(rpc_peeraddr2str);
 719
 720void
 721rpc_setbufsize(struct rpc_clnt *clnt, unsigned int sndsize, unsigned int rcvsize)
 722{
 723        struct rpc_xprt *xprt = clnt->cl_xprt;
 724        if (xprt->ops->set_buffer_size)
 725                xprt->ops->set_buffer_size(xprt, sndsize, rcvsize);
 726}
 727EXPORT_SYMBOL_GPL(rpc_setbufsize);
 728
 729/*
 730 * Return size of largest payload RPC client can support, in bytes
 731 *
 732 * For stream transports, this is one RPC record fragment (see RFC
 733 * 1831), as we don't support multi-record requests yet.  For datagram
 734 * transports, this is the size of an IP packet minus the IP, UDP, and
 735 * RPC header sizes.
 736 */
 737size_t rpc_max_payload(struct rpc_clnt *clnt)
 738{
 739        return clnt->cl_xprt->max_payload;
 740}
 741EXPORT_SYMBOL_GPL(rpc_max_payload);
 742
 743/**
 744 * rpc_force_rebind - force transport to check that remote port is unchanged
 745 * @clnt: client to rebind
 746 *
 747 */
 748void rpc_force_rebind(struct rpc_clnt *clnt)
 749{
 750        if (clnt->cl_autobind)
 751                xprt_clear_bound(clnt->cl_xprt);
 752}
 753EXPORT_SYMBOL_GPL(rpc_force_rebind);
 754
 755/*
 756 * Restart an (async) RPC call from the call_prepare state.
 757 * Usually called from within the exit handler.
 758 */
 759void
 760rpc_restart_call_prepare(struct rpc_task *task)
 761{
 762        if (RPC_ASSASSINATED(task))
 763                return;
 764        task->tk_action = rpc_prepare_task;
 765}
 766EXPORT_SYMBOL_GPL(rpc_restart_call_prepare);
 767
 768/*
 769 * Restart an (async) RPC call. Usually called from within the
 770 * exit handler.
 771 */
 772void
 773rpc_restart_call(struct rpc_task *task)
 774{
 775        if (RPC_ASSASSINATED(task))
 776                return;
 777
 778        task->tk_action = call_start;
 779}
 780EXPORT_SYMBOL_GPL(rpc_restart_call);
 781
 782#ifdef RPC_DEBUG
 783static const char *rpc_proc_name(const struct rpc_task *task)
 784{
 785        const struct rpc_procinfo *proc = task->tk_msg.rpc_proc;
 786
 787        if (proc) {
 788                if (proc->p_name)
 789                        return proc->p_name;
 790                else
 791                        return "NULL";
 792        } else
 793                return "no proc";
 794}
 795#endif
 796
 797/*
 798 * 0.  Initial state
 799 *
 800 *     Other FSM states can be visited zero or more times, but
 801 *     this state is visited exactly once for each RPC.
 802 */
 803static void
 804call_start(struct rpc_task *task)
 805{
 806        struct rpc_clnt *clnt = task->tk_client;
 807
 808        dprintk("RPC: %5u call_start %s%d proc %s (%s)\n", task->tk_pid,
 809                        clnt->cl_protname, clnt->cl_vers,
 810                        rpc_proc_name(task),
 811                        (RPC_IS_ASYNC(task) ? "async" : "sync"));
 812
 813        /* Increment call count */
 814        task->tk_msg.rpc_proc->p_count++;
 815        clnt->cl_stats->rpccnt++;
 816        task->tk_action = call_reserve;
 817}
 818
 819/*
 820 * 1.   Reserve an RPC call slot
 821 */
 822static void
 823call_reserve(struct rpc_task *task)
 824{
 825        dprint_status(task);
 826
 827        if (!rpcauth_uptodatecred(task)) {
 828                task->tk_action = call_refresh;
 829                return;
 830        }
 831
 832        task->tk_status  = 0;
 833        task->tk_action  = call_reserveresult;
 834        xprt_reserve(task);
 835}
 836
 837/*
 838 * 1b.  Grok the result of xprt_reserve()
 839 */
 840static void
 841call_reserveresult(struct rpc_task *task)
 842{
 843        int status = task->tk_status;
 844
 845        dprint_status(task);
 846
 847        /*
 848         * After a call to xprt_reserve(), we must have either
 849         * a request slot or else an error status.
 850         */
 851        task->tk_status = 0;
 852        if (status >= 0) {
 853                if (task->tk_rqstp) {
 854                        task->tk_action = call_allocate;
 855                        return;
 856                }
 857
 858                printk(KERN_ERR "%s: status=%d, but no request slot, exiting\n",
 859                                __func__, status);
 860                rpc_exit(task, -EIO);
 861                return;
 862        }
 863
 864        /*
 865         * Even though there was an error, we may have acquired
 866         * a request slot somehow.  Make sure not to leak it.
 867         */
 868        if (task->tk_rqstp) {
 869                printk(KERN_ERR "%s: status=%d, request allocated anyway\n",
 870                                __func__, status);
 871                xprt_release(task);
 872        }
 873
 874        switch (status) {
 875        case -EAGAIN:   /* woken up; retry */
 876                task->tk_action = call_reserve;
 877                return;
 878        case -EIO:      /* probably a shutdown */
 879                break;
 880        default:
 881                printk(KERN_ERR "%s: unrecognized error %d, exiting\n",
 882                                __func__, status);
 883                break;
 884        }
 885        rpc_exit(task, status);
 886}
 887
 888/*
 889 * 2.   Allocate the buffer. For details, see sched.c:rpc_malloc.
 890 *      (Note: buffer memory is freed in xprt_release).
 891 */
 892static void
 893call_allocate(struct rpc_task *task)
 894{
 895        unsigned int slack = task->tk_msg.rpc_cred->cr_auth->au_cslack;
 896        struct rpc_rqst *req = task->tk_rqstp;
 897        struct rpc_xprt *xprt = task->tk_xprt;
 898        struct rpc_procinfo *proc = task->tk_msg.rpc_proc;
 899
 900        dprint_status(task);
 901
 902        task->tk_status = 0;
 903        task->tk_action = call_bind;
 904
 905        if (req->rq_buffer)
 906                return;
 907
 908        if (proc->p_proc != 0) {
 909                BUG_ON(proc->p_arglen == 0);
 910                if (proc->p_decode != NULL)
 911                        BUG_ON(proc->p_replen == 0);
 912        }
 913
 914        /*
 915         * Calculate the size (in quads) of the RPC call
 916         * and reply headers, and convert both values
 917         * to byte sizes.
 918         */
 919        req->rq_callsize = RPC_CALLHDRSIZE + (slack << 1) + proc->p_arglen;
 920        req->rq_callsize <<= 2;
 921        req->rq_rcvsize = RPC_REPHDRSIZE + slack + proc->p_replen;
 922        req->rq_rcvsize <<= 2;
 923
 924        req->rq_buffer = xprt->ops->buf_alloc(task,
 925                                        req->rq_callsize + req->rq_rcvsize);
 926        if (req->rq_buffer != NULL)
 927                return;
 928
 929        dprintk("RPC: %5u rpc_buffer allocation failed\n", task->tk_pid);
 930
 931        if (RPC_IS_ASYNC(task) || !signalled()) {
 932                task->tk_action = call_allocate;
 933                rpc_delay(task, HZ>>4);
 934                return;
 935        }
 936
 937        rpc_exit(task, -ERESTARTSYS);
 938}
 939
 940static inline int
 941rpc_task_need_encode(struct rpc_task *task)
 942{
 943        return task->tk_rqstp->rq_snd_buf.len == 0;
 944}
 945
 946static inline void
 947rpc_task_force_reencode(struct rpc_task *task)
 948{
 949        task->tk_rqstp->rq_snd_buf.len = 0;
 950        task->tk_rqstp->rq_bytes_sent = 0;
 951}
 952
 953static inline void
 954rpc_xdr_buf_init(struct xdr_buf *buf, void *start, size_t len)
 955{
 956        buf->head[0].iov_base = start;
 957        buf->head[0].iov_len = len;
 958        buf->tail[0].iov_len = 0;
 959        buf->page_len = 0;
 960        buf->flags = 0;
 961        buf->len = 0;
 962        buf->buflen = len;
 963}
 964
 965/*
 966 * 3.   Encode arguments of an RPC call
 967 */
 968static void
 969rpc_xdr_encode(struct rpc_task *task)
 970{
 971        struct rpc_rqst *req = task->tk_rqstp;
 972        kxdrproc_t      encode;
 973        __be32          *p;
 974
 975        dprint_status(task);
 976
 977        rpc_xdr_buf_init(&req->rq_snd_buf,
 978                         req->rq_buffer,
 979                         req->rq_callsize);
 980        rpc_xdr_buf_init(&req->rq_rcv_buf,
 981                         (char *)req->rq_buffer + req->rq_callsize,
 982                         req->rq_rcvsize);
 983
 984        p = rpc_encode_header(task);
 985        if (p == NULL) {
 986                printk(KERN_INFO "RPC: couldn't encode RPC header, exit EIO\n");
 987                rpc_exit(task, -EIO);
 988                return;
 989        }
 990
 991        encode = task->tk_msg.rpc_proc->p_encode;
 992        if (encode == NULL)
 993                return;
 994
 995        task->tk_status = rpcauth_wrap_req(task, encode, req, p,
 996                        task->tk_msg.rpc_argp);
 997}
 998
 999/*
1000 * 4.   Get the server port number if not yet set
1001 */
1002static void
1003call_bind(struct rpc_task *task)
1004{
1005        struct rpc_xprt *xprt = task->tk_xprt;
1006
1007        dprint_status(task);
1008
1009        task->tk_action = call_connect;
1010        if (!xprt_bound(xprt)) {
1011                task->tk_action = call_bind_status;
1012                task->tk_timeout = xprt->bind_timeout;
1013                xprt->ops->rpcbind(task);
1014        }
1015}
1016
1017/*
1018 * 4a.  Sort out bind result
1019 */
1020static void
1021call_bind_status(struct rpc_task *task)
1022{
1023        int status = -EIO;
1024
1025        if (task->tk_status >= 0) {
1026                dprint_status(task);
1027                task->tk_status = 0;
1028                task->tk_action = call_connect;
1029                return;
1030        }
1031
1032        switch (task->tk_status) {
1033        case -ENOMEM:
1034                dprintk("RPC: %5u rpcbind out of memory\n", task->tk_pid);
1035                rpc_delay(task, HZ >> 2);
1036                goto retry_timeout;
1037        case -EACCES:
1038                dprintk("RPC: %5u remote rpcbind: RPC program/version "
1039                                "unavailable\n", task->tk_pid);
1040                /* fail immediately if this is an RPC ping */
1041                if (task->tk_msg.rpc_proc->p_proc == 0) {
1042                        status = -EOPNOTSUPP;
1043                        break;
1044                }
1045                rpc_delay(task, 3*HZ);
1046                goto retry_timeout;
1047        case -ETIMEDOUT:
1048                dprintk("RPC: %5u rpcbind request timed out\n",
1049                                task->tk_pid);
1050                goto retry_timeout;
1051        case -EPFNOSUPPORT:
1052                /* server doesn't support any rpcbind version we know of */
1053                dprintk("RPC: %5u unrecognized remote rpcbind service\n",
1054                                task->tk_pid);
1055                break;
1056        case -EPROTONOSUPPORT:
1057                dprintk("RPC: %5u remote rpcbind version unavailable, retrying\n",
1058                                task->tk_pid);
1059                task->tk_status = 0;
1060                task->tk_action = call_bind;
1061                return;
1062        case -ECONNREFUSED:             /* connection problems */
1063        case -ECONNRESET:
1064        case -ENOTCONN:
1065        case -EHOSTDOWN:
1066        case -EHOSTUNREACH:
1067        case -ENETUNREACH:
1068        case -EPIPE:
1069                dprintk("RPC: %5u remote rpcbind unreachable: %d\n",
1070                                task->tk_pid, task->tk_status);
1071                if (!RPC_IS_SOFTCONN(task)) {
1072                        rpc_delay(task, 5*HZ);
1073                        goto retry_timeout;
1074                }
1075                status = task->tk_status;
1076                break;
1077        default:
1078                dprintk("RPC: %5u unrecognized rpcbind error (%d)\n",
1079                                task->tk_pid, -task->tk_status);
1080        }
1081
1082        rpc_exit(task, status);
1083        return;
1084
1085retry_timeout:
1086        task->tk_action = call_timeout;
1087}
1088
1089/*
1090 * 4b.  Connect to the RPC server
1091 */
1092static void
1093call_connect(struct rpc_task *task)
1094{
1095        struct rpc_xprt *xprt = task->tk_xprt;
1096
1097        dprintk("RPC: %5u call_connect xprt %p %s connected\n",
1098                        task->tk_pid, xprt,
1099                        (xprt_connected(xprt) ? "is" : "is not"));
1100
1101        task->tk_action = call_transmit;
1102        if (!xprt_connected(xprt)) {
1103                task->tk_action = call_connect_status;
1104                if (task->tk_status < 0)
1105                        return;
1106                xprt_connect(task);
1107        }
1108}
1109
1110/*
1111 * 4c.  Sort out connect result
1112 */
1113static void
1114call_connect_status(struct rpc_task *task)
1115{
1116        struct rpc_clnt *clnt = task->tk_client;
1117        int status = task->tk_status;
1118
1119        dprint_status(task);
1120
1121        task->tk_status = 0;
1122        if (status >= 0 || status == -EAGAIN) {
1123                clnt->cl_stats->netreconn++;
1124                task->tk_action = call_transmit;
1125                return;
1126        }
1127
1128        switch (status) {
1129                /* if soft mounted, test if we've timed out */
1130        case -ETIMEDOUT:
1131                task->tk_action = call_timeout;
1132                break;
1133        default:
1134                rpc_exit(task, -EIO);
1135        }
1136}
1137
1138/*
1139 * 5.   Transmit the RPC request, and wait for reply
1140 */
1141static void
1142call_transmit(struct rpc_task *task)
1143{
1144        dprint_status(task);
1145
1146        task->tk_action = call_status;
1147        if (task->tk_status < 0)
1148                return;
1149        task->tk_status = xprt_prepare_transmit(task);
1150        if (task->tk_status != 0)
1151                return;
1152        task->tk_action = call_transmit_status;
1153        /* Encode here so that rpcsec_gss can use correct sequence number. */
1154        if (rpc_task_need_encode(task)) {
1155                BUG_ON(task->tk_rqstp->rq_bytes_sent != 0);
1156                rpc_xdr_encode(task);
1157                /* Did the encode result in an error condition? */
1158                if (task->tk_status != 0) {
1159                        /* Was the error nonfatal? */
1160                        if (task->tk_status == -EAGAIN)
1161                                rpc_delay(task, HZ >> 4);
1162                        else
1163                                rpc_exit(task, task->tk_status);
1164                        return;
1165                }
1166        }
1167        xprt_transmit(task);
1168        if (task->tk_status < 0)
1169                return;
1170        /*
1171         * On success, ensure that we call xprt_end_transmit() before sleeping
1172         * in order to allow access to the socket to other RPC requests.
1173         */
1174        call_transmit_status(task);
1175        if (rpc_reply_expected(task))
1176                return;
1177        task->tk_action = rpc_exit_task;
1178        rpc_wake_up_queued_task(&task->tk_xprt->pending, task);
1179}
1180
1181/*
1182 * 5a.  Handle cleanup after a transmission
1183 */
1184static void
1185call_transmit_status(struct rpc_task *task)
1186{
1187        task->tk_action = call_status;
1188
1189        /*
1190         * Common case: success.  Force the compiler to put this
1191         * test first.
1192         */
1193        if (task->tk_status == 0) {
1194                xprt_end_transmit(task);
1195                rpc_task_force_reencode(task);
1196                return;
1197        }
1198
1199        switch (task->tk_status) {
1200        case -EAGAIN:
1201                break;
1202        default:
1203                dprint_status(task);
1204                xprt_end_transmit(task);
1205                rpc_task_force_reencode(task);
1206                break;
1207                /*
1208                 * Special cases: if we've been waiting on the
1209                 * socket's write_space() callback, or if the
1210                 * socket just returned a connection error,
1211                 * then hold onto the transport lock.
1212                 */
1213        case -ECONNREFUSED:
1214        case -EHOSTDOWN:
1215        case -EHOSTUNREACH:
1216        case -ENETUNREACH:
1217                if (RPC_IS_SOFTCONN(task)) {
1218                        xprt_end_transmit(task);
1219                        rpc_exit(task, task->tk_status);
1220                        break;
1221                }
1222        case -ECONNRESET:
1223        case -ENOTCONN:
1224        case -EPIPE:
1225                rpc_task_force_reencode(task);
1226        }
1227}
1228
1229#if defined(CONFIG_NFS_V4_1)
1230/*
1231 * 5b.  Send the backchannel RPC reply.  On error, drop the reply.  In
1232 * addition, disconnect on connectivity errors.
1233 */
1234static void
1235call_bc_transmit(struct rpc_task *task)
1236{
1237        struct rpc_rqst *req = task->tk_rqstp;
1238
1239        BUG_ON(task->tk_status != 0);
1240        task->tk_status = xprt_prepare_transmit(task);
1241        if (task->tk_status == -EAGAIN) {
1242                /*
1243                 * Could not reserve the transport. Try again after the
1244                 * transport is released.
1245                 */
1246                task->tk_status = 0;
1247                task->tk_action = call_bc_transmit;
1248                return;
1249        }
1250
1251        task->tk_action = rpc_exit_task;
1252        if (task->tk_status < 0) {
1253                printk(KERN_NOTICE "RPC: Could not send backchannel reply "
1254                        "error: %d\n", task->tk_status);
1255                return;
1256        }
1257
1258        xprt_transmit(task);
1259        xprt_end_transmit(task);
1260        dprint_status(task);
1261        switch (task->tk_status) {
1262        case 0:
1263                /* Success */
1264                break;
1265        case -EHOSTDOWN:
1266        case -EHOSTUNREACH:
1267        case -ENETUNREACH:
1268        case -ETIMEDOUT:
1269                /*
1270                 * Problem reaching the server.  Disconnect and let the
1271                 * forechannel reestablish the connection.  The server will
1272                 * have to retransmit the backchannel request and we'll
1273                 * reprocess it.  Since these ops are idempotent, there's no
1274                 * need to cache our reply at this time.
1275                 */
1276                printk(KERN_NOTICE "RPC: Could not send backchannel reply "
1277                        "error: %d\n", task->tk_status);
1278                xprt_conditional_disconnect(task->tk_xprt,
1279                        req->rq_connect_cookie);
1280                break;
1281        default:
1282                /*
1283                 * We were unable to reply and will have to drop the
1284                 * request.  The server should reconnect and retransmit.
1285                 */
1286                BUG_ON(task->tk_status == -EAGAIN);
1287                printk(KERN_NOTICE "RPC: Could not send backchannel reply "
1288                        "error: %d\n", task->tk_status);
1289                break;
1290        }
1291        rpc_wake_up_queued_task(&req->rq_xprt->pending, task);
1292}
1293#endif /* CONFIG_NFS_V4_1 */
1294
1295/*
1296 * 6.   Sort out the RPC call status
1297 */
1298static void
1299call_status(struct rpc_task *task)
1300{
1301        struct rpc_clnt *clnt = task->tk_client;
1302        struct rpc_rqst *req = task->tk_rqstp;
1303        int             status;
1304
1305        if (req->rq_reply_bytes_recvd > 0 && !req->rq_bytes_sent)
1306                task->tk_status = req->rq_reply_bytes_recvd;
1307
1308        dprint_status(task);
1309
1310        status = task->tk_status;
1311        if (status >= 0) {
1312                task->tk_action = call_decode;
1313                return;
1314        }
1315
1316        task->tk_status = 0;
1317        switch(status) {
1318        case -EHOSTDOWN:
1319        case -EHOSTUNREACH:
1320        case -ENETUNREACH:
1321                /*
1322                 * Delay any retries for 3 seconds, then handle as if it
1323                 * were a timeout.
1324                 */
1325                rpc_delay(task, 3*HZ);
1326        case -ETIMEDOUT:
1327                task->tk_action = call_timeout;
1328                if (task->tk_client->cl_discrtry)
1329                        xprt_conditional_disconnect(task->tk_xprt,
1330                                        req->rq_connect_cookie);
1331                break;
1332        case -ECONNRESET:
1333        case -ECONNREFUSED:
1334                rpc_force_rebind(clnt);
1335                rpc_delay(task, 3*HZ);
1336        case -EPIPE:
1337        case -ENOTCONN:
1338                task->tk_action = call_bind;
1339                break;
1340        case -EAGAIN:
1341                task->tk_action = call_transmit;
1342                break;
1343        case -EIO:
1344                /* shutdown or soft timeout */
1345                rpc_exit(task, status);
1346                break;
1347        default:
1348                if (clnt->cl_chatty)
1349                        printk("%s: RPC call returned error %d\n",
1350                               clnt->cl_protname, -status);
1351                rpc_exit(task, status);
1352        }
1353}
1354
1355/*
1356 * 6a.  Handle RPC timeout
1357 *      We do not release the request slot, so we keep using the
1358 *      same XID for all retransmits.
1359 */
1360static void
1361call_timeout(struct rpc_task *task)
1362{
1363        struct rpc_clnt *clnt = task->tk_client;
1364
1365        if (xprt_adjust_timeout(task->tk_rqstp) == 0) {
1366                dprintk("RPC: %5u call_timeout (minor)\n", task->tk_pid);
1367                goto retry;
1368        }
1369
1370        dprintk("RPC: %5u call_timeout (major)\n", task->tk_pid);
1371        task->tk_timeouts++;
1372
1373        if (RPC_IS_SOFTCONN(task)) {
1374                rpc_exit(task, -ETIMEDOUT);
1375                return;
1376        }
1377        if (RPC_IS_SOFT(task)) {
1378                if (clnt->cl_chatty)
1379                        printk(KERN_NOTICE "%s: server %s not responding, timed out\n",
1380                                clnt->cl_protname, clnt->cl_server);
1381                rpc_exit(task, -EIO);
1382                return;
1383        }
1384
1385        if (!(task->tk_flags & RPC_CALL_MAJORSEEN)) {
1386                task->tk_flags |= RPC_CALL_MAJORSEEN;
1387                if (clnt->cl_chatty)
1388                        printk(KERN_NOTICE "%s: server %s not responding, still trying\n",
1389                        clnt->cl_protname, clnt->cl_server);
1390        }
1391        rpc_force_rebind(clnt);
1392        /*
1393         * Did our request time out due to an RPCSEC_GSS out-of-sequence
1394         * event? RFC2203 requires the server to drop all such requests.
1395         */
1396        rpcauth_invalcred(task);
1397
1398retry:
1399        clnt->cl_stats->rpcretrans++;
1400        task->tk_action = call_bind;
1401        task->tk_status = 0;
1402}
1403
1404/*
1405 * 7.   Decode the RPC reply
1406 */
1407static void
1408call_decode(struct rpc_task *task)
1409{
1410        struct rpc_clnt *clnt = task->tk_client;
1411        struct rpc_rqst *req = task->tk_rqstp;
1412        kxdrproc_t      decode = task->tk_msg.rpc_proc->p_decode;
1413        __be32          *p;
1414
1415        dprintk("RPC: %5u call_decode (status %d)\n",
1416                        task->tk_pid, task->tk_status);
1417
1418        if (task->tk_flags & RPC_CALL_MAJORSEEN) {
1419                if (clnt->cl_chatty)
1420                        printk(KERN_NOTICE "%s: server %s OK\n",
1421                                clnt->cl_protname, clnt->cl_server);
1422                task->tk_flags &= ~RPC_CALL_MAJORSEEN;
1423        }
1424
1425        /*
1426         * Ensure that we see all writes made by xprt_complete_rqst()
1427         * before it changed req->rq_reply_bytes_recvd.
1428         */
1429        smp_rmb();
1430        req->rq_rcv_buf.len = req->rq_private_buf.len;
1431
1432        /* Check that the softirq receive buffer is valid */
1433        WARN_ON(memcmp(&req->rq_rcv_buf, &req->rq_private_buf,
1434                                sizeof(req->rq_rcv_buf)) != 0);
1435
1436        if (req->rq_rcv_buf.len < 12) {
1437                if (!RPC_IS_SOFT(task)) {
1438                        task->tk_action = call_bind;
1439                        clnt->cl_stats->rpcretrans++;
1440                        goto out_retry;
1441                }
1442                dprintk("RPC:       %s: too small RPC reply size (%d bytes)\n",
1443                                clnt->cl_protname, task->tk_status);
1444                task->tk_action = call_timeout;
1445                goto out_retry;
1446        }
1447
1448        p = rpc_verify_header(task);
1449        if (IS_ERR(p)) {
1450                if (p == ERR_PTR(-EAGAIN))
1451                        goto out_retry;
1452                return;
1453        }
1454
1455        task->tk_action = rpc_exit_task;
1456
1457        if (decode) {
1458                task->tk_status = rpcauth_unwrap_resp(task, decode, req, p,
1459                                                      task->tk_msg.rpc_resp);
1460        }
1461        dprintk("RPC: %5u call_decode result %d\n", task->tk_pid,
1462                        task->tk_status);
1463        return;
1464out_retry:
1465        task->tk_status = 0;
1466        /* Note: rpc_verify_header() may have freed the RPC slot */
1467        if (task->tk_rqstp == req) {
1468                req->rq_reply_bytes_recvd = req->rq_rcv_buf.len = 0;
1469                if (task->tk_client->cl_discrtry)
1470                        xprt_conditional_disconnect(task->tk_xprt,
1471                                        req->rq_connect_cookie);
1472        }
1473}
1474
1475/*
1476 * 8.   Refresh the credentials if rejected by the server
1477 */
1478static void
1479call_refresh(struct rpc_task *task)
1480{
1481        dprint_status(task);
1482
1483        task->tk_action = call_refreshresult;
1484        task->tk_status = 0;
1485        task->tk_client->cl_stats->rpcauthrefresh++;
1486        rpcauth_refreshcred(task);
1487}
1488
1489/*
1490 * 8a.  Process the results of a credential refresh
1491 */
1492static void
1493call_refreshresult(struct rpc_task *task)
1494{
1495        int status = task->tk_status;
1496
1497        dprint_status(task);
1498
1499        task->tk_status = 0;
1500        task->tk_action = call_reserve;
1501        if (status >= 0 && rpcauth_uptodatecred(task))
1502                return;
1503        if (status == -EACCES) {
1504                rpc_exit(task, -EACCES);
1505                return;
1506        }
1507        task->tk_action = call_refresh;
1508        if (status != -ETIMEDOUT)
1509                rpc_delay(task, 3*HZ);
1510}
1511
1512static __be32 *
1513rpc_encode_header(struct rpc_task *task)
1514{
1515        struct rpc_clnt *clnt = task->tk_client;
1516        struct rpc_rqst *req = task->tk_rqstp;
1517        __be32          *p = req->rq_svec[0].iov_base;
1518
1519        /* FIXME: check buffer size? */
1520
1521        p = xprt_skip_transport_header(task->tk_xprt, p);
1522        *p++ = req->rq_xid;             /* XID */
1523        *p++ = htonl(RPC_CALL);         /* CALL */
1524        *p++ = htonl(RPC_VERSION);      /* RPC version */
1525        *p++ = htonl(clnt->cl_prog);    /* program number */
1526        *p++ = htonl(clnt->cl_vers);    /* program version */
1527        *p++ = htonl(task->tk_msg.rpc_proc->p_proc);    /* procedure */
1528        p = rpcauth_marshcred(task, p);
1529        req->rq_slen = xdr_adjust_iovec(&req->rq_svec[0], p);
1530        return p;
1531}
1532
1533static __be32 *
1534rpc_verify_header(struct rpc_task *task)
1535{
1536        struct kvec *iov = &task->tk_rqstp->rq_rcv_buf.head[0];
1537        int len = task->tk_rqstp->rq_rcv_buf.len >> 2;
1538        __be32  *p = iov->iov_base;
1539        u32 n;
1540        int error = -EACCES;
1541
1542        if ((task->tk_rqstp->rq_rcv_buf.len & 3) != 0) {
1543                /* RFC-1014 says that the representation of XDR data must be a
1544                 * multiple of four bytes
1545                 * - if it isn't pointer subtraction in the NFS client may give
1546                 *   undefined results
1547                 */
1548                dprintk("RPC: %5u %s: XDR representation not a multiple of"
1549                       " 4 bytes: 0x%x\n", task->tk_pid, __func__,
1550                       task->tk_rqstp->rq_rcv_buf.len);
1551                goto out_eio;
1552        }
1553        if ((len -= 3) < 0)
1554                goto out_overflow;
1555
1556        p += 1; /* skip XID */
1557        if ((n = ntohl(*p++)) != RPC_REPLY) {
1558                dprintk("RPC: %5u %s: not an RPC reply: %x\n",
1559                        task->tk_pid, __func__, n);
1560                goto out_garbage;
1561        }
1562
1563        if ((n = ntohl(*p++)) != RPC_MSG_ACCEPTED) {
1564                if (--len < 0)
1565                        goto out_overflow;
1566                switch ((n = ntohl(*p++))) {
1567                        case RPC_AUTH_ERROR:
1568                                break;
1569                        case RPC_MISMATCH:
1570                                dprintk("RPC: %5u %s: RPC call version "
1571                                                "mismatch!\n",
1572                                                task->tk_pid, __func__);
1573                                error = -EPROTONOSUPPORT;
1574                                goto out_err;
1575                        default:
1576                                dprintk("RPC: %5u %s: RPC call rejected, "
1577                                                "unknown error: %x\n",
1578                                                task->tk_pid, __func__, n);
1579                                goto out_eio;
1580                }
1581                if (--len < 0)
1582                        goto out_overflow;
1583                switch ((n = ntohl(*p++))) {
1584                case RPC_AUTH_REJECTEDCRED:
1585                case RPC_AUTH_REJECTEDVERF:
1586                case RPCSEC_GSS_CREDPROBLEM:
1587                case RPCSEC_GSS_CTXPROBLEM:
1588                        if (!task->tk_cred_retry)
1589                                break;
1590                        task->tk_cred_retry--;
1591                        dprintk("RPC: %5u %s: retry stale creds\n",
1592                                        task->tk_pid, __func__);
1593                        rpcauth_invalcred(task);
1594                        /* Ensure we obtain a new XID! */
1595                        xprt_release(task);
1596                        task->tk_action = call_refresh;
1597                        goto out_retry;
1598                case RPC_AUTH_BADCRED:
1599                case RPC_AUTH_BADVERF:
1600                        /* possibly garbled cred/verf? */
1601                        if (!task->tk_garb_retry)
1602                                break;
1603                        task->tk_garb_retry--;
1604                        dprintk("RPC: %5u %s: retry garbled creds\n",
1605                                        task->tk_pid, __func__);
1606                        task->tk_action = call_bind;
1607                        goto out_retry;
1608                case RPC_AUTH_TOOWEAK:
1609                        printk(KERN_NOTICE "RPC: server %s requires stronger "
1610                               "authentication.\n", task->tk_client->cl_server);
1611                        break;
1612                default:
1613                        dprintk("RPC: %5u %s: unknown auth error: %x\n",
1614                                        task->tk_pid, __func__, n);
1615                        error = -EIO;
1616                }
1617                dprintk("RPC: %5u %s: call rejected %d\n",
1618                                task->tk_pid, __func__, n);
1619                goto out_err;
1620        }
1621        if (!(p = rpcauth_checkverf(task, p))) {
1622                dprintk("RPC: %5u %s: auth check failed\n",
1623                                task->tk_pid, __func__);
1624                goto out_garbage;               /* bad verifier, retry */
1625        }
1626        len = p - (__be32 *)iov->iov_base - 1;
1627        if (len < 0)
1628                goto out_overflow;
1629        switch ((n = ntohl(*p++))) {
1630        case RPC_SUCCESS:
1631                return p;
1632        case RPC_PROG_UNAVAIL:
1633                dprintk("RPC: %5u %s: program %u is unsupported by server %s\n",
1634                                task->tk_pid, __func__,
1635                                (unsigned int)task->tk_client->cl_prog,
1636                                task->tk_client->cl_server);
1637                error = -EPFNOSUPPORT;
1638                goto out_err;
1639        case RPC_PROG_MISMATCH:
1640                dprintk("RPC: %5u %s: program %u, version %u unsupported by "
1641                                "server %s\n", task->tk_pid, __func__,
1642                                (unsigned int)task->tk_client->cl_prog,
1643                                (unsigned int)task->tk_client->cl_vers,
1644                                task->tk_client->cl_server);
1645                error = -EPROTONOSUPPORT;
1646                goto out_err;
1647        case RPC_PROC_UNAVAIL:
1648                dprintk("RPC: %5u %s: proc %s unsupported by program %u, "
1649                                "version %u on server %s\n",
1650                                task->tk_pid, __func__,
1651                                rpc_proc_name(task),
1652                                task->tk_client->cl_prog,
1653                                task->tk_client->cl_vers,
1654                                task->tk_client->cl_server);
1655                error = -EOPNOTSUPP;
1656                goto out_err;
1657        case RPC_GARBAGE_ARGS:
1658                dprintk("RPC: %5u %s: server saw garbage\n",
1659                                task->tk_pid, __func__);
1660                break;                  /* retry */
1661        default:
1662                dprintk("RPC: %5u %s: server accept status: %x\n",
1663                                task->tk_pid, __func__, n);
1664                /* Also retry */
1665        }
1666
1667out_garbage:
1668        task->tk_client->cl_stats->rpcgarbage++;
1669        if (task->tk_garb_retry) {
1670                task->tk_garb_retry--;
1671                dprintk("RPC: %5u %s: retrying\n",
1672                                task->tk_pid, __func__);
1673                task->tk_action = call_bind;
1674out_retry:
1675                return ERR_PTR(-EAGAIN);
1676        }
1677out_eio:
1678        error = -EIO;
1679out_err:
1680        rpc_exit(task, error);
1681        dprintk("RPC: %5u %s: call failed with error %d\n", task->tk_pid,
1682                        __func__, error);
1683        return ERR_PTR(error);
1684out_overflow:
1685        dprintk("RPC: %5u %s: server reply was truncated.\n", task->tk_pid,
1686                        __func__);
1687        goto out_garbage;
1688}
1689
1690static int rpcproc_encode_null(void *rqstp, __be32 *data, void *obj)
1691{
1692        return 0;
1693}
1694
1695static int rpcproc_decode_null(void *rqstp, __be32 *data, void *obj)
1696{
1697        return 0;
1698}
1699
1700static struct rpc_procinfo rpcproc_null = {
1701        .p_encode = rpcproc_encode_null,
1702        .p_decode = rpcproc_decode_null,
1703};
1704
1705static int rpc_ping(struct rpc_clnt *clnt)
1706{
1707        struct rpc_message msg = {
1708                .rpc_proc = &rpcproc_null,
1709        };
1710        int err;
1711        msg.rpc_cred = authnull_ops.lookup_cred(NULL, NULL, 0);
1712        err = rpc_call_sync(clnt, &msg, RPC_TASK_SOFT | RPC_TASK_SOFTCONN);
1713        put_rpccred(msg.rpc_cred);
1714        return err;
1715}
1716
1717struct rpc_task *rpc_call_null(struct rpc_clnt *clnt, struct rpc_cred *cred, int flags)
1718{
1719        struct rpc_message msg = {
1720                .rpc_proc = &rpcproc_null,
1721                .rpc_cred = cred,
1722        };
1723        struct rpc_task_setup task_setup_data = {
1724                .rpc_client = clnt,
1725                .rpc_message = &msg,
1726                .callback_ops = &rpc_default_ops,
1727                .flags = flags,
1728        };
1729        return rpc_run_task(&task_setup_data);
1730}
1731EXPORT_SYMBOL_GPL(rpc_call_null);
1732
1733#ifdef RPC_DEBUG
1734static void rpc_show_header(void)
1735{
1736        printk(KERN_INFO "-pid- flgs status -client- --rqstp- "
1737                "-timeout ---ops--\n");
1738}
1739
1740static void rpc_show_task(const struct rpc_clnt *clnt,
1741                          const struct rpc_task *task)
1742{
1743        const char *rpc_waitq = "none";
1744        char *p, action[KSYM_SYMBOL_LEN];
1745
1746        if (RPC_IS_QUEUED(task))
1747                rpc_waitq = rpc_qname(task->tk_waitqueue);
1748
1749        /* map tk_action pointer to a function name; then trim off
1750         * the "+0x0 [sunrpc]" */
1751        sprint_symbol(action, (unsigned long)task->tk_action);
1752        p = strchr(action, '+');
1753        if (p)
1754                *p = '\0';
1755
1756        printk(KERN_INFO "%5u %04x %6d %8p %8p %8ld %8p %sv%u %s a:%s q:%s\n",
1757                task->tk_pid, task->tk_flags, task->tk_status,
1758                clnt, task->tk_rqstp, task->tk_timeout, task->tk_ops,
1759                clnt->cl_protname, clnt->cl_vers, rpc_proc_name(task),
1760                action, rpc_waitq);
1761}
1762
1763void rpc_show_tasks(void)
1764{
1765        struct rpc_clnt *clnt;
1766        struct rpc_task *task;
1767        int header = 0;
1768
1769        spin_lock(&rpc_client_lock);
1770        list_for_each_entry(clnt, &all_clients, cl_clients) {
1771                spin_lock(&clnt->cl_lock);
1772                list_for_each_entry(task, &clnt->cl_tasks, tk_task) {
1773                        if (!header) {
1774                                rpc_show_header();
1775                                header++;
1776                        }
1777                        rpc_show_task(clnt, task);
1778                }
1779                spin_unlock(&clnt->cl_lock);
1780        }
1781        spin_unlock(&rpc_client_lock);
1782}
1783#endif
1784