linux/fs/nfsd/nfs4recover.c
<<
>>
Prefs
   1/*
   2*  Copyright (c) 2004 The Regents of the University of Michigan.
   3*  Copyright (c) 2012 Jeff Layton <jlayton@redhat.com>
   4*  All rights reserved.
   5*
   6*  Andy Adamson <andros@citi.umich.edu>
   7*
   8*  Redistribution and use in source and binary forms, with or without
   9*  modification, are permitted provided that the following conditions
  10*  are met:
  11*
  12*  1. Redistributions of source code must retain the above copyright
  13*     notice, this list of conditions and the following disclaimer.
  14*  2. Redistributions in binary form must reproduce the above copyright
  15*     notice, this list of conditions and the following disclaimer in the
  16*     documentation and/or other materials provided with the distribution.
  17*  3. Neither the name of the University nor the names of its
  18*     contributors may be used to endorse or promote products derived
  19*     from this software without specific prior written permission.
  20*
  21*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
  22*  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  23*  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  24*  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25*  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  26*  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  27*  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  28*  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  29*  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  30*  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  31*  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  32*
  33*/
  34
  35#include <linux/file.h>
  36#include <linux/slab.h>
  37#include <linux/namei.h>
  38#include <linux/crypto.h>
  39#include <linux/sched.h>
  40#include <linux/fs.h>
  41#include <linux/module.h>
  42#include <net/net_namespace.h>
  43#include <linux/sunrpc/rpc_pipe_fs.h>
  44#include <linux/sunrpc/clnt.h>
  45#include <linux/nfsd/cld.h>
  46
  47#include "nfsd.h"
  48#include "state.h"
  49#include "vfs.h"
  50#include "netns.h"
  51
  52#define NFSDDBG_FACILITY                NFSDDBG_PROC
  53
  54/* Declarations */
  55struct nfsd4_client_tracking_ops {
  56        int (*init)(struct net *);
  57        void (*exit)(struct net *);
  58        void (*create)(struct nfs4_client *);
  59        void (*remove)(struct nfs4_client *);
  60        int (*check)(struct nfs4_client *);
  61        void (*grace_done)(struct nfsd_net *, time_t);
  62};
  63
  64/* Globals */
  65static char user_recovery_dirname[PATH_MAX] = "/var/lib/nfs/v4recovery";
  66
  67static int
  68nfs4_save_creds(const struct cred **original_creds)
  69{
  70        struct cred *new;
  71
  72        new = prepare_creds();
  73        if (!new)
  74                return -ENOMEM;
  75
  76        new->fsuid = GLOBAL_ROOT_UID;
  77        new->fsgid = GLOBAL_ROOT_GID;
  78        *original_creds = override_creds(new);
  79        put_cred(new);
  80        return 0;
  81}
  82
  83static void
  84nfs4_reset_creds(const struct cred *original)
  85{
  86        revert_creds(original);
  87}
  88
  89static void
  90md5_to_hex(char *out, char *md5)
  91{
  92        int i;
  93
  94        for (i=0; i<16; i++) {
  95                unsigned char c = md5[i];
  96
  97                *out++ = '0' + ((c&0xf0)>>4) + (c>=0xa0)*('a'-'9'-1);
  98                *out++ = '0' + (c&0x0f) + ((c&0x0f)>=0x0a)*('a'-'9'-1);
  99        }
 100        *out = '\0';
 101}
 102
 103static int
 104nfs4_make_rec_clidname(char *dname, const struct xdr_netobj *clname)
 105{
 106        struct xdr_netobj cksum;
 107        struct hash_desc desc;
 108        struct scatterlist sg;
 109        int status;
 110
 111        dprintk("NFSD: nfs4_make_rec_clidname for %.*s\n",
 112                        clname->len, clname->data);
 113        desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP;
 114        desc.tfm = crypto_alloc_hash("md5", 0, CRYPTO_ALG_ASYNC);
 115        if (IS_ERR(desc.tfm)) {
 116                status = PTR_ERR(desc.tfm);
 117                goto out_no_tfm;
 118        }
 119
 120        cksum.len = crypto_hash_digestsize(desc.tfm);
 121        cksum.data = kmalloc(cksum.len, GFP_KERNEL);
 122        if (cksum.data == NULL) {
 123                status = -ENOMEM;
 124                goto out;
 125        }
 126
 127        sg_init_one(&sg, clname->data, clname->len);
 128
 129        status = crypto_hash_digest(&desc, &sg, sg.length, cksum.data);
 130        if (status)
 131                goto out;
 132
 133        md5_to_hex(dname, cksum.data);
 134
 135        status = 0;
 136out:
 137        kfree(cksum.data);
 138        crypto_free_hash(desc.tfm);
 139out_no_tfm:
 140        return status;
 141}
 142
 143/*
 144 * If we had an error generating the recdir name for the legacy tracker
 145 * then warn the admin. If the error doesn't appear to be transient,
 146 * then disable recovery tracking.
 147 */
 148static void
 149legacy_recdir_name_error(struct nfs4_client *clp, int error)
 150{
 151        printk(KERN_ERR "NFSD: unable to generate recoverydir "
 152                        "name (%d).\n", error);
 153
 154        /*
 155         * if the algorithm just doesn't exist, then disable the recovery
 156         * tracker altogether. The crypto libs will generally return this if
 157         * FIPS is enabled as well.
 158         */
 159        if (error == -ENOENT) {
 160                printk(KERN_ERR "NFSD: disabling legacy clientid tracking. "
 161                        "Reboot recovery will not function correctly!\n");
 162                nfsd4_client_tracking_exit(clp->net);
 163        }
 164}
 165
 166static void
 167nfsd4_create_clid_dir(struct nfs4_client *clp)
 168{
 169        const struct cred *original_cred;
 170        char dname[HEXDIR_LEN];
 171        struct dentry *dir, *dentry;
 172        struct nfs4_client_reclaim *crp;
 173        int status;
 174        struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
 175
 176        dprintk("NFSD: nfsd4_create_clid_dir for \"%s\"\n", dname);
 177
 178        if (test_and_set_bit(NFSD4_CLIENT_STABLE, &clp->cl_flags))
 179                return;
 180        if (!nn->rec_file)
 181                return;
 182
 183        status = nfs4_make_rec_clidname(dname, &clp->cl_name);
 184        if (status)
 185                return legacy_recdir_name_error(clp, status);
 186
 187        status = nfs4_save_creds(&original_cred);
 188        if (status < 0)
 189                return;
 190
 191        status = mnt_want_write_file(nn->rec_file);
 192        if (status)
 193                return;
 194
 195        dir = nn->rec_file->f_path.dentry;
 196        /* lock the parent */
 197        mutex_lock(&dir->d_inode->i_mutex);
 198
 199        dentry = lookup_one_len(dname, dir, HEXDIR_LEN-1);
 200        if (IS_ERR(dentry)) {
 201                status = PTR_ERR(dentry);
 202                goto out_unlock;
 203        }
 204        if (dentry->d_inode)
 205                /*
 206                 * In the 4.1 case, where we're called from
 207                 * reclaim_complete(), records from the previous reboot
 208                 * may still be left, so this is OK.
 209                 *
 210                 * In the 4.0 case, we should never get here; but we may
 211                 * as well be forgiving and just succeed silently.
 212                 */
 213                goto out_put;
 214        status = vfs_mkdir(dir->d_inode, dentry, S_IRWXU);
 215out_put:
 216        dput(dentry);
 217out_unlock:
 218        mutex_unlock(&dir->d_inode->i_mutex);
 219        if (status == 0) {
 220                if (nn->in_grace) {
 221                        crp = nfs4_client_to_reclaim(dname, nn);
 222                        if (crp)
 223                                crp->cr_clp = clp;
 224                }
 225                vfs_fsync(nn->rec_file, 0);
 226        } else {
 227                printk(KERN_ERR "NFSD: failed to write recovery record"
 228                                " (err %d); please check that %s exists"
 229                                " and is writeable", status,
 230                                user_recovery_dirname);
 231        }
 232        mnt_drop_write_file(nn->rec_file);
 233        nfs4_reset_creds(original_cred);
 234}
 235
 236typedef int (recdir_func)(struct dentry *, struct dentry *, struct nfsd_net *);
 237
 238struct name_list {
 239        char name[HEXDIR_LEN];
 240        struct list_head list;
 241};
 242
 243struct nfs4_dir_ctx {
 244        struct dir_context ctx;
 245        struct list_head names;
 246};
 247
 248static int
 249nfsd4_build_namelist(void *arg, const char *name, int namlen,
 250                loff_t offset, u64 ino, unsigned int d_type)
 251{
 252        struct nfs4_dir_ctx *ctx = arg;
 253        struct name_list *entry;
 254
 255        if (namlen != HEXDIR_LEN - 1)
 256                return 0;
 257        entry = kmalloc(sizeof(struct name_list), GFP_KERNEL);
 258        if (entry == NULL)
 259                return -ENOMEM;
 260        memcpy(entry->name, name, HEXDIR_LEN - 1);
 261        entry->name[HEXDIR_LEN - 1] = '\0';
 262        list_add(&entry->list, &ctx->names);
 263        return 0;
 264}
 265
 266static int
 267nfsd4_list_rec_dir(recdir_func *f, struct nfsd_net *nn)
 268{
 269        const struct cred *original_cred;
 270        struct dentry *dir = nn->rec_file->f_path.dentry;
 271        struct nfs4_dir_ctx ctx = {
 272                .ctx.actor = nfsd4_build_namelist,
 273                .names = LIST_HEAD_INIT(ctx.names)
 274        };
 275        int status;
 276
 277        status = nfs4_save_creds(&original_cred);
 278        if (status < 0)
 279                return status;
 280
 281        status = vfs_llseek(nn->rec_file, 0, SEEK_SET);
 282        if (status < 0) {
 283                nfs4_reset_creds(original_cred);
 284                return status;
 285        }
 286
 287        status = iterate_dir(nn->rec_file, &ctx.ctx);
 288        mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_PARENT);
 289        while (!list_empty(&ctx.names)) {
 290                struct name_list *entry;
 291                entry = list_entry(ctx.names.next, struct name_list, list);
 292                if (!status) {
 293                        struct dentry *dentry;
 294                        dentry = lookup_one_len(entry->name, dir, HEXDIR_LEN-1);
 295                        if (IS_ERR(dentry)) {
 296                                status = PTR_ERR(dentry);
 297                                break;
 298                        }
 299                        status = f(dir, dentry, nn);
 300                        dput(dentry);
 301                }
 302                list_del(&entry->list);
 303                kfree(entry);
 304        }
 305        mutex_unlock(&dir->d_inode->i_mutex);
 306        nfs4_reset_creds(original_cred);
 307        return status;
 308}
 309
 310static int
 311nfsd4_unlink_clid_dir(char *name, int namlen, struct nfsd_net *nn)
 312{
 313        struct dentry *dir, *dentry;
 314        int status;
 315
 316        dprintk("NFSD: nfsd4_unlink_clid_dir. name %.*s\n", namlen, name);
 317
 318        dir = nn->rec_file->f_path.dentry;
 319        mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_PARENT);
 320        dentry = lookup_one_len(name, dir, namlen);
 321        if (IS_ERR(dentry)) {
 322                status = PTR_ERR(dentry);
 323                goto out_unlock;
 324        }
 325        status = -ENOENT;
 326        if (!dentry->d_inode)
 327                goto out;
 328        status = vfs_rmdir(dir->d_inode, dentry);
 329out:
 330        dput(dentry);
 331out_unlock:
 332        mutex_unlock(&dir->d_inode->i_mutex);
 333        return status;
 334}
 335
 336static void
 337nfsd4_remove_clid_dir(struct nfs4_client *clp)
 338{
 339        const struct cred *original_cred;
 340        struct nfs4_client_reclaim *crp;
 341        char dname[HEXDIR_LEN];
 342        int status;
 343        struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
 344
 345        if (!nn->rec_file || !test_bit(NFSD4_CLIENT_STABLE, &clp->cl_flags))
 346                return;
 347
 348        status = nfs4_make_rec_clidname(dname, &clp->cl_name);
 349        if (status)
 350                return legacy_recdir_name_error(clp, status);
 351
 352        status = mnt_want_write_file(nn->rec_file);
 353        if (status)
 354                goto out;
 355        clear_bit(NFSD4_CLIENT_STABLE, &clp->cl_flags);
 356
 357        status = nfs4_save_creds(&original_cred);
 358        if (status < 0)
 359                goto out_drop_write;
 360
 361        status = nfsd4_unlink_clid_dir(dname, HEXDIR_LEN-1, nn);
 362        nfs4_reset_creds(original_cred);
 363        if (status == 0) {
 364                vfs_fsync(nn->rec_file, 0);
 365                if (nn->in_grace) {
 366                        /* remove reclaim record */
 367                        crp = nfsd4_find_reclaim_client(dname, nn);
 368                        if (crp)
 369                                nfs4_remove_reclaim_record(crp, nn);
 370                }
 371        }
 372out_drop_write:
 373        mnt_drop_write_file(nn->rec_file);
 374out:
 375        if (status)
 376                printk("NFSD: Failed to remove expired client state directory"
 377                                " %.*s\n", HEXDIR_LEN, dname);
 378}
 379
 380static int
 381purge_old(struct dentry *parent, struct dentry *child, struct nfsd_net *nn)
 382{
 383        int status;
 384
 385        if (nfs4_has_reclaimed_state(child->d_name.name, nn))
 386                return 0;
 387
 388        status = vfs_rmdir(parent->d_inode, child);
 389        if (status)
 390                printk("failed to remove client recovery directory %s\n",
 391                                child->d_name.name);
 392        /* Keep trying, success or failure: */
 393        return 0;
 394}
 395
 396static void
 397nfsd4_recdir_purge_old(struct nfsd_net *nn, time_t boot_time)
 398{
 399        int status;
 400
 401        nn->in_grace = false;
 402        if (!nn->rec_file)
 403                return;
 404        status = mnt_want_write_file(nn->rec_file);
 405        if (status)
 406                goto out;
 407        status = nfsd4_list_rec_dir(purge_old, nn);
 408        if (status == 0)
 409                vfs_fsync(nn->rec_file, 0);
 410        mnt_drop_write_file(nn->rec_file);
 411out:
 412        nfs4_release_reclaim(nn);
 413        if (status)
 414                printk("nfsd4: failed to purge old clients from recovery"
 415                        " directory %s\n", nn->rec_file->f_path.dentry->d_name.name);
 416}
 417
 418static int
 419load_recdir(struct dentry *parent, struct dentry *child, struct nfsd_net *nn)
 420{
 421        if (child->d_name.len != HEXDIR_LEN - 1) {
 422                printk("nfsd4: illegal name %s in recovery directory\n",
 423                                child->d_name.name);
 424                /* Keep trying; maybe the others are OK: */
 425                return 0;
 426        }
 427        nfs4_client_to_reclaim(child->d_name.name, nn);
 428        return 0;
 429}
 430
 431static int
 432nfsd4_recdir_load(struct net *net) {
 433        int status;
 434        struct nfsd_net *nn =  net_generic(net, nfsd_net_id);
 435
 436        if (!nn->rec_file)
 437                return 0;
 438
 439        status = nfsd4_list_rec_dir(load_recdir, nn);
 440        if (status)
 441                printk("nfsd4: failed loading clients from recovery"
 442                        " directory %s\n", nn->rec_file->f_path.dentry->d_name.name);
 443        return status;
 444}
 445
 446/*
 447 * Hold reference to the recovery directory.
 448 */
 449
 450static int
 451nfsd4_init_recdir(struct net *net)
 452{
 453        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 454        const struct cred *original_cred;
 455        int status;
 456
 457        printk("NFSD: Using %s as the NFSv4 state recovery directory\n",
 458                        user_recovery_dirname);
 459
 460        BUG_ON(nn->rec_file);
 461
 462        status = nfs4_save_creds(&original_cred);
 463        if (status < 0) {
 464                printk("NFSD: Unable to change credentials to find recovery"
 465                       " directory: error %d\n",
 466                       status);
 467                return status;
 468        }
 469
 470        nn->rec_file = filp_open(user_recovery_dirname, O_RDONLY | O_DIRECTORY, 0);
 471        if (IS_ERR(nn->rec_file)) {
 472                printk("NFSD: unable to find recovery directory %s\n",
 473                                user_recovery_dirname);
 474                status = PTR_ERR(nn->rec_file);
 475                nn->rec_file = NULL;
 476        }
 477
 478        nfs4_reset_creds(original_cred);
 479        if (!status)
 480                nn->in_grace = true;
 481        return status;
 482}
 483
 484
 485static int
 486nfs4_legacy_state_init(struct net *net)
 487{
 488        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 489        int i;
 490
 491        nn->reclaim_str_hashtbl = kmalloc(sizeof(struct list_head) *
 492                                          CLIENT_HASH_SIZE, GFP_KERNEL);
 493        if (!nn->reclaim_str_hashtbl)
 494                return -ENOMEM;
 495
 496        for (i = 0; i < CLIENT_HASH_SIZE; i++)
 497                INIT_LIST_HEAD(&nn->reclaim_str_hashtbl[i]);
 498        nn->reclaim_str_hashtbl_size = 0;
 499
 500        return 0;
 501}
 502
 503static void
 504nfs4_legacy_state_shutdown(struct net *net)
 505{
 506        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 507
 508        kfree(nn->reclaim_str_hashtbl);
 509}
 510
 511static int
 512nfsd4_load_reboot_recovery_data(struct net *net)
 513{
 514        int status;
 515
 516        status = nfsd4_init_recdir(net);
 517        if (!status)
 518                status = nfsd4_recdir_load(net);
 519        if (status)
 520                printk(KERN_ERR "NFSD: Failure reading reboot recovery data\n");
 521        return status;
 522}
 523
 524static int
 525nfsd4_legacy_tracking_init(struct net *net)
 526{
 527        int status;
 528
 529        /* XXX: The legacy code won't work in a container */
 530        if (net != &init_net) {
 531                WARN(1, KERN_ERR "NFSD: attempt to initialize legacy client "
 532                        "tracking in a container!\n");
 533                return -EINVAL;
 534        }
 535
 536        status = nfs4_legacy_state_init(net);
 537        if (status)
 538                return status;
 539
 540        status = nfsd4_load_reboot_recovery_data(net);
 541        if (status)
 542                goto err;
 543        return 0;
 544
 545err:
 546        nfs4_legacy_state_shutdown(net);
 547        return status;
 548}
 549
 550static void
 551nfsd4_shutdown_recdir(struct nfsd_net *nn)
 552{
 553        if (!nn->rec_file)
 554                return;
 555        fput(nn->rec_file);
 556        nn->rec_file = NULL;
 557}
 558
 559static void
 560nfsd4_legacy_tracking_exit(struct net *net)
 561{
 562        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 563
 564        nfs4_release_reclaim(nn);
 565        nfsd4_shutdown_recdir(nn);
 566        nfs4_legacy_state_shutdown(net);
 567}
 568
 569/*
 570 * Change the NFSv4 recovery directory to recdir.
 571 */
 572int
 573nfs4_reset_recoverydir(char *recdir)
 574{
 575        int status;
 576        struct path path;
 577
 578        status = kern_path(recdir, LOOKUP_FOLLOW, &path);
 579        if (status)
 580                return status;
 581        status = -ENOTDIR;
 582        if (S_ISDIR(path.dentry->d_inode->i_mode)) {
 583                strcpy(user_recovery_dirname, recdir);
 584                status = 0;
 585        }
 586        path_put(&path);
 587        return status;
 588}
 589
 590char *
 591nfs4_recoverydir(void)
 592{
 593        return user_recovery_dirname;
 594}
 595
 596static int
 597nfsd4_check_legacy_client(struct nfs4_client *clp)
 598{
 599        int status;
 600        char dname[HEXDIR_LEN];
 601        struct nfs4_client_reclaim *crp;
 602        struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
 603
 604        /* did we already find that this client is stable? */
 605        if (test_bit(NFSD4_CLIENT_STABLE, &clp->cl_flags))
 606                return 0;
 607
 608        status = nfs4_make_rec_clidname(dname, &clp->cl_name);
 609        if (status) {
 610                legacy_recdir_name_error(clp, status);
 611                return status;
 612        }
 613
 614        /* look for it in the reclaim hashtable otherwise */
 615        crp = nfsd4_find_reclaim_client(dname, nn);
 616        if (crp) {
 617                set_bit(NFSD4_CLIENT_STABLE, &clp->cl_flags);
 618                crp->cr_clp = clp;
 619                return 0;
 620        }
 621
 622        return -ENOENT;
 623}
 624
 625static struct nfsd4_client_tracking_ops nfsd4_legacy_tracking_ops = {
 626        .init           = nfsd4_legacy_tracking_init,
 627        .exit           = nfsd4_legacy_tracking_exit,
 628        .create         = nfsd4_create_clid_dir,
 629        .remove         = nfsd4_remove_clid_dir,
 630        .check          = nfsd4_check_legacy_client,
 631        .grace_done     = nfsd4_recdir_purge_old,
 632};
 633
 634/* Globals */
 635#define NFSD_PIPE_DIR           "nfsd"
 636#define NFSD_CLD_PIPE           "cld"
 637
 638/* per-net-ns structure for holding cld upcall info */
 639struct cld_net {
 640        struct rpc_pipe         *cn_pipe;
 641        spinlock_t               cn_lock;
 642        struct list_head         cn_list;
 643        unsigned int             cn_xid;
 644};
 645
 646struct cld_upcall {
 647        struct list_head         cu_list;
 648        struct cld_net          *cu_net;
 649        struct task_struct      *cu_task;
 650        struct cld_msg           cu_msg;
 651};
 652
 653static int
 654__cld_pipe_upcall(struct rpc_pipe *pipe, struct cld_msg *cmsg)
 655{
 656        int ret;
 657        struct rpc_pipe_msg msg;
 658
 659        memset(&msg, 0, sizeof(msg));
 660        msg.data = cmsg;
 661        msg.len = sizeof(*cmsg);
 662
 663        /*
 664         * Set task state before we queue the upcall. That prevents
 665         * wake_up_process in the downcall from racing with schedule.
 666         */
 667        set_current_state(TASK_UNINTERRUPTIBLE);
 668        ret = rpc_queue_upcall(pipe, &msg);
 669        if (ret < 0) {
 670                set_current_state(TASK_RUNNING);
 671                goto out;
 672        }
 673
 674        schedule();
 675        set_current_state(TASK_RUNNING);
 676
 677        if (msg.errno < 0)
 678                ret = msg.errno;
 679out:
 680        return ret;
 681}
 682
 683static int
 684cld_pipe_upcall(struct rpc_pipe *pipe, struct cld_msg *cmsg)
 685{
 686        int ret;
 687
 688        /*
 689         * -EAGAIN occurs when pipe is closed and reopened while there are
 690         *  upcalls queued.
 691         */
 692        do {
 693                ret = __cld_pipe_upcall(pipe, cmsg);
 694        } while (ret == -EAGAIN);
 695
 696        return ret;
 697}
 698
 699static ssize_t
 700cld_pipe_downcall(struct file *filp, const char __user *src, size_t mlen)
 701{
 702        struct cld_upcall *tmp, *cup;
 703        struct cld_msg __user *cmsg = (struct cld_msg __user *)src;
 704        uint32_t xid;
 705        struct nfsd_net *nn = net_generic(filp->f_dentry->d_sb->s_fs_info,
 706                                                nfsd_net_id);
 707        struct cld_net *cn = nn->cld_net;
 708
 709        if (mlen != sizeof(*cmsg)) {
 710                dprintk("%s: got %zu bytes, expected %zu\n", __func__, mlen,
 711                        sizeof(*cmsg));
 712                return -EINVAL;
 713        }
 714
 715        /* copy just the xid so we can try to find that */
 716        if (copy_from_user(&xid, &cmsg->cm_xid, sizeof(xid)) != 0) {
 717                dprintk("%s: error when copying xid from userspace", __func__);
 718                return -EFAULT;
 719        }
 720
 721        /* walk the list and find corresponding xid */
 722        cup = NULL;
 723        spin_lock(&cn->cn_lock);
 724        list_for_each_entry(tmp, &cn->cn_list, cu_list) {
 725                if (get_unaligned(&tmp->cu_msg.cm_xid) == xid) {
 726                        cup = tmp;
 727                        list_del_init(&cup->cu_list);
 728                        break;
 729                }
 730        }
 731        spin_unlock(&cn->cn_lock);
 732
 733        /* couldn't find upcall? */
 734        if (!cup) {
 735                dprintk("%s: couldn't find upcall -- xid=%u\n", __func__, xid);
 736                return -EINVAL;
 737        }
 738
 739        if (copy_from_user(&cup->cu_msg, src, mlen) != 0)
 740                return -EFAULT;
 741
 742        wake_up_process(cup->cu_task);
 743        return mlen;
 744}
 745
 746static void
 747cld_pipe_destroy_msg(struct rpc_pipe_msg *msg)
 748{
 749        struct cld_msg *cmsg = msg->data;
 750        struct cld_upcall *cup = container_of(cmsg, struct cld_upcall,
 751                                                 cu_msg);
 752
 753        /* errno >= 0 means we got a downcall */
 754        if (msg->errno >= 0)
 755                return;
 756
 757        wake_up_process(cup->cu_task);
 758}
 759
 760static const struct rpc_pipe_ops cld_upcall_ops = {
 761        .upcall         = rpc_pipe_generic_upcallclass="sref">cu_task);
dprintk(cu_task);
);
ret ass="sref">cn_list/* errno >= 0 means we got a do46" id="L0=msg" c="+co 4recover.c#L757" id_ef">cewe got a do46" idb3cld_upcall_opsi_modeecoverydir" class="sref">nfs4_recov7t_current7state();
gist_up4recover.c#L706"  class=l>);
gist_up4r>msg)
cn_lup_upbk" c/a>(msg="L751" class="line" namld_msg" class="sref">cld_msg *cmsg)
<;
76 href="+code=cld_msg" class="sref">cld_m 0) {
i_modeec+code=msg" clasiname="L630"> 630i_modensd/nf4red/nfs9ts4recovL4red/nf ="lsref">set7current_state(/* walk the list and find c;
cn-> 630msg="name="L723"> 723ref="fs/nfsd/nfs4recover.c#L636" id="L636" cs4recover.c#L759" id="L759" class="lclass="li7e" name="L673"> 673
7a hre7="fs/nfsd/nfs4a href="fs/nfsd/nfsiname="L630"> 630 723         674        __cld_pipe_upc"line" name="L744"> 74ERR_PTd/nfs4recover.c#ERR_PTdhref=ine" name="L623"> 623}
i_modee
overmk>ret 630 723ref=fs/nfsd/nfs4recover.c#L637" id="L637" cleename="L723"> 723         72g" class="sref">cmsg)
<;4recover.c#L759" id="L759" class="lcne" name=state(TASK_RUNdcover.c#L587" id="d class=""fs/nfsd/nfs4reiname="L630"> 630 677        if7( 697i_modensd/nf4red/nfs9ts4recovL4red/nf ="ls_current7=errno" class="sref">err7o77/nfs4recover.c#L699" id="L699" class="l7= cd/nfs4rec7ver.c#L680" id="L680" cl7ss="l7700" class="lpipe_destroy_msg" class="sref">cld_pipfile  class=l>)un;
gist_up4recover.c#L706"  class=l>)un;
gist_up4r>msg)
cld_msg *cmsg)
<;
 682
clne" name=7L683"> 683static int7cmsg)
 750_mode" class="sref">i_mode;
 6847a hre78"sref">__cld_pipe_upcall(cn_=_msun684cass=""fs/nfsd/nfs4reg" class="sref">cmsg)
 750_mode" class="sref">i_mode;nsd/nf4red/nfs9ts4recovL4red/nf ="lall(s7ruct  686        i7t i_modeecoverydir" class="sref">nfs4_recov7ne" name=7L688"> 688        );
gist_upss="sref">net_generic);
gist_upss=>msg)
cld_msg *cmsg)
<;
cld_m is close7 and reopened while ther7 are<78cmsg = cn_lup_upbk" c/a>(msgnsd/nf4red/nfs9ts4recovL4red/nf ="lcup = i_modeec+code=msg" clasi_mode" class="sref">i_modensd/nf4red/nfs9ts4recovL4red/nf ="l/nfs4reco7er.c#L692" id="L692" cla7s="li79code=wake_up_process" class="sref">wake3" class=7line" name="L693"> 693    79"sref">cup->msge
net_geneovercu_msbpss=ass=""fs/nfsd/nfs4recs4recover.c#L603" id="L6;nsd/nf4red/nfs9ts4recovL4red/nf ="l= __cld_ine" name="L735"> 734recover.c#L706" 4r>msg;
);
 697<3        spin_lock 696        re7urn <79NNING" class="sref">TASK_RUNd_mode" class="sref">i_modee
);
gist_up4r>msg<"fs/nfsd/nfs4re4recover.c#L706" 4r>msg="name="L723"> 72g" class="sref">cmsg)
<;4recover.c#L759" id="L759" class="lnet_geneoverru_msbpss=ass=""fs/nfsd/nfs4recs4recover.c#L603" id="L6;nsd/nf4red/nfs9ts4recovL4red/nf ="l=e" name=7"L698"> 698
cup 697i_modensd/nf4red/nfs9ts4recovL4red/nf ="lne" name=7L699"> 699static cld_pi8ine" name8"L702"> 702        s8ruct 8a hrefsref">file  class=l>)un;
gist_upss="sref">net_generic)un;
gist_upss=>msg)
cld_msg *cmsg)
<;
="+code=cld_msg" class="sref">cld_8sg __user *cn_lup_upbk" c/a>(msgnsd/nf4red/nfs9ts4recovL4red/nf ="8> /* copy just the xid so we8_net 8TASK_RUN4recover.c#L706" 4r>msge
net_geneovercu_msbpss=ass=""fs/nfsd/nfs4recs4recover.c#L603" id="L6;nsd/nf4red/nfs9ts4recovL4red/nf ="8+code=nfs8_net_id" class="sref">nf8d_net80 class="sref">xid, &msg;de=upcall" class="sref">upcall 8et *<8 href="+code=cn" class="8ref">80 error when copying xid from userspa class=l>)un;
gist_up4recover.c#L706"  class=l>)un;
gist_up4r>msg 72g" class="sref">cmsg)
<;4recover.c#L759" id="L759" class="8ne" name=8L709"> 709        if8(efs4ru_msbpss="sref">net_geneoverru_msbpss=ass=""fs/nfsd/nfs4recs4recover.c#L603" id="L6;nsd/nf4red/nfs9ts4recovL4red/nf ="8 sizeof(*8a href="+code=cmsg" clas8="sre80"fs/nfsd/nfs4recover.c#L721" id="L721" class="l8ntk(<8pan class="string">"8%8: got recover.c#L721" id="L721" class="l8nne" name8msg));
wak8f">EINVAL8/a>;
msg->8class="li8e" name="L714"> 714
8a hre81"+code=cld_pipe_upcall" class="sref">cld_pipe_up8ne" name=8L715"> 715        rpc_pipe< class/a>)/a>);
)/a>);
msg)

ret;
(& 687
"8%81 = i_modeec+code=msg" clasi_mode" class="sref">i_modensd/nf4red/nfs9ts4recovL4red/nf ="8f">EFAULT8/a>;
cu_net;
net_generic(filp->f_dentry-> 707        struct cld_8class="li8e" name="L720"> 720
8a hre81cmsg = cld_net;
cld_8ne" name=8L721"> 721        /* walk the list and find 8orrespond8ng xid */
xid, & 708
NULL;
cupcld_8nlass="li8a href="+code=cn" class=8sref"82code=schedule" class="sref">schedule(tmp, &">cld_net;
;
msg 7>cld_net;
;
cld_8sref">get8unaligned(& 735>cld_net;
upcall 8cup =8tmp;
 687
cld_8ntk(<8list_del_init(&<8 href8"+code=cup" class="sree" name="L672"> 672 630cld_8n">EFAULT8 id="L729" class="line" 8ame="8729"> 729 recover.c#L721" id="L721" class="l8="L730" c8ass="line" name="L730"> 830 731 8     83ef="+code=cmsg" class="sref"ver.c#L732" id="L732" class="line" name="L732" 641        ret        structovermk>retmsg 761        .cld_8ock(&8mp;        dpr8ne" name=8L733"> 733        cup 687
 687        cld_8olass="li8>
__cld_pipe_upce" name="L672"> 672 630cld_8"8%83NNING" class="sref">TASK_RUN4k);
u_list" class="sref"4k);
u_lis>msg 732
EINVAL8/a>;
msgrecover.c#L725" id="L725" cla4recover.c#L733" id="L733" class="l8ftk(<8e" name="L738"> 738
8a hre83s="comment">/*
 739        if8((i_modee
net_generic);
gist_upss=>msg< href="+code=d_cs4recover.c#L603" id="L603>;
        cld_8o"L730" c8ser(&cup->i_mode;ref="+code=dprintk" class="sref">dpr8f">EFAULT8/a>;
 687
 687i_mode;nsd/nf4red/nfs9ts4recovL4red/nf ="8ne" name=8L742"> 742         672         structera cld_8_up_proce8s(cupschedule 745
tmp, &">cld_net;
         750_mode" class="sref">i_mode ="me="L687"> 687i_modensd/nf4red/nfs9ts4recovL4red/nf ="8ne" name=8L746"> 746static voi8
TASK_RUNer.c#L708" id="L708" class="line" name="L708"> 708
cld_8" class="8ine" name="L747"> 747cld_8e_destroy8msg(struct /*
 749        s8ruct 8a hrefme="L672"> 672         structera ret;8sg *<8 href="+code=cmsg" class8"sref8>cmsg =         cld_8d_upcall<8a> *file erame="L630"> 630ret;8"+code=cu8msg" class="sref">cu_msg8/a>);85f">cn->cld_8dup_proce8L753"> 753        cup->__f637": unabn clo cres="lt" cs/n=xid" cl"line(ef">xd)d);
cld_8d

__cld_pipe_upc"L741" cme="L687"> 687
cld_8dne" name8code=errno" class="sref"8errno8/a> >= 0)
 697}
 856recover.c#L721" id="L721" class="l8ne" name=8L757"> 757        wak8_up_proce8s(cld_pi8ine" name8"L759"> 759
 672c/a>);
c/a>);
msg)
 760static con8t str8ct dpr8ref">rpc_8ipe_ops cup = net_generic(filp->f_dentry-> 707        struct dpr8r+code=cu8a href="+code=rpc_pipe_g8neric8upcall" class=f="+code=nn" class="sref">nn->cld_net;
 708
cu_task<8a>);
86s="comment">/* errno >= 0 means we 8s4rececov8r.c#L711" id="L2s we got8a dow86n->net_generic)un;
gist_upss=>msg< href="+code=d_cs4recover.c#L603" id="L603>;
        cld_8" id="L648"d/nfs4recover.c#L755" i8="L7586" class="sref">tmp, &over/a> ret        structover/a> ret        cld_8ine" name8"L750">ass="sref">cn_lis8/86NNING" class="sref">TASK_RUNkfre1         708
cld_8ie" name=8"+co 4recover.c#L757" id8ef">c86697" class="l href="fs/nfsd/er.c#L708" id="L708" class="line" name="L708"> 708
spin_lock8t_current8state(86f="+code=copy_from_user" class="sref">8 0) {
container_of(8sref">set8current_state(file alk" _iner_of" class="sref">conalk" _iner_of" c>msg)
nn->cld_net;
c8class="li8e" name="L673"> 673
8a hre8="fs/nfsd/nfs4= container_of(                         674        schedule;
msg newrecover.c#L603" iw="L6)03>;
cld_8cne" name8state( 73newrecover.c#L603" iw="L6)"+code=cld_net" class="sref">cld_8ce" name=8L677"> 677        if8( 73newrecover.c#L603" iw="L6="+code=cld_net" class="sref">cld_8c_current8=errno" class="sref">err8o87s="comment">/*
cup) {8d/nfs4rec8ver.c#L680" id="L680" cl8ss="l8700" cme="L697"> 697ret;8cn_lock);
 724         682
cn->cn->cn_list, cu_list) {
 725                if ( 683static int8cupcup->cm_xid) == xid) {
 72ass="sref">cu_list) {
 6848a hre88"sref">__cld_pipe_upc->cu_list) {
);
cn_lock);
 732
 686        i8t 
 672 688         758}
xid) {
 761  velas"d/nf href idt ru_mde=cu_msggt;xid) {
cn->->cld_net;
cld_83" class=8line" name="L693"> 693    89"sref">cup-> 725                if (ref="+code=cu_list" class="sref">cu_list) {
->cn_lock);
 732
/* copy just the xid so we8ne" name=8L696"> 696        re8urn <89NNING" class="sref">TASK_RUNd;u\n", __func__xid);
 736newrecover.c#L603" iw="L6lass="line" name="L758"s="sref">xid) {
wak8=e" name=8"L698"> 698
cup 697cld_8ne" name=8L699"> 699static cld_pi9ine" name9"L702"> 702        s9ruct 9a hrefsref">file fre1_iner_of" class="sref">confre1_iner_of" c>msg)
_of" class="sref">container_of(convictim="L6)"+code=cld_net" class="sref">cld_9d_upcall<9a> *="+code=cld_msg" class="sref">cld_9sg __user *nn->cld_net;
convictim="L6lass="line" name="L758"nn->cld_9> /* copy just the xid so we9_net 9TASK_RUN4ock" class="sref">cn_lock);
 724        nf9d_net90697" class="l href="fs/nfsd/>cu_list#L726" id="L726nistconvictim="L6lass="line" name="L758"> 728                        break;
90 error when chref="+code=cn_lock"ock" class="sref">cn_lock);
 732
 709        if9((convictim="L6)recover.c#L733" id="L733" class="l9n9" name=9Lnfsd/nfs4recover.c#L7009="sre90"fs/nrecover.c#L760" id="L760" class="l9ntk(<9pan class="string">"9%91s="comment">/* walk the list and find 9nne" name9msg));
cup) {9f">EINVAL9/a>;
cld_pi9class="li9e" name="L714"> 714
9a hre91"+codme="L697"> 697)cres="recover.c#L603" ic)cres=">msg)
cld_9ne" name=9L715"> 715        cld_9can try t9 find that */
 687
container_of(cmsgrecover.c#L688" id="L688" class="l9ot *<9pan class="string">"9%91 = net_generic(filp->f_dentry-> 707        struct dpr9f">EFAULT9/a>;
cu_net;
nn->cld_net;
 708
 720
9a hre91t  721        cup) {9orrespond9ng xid */
xid, &bist" class="sref"te/a>bisgt; 761   _flag" href)"+code=cld_net" class="sref">cld_9f="+code=9ULL" class="sref">NULL;
cupschedule(tmp, &"g" class="sref">cmsg, struct conalk" _iner_of" c>msgcld_net;
dpr9sref">get9unaligned(& 735g" class="sref">cmsg     =9tmp;
 687
cld_9ntk(<9list_del_init(&<9 href9"+code=cup" class="sree" name="L672"> 672 630cld_9n">EFAULT9 id="L729" class="line" 9ame="9729"> 729 recover.c#L721" id="L721" class="l9="L730" c9ass="line" name="L730"> 930 731 9     93ef="+code=cmsg" class="sref"vover.c#L758" id="L758" class="line" name="L758"s="sref">xid) {
cld_9ock(&9mp;cn->xid) {
cld_net;
nfs4 href idt cld_net;
nfs4="+code=cld_net" class="sref">cld_9o="+code=9L733"> 733        cup->cmemcp">msgxid) {
        struct/cld_9olass="li9>
__cld_pipe_upc->cld_net;
nfs4f="+code=cld_net" class=""sref">dpr9/* copy just the xid so we9ntk(<9pan class="string">"9%93NNING" class="sref">TASK_RUN/a>
 687ret<_of" class="sref">contain>ret<_of" c>msgcld_net;
        xid) {
dpr9 =9/a>;
xid name="L735"> 73/a>
(<9e" name="L738"> 738
9a hre93 error when copying xid from userspa/a>
 687xid) {
 761  ve_opsu"nfs4="+code=cld_net" class="sref">cld_9o">EFAULT9L739"> 739        if9(sea>bist" class="sref"sea>bisgt; 761   _flag" href="+code=cld_net" class="sref">cld_9o"L730" c9ser(&EFAULT9/a>;
/* walk the list and find 9ne" name=9L742"> 742        cn->confre1_iner_of" c>msg 735g" class="sref">cmsg ="+code=cld_net" class="sref">cld_9_up_proce9s( 672 630ret;9;
__cld_ine"name="L735"> 73/a>
ret;9;a href="9"L745"> 745
, __f637": Unabn clo cres="lhref=" /a>);
ret;9;tk(<9L746"> 746static voi9

__ft anrdxdd);
cld_9" class="9ine" name="L747"> 747/*
 749        s9ruct 9a hrefm754" id="L754" class="liAsk daemonslo cres="la  iw t anrdcup) {9sg *<9 href="+code=cmsg" class9"sref9400" class="lpipe_destroy_msg" class="sref">cld_pi9d_upcall<9a> *file  ic)rem">crecover.c#L603" ic)rem">c>msg)
cld_9"+code=cu9msg" class="sref">cu_msg9/a>);95 href="+code=cld_upcall" class="sref">c9dup_proce9L753"> 753        cup 687
__user *_of" class="sref">container_of(cmsgrecover.c#L688" id="L688" class="l9dne" name9code=errno" class="sref"9errno9/a> >= 0)
net_generic(filp->f_dentry-> 707        struct dpr956" id="L956" class="line" name="L956"> 955__user *nn->cld_net;
 708
 757        wak9_up_proce9s(cdcup) {9ine" name9"L759"> 759
 73te/a>bist" class="sref"te/a>bisgt; 761   _flag" href)"+code=cld_net" class="sref">cld_9ne" name=9L760"> 760static con9t str95"fs/nfsd/nfs444444444ine" nrecover.c#L709" id="L709" class="l9ref">rpc_9ipe_ops /* walk the list and find 9r+code=cu9a href="+code=rpc_pipe_g9neric96f">cn->conalk" _iner_of" c>msgcld_net;
dpr9ode=cu_ta9k" class="sref">cu_task<9a>);
962 735g" class="sref">cmsg    __cld_pipe_upcme="L687"> 687
cld_9" id="L649"d/nfs4recover.c#L755" i9="L7596" class="sref->e" name="L672"> 672 630cld_9ine" name9"L750">ass="sref">cn_lis9/96NNING" class=recover.c#L721" id="L721" class="l9ie" name=9"+co 4recover.c#L757" id9ef">c96code=wake_up_process" class="sref">wak9t_current9state(xid) {
crecover.c#L603"inerRem">cref=="+code=cld_net" class="sref">cld_9ine" name9pc_queue_upcall" class="9ref">96c_queue_upcall(xid) {
cld_net;
nfs4 href idt cld_net;
nfs4="+code=cld_net" class="sref">cld_9 0) {
cmemcp">msgxid) {
        struct/cld_9sref">set9current_state((cld_net;
nfs4f="+code=cld_net" class=""sref">dpr9;
wak9class="li9e" name="L673"> 673
9a hre97"sref">cup-> 687ret<_of" class="sref">contain>ret<_of" c>msgcld_net;
        xid) {
dpr9ne" name=9L674"> 674        __cld_ine" name="L735"> 73/a>

 687xid) {
 761  ve_opsu"nfs4="+code=cld_net" class="sref">cld_9cne" name9state( 687bist" class="sref"reear>bisgt; 761   _flag" href="+code=cld_net" class="sref">cld_9ce" name=9L677"> 677        if9(err9o97s="comment">/*
(confre1_iner_of" c>msg 735g" class="sref">cmsg ="+code=cld_net" class="sref">cld_9d/nfs4rec9ver.c#L680" id="L680" cl9ss="l9700" cme="L697"> 697 630ret;9 73/a>
ret;9ine" name9"L682"> 682
, __f637": Unabn clo rem">clhref=" /a>);
ret;9ilass="li9L683"> 683static int9cup__ft anrdxdd);
cld_9ie" name=9ne" name="L684"> 6849a hre98"srefrecover.c#L721" id="L721" class="l9i id="L649ruct /* copy just the xid so we9ine" name9"L686"> 686        i9t h754" id="L754" class="liCheckeL639presence of a t anrd, ann=xids="lits timslasmpcup) {9ie" name=9fsd/nfs4recover.c#L687" 9d="L698r.c#Le=cld_pipe_upcall" class="sref">cld_pipe_up9ne" name=9L688"> 688        file  ic)checkrecover.c#L603" ic)check>msg)
cld_9i  =  687
_of" class="sref">container_of(cmsgrecover.c#L688" id="L688" class="l9net_generic(filp->f_dentry-> 707 _generic( dpr93" class=9line" name="L693"> 693    99"fs/nfsd/nfs4= cld_net;
 708
schedulecup) {9ne" name=9L696"> 696        re9urn <99NNING" class=>xid, &bist" class="sref"te/a>bisgt; 761   _flag" href)"+code=cld_net" class="sref/a>) {9ne" name=9s/nfsd/nfs4recover.c#L699" id=99r.c#L737" id="L737" class="l0="+code=cld_net" class="sref">cld_9=e" name=9"L698"> 698
/*
 699static conalk" _iner_of" c>msgcld_net;
dpr9a href="f9/nfsd/nfs4recover.c#L7009 id="99 class="sref">cup name="L735"> 735g" class="sref">cmsg    10owid="L672" class="lin;__f637": Unabn clo checklhref=" t anrd);
10o id="L672" class="linL672" class="lin;__func__" class="sref">__f_opbn c_norage:eef">xdd);
dpr10o2ncall 69310oref="fs/nfsd/">cupcld_10o3ncall10o"sref">__cld_recover.c#L721" id="L721" class="l10o4ncall10os="comment">/* copy just the xid so we10o5ncall 696        re10o69>10oNNING" class="sref">TASK_RUNvover.c#L758" id="L758" class="line" name="L758"s="sref">xid) {
cld_10o6ncall10o697" class="l href="fs/nfsd/"over.c#L758" id="L758" class="line" name="L758"s="sref">xid) {
cld_net;
nfs4 href idt cld_net;
nfs4="+code=cld_net" class="sref">cld_10o7ncall 698
10o error when chref="+code=cn_memcp" class="sref">cmemcp">msgxid) {
        struct/cld_10o8ncall 699static 10o.cld_net;
nfs4f="+code=cld_net" class=""sref">dpr10o9ncall10ot "10pan>10pasref">cup-> 687ret<_of" class="sref">contain>ret<_of" c>msgcld_net;
        xid) {
dpr10p1ncall));
 73/a>
;
cup 687xid) {
 761  ve_opsu"nfs4="+code=cld_net" class="sref">cld_10p3ncall 714
10e" >10p"sref">__cld_pipe_upcme="L687"> 687bist" class="sref"sea>bisgt; 761   _flag" href="+code=cld_net" class="sref">cld_10p4ncall 715        10p" class="srefrecover.c#L721" id="L721" class="l1015ncall
10p5 10p697" class="l href="fs/nfsd/fre1_iner_of" class="sref">confre1_iner_of" c>msg 735g" class="sref">cmsg ="+code=cld_net" class="sref">cld_10p7ncall"10pan>10p"sref">cup 697
>10p/nfs4recover.c#L760" id="L760" class="l10p9ncall 720
10e" >10pt  721        10L7.c#Le=cld_ppipe_destroy_msg" class="sref">cld_pi10L1ncall
10L hrefsref">file  ic)grace_doovercover.c#L603" ic)grace_doov>msg)
net_generic(filp-&ss="line" name="Ltims_st" class="sref"tims_ssref"="line" name="Lboot_timst" class="sref"boot_tims="L6)"+code=cld_net" class="sref">cld_10L2ncallNULL10Lref">="+code=cld_msg" class="sref">cld_10L3ncall10L"sref">__cld_i name="L687"> 687
10La> >= 0)
_of" class="sref">container_of(cmsgrecover.c#L688" id="L688" class="l10L5ncall(&10L5__user *nn->cld_net;
 708
10Lcode=wake_up_process" class="sref">wak10L7ncall(&<10lis>10L error when chref="+code=cn_vover.c#L758" id="L758" c, struct conalk" _iner_of" c>msgcld_net;
dpr10L8ncall10L. 735g" class="sref">cmsg     10ass>10L"fs/nfsd/nfs444444444;cld_103wncall 731 10e" >10e"fs/nfsd/nfs444444444e" name="L672"> 672 630cld_10e1ncall10ed/nfs4recoverrecover.c#L760" id="L760" class="l1032ncall 733        10e2ode=wake_up_process" class="sref">wak1033ncall
xid) {
cld_10e4ncall10e" class="sref">tmp, &"g" class="sref">cmsglass="line" name="L758"s="sref">xid) {
 ="line" name="Lboot_timst" class="sref"boot_tims="L6="+code=cld_net" class="sref">cld_10e5ncall"10pan>10eNNING" class="sref">TASK_RUN/a>
 687ret<_of" class="sref">contain>ret<_of" c>msgcld_net;
        xid) {
dpr1036ncall;
xid name="L735"> 73/a>
dpr1037ncall 738
10e" >10e error when copying xid from userspa/a>
 687xid) {
 761  ve_opsu"nfs4="+code=cld_net" class="sref">cld_10e8ncall 739        if10L73>10e8ode=wake_up_process" class="sref">wak1039ncall(&confre1_iner_of" c>msg 735g" class="sref">cmsg ="+code=cld_net" class="sref">cld_104wncall;
file out_erame="L630"> 630ret;10/1ncall 742        10/d/nfs4recover>xid, &
dpr1042ncall(cup__f637": Unabn clo end grace period:eef">xdd);
cld_10/3ncall10/"srefrecover.c#L721" id="L721" class="l10/4ncall 745
10/s="comment">/* copy just the xid so we1045ncall 746static voi10L74>10/5.c#Le=cld_p/a>)
 761 s="ls_href="_track="s_op"sref"="line" name="L ic)track="s_op"L761"> 761 s="ls_hrd_track="s_op"sref"=    74710/ class="sref""fs/nfsd/nfs4recinist" class="sref"inisef="fs/nfsd/">cfs/nfsd/nfs4recove="ls_inis_tain>retL761"> 761 s="ls_inis_tain>retgt;<="+code=cld_net" class="sref">cld_1047ncall(struct cfs/nfsd/nfs4recove="ls_rem">c_tain>retL761"> 761 s="ls_rem">c_tain>retgt;<="+code=cld_net" class="sref">cld_1048ncall 749        s10"L7>10/8class="sref""fs/nfsd/nfs4reccres="recover.c#L603"cres="ref=/nfsd/">cfs/nfsd/nfs4recove="ls_=l>)cres="recover.c#L603" ic)cres=">msg="+code=cld_net" class="sref">cld_1049ncall10/9class="sref""fs/nfsd/nfs4recrem">crecover.c#L603"rem">c>msg/nfsd/">cfs/nfsd/nfs4recove="ls_=l>)rem">crecover.c#L603" ic)rem">c>msg="+code=cld_net" class="sref">cld_105wncall * >10a>class="sref""fs/nfsd/nfs4reccheckrecover.c#L603"check>msgs/nfsd/">cfs/nfsd/nfs4recove="ls_=l>)checkrecover.c#L603" ic)check>msg="+code=cld_net" class="sref">cld_1051ncallcu_msg10msg>10a1class="sref""fs/nfsd/nfs4recgrace_doovercover.c#L603"grace_doov>msgd/">cfs/nfsd/nfs4recove="ls_=l>)grace_doovercover.c#L603" ic)grace_doov>msg="+code=cld_net" class="sref">cld_1052ncall 753        10aref="}="+code=cld_net" class="sref">cld_1053ncall
schedule10as="co"754" id="L754" class="lixid" clvia usermecohelpercup) {10a5ncall10a5.c#Le=cld_pchar"me="L687"> 687xid) {etrack_pro".c#L[me="L687"> 687xid) PATH_MAX.c#L]cfs/__func__" class="sref">__f/sbinass="{etrack/a>);
cld_1056ncall 757        10a6hrefsref">file mecule_parave_os="srref">xid) mecule_parave_os="s>msg 735etrack_pro"sref">xid) {etrack_pro".c#Lss="line" name="L7ltrack_pro"sref">xid) {etrack_pro".c#Lsssizeof 735etrack_pro"sref">xid) {etrack_pro".c#L)="+code=cld_net" class="sref">cld_1057ncall(cupxid) S_IRUGOerro|;cld_1058ncall 759
10a8hrefsref">file MODULE_PARM_DESC/nfs4recover.c#MODULE_PARM_DESC>msg 735etrack_pro"sref">xid) {etrack_pro".c#Lss=__func__" class="sref">__fPathclo the ss="{etrackixid" clpro"rav/a>);
cld_1059ncall 760static con10L76>10at 10ip.c#Le=cld_p="line" name="Lbooclass="sref">conboocsref"="line" name="L{etrack_legacy_disabn sref">xid) {etrack_legacy_disabn nfs4="+code=cld_net" class="sref">cld_1061ncall10i hrefsref">file mecule_paravrref">xid) mecule_parav>msg 735etrack_legacy_disabn sref">xid) {etrack_legacy_disabn nfs4ss="line" name="Lbooclass="sref">conboocsrefss="line" name="LS_IRUGOsref">xid) S_IRUGOerro|;cld_1062ncallcu_task<10k" >10i"srefme="L672"> 672msg 735etrack_legacy_disabn sref">xid) {etrack_legacy_disabn nfs4s"+code=cld_net" class="sref">cld_1063ncall10i"sref">__cld_pipe_upcm__func__" class="sref">__fDisabn  legacy "sref">ydir conf">sion. Default: false/a>);
cld_1064ncall10is="comment">/* copy just the xid so we1065ncallass="sref">cn_lis10"L7>10i5.c#L#defsres="line" name="LLEGACY_TOPDIR_ENV_PREFIXsref">xid) LEGACY_TOPDIR_ENV_PREFIXsref"=__func__" class="sref">__f637"CLTRACK_LEGACY_TOPDIR=/a>);
ret;10i6ncall10i6.c#L#defsres="line" name="LLEGACY_RECDIR_ENV_PREFIXsref">xid) LEGACY_RECDIR_ENV_PREFIXsref"=__func__" class="sref">__f637"CLTRACK_LEGACY_RECDIR=/a>);
ret;10i7ncall(/*
/*
10i00" cme="L697"> 697< icmsgdpr107wncall(10cuef">="+code=cld_msg" class="sref">cld_1071ncall10cd/nfs4recover> name="L687"> 687cld_1072ncall 673
10e" >10c"sref">cup->cld_1073ncall 674        10c"sref">__cld_char"*fs/nfsd/nfs4recresultrecover.c#L603"resultnfs4="+code=cld_net" class="sref">cld_1074ncall10cs="comment">/* copy just the xid so we1075ncall(xid, &xid) {etrack_legacy_disabn nfs4h"+code=cld_net" class=""sref">dpr1076ncall 677        if10L67>10cr.c#L737" id="L737" class="l, &xid) NULLnfs4="+code=cld_net" class="sref">cld_1077ncallerr10=er>10cs="comment">/*
10cc_queue_upcall( 73LEGACY_TOPDIR_ENV_PREFIXsref">xid) LEGACY_TOPDIR_ENV_PREFIXsref) +mment">/*
10c"fs/nfsd/nfs444444444; 73a hr_"sref">ydirercover.c#L603" icr_"sref">ydir>msg<)) + 1="+code=cld_net" class="sref">cld_108wncall10s/="comment">/*
 682
10sf">cn->msg 73le>cld_net;
nfs4ss="line" name="LGFP_KERNELsref">xid) GFP_KERNELnfs4h="+code=cld_net" class="sref">cld_1082ncall 683static int10L68>10s2 73resultrecover.c#L603"resultnfs4h"+code=cld_net" class=""sref">dpr1083ncall 68410ne">10s"sref">__cld_pipe_upcine" name="L697"> 697cld_1084ncall10ss="comment">/* copy just the xid so we1085ncall 686        i10"L6>10sNNING" class="sref">TASK_RUNvopiec#L726" id="L726"opiecnfs4cfs/nfsd/nfs4recovanhref=fcld_net;
msg 73/asultrecover.c#L603"resultnfs4ss="line" name="Lle>cld_net;
nfs4ss="line" name="LLEGACY_TOPDIR_ENV_PREFIXsref">xid) LEGACY_TOPDIR_ENV_PREFIXsref"=__func__" class="sref">__fef">xs/a>);
/* copy just the xid so we1086ncall10sr.c#L737" id="L737" cfsd/nfs444444444;ydirercover.c#L603" icr_"sref">ydir>msg<))="+code=cld_net" class="sref">cld_1087ncall 688        10s7NING" class=>xid, &cld_net;
nfs4f   10s.cup) {10s9ncall10s"fs/nfsd/nfs444444444;msg 73/asultrecover.c#L603"resultnfs4)="+code=cld_net" class="sref">cld_109wncall10s/.c#L737" id="L737" class="l, &xid) NULLnfs4="+code=cld_net" class="sref">cld_1091ncall10sd/nfs4recoverrecover.c#L760" id="L760" class="l1092ncall 69310s2ode=wake_up_process" class="sref">wak1093ncall10s"sref">__cld_ine" name="L697"> 697cld_1094ncall10s4srefrecover.c#L721" id="L721" class="l1095ncall 696        re10L69>10s5 /*
 698
10s"fs/nsref">file  icmsg)
dpr1098ncall 699static 10sc_que  10scmsg =  687cld_11owncall110asref">cup->cld_11o1ncall11o id="L672" clchar"*fs/nfsd/nfs4recresultrecover.c#L603"resultnfs4="+code=cld_net" class="sref">cld_11o2ncall 6931102ode=wake_up_process" class="sref">wak11o3ncall110"sref">__cld_ine"name="L735"> 735etrack_legacy_disabn sref">xid) {etrack_legacy_disabn nfs4h"+code=cld_net" class=""sref">dpr11o4ncall110" class="sref->lass="l, &xid) NULLnfs4="+code=cld_net" class="sref">cld_11o5ncall 696        re11o69>1105 __ft adir/a>);
 a href="+code=cup" class="sref">cup) {11o7ncall 698
11o error when chref="+code=cn_le>cld_net;
nfs4cfs/nfsd/nfs4recovassle>cld_net;
>msg 73LEGACY_RECDIR_ENV_PREFIXsref">xid) LEGACY_RECDIR_ENV_PREFIXsref) +mment">/*
 699static 11o.cld_net;
>msg 73a hr_"sref">ydirercover.c#L603" icr_"sref">ydir>msg<)) + 1 + name="L735"> 73HEXDIR_LENercover.c#L603"HEXDIR_LENnfs4="+code=cld_net" class="sref">cld_11o9ncall11ot "11pan>11pasref">cup->msg 73le>cld_net;
nfs4ss="line" name="LGFP_KERNELsref">xid) GFP_KERNELnfs4h="+code=cld_net" class="sref">cld_11p1ncall));
 73/asultrecover.c#L603"resultnfs4h"+code=cld_net" class=""sref">dpr11p2ncall;
cup 697cld_11p3ncall 714
11e" >111code=schedule" class="sref">schedule 715        11p" class="sref"sref">TASK_RUNvopiec#L726" id="L726"opiecnfs4cfs/nfsd/nfs4recovanhref=fcld_net;
msg 73/asultrecover.c#L603"resultnfs4ss="line" name="Lle>cld_net;
nfs4ss="line" name="LLEGACY_RECDIR_ENV_PREFIXsref">xid) LEGACY_RECDIR_ENV_PREFIXsref"=__func__" class="sref">__fef">xs//a>);
/* copy just the xid so we1115ncall
1116
ydirercover.c#L603" icr_"sref">ydir>msg<))="+code=cld_net" class="sref">cld_1116ncall(&xid, &, &cld_net;
nfs4c- name="L735"> 73HEXDIR_LENercover.c#L603"HEXDIR_LENnfs4)f   "11pan>111 error when copying xi754" id="L754" class="lijustcine" nanoth="s if output will be truncatcdcup) {11p8ncall;
msg 73/asultrecover.c#L603"resultnfs4)="+code=cld_net" class="sref">cld_11p9ncall 720
11e" >111"fs/nfsd/nfs444444444ine" nl, &xid) NULLnfs4="+code=cld_net" class="sref">cld_112wncall 721        112asref">cupwak1122ncallNULL112"sref">cup->msg 73/asultrecover.c#L603"resultnfs4 + name="L735"> 73vopiec#L726" id="L726"opiecnfs403>;
cld_1123ncall112"sref">__cld_ine"name="L735"> 735opiec#L726" id="L726"opiecnfs4f   (msg 73/asultrecover.c#L603"resultnfs4)="+code=cld_net" class="sref">cld_11L5ncall(&1126
, &xid) NULLnfs4="+code=cld_net" class="sref">cld_1126ncall112r.c#L737" id=recover.c#L721" id="L721" class="l1127ncall(&<11lis>112s="comment">/*
11L. 697cld_1129ncall 11ass>11L"fs/nrecover.c#L721" id="L721" class="l113wncall 731 11e" >113/="comment">/*
11ed/nfse=cld_pipe_upcall" class="sref">cld_pipe_up11e2ncall 733        113"srefme="L672"> 672< iccon icmsgxid) ar"nfs403char"*fs/nfsd/nfs4reclegacycld_net;
dpr1133ncall
11e" class="srefchar"*fs/nfsd/nfs4recenv" class="sref">cenv" cla[2]="+code=cld_net" class="sref">cld_11e5ncall"11pan>11eNNING" class=char"*fs/nfsd/nfs4recar"vsref">xid) ar"v cla[4]="+code=cld_net" class="sref">cld_11e6ncall;
 name="L687"> 687
 738
11e" >113s="comment">/*
 739        if11L73>113. 687;
msg< name="L735"> 735etrack_pro"sref">xid) {etrack_pro".c#L[0])f   (&__fef">xs: {etrack_pro" isedisabn dd);
cld_114wncall;
,  742        114d/nfs4recoverrecover.c#L760" id="L760" class="l1142ncall(wak11/3ncall114n->__fef">xs: {md:eef">xsd);
cld_1144ncall 745
114" class="sref"sref">TASK_RUNd;u\n", __fef">xs: ar":eef">xsd);
xid) ar"nfs4 ?s="line" name="Lar"sref">xid) ar"nfs4 :"=__func__" class="sref">__f(null)/a>);
cld_1145ncall 746static voi11L74>114NNING" class="sref">TASK_RUNd;u\n", __fef">xs: legacy:eef">xsd);
__f(null)/a>);
cld_1146ncall 747114code=wake_up_process" class="sref">wak1147ncall(struct cenv" cla[0]cfs/nfsd/nfs4recovlegacycld_net;
cld_1148ncall 749        s11"L7>114c_queue_upcall(cenv" cla[1]cfs/nfsd/nfs4recovNULLsref">xid) NULLnfs4="+code=cld_net" class="sref">cld_1149ncall114t  >115asref">cup->xid) ar"v cla[0]cfsxid) {etrack_pro".c#L="+code=cld_net" class="sref">cld_1151ncallcu_msg11msg>115f">cn->xid) ar"v cla[1]cfs/nfsd/nfs4recov7mc#L726" id="L726" cnfs4="+code=cld_net" class="sref">cld_1152ncall 753        115"sref">cup->xid) ar"v cla[2]cfs/nfsd/nfs4recovar"sref">xid) ar"nfs4="+code=cld_net" class="sref">cld_1153ncall
xid) ar"v cla[3]cfs/nfsd/nfs4recovNULLsref">xid) NULLnfs4="+code=cld_net" class="sref">cld_11a4ncall115s="comment">/* copy just the xid so we11a5ncall115NNING" class="sref">TASK_RUN/a>
 687msg 73ar"vsref">xid) ar"v cla[0]ss="line" name="Lar"vsref">xid) ar"v class="line" name="Lenv" class="sref">cenv" class="line" name="LUMH_WAIT_PROC/nfs4recover.c#UMH_WAIT_PROCnfs4)="+code=cld_net" class="sref">cld_1156ncall 757        115697" class="l 754" id="L754" class="lhref="+code=cup" class="sref">cup) {1157ncall(xiwehref=re gett="s 4" ENOENT or "ACCESnfef="+code=cup" class="sref">cup) {1158ncall 759
11a8hrefs754" id="L754" class=="L737" c* error. The admi" i4" re-enabn citcup) {1159ncall 760static con11L76>11at cup) {116wncall cup) {1161ncall116d/nfs4recover>xid, &
, TASK_RUN/a>
, cu_task<11k" >116ref="fs/nfsd/">cup__f637": ef">xs was not found or is href="+execuopbn c(ef">xd). /a>);
__cld_pipe_upcclass="l 754" id="L75ass="sref">__fSett="s {etrack_pro" to blank ass="s!/a>);
/* copy just the xid so we1164ncall116" class="sref->">cupxid) {etrack_pro".c#Lss="line" name="L/a>
cld_1165ncallass="sref">cn_lis11"L7>1166
 735etrack_pro"sref">xid) {etrack_pro".c#L[0]cfs/__func__" class="srefref=\0fref=cld_11i6ncall116r.c#L737" id=recover.c#L721" id="L721" class="l11i7ncall(, __fef">xs: ef">xs lass="lvalue:eef">xdd);
xid) {etrack_pro".c#Lss="line" name="L/a>
cld_1168ncall1168ode=wake_up_process" class="sref">wak11i9ncall116"fs/nfsd/nfs4ine" name="L697"> 697
recover.c#L721" id="L721" class="l1171ncall117code=wake_up_process" class="sref">wak1172ncall 673
11e" >11c"srefe=cld_pchar"*mment">/*
 674        11c"srefme="L697"> 697cbin_to_hex_dg">msg name="L687"> 687cld_net;
nfs4h"+code=cld_net" class=""sref">dpr1174ncall11cs="co  ( name="L687"> 687;
 677        if11L67>11cr.c#L737" id=char"*fs/nfsd/nfs4recbufcld_net;
;
err11=er>11cs="comment">/*
11cc_queue_upcall754" id="L754" class="li+1 L639terminat="s NULLc* href="+code=cup" class="sref">cup) {1179ncall117cmsg = msg, &cld_net;
nfs4c* 2) + 1ss="line" name="LGFP_KERNELsref">xid) GFP_KERNELnfs4h="+code=cld_net" class="sref">cld_118wncall118asref">cupxid name="L735"> 73bufcld_net;
dpr1181ncall 682
118 id="L672" class="linine" name="L697"> 697;
cld_1182ncall 683static int11L68>1182ode=wake_up_process" class="sref">wak1183ncall 68411ne">118n->cld_1184ncall118" class="srefL639 687;
 687cld_net;
nfs4;ame="L687"> 687;
 686        i11"L6>1186
 73shref=fcld_net;
msg 73hexcld_net;
__fef">x2.2x/a>);
cld_1186ncall11sr.c#L737" id="L737" chref="+code=cn_hexcld_net;
cld_1187ncall 688        11s7NING" class=recover.c#L721" id="L721" class="l1188ncall118. 697;
cld_1189ncall118"fs/nrecover.c#L721" id="L721" class="l119wncall119/="comment">/*
119d/nfse=cld_pipe_upcall" class="sref">cld_pipe_up1192ncall 693119"srefme="L672"> 672< icmsg)
net_generessref"="line" name="L__atss=bute__uot;, msg, &net_generessrefh"+code=cld_net" class=""sref">dpr1193ncall119n  119" class="sref"754" id="L754" class="liXXX: The usermeco helpercup) {1195ncall 696        re11L69>119NNING" class=>xid, &net_generessref"!=ef="+code=cu_list" clinis_ss="sref">net_geneinis_ss=nfs4f   119r.c#L737" id="L737" chref="+code=cn_WARNercover.c#L603"WARN>msg<1ss="line" name="LKERN_ERd/nfs4recover.c#KERN_ERdsref"=__func__" class="sref">__f637": atsempt to inisialize umh href=" /a>);
 698
119 error when copying x">cup__ftrack="s in a contaGAIr!d);
cld_1198ncall 699static 119.xid) "INVAL.c#L="+code=cld_net" class="sref">cld_11s9ncall11scmsg = cup 697< iccon icmsg<;__func__" class="sref">__finis/a>);
xid) NULLnfs4="fs/nfsd/nfs4recNULLsref">xid) NULLnfs4f="+code=cld_net" class="sref">cld_12o1ncall12o id="recover.c#L721" id="L721" class="l12o2ncall 6931202ode=wake_up_process" class="sref">wak12o3ncall120"srefe=cld_ppipe_destroy_msg" class="sref">cld_pi12o4ncall120" clame="L697"> 697< icmsg)
cmlpsrefh"+code=cld_net" class=""sref">dpr12o5ncall 696        re12o69>1205 120r.c#L737" id=char"*fs/nfsd/nfs4rechexic#L726" id="L726hexic.c#L="+code=cld_net" class="sref">cld_12o7ncall 698
120s="comment">/*
 699static 120c_queue_upcall(cbin_to_hex_dg">msg<="line" name="L7e" class="sref">cmlpsrefass="line" name="L708"_ncn"#L726" id="L7268"_ncn"sref"fs/nfsd/nfs4recdatauot;, cmlpsrefass="line" name="L708"_ncn"#L726" id="L7268"_ncn"sref"fs/nfsd/nfs4recle>cld_net;
nfs4f="+code=cld_net" class="sref">cld_12o9ncall120cmsg =  73hexic#L726" id="L726hexic.c#Lf   "12pan>121/.c#L737" id="L737" chref="+code=cn_d;u\n", __fef">xs: ca href="+alk" s=" memoryfL639_of" c!d);
cld_12p1ncall));
cld_12p2ncall;
 714
12e" >121n->con icmsg<;__func__" class="sref">__fcres="/a>);
xid) NULLnfs4f="+code=cld_net" class="sref">cld_12p4ncall 715        12p" class="sref"sref">TASK_RUNkfre1recover.c#L603"kfre1>msg 73hexic#L726" id="L726hexic.c#Lf="+code=cld_net" class="sref">cld_12p5ncall
1216recover.c#L721" id="L721" class="l12p6ncall(&wak12p7ncall"12pan>121 erroe=cld_ppipe_destroy_msg" class="sref">cld_pi12p8ncall;
file  iccrecover.c#L603" icc>msg)
cmlpsrefh"+code=cld_net" class=""sref">dpr12p9ncall 720
12e" >121"fs/n   721        122asref">cupcld_12L1ncall
122code=wake_up_process" class="sref">wak1222ncallNULL122"sref">cup->cbin_to_hex_dg">msg<="line" name="L7e" class="sref">cmlpsrefass="line" name="L708"_ncn"#L726" id="L7268"_ncn"sref"fs/nfsd/nfs4recdatauot;, cmlpsrefass="line" name="L708"_ncn"#L726" id="L7268"_ncn"sref"fs/nfsd/nfs4recle>cld_net;
nfs4f="+code=cld_net" class="sref">cld_1223ncall122"sref">__cld_ine" name="L735"> 73hexic#L726" id="L726hexic.c#Lf   (, __fef">xs: ca href="+alk" s=" memoryfL639_of" c!d);
cld_12L5ncall(&1226
cld_12L6ncall122r.c#L737" id=recover.c#L721" id="L721" class="l1227ncall(&<12lis>122 error when chref="+code=cn_ iccon icmsg<;__func__" class="sref">__frem">c/a>);
xid) NULLnfs4f="+code=cld_net" class="sref">cld_12L8ncall122c_queue_upcall(msg 73hexic#L726" id="L726hexic.c#Lf="+code=cld_net" class="sref">cld_1229ncall 12ass>12L"fs/nrecover.c#L721" id="L721" class="l123wncall 731 12e" >123/="comment">/*
12ed/nfse=cld_pipe_upcall" class="sref">cld_pipe_up12e2ncall 733        123"srefme="L672"> 672< icmsg)
cmlpsrefh"+code=cld_net" class=""sref">dpr1233ncall
12e" class="sref> name="L687"> 687
"12pan>12eNNING" class=char"*fs/nfsd/nfs4rechexic#L726" id="L726hexic.c#L="*fs/nfsd/nfs4reclegacycld_net;
>123code=wake_up_process" class="sref">wak1237ncall 738
12e" >123 error when chref="+code=cn_hexic#L726" id="L726hexic.c#Lcfs/nfsd/nfs4recovbin_to_hex_dg" class="sref">cbin_to_hex_dg">msg<="line" name="L7e" class="sref">cmlpsrefass="line" name="L708"_ncn"#L726" id="L7268"_ncn"sref"fs/nfsd/nfs4recdatauot;, cmlpsrefass="line" name="L708"_ncn"#L726" id="L7268"_ncn"sref"fs/nfsd/nfs4recle>cld_net;
nfs4f="+code=cld_net" class="sref">cld_12e8ncall 739        if12L73>123. 73hexic#L726" id="L726hexic.c#Lf   (&__fef">xs: {a href="+alk" s=" memoryfL639_of" c!d);
cld_124wncall;
xid) "NOMEMnfs4recover.c#L688" id="L688" class="l12/1ncall 742        124d/nfs4recoverrecover.c#L760" id="L760" class="l1242ncall(cup->msgcmlpsrefass="line" name="L708"_ncn"#L726" id="L7268"_ncn"sref)="+code=cld_net" class="sref">cld_1243ncall124n-> 687< iccon icmsg<;__func__" class="sref">__fcheck/a>);
;
cld_1244ncall 745
124" class="sref"sref">TASK_RUNkfre1recover.c#L603"kfre1>msg 73legacycld_net;
cld_1245ncall 746static voi12L74>124NNING" class="sref">TASK_RUNkfre1recover.c#L603"kfre1>msg 73hexic#L726" id="L726hexic.c#Lf="+code=cld_net" class="sref">cld_1246ncall 747124r.c#L737" id=ine" name="L697"> 697
124 errorecover.c#L760" id="L760" class="l1248ncall 749        s12"L7>1248ode=wake_up_process" class="sref">wak1249ncall124t cld_pi125wncall * >125asrefme="L687"> 687< icmsg)
net_genesicd_ss=.c#L7fs/nfsd/nfs4rec__atss=bute__uot;, msg, &cld_net;
nfs4s_destroy_msg" class="sref">cld_pi1251ncallcu_msg12msg>125 id="L672" class="linfsd/nfs444444444;cboot_timesrefh"+code=cld_net" class=""sref">dpr1252ncall 753        125"sref  
__cld_char"*fs/nfsd/nfs4reclegacycld_net;
125" class="srefchar"; cla[22];f"754" id="L754" class="liFIXME: better way to determin" max size?c* href="+code=cup" class="sref">cup) {12a5ncall1255  757        125697" class="l  73time/a>t" class="sref"time/a> class=__func__" class="sref">__fef">xld/a>);
cboot_timesrefhrecover.c#L688" id="L688" class="l12a7ncall(;
msg 759
125c_queue_upcall(con icmsg<;__func__" class="sref">__fgracedonc/a>);
 class=ame="L735"> 73legacycld_net;
cld_1259ncall 760static con12L76>125cmsg = msg 73legacycld_net;
cld_126wncall recover.c#L721" id="L721" class="l1261ncall126code=wake_up_process" class="sref">wak1262ncallcu_task<12k" >126"srefe=cld_p/a>)
__cld_"fs/nfsd/nfs4recinist" class="sref"inis>msgfs444444444="me="L687"> 687< icmsgs_destroy_msg" class="sref">cld_pi1264ncall126" class="sref"fs/nfsd/nfs4recexist" class="sref"exis>msgfs444444444="me="L687"> 687xid) NULLnfs4=_destroy_msg" class="sref">cld_pi1265ncallass="sref">cn_lis12"L7>1266
 687< icmsg=_destroy_msg" class="sref">cld_pi1266ncall126r.c#L737" id="fs/nfsd/nfs4recrem">crecover.c#L603"rem">c>msg444444444="me="L687"> 687< iccrecover.c#L603" icc>msg=_destroy_msg" class="sref">cld_pi1267ncall(msgs444444444="me="L687"> 687< icmsg=_destroy_msg" class="sref">cld_pi1268ncall1268error when c"fs/nfsd/nfs4recgrace_doncrecover.c#L603"grace_donc>msg44444="me="L687"> 687< icmsg=_destroy_msg" class="sref">cld_pi1269ncall126"fs/n}="+code=cld_net" class="sref">cld_127wncall(127/="comment">/*
127code=ipe_upcall" class="sref">cld_pipe_up1272ncall 673
12e" >127"srefme="L672"> 672< icmsg)
net_generessref"ef="+code=filp" cs="sref">net_generessrefh"+code=cld_net" class=""sref">dpr1273ncall 674        127n   68712cNNING" class=/a>)
 677        if12L67>12cr.c#L737" id=/a>)
net_genesicd_ss=.c#L7ef="+code=filp" c>cld_net;
nfs44="me="L687"> 687< et_generi recover.c#L603" et_generi >msg 73cs="sref">net_generessref03>;
cld_1277ncallerr12=er>12cs="comment">/*
12cc_queue_upcall754" id="L754" class="lijustciun the iniso>xiisothe method isealresdy decidcdcup) {1279ncall127cmsg = cld_net;
nfs4ass="line" name="L708"ef="_track="s_opsercover.c#L603"=lef="_track="s_ops.c#Lh"+code=cld_net" class=""sref">dpr128wncall128/.c#L737" id="L737" cgoto4; 682
128code=wake_up_process" class="sref">wak1282ncall 683static int12L68>1282_queue_upcall754" id="L754" class="lhref="+code=cup" class="sref">cup) {1283ncall 68412ne">128ns754" id="L754" class=="L737" c* First, try a UMH9_of" c. It should succeed or fail quickly, sohref="+code=cup" class="sref">cup) {1284ncall128" clas754" id="L754" class=="L737" c* therehref=s little harm in try="s that first.nfef="+code=cup" class="sref">cup) {1285ncall 686        i12"L6>1286s754" id="L754" class=="L737" c* href="+code=cup" class="sref">cup) {1286ncall128697" class="l  688        128 error when chref="+code=cn_e=clusercover.c#L603"e=clusnfs44="me="L687"> 687< >cld_net;
nfs4ass="line" name="L708"ef="_track="s_opsercover.c#L603"=lef="_track="s_ops.c#Lass="line" name="L70inist" class="sref"inis>msg 73cs="sref">net_generessrefh="+code=cld_net" class="sref">cld_1288ncall128. 73e=clusercover.c#L603"e=clusnfs4h"+code=cld_net" class=""sref">dpr1289ncall128"fs/nfsd/nfs444444444ine" nl, &/*
1291_queue_upcall754" id="L754" class="lhref="+code=cup" class="sref">cup) {1292ncall 693129"srefm754" id="L754" class=="L737" c* Seeo>xithe >cupcup) {1293ncall129ns754" id="L754" class=="L737" c* then useithe legacy ops.nfef="+code=cup" class="sref">cup) {1294ncall129" clas754" id="L754" class=="L737" c* href="+code=cup" class="sref">cup) {1295ncall 696        re12L69>129NNING" class="sref">TASK_RUNc>cld_net;
nfs4ass="line" name="L708"ef="_track="s_opsercover.c#L603"=lef="_track="s_ops.c#L =ef="+code=cu_list" cl ic 687msg 73cfhr_"sref">ydirercover.c#L603" icr_"sref">ydir>msg<)ss="line" name="LLOOKUP_FOLLOWercover.c#L603"LOOKUP_FOLLOWsref03f="+code=cu_list" clpathercover.c#L603"path.c#Lh="+code=cld_net" class="sref">cld_1297ncall 698
129 error when c>xid name="L735"> 73e=clusercover.c#L603"e=clusnfs4hs   699static 129. 687msg 73pathercover.c#L603"path.c#L"fs/nfsd/nfs4recdf="rycld_net;
;
;
cld_1299ncall129"fs/nfsd/nfs444444444;net_genepath_pu=>msgcld_13owncall130/.c#L737" id="L737" cixidf="+code=filp" e=clusercover.c#L603"e=clusnfs4h"+code=cld_net" class=""sref">dpr13o1ncall130 id="L672" class="linfsd/nfs4goto4; 693130ref="fs/nfsd/recover.c#L721" id="L721" class="l13o3ncall130"srefecover.c#L721" id="L721" class="l13o4ncall130" class="sref"754" id="L754" class="liFin" cy, try to4usei" idcldcup) {13o5ncall 696        re13o69>130NNING" class="sref">TASK_RUNc>cld_net;
nfs4ass="line" name="L708"ef="_track="s_opsercover.c#L603"=lef="_track="s_ops.c#L =ef="+code=cu_list" cl ic, __f637": the " idcld);
 698
130 error when copying x">cup__frem">cd in 3.10. Pleaseitransition to us="s /a>);
 699static 130.cup__f" idcltrack.d);
cld_13o9ncall130cmsg<;cld_131wncall"13pan>131asref">cup-> 687< >cld_net;
nfs4ass="line" name="L708"ef="_track="s_opsercover.c#L603"=lef="_track="s_ops.c#Lass="line" name="L70inist" class="sref"inis>msg 73cs="sref">net_generessrefh="+code=cld_net" class="sref">cld_1311ncall));
;
cup__f637": Unabn cto inisialize href=" /a>);
 714
13e" >131n->__freref">y track="s!c(ef">xd)d);
cld_1314ncall 715        13p" class="sref" class="sref">TASK_RUNc>cld_net;
nfs4ass="line" name="L708"ef="_track="s_opsercover.c#L603"=lef="_track="s_ops.c#L =eme="L687"> 687xid) NULLnfs4="+code=cld_net" class="sref">cld_1315ncall
1315ef="fs/nfsd/recover.c#L721" id="L721" class="l13p6ncall(& 697"13pan>131 errorecover.c#L760" id="L760" class="l13p8ncall;
wak13p9ncall 720
13e" >131"fs/npipe_destroy_msg" class="sref">cld_pi132wncall 721        132asrefme="L687"> 687< icmsg)
net_generessref"ef="+code=filp" cs="sref">net_generessrefh"+code=cld_net" class=""sref">dpr13L1ncall
132code=  NULL132"sref">cup)
net_genesicd_ss=.c#L7ef="+code=filp" c>cld_net;
nfs44="me="L687"> 687< et_generi recover.c#L603" et_generi >msg 73cs="sref">net_generessref03>;
132"srefecover.c#L721" id="L721" class="l13L4ncall(cld_net;
nfs4ass="line" name="L708"ef="_track="s_opsercover.c#L603"=lef="_track="s_ops.c#Lhs  (&1326
cld_net;
nfs4ass="line" name="L708"ef="_track="s_opsercover.c#L603"=lef="_track="s_ops.c#Lass="line" name="L70exist" class="sref"exis>msgh"+code=cld_net" class=""sref">dpr13L6ncall132r.c#L737" id="L737" c" class="sref">TASK_RUNc>cld_net;
nfs4ass="line" name="L708"ef="_track="s_opsercover.c#L603"=lef="_track="s_ops.c#Lass="line" name="L70exist" class="sref"exis>msg 73cs="sref">net_generessrefh="+code=cld_net" class="sref">cld_1327ncall(&<13lis>132 error when copying x"sref">TASK_RUNc>cld_net;
nfs4ass="line" name="L708"ef="_track="s_opsercover.c#L603"=lef="_track="s_ops.c#L =eme="L687"> 687xid) NULLnfs4="+code=cld_net" class="sref">cld_13L8ncall132c_queue_upcalrecover.c#L760" id="L760" class="l1329ncall 13ass>13L"fs/nrecover.c#L721" id="L721" class="l133wncall 731 13e" >133/="comment">/*
13ed/nfspipe_destroy_msg" class="sref">cld_pi13e2ncall 733        133"srefme="L672"> 672< icmsg)
cmlpsrefh"+code=cld_net" class=""sref">dpr1333ncall
13e" class="sref/a>)
net_genesicd_ss=.c#L7ef="+code=filp" c>cld_net;
nfs44="me="L687"> 687< et_generi recover.c#L603" et_generi >msg 737e" class="sref">cmlpsrefass="line" name="L70cs="sref">net_generessref03>;
"13pan>1335 >133r.c#L737" id=ixidf="+code=filp" c>cld_net;
nfs4ass="line" name="L708"ef="_track="s_opsercover.c#L603"=lef="_track="s_ops.c#Lh"+code=cld_net" class=""sref">dpr1337ncall 738
13e" >133 error when copying x"sref">TASK_RUNc>cld_net;
nfs4ass="line" name="L708"ef="_track="s_opsercover.c#L603"=lef="_track="s_ops.c#Lass="line" name="L708res="recover.c#L603"cres=">msg 737e" class="sref">cmlpsrefh=" 739        if13L73>133.133"fs/necover.c#L721" id="L721" class="l134wncall;
cld_pi13/1ncall 742        134d/nfsme="L672"> 672< iccrecover.c#L603" icc>msg)
cmlpsrefh"+code=cld_net" class=""sref">dpr1342ncall(134n->)
net_genesicd_ss=.c#L7ef="+code=filp" c>cld_net;
nfs44="me="L687"> 687< et_generi recover.c#L603" et_generi >msg 737e" class="sref">cmlpsrefass="line" name="L70cs="sref">net_generessref03>;
 745
134" cla" 746static voi13L74>134NNING" class=ixidf="+code=filp" c>cld_net;
nfs4ass="line" name="L708"ef="_track="s_opsercover.c#L603"=lef="_track="s_ops.c#Lh"+code=cld_net" class=""sref">dpr1346ncall 747134r.c#L737" id="L737" chref="+code=cn_c>cld_net;
nfs4ass="line" name="L708"ef="_track="s_opsercover.c#L603"=lef="_track="s_ops.c#Lass="line" name="L70rem">crecover.c#L603"rem">c>msg 737e" class="sref">cmlpsrefh="(struct  749        s13"L7>1348ode=wake_up_process" class="sref">wak1349ncall134t cld_pipe_up135wncall * >135asrefme="L687"> 687< icmsg)
cmlpsrefh"+code=cld_net" class=""sref">dpr1351ncallcu_msg13msg>135code=   753        135"sref">cup)
net_genesicd_ss=.c#L7ef="+code=filp" c>cld_net;
nfs44="me="L687"> 687< et_generi recover.c#L603" et_generi >msg 737e" class="sref">cmlpsrefass="line" name="L70cs="sref">net_generessref03>;

135" class="srefixidf="+code=filp" c>cld_net;
nfs4ass="line" name="L708"ef="_track="s_opsercover.c#L603"=lef="_track="s_ops.c#Lhecover.c#L721" id="L721" class="l13a5ncall1356
msg 737e" class="sref">cmlpsrefh=" 757        135code=wake_up_process" class="sref">wak13a7ncall(c"OPNOTSUPPnfs4="+code=cld_net" class="sref">cld_13a8ncall 759
135. 760static con13L76>135"fs/necover.c#L721" id="L721" class="l136wncall cld_pi1361ncall136d/nfsme="L672"> 672< icmsg)
net_genesicd_ss=.c#L7ef="+code=filp" c>cld_net;
nfs4="fs/nfsd/nfs4rectime_st" class="sref"time_s.c#L7fs/nfsd/nfs4recboot_time class="sref">cboot_timesrefh"+code=cld_net" class=""sref">dpr1362ncallcu_task<13k" >136"sref  __cld_ixidf="+code=filp" c>cld_net;
nfs4ass="line" name="L708"ef="_track="s_opsercover.c#L603"=lef="_track="s_ops.c#Lhecover.c#L721" id="L721" class="l1364ncall136" class="sref" class="sref">TASK_RUNc>cld_net;
nfs4ass="line" name="L708"ef="_track="s_opsercover.c#L603"=lef="_track="s_ops.c#Lass="line" name="L70grace_doncrecover.c#L603"grace_donc>msgdf="+code=filp" c>cld_net;
nfs4="fs/nfsd/nfs4recboot_time class="sref">cboot_timesrefhrecover.c#L688" id="L688" class="l1365ncallass="sref">cn_lis13"L7>1366recover.c#L721" id="L721" class="l1366ncall136code=wake_up_process" class="sref">wak1367ncall(cld_pipe_up1368ncall1368hrefsref">file rpc_pipefs_evf="recover.c#L603"rpc_pipefs_evf=">msg)
t" class="sref"pa> clahecover.c#L721" id="L721" class="l1369ncall136"fs/n  (137asref">cup)
 687t" class="sref"pa> clarecover.c#L688" id="L688" class="l1371ncall1371sref">cup)
net_generessref"ef="+code=filp" cs="sref">net_generessref4="me="L687"> 687 673
13e" >137"sref">cup)
net_genesicd_ss=.c#L7ef="+code=filp" c>cld_net;
nfs44="me="L687"> 687< et_generi recover.c#L603" et_generi >msg 73cs="sref">net_generessref03>;
 674        137n->)
net_gene=ld_cs=nfs4c*="line" name="L7>cld_net;
nfs44="me="L687"> 687< >cld_net;
nfs4ass="line" name="L708"d_cs="sref">net_gene=ld_cs=nfs4=";
( name="L687"> 687
 677        if13L67>137code=wake_up_process" class="sref">wak1377ncallerr13=er>137 error when c>xid name="L735"> 73"ry_m"Lule_gest" class="sref"try_m"Lule_ges>msg 73THIS_MODULEt" class="sref"THIS_MODULEnfs4hhecover.c#L721" id="L721" class="l1378ncall137.137"fs/necover.c#L721" id="L721" class="l138wncall138/.c#L737" id=>xid name="L735"> 737>cld_net;
nfs4hs   682
138 id="L672" class="linname="L735"> 73m"Lule_pu="sref">net_genem"Lule_pu=>msg 73THIS_MODULEt" class="sref"THIS_MODULEnfs4h=" 683static int13L68>138ref="fs/nfsd/">cup 68413ne">138n->138" cla" 686        i13"L6>138NNING" class=/witchidf="+code=filp" evf="recover.c#L603"evf=">msghs  138697" class="lcaseif="+code=filp" RPC_PIPEFS_MOUNTrecover.c#L603"RPC_PIPEFS_MOUNT97" :"+code=cld_net" class="sref">cld_1387ncall 688        138 error when copying x"sref">TASK_RUNdf="rycld_net;
msg 73sbrecover.c#L603"sbnfs4ss="line" name="L7>cld_net;
nfs4ass="line" name="L708n_pipecld_net;
_pipenfs4h="138.msg 73df="rycld_net;
138"fs/nfsd/nfs444444444opying x"sref">TASK_RUN/a>
 687msg 73df="rycld_net;
139/.c#L737" id="L737" cccccccccbreak="139 id="L672" class="linrecover.c#L721" id="L721" class="l1392ncall 693139ref="fs/nfsd/">cup;
139n->139497" class="lcaseif="+code=filp" RPC_PIPEFS_UMOUNTrecover.c#L603"RPC_PIPEFS_UMOUNT97" :"+code=cld_net" class="sref">cld_1395ncall 696        re13L69>1396
cld_net;
nfs4ass="line" name="L708n_pipecld_net;
_pipenfs4ass="line" name="L70df="rycld_net;
TASK_RUNcicmsg 737>cld_net;
nfs4ass="line" name="L708n_pipecld_net;
_pipenfs4h=" 698
139 error when copying xbreak=" 699static 139.cld_1399ncall139"fs/nfsd/nfs444444444;c"NOTSUPPnfs4="+code=cld_net" class="sref">cld_14owncall140/.c#L737" id="L737" cbreak="140d/nfs4recoverrecover.c#L760" id="L760" class="l14o2ncall 693140ref="fs/nfsd/name="L735"> 73m"Lule_pu="sref">net_genem"Lule_pu=>msg 73THIS_MODULEt" class="sref"THIS_MODULEnfs4h="140n-> 697
140" clarecover.c#L760" id="L760" class="l14o5ncall 696        re14o69>1405 )
TASK_RUNcic 698
140 error when c"fs/nfsd/nfs4rec otifier_f" class="sref">con otifier_f" cnfs4cfs/nfsd/nfs4recovrpc_pipefs_evf="recover.c#L603"rpc_pipefs_evf=">msg=_destroy_msg" class="sref">cld_pi14o8ncall 699static 140.cld_14o9ncall140"fs/necover.c#L721" id="L721" class="l141wncall"14pan>141asrefipe_upcall" class="sref">cld_pipe_up1411ncall));
 672>141"sref   714
14e" >141n-> 697msg 715        141" clarecover.c#L760" id="L760" class="l1415ncall
1415 141r.c#Lpipe_destroy_msg" class="sref">cld_pi14p7ncall"14pan>141 erroode=cu_list" clunregister_=ld_cotifier
>1418ode=   720
14e" >141cmsg = msg 721        142uef">recover.c#L721" id="L721" class="l14L1ncall
142code=


The origin" LXR software by the cover.c#Lhttp://sourceforge.net/projects/lxrr>LXR 4" cunitynfs4ssthis expericlas" lassion by cover.c#Lmailto:lxr@spaux.no">lxr@spaux.nonfs4.
lxr.spaux.no kindly hosted by cover.c#Lhttp://www.redpill-spapro.no">Redpill Lpapro ASnfs4ssprovider of Lpaux 4"nsult="s and operations services since 1995.