linux/fs/nfs/nfs4state.c
<<
>>
Prefs
   1/*
   2 *  fs/nfs/nfs4state.c
   3 *
   4 *  Client-side XDR for NFSv4.
   5 *
   6 *  Copyright (c) 2002 The Regents of the University of Michigan.
   7 *  All rights reserved.
   8 *
   9 *  Kendrick Smith <kmsmith@umich.edu>
  10 *
  11 *  Redistribution and use in source and binary forms, with or without
  12 *  modification, are permitted provided that the following conditions
  13 *  are met:
  14 *
  15 *  1. Redistributions of source code must retain the above copyright
  16 *     notice, this list of conditions and the following disclaimer.
  17 *  2. Redistributions in binary form must reproduce the above copyright
  18 *     notice, this list of conditions and the following disclaimer in the
  19 *     documentation and/or other materials provided with the distribution.
  20 *  3. Neither the name of the University nor the names of its
  21 *     contributors may be used to endorse or promote products derived
  22 *     from this software without specific prior written permission.
  23 *
  24 *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
  25 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  26 *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  27 *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28 *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  29 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  30 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  31 *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  32 *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  33 *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  34 *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  35 *
  36 * Implementation of the NFSv4 state model.  For the time being,
  37 * this is minimal, but will be made much more complex in a
  38 * subsequent patch.
  39 */
  40
  41#include <linux/kernel.h>
  42#include <linux/slab.h>
  43#include <linux/fs.h>
  44#include <linux/nfs_fs.h>
  45#include <linux/nfs_idmap.h>
  46#include <linux/kthread.h>
  47#include <linux/module.h>
  48#include <linux/random.h>
  49#include <linux/ratelimit.h>
  50#include <linux/workqueue.h>
  51#include <linux/bitops.h>
  52#include <linux/jiffies.h>
  53
  54#include <linux/sunrpc/clnt.h>
  55
  56#include "nfs4_fs.h"
  57#include "callback.h"
  58#include "delegation.h"
  59#include "internal.h"
  60#include "nfs4session.h"
  61#include "pnfs.h"
  62#include "netns.h"
  63
  64#define NFSDBG_FACILITY         NFSDBG_STATE
  65
  66#define OPENOWNER_POOL_SIZE     8
  67
  68const nfs4_stateid zero_stateid;
  69static DEFINE_MUTEX(nfs_clid_init_mutex);
  70
  71int nfs4_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
  72{
  73        struct nfs4_setclientid_res clid = {
  74                .clientid = clp->cl_clientid,
  75                .confirm = clp->cl_confirm,
  76        };
  77        unsigned short port;
  78        int status;
  79        struct nfs_net *nn = net_generic(clp->cl_net, nfs_net_id);
  80
  81        if (test_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state))
  82                goto do_confirm;
  83        port = nn->nfs_callback_tcpport;
  84        if (clp->cl_addr.ss_family == AF_INET6)
  85                port = nn->nfs_callback_tcpport6;
  86
  87        status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, port, cred, &clid);
  88        if (status != 0)
  89                goto out;
  90        clp->cl_clientid = clid.clientid;
  91        clp->cl_confirm = clid.confirm;
  92        set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
  93do_confirm:
  94        status = nfs4_proc_setclientid_confirm(clp, &clid, cred);
  95        if (status != 0)
  96                goto out;
  97        clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
  98        nfs4_schedule_state_renewal(clp);
  99out:
 100        return status;
 101}
 102
 103/**
 104 * nfs40_discover_server_trunking - Detect server IP address trunking (mv0)
 105 *
 106 * @clp: nfs_client under test
 107 * @result: OUT: found nfs_client, or clp
 108 * @cred: credential to use for trunking test
 109 *
 110 * Returns zero, a negative errno, or a negative NFS4ERR status.
 111 * If zero is returned, an nfs_client pointer is planted in
 112 * "result".
 113 *
 114 * Note: The returned client may not yet be marked ready.
 115 */
 116int nfs40_discover_server_trunking(struct nfs_client *clp,
 117                                   struct nfs_client **result,
 118                                   struct rpc_cred *cred)
 119{
 120        struct nfs4_setclientid_res clid = {
 121                .clientid = clp->cl_clientid,
 122                .confirm = clp->cl_confirm,
 123        };
 124        struct nfs_net *nn = net_generic(clp->cl_net, nfs_net_id);
 125        unsigned short port;
 126        int status;
 127
 128        port = nn->nfs_callback_tcpport;
 129        if (clp->cl_addr.ss_family == AF_INET6)
 130                port = nn->nfs_callback_tcpport6;
 131
 132        status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, port, cred, &clid);
 133        if (status != 0)
 134                goto out;
 135        clp->cl_clientid = clid.clientid;
 136        clp->cl_confirm = clid.confirm;
 137
 138        status = nfs40_walk_client_list(clp, result, cred);
 139        if (status == 0) {
 140                /* Sustain the lease, even if it's empty.  If the clientid4
 141                 * goes stale it's of no use for trunking discovery. */
 142                nfs4_schedule_state_renewal(*result);
 143        }
 144out:
 145        return status;
 146}
 147
 148struct rpc_cred *nfs4_get_machine_cred_locked(struct nfs_client *clp)
 149{
 150        struct rpc_cred *cred = NULL;
 151
 152        if (clp->cl_machine_cred != NULL)
 153                cred = get_rpccred(clp->cl_machine_cred);
 154        return cred;
 155}
 156
 157static void nfs4_root_machine_cred(struct nfs_client *clp)
 158{
 159        struct rpc_cred *cred, *new;
 160
 161        new = rpc_lookup_machine_cred(NULL);
 162        spin_lock(&clp->cl_lock);
 163        cred = clp->cl_machine_cred;
 164        clp->cl_machine_cred = new;
 165        spin_unlock(&clp->cl_lock);
 166        if (cred != NULL)
 167                put_rpccred(cred);
 168}
 169
 170static struct rpc_cred *
 171nfs4_get_renew_cred_server_locked(struct nfs_server *server)
 172{
 173        struct rpc_cred *cred = NULL;
 174        struct nfs4_state_owner *sp;
 175        struct rb_node *pos;
 176
 177        for (pos = rb_first(&server->state_owners);
 178             pos != NULL;
 179             pos = rb_next(pos)) {
 180                sp = rb_entry(pos, struct nfs4_state_owner, so_server_node);
 181                if (list_empty(&sp->so_states))
 182                        continue;
 183                cred = get_rpccred(sp->so_cred);
 184                break;
 185        }
 186        return cred;
 187}
 188
 189/**
 190 * nfs4_get_renew_cred_locked - Acquire credential for a renew operation
 191 * @clp: client state handle
 192 *
 193 * Returns an rpc_cred with reference count bumped, or NULL.
 194 * Caller must hold clp->cl_lock.
 195 */
 196struct rpc_cred *nfs4_get_renew_cred_locked(struct nfs_client *clp)
 197{
 198        struct rpc_cred *cred = NULL;
 199        struct nfs_server *server;
 200
 201        /* Use machine credentials if available */
 202        cred = nfs4_get_machine_cred_locked(clp);
 203        if (cred != NULL)
 204                goto out;
 205
 206        rcu_read_lock();
 207        list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
 208                cred = nfs4_get_renew_cred_server_locked(server);
 209                if (cred != NULL)
 210                        break;
 211        }
 212        rcu_read_unlock();
 213
 214out:
 215        return cred;
 216}
 217
 218static void nfs4_end_drain_slot_table(struct nfs4_slot_table *tbl)
 219{
 220        if (test_and_clear_bit(NFS4_SLOT_TBL_DRAINING, &tbl->slot_tbl_state)) {
 221                spin_lock(&tbl->slot_tbl_lock);
 222                nfs41_wake_slot_table(tbl);
 223                spin_unlock(&tbl->slot_tbl_lock);
 224        }
 225}
 226
 227static void nfs4_end_drain_session(struct nfs_client *clp)
 228{
 229        struct nfs4_session *ses = clp->cl_session;
 230
 231        if (clp->cl_slot_tbl) {
 232                nfs4_end_drain_slot_table(clp->cl_slot_tbl);
 233                return;
 234        }
 235
 236        if (ses != NULL) {
 237                nfs4_end_drain_slot_table(&ses->bc_slot_table);
 238                nfs4_end_drain_slot_table(&ses->fc_slot_table);
 239        }
 240}
 241
 242static int nfs4_drain_slot_tbl(struct nfs4_slot_table *tbl)
 243{
 244        set_bit(NFS4_SLOT_TBL_DRAINING, &tbl->slot_tbl_state);
 245        spin_lock(&tbl->slot_tbl_lock);
 246        if (tbl->highest_used_slotid != NFS4_NO_SLOT) {
 247                reinit_completion(&tbl->complete);
 248                spin_unlock(&tbl->slot_tbl_lock);
 249                return wait_for_completion_interruptible(&tbl->complete);
 250        }
 251        spin_unlock(&tbl->slot_tbl_lock);
 252        return 0;
 253}
 254
 255static int nfs4_begin_drain_session(struct nfs_client *clp)
 256{
 257        struct nfs4_session *ses = clp->cl_session;
 258        int ret = 0;
 259
 260        if (clp->cl_slot_tbl)
 261                return nfs4_drain_slot_tbl(clp->cl_slot_tbl);
 262
 263        /* back channel */
 264        ret = nfs4_drain_slot_tbl(&ses->bc_slot_table);
 265        if (ret)
 266                return ret;
 267        /* fore channel */
 268        return nfs4_drain_slot_tbl(&ses->fc_slot_table);
 269}
 270
 271#if defined(CONFIG_NFS_V4_1)
 272
 273static int nfs41_setup_state_renewal(struct nfs_client *clp)
 274{
 275        int status;
 276        struct nfs_fsinfo fsinfo;
 277
 278        if (!test_bit(NFS_CS_CHECK_LEASE_TIME, &clp->cl_res_state)) {
 279                nfs4_schedule_state_renewal(clp);
 280                return 0;
 281        }
 282
 283        status = nfs4_proc_get_lease_time(clp, &fsinfo);
 284        if (status == 0) {
 285                /* Update lease time and schedule renewal */
 286                spin_lock(&clp->cl_lock);
 287                clp->cl_lease_time = fsinfo.lease_time * HZ;
 288                clp->cl_last_renewal = jiffies;
 289                spin_unlock(&clp->cl_lock);
 290
 291                nfs4_schedule_state_renewal(clp);
 292        }
 293
 294        return status;
 295}
 296
 297static void nfs41_finish_session_reset(struct nfs_client *clp)
 298{
 299        clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
 300        clear_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
 301        /* create_session negotiated new slot table */
 302        clear_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state);
 303        nfs41_setup_state_renewal(clp);
 304}
 305
 306int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
 307{
 308        int status;
 309
 310        if (test_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state))
 311                goto do_confirm;
 312        nfs4_begin_drain_session(clp);
 313        status = nfs4_proc_exchange_id(clp, cred);
 314        if (status != 0)
 315                goto out;
 316        set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
 317do_confirm:
 318        status = nfs4_proc_create_session(clp, cred);
 319        if (status != 0)
 320                goto out;
 321        nfs41_finish_session_reset(clp);
 322        nfs_mark_client_ready(clp, NFS_CS_READY);
 323out:
 324        return status;
 325}
 326
 327/**
 328 * nfs41_discover_server_trunking - Detect server IP address trunking (mv1)
 329 *
 330 * @clp: nfs_client under test
 331 * @result: OUT: found nfs_client, or clp
 332 * @cred: credential to use for trunking test
 333 *
 334 * Returns NFS4_OK, a negative errno, or a negative NFS4ERR status.
 335 * If NFS4_OK is returned, an nfs_client pointer is planted in
 336 * "result".
 337 *
 338 * Note: The returned client may not yet be marked ready.
 339 */
 340int nfs41_discover_server_trunking(struct nfs_client *clp,
 341                                   struct nfs_client **result,
 342                                   struct rpc_cred *cred)
 343{
 344        int status;
 345
 346        status = nfs4_proc_exchange_id(clp, cred);
 347        if (status != NFS4_OK)
 348                return status;
 349        set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
 350
 351        return nfs41_walk_client_list(clp, result, cred);
 352}
 353
 354#endif /* CONFIG_NFS_V4_1 */
 355
 356/**
 357 * nfs4_get_clid_cred - Acquire credential for a setclientid operation
 358 * @clp: client state handle
 359 *
 360 * Returns an rpc_cred with reference count bumped, or NULL.
 361 */
 362struct rpc_cred *nfs4_get_clid_cred(struct nfs_client *clp)
 363{
 364        struct rpc_cred *cred;
 365
 366        spin_lock(&clp->cl_lock);
 367        cred = nfs4_get_machine_cred_locked(clp);
 368        spin_unlock(&clp->cl_lock);
 369        return cred;
 370}
 371
 372static struct nfs4_state_owner *
 373nfs4_find_state_owner_locked(struct nfs_server *server, struct rpc_cred *cred)
 374{
 375        struct rb_node **p = &server->state_owners.rb_node,
 376                       *parent = NULL;
 377        struct nfs4_state_owner *sp;
 378
 379        while (*p != NULL) {
 380                parent = *p;
 381                sp = rb_entry(parent, struct nfs4_state_owner, so_server_node);
 382
 383                if (cred < sp->so_cred)
 384                        p = &parent->rb_left;
 385                else if (cred > sp->so_cred)
 386                        p = &parent->rb_right;
 387                else {
 388                        if (!list_empty(&sp->so_lru))
 389                                list_del_init(&sp->so_lru);
 390                        atomic_inc(&sp->so_count);
 391                        return sp;
 392                }
 393        }
 394        return NULL;
 395}
 396
 397static struct nfs4_state_owner *
 398nfs4_insert_state_owner_locked(struct nfs4_state_owner *new)
 399{
 400        struct nfs_server *server = new->so_server;
 401        struct rb_node **p = &server->state_owners.rb_node,
 402                       *parent = NULL;
 403        struct nfs4_state_owner *sp;
 404        int err;
 405
 406        while (*p != NULL) {
 407                parent = *p;
 408                sp = rb_entry(parent, struct nfs4_state_owner, so_server_node);
 409
 410                if (new->so_cred < sp->so_cred)
 411                        p = &parent->rb_left;
 412                else if (new->so_cred > sp->so_cred)
 413                        p = &parent->rb_right;
 414                else {
 415                        if (!list_empty(&sp->so_lru))
 416                                list_del_init(&sp->so_lru);
 417                        atomic_inc(&sp->so_count);
 418                        return sp;
 419                }
 420        }
 421        err = ida_get_new(&server->openowner_id, &new->so_seqid.owner_id);
 422        if (err)
 423                return ERR_PTR(err);
 424        rb_link_node(&new->so_server_node, parent, p);
 425        rb_insert_color(&new->so_server_node, &server->state_owners);
 426        return new;
 427}
 428
 429static void
 430nfs4_remove_state_owner_locked(struct nfs4_state_owner *sp)
 431{
 432        struct nfs_server *server = sp->so_server;
 433
 434        if (!RB_EMPTY_NODE(&sp->so_server_node))
 435                rb_erase(&sp->so_server_node, &server->state_owners);
 436        ida_remove(&server->openowner_id, sp->so_seqid.owner_id);
 437}
 438
 439static void
 440nfs4_init_seqid_counter(struct nfs_seqid_counter *sc)
 441{
 442        sc->create_time = ktime_get();
 443        sc->flags = 0;
 444        sc->counter = 0;
 445        spin_lock_init(&sc->lock);
 446        INIT_LIST_HEAD(&sc->list);
 447        rpc_init_wait_queue(&sc->wait, "Seqid_waitqueue");
 448}
 449
 450static void
 451nfs4_destroy_seqid_counter(struct nfs_seqid_counter *sc)
 452{
 453        rpc_destroy_wait_queue(&sc->wait);
 454}
 455
 456/*
 457 * nfs4_alloc_state_owner(): this is called on the OPEN or CREATE path to
 458 * create a new state_owner.
 459 *
 460 */
 461static struct nfs4_state_owner *
 462nfs4_alloc_state_owner(struct nfs_server *server,
 463                struct rpc_cred *cred,
 464                gfp_t gfp_flags)
 465{
 466        struct nfs4_state_owner *sp;
 467
 468        sp = kzalloc(sizeof(*sp), gfp_flags);
 469        if (!sp)
 470                return NULL;
 471        sp->so_server = server;
 472        sp->so_cred = get_rpccred(cred);
 473        spin_lock_init(&sp->so_lock);
 474        INIT_LIST_HEAD(&sp->so_states);
 475        nfs4_init_seqid_counter(&sp->so_seqid);
 476        atomic_set(&sp->so_count, 1);
 477        INIT_LIST_HEAD(&sp->so_lru);
 478        seqcount_init(&sp->so_reclaim_seqcount);
 479        mutex_init(&sp->so_delegreturn_mutex);
 480        return sp;
 481}
 482
 483static void
 484nfs4_drop_state_owner(struct nfs4_state_owner *sp)
 485{
 486        struct rb_node *rb_node = &sp->so_server_node;
 487
 488        if (!RB_EMPTY_NODE(rb_node)) {
 489                struct nfs_server *server = sp->so_server;
 490                struct nfs_client *clp = server->nfs_client;
 491
 492                spin_lock(&clp->cl_lock);
 493                if (!RB_EMPTY_NODE(rb_node)) {
 494                        rb_erase(rb_node, &server->state_owners);
 495                        RB_CLEAR_NODE(rb_node);
 496                }
 497                spin_unlock(&clp->cl_lock);
 498        }
 499}
 500
 501static void nfs4_free_state_owner(struct nfs4_state_owner *sp)
 502{
 503        nfs4_destroy_seqid_counter(&sp->so_seqid);
 504        put_rpccred(sp->so_cred);
 505        kfree(sp);
 506}
 507
 508static void nfs4_gc_state_owners(struct nfs_server *server)
 509{
 510        struct nfs_client *clp = server->nfs_client;
 511        struct nfs4_state_owner *sp, *tmp;
 512        unsigned long time_min, time_max;
 513        LIST_HEAD(doomed);
 514
 515        spin_lock(&clp->cl_lock);
 516        time_max = jiffies;
 517        time_min = (long)time_max - (long)clp->cl_lease_time;
 518        list_for_each_entry_safe(sp, tmp, &server->state_owners_lru, so_lru) {
 519                /* NB: LRU is sorted so that oldest is at the head */
 520                if (time_in_range(sp->so_expires, time_min, time_max))
 521                        break;
 522                list_move(&sp->so_lru, &doomed);
 523                nfs4_remove_state_owner_locked(sp);
 524        }
 525        spin_unlock(&clp->cl_lock);
 526
 527        list_for_each_entry_safe(sp, tmp, &doomed, so_lru) {
 528                list_del(&sp->so_lru);
 529                nfs4_free_state_owner(sp);
 530        }
 531}
 532
 533/**
 534 * nfs4_get_state_owner - Look up a state owner given a credential
 535 * @server: nfs_server to search
 536 * @cred: RPC credential to match
 537 *
 538 * Returns a pointer to an instantiated nfs4_state_owner struct, or NULL.
 539 */
 540struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server,
 541                                              struct rpc_cred *cred,
 542                                              gfp_t gfp_flags)
 543{
 544        struct nfs_client *clp = server->nfs_client;
 545        struct nfs4_state_owner *sp, *new;
 546
 547        spin_lock(&clp->cl_lock);
 548        sp = nfs4_find_state_owner_locked(server, cred);
 549        spin_unlock(&clp->cl_lock);
 550        if (sp != NULL)
 551                goto out;
 552        new = nfs4_alloc_state_owner(server, cred, gfp_flags);
 553        if (new == NULL)
 554                goto out;
 555        do {
 556                if (ida_pre_get(&server->openowner_id, gfp_flags) == 0)
 557                        break;
 558                spin_lock(&clp->cl_lock);
 559                sp = nfs4_insert_state_owner_locked(new);
 560                spin_unlock(&clp->cl_lock);
 561        } while (sp == ERR_PTR(-EAGAIN));
 562        if (sp != new)
 563                nfs4_free_state_owner(new);
 564out:
 565        nfs4_gc_state_owners(server);
 566        return sp;
 567}
 568
 569/**
 570 * nfs4_put_state_owner - Release a nfs4_state_owner
 571 * @sp: state owner data to release
 572 *
 573 * Note that we keep released state owners on an LRU
 574 * list.
 575 * This caches valid state owners so that they can be
 576 * reused, to avoid the OPEN_CONFIRM on minor version 0.
 577 * It also pins the uniquifier of dropped state owners for
 578 * a while, to ensure that those state owner names are
 579 * never reused.
 580 */
 581void nfs4_put_state_owner(struct nfs4_state_owner *sp)
 582{
 583        struct nfs_server *server = sp->so_server;
 584        struct nfs_client *clp = server->nfs_client;
 585
 586        if (!atomic_dec_and_lock(&sp->so_count, &clp->cl_lock))
 587                return;
 588
 589        sp->so_expires = jiffies;
 590        list_add_tail(&sp->so_lru, &server->state_owners_lru);
 591        spin_unlock(&clp->cl_lock);
 592}
 593
 594/**
 595 * nfs4_purge_state_owners - Release all cached state owners
 596 * @server: nfs_server with cached state owners to release
 597 *
 598 * Called at umount time.  Remaining state owners will be on
 599 * the LRU with ref count of zero.
 600 */
 601void nfs4_purge_state_owners(struct nfs_server *server)
 602{
 603        struct nfs_client *clp = server->nfs_client;
 604        struct nfs4_state_owner *sp, *tmp;
 605        LIST_HEAD(doomed);
 606
 607        spin_lock(&clp->cl_lock);
 608        list_for_each_entry_safe(sp, tmp, &server->state_owners_lru, so_lru) {
 609                list_move(&sp->so_lru, &doomed);
 610                nfs4_remove_state_owner_locked(sp);
 611        }
 612        spin_unlock(&clp->cl_lock);
 613
 614        list_for_each_entry_safe(sp, tmp, &doomed, so_lru) {
 615                list_del(&sp->so_lru);
 616                nfs4_free_state_owner(sp);
 617        }
 618}
 619
 620static struct nfs4_state *
 621nfs4_alloc_open_state(void)
 622{
 623        struct nfs4_state *state;
 624
 625        state = kzalloc(sizeof(*state), GFP_NOFS);
 626        if (!state)
 627                return NULL;
 628        atomic_set(&state->count, 1);
 629        INIT_LIST_HEAD(&state->lock_states);
 630        spin_lock_init(&state->state_lock);
 631        seqlock_init(&state->seqlock);
 632        return state;
 633}
 634
 635void
 636nfs4_state_set_mode_locked(struct nfs4_state *state, fmode_t fmode)
 637{
 638        if (state->state == fmode)
 639                return;
 640        /* NB! List reordering - see the reclaim code for why.  */
 641        if ((fmode & FMODE_WRITE) != (state->state & FMODE_WRITE)) {
 642                if (fmode & FMODE_WRITE)
 643                        list_move(&state->open_states, &state->owner->so_states);
 644                else
 645                        list_move_tail(&state->open_states, &state->owner->so_states);
 646        }
 647        state->state = fmode;
 648}
 649
 650static struct nfs4_state *
 651__nfs4_find_state_byowner(struct inode *inode, struct nfs4_state_owner *owner)
 652{
 653        struct nfs_inode *nfsi = NFS_I(inode);
 654        struct nfs4_state *state;
 655
 656        list_for_each_entry(state, &nfsi->open_states, inode_states) {
 657                if (state->owner != owner)
 658                        continue;
 659                if (!nfs4_valid_open_stateid(state))
 660                        continue;
 661                if (atomic_inc_not_zero(&state->count))
 662                        return state;
 663        }
 664        return NULL;
 665}
 666
 667static void
 668nfs4_free_open_state(struct nfs4_state *state)
 669{
 670        kfree(state);
 671}
 672
 673struct nfs4_state *
 674nfs4_get_open_state(struct inode *inode, struct nfs4_state_owner *owner)
 675{
 676        struct nfs4_state *state, *new;
 677        struct nfs_inode *nfsi = NFS_I(inode);
 678
 679        spin_lock(&inode->i_lock);
 680        state = __nfs4_find_state_byowner(inode, owner);
 681        spin_unlock(&inode->i_lock);
 682        if (state)
 683                goto out;
 684        new = nfs4_alloc_open_state();
 685        spin_lock(&owner->so_lock);
 686        spin_lock(&inode->i_lock);
 687        state = __nfs4_find_state_byowner(inode, owner);
 688        if (state == NULL && new != NULL) {
 689                state = new;
 690                state->owner = owner;
 691                atomic_inc(&owner->so_count);
 692                list_add(&state->inode_states, &nfsi->open_states);
 693                ihold(inode);
 694                state->inode = inode;
 695                spin_unlock(&inode->i_lock);
 696                /* Note: The reclaim code dictates that we add stateless
 697                 * and read-only stateids to the end of the list */
 698                list_add_tail(&state->open_states, &owner->so_states);
 699                spin_unlock(&owner->so_lock);
 700        } else {
 701                spin_unlock(&inode->i_lock);
 702                spin_unlock(&owner->so_lock);
 703                if (new)
 704                        nfs4_free_open_state(new);
 705        }
 706out:
 707        return state;
 708}
 709
 710void nfs4_put_open_state(struct nfs4_state *state)
 711{
 712        struct inode *inode = state->inode;
 713        struct nfs4_state_owner *owner = state->owner;
 714
 715        if (!atomic_dec_and_lock(&state->count, &owner->so_lock))
 716                return;
 717        spin_lock(&inode->i_lock);
 718        list_del(&state->inode_states);
 719        list_del(&state->open_states);
 720        spin_unlock(&inode->i_lock);
 721        spin_unlock(&owner->so_lock);
 722        iput(inode);
 723        nfs4_free_open_state(state);
 724        nfs4_put_state_owner(owner);
 725}
 726
 727/*
 728 * Close the current file.
 729 */
 730static void __nfs4_close(struct nfs4_state *state,
 731                fmode_t fmode, gfp_t gfp_mask, int wait)
 732{
 733        struct nfs4_state_owner *owner = state->owner;
 734        int call_close = 0;
 735        fmode_t newstate;
 736
 737        atomic_inc(&owner->so_count);
 738        /* Protect against nfs4_find_state() */
 739        spin_lock(&owner->so_lock);
 740        switch (fmode & (FMODE_READ | FMODE_WRITE)) {
 741                case FMODE_READ:
 742                        state->n_rdonly--;
 743                        break;
 744                case FMODE_WRITE:
 745                        state->n_wronly--;
 746                        break;
 747                case FMODE_READ|FMODE_WRITE:
 748                        state->n_rdwr--;
 749        }
 750        newstate = FMODE_READ|FMODE_WRITE;
 751        if (state->n_rdwr == 0) {
 752                if (state->n_rdonly == 0) {
 753                        newstate &= ~FMODE_READ;
 754                        call_close |= test_bit(NFS_O_RDONLY_STATE, &state->flags);
 755                        call_close |= test_bit(NFS_O_RDWR_STATE, &state->flags);
 756                }
 757                if (state->n_wronly == 0) {
 758                        newstate &= ~FMODE_WRITE;
 759                        call_close |= test_bit(NFS_O_WRONLY_STATE, &state->flags);
 760                        call_close |= test_bit(NFS_O_RDWR_STATE, &state->flags);
 761                }
 762                if (newstate == 0)
 763                        clear_bit(NFS_DELEGATED_STATE, &state->flags);
 764        }
 765        nfs4_state_set_mode_locked(state, newstate);
 766        spin_unlock(&owner->so_lock);
 767
 768        if (!call_close) {
 769                nfs4_put_open_state(state);
 770                nfs4_put_state_owner(owner);
 771        } else
 772                nfs4_do_close(state, gfp_mask, wait);
 773}
 774
 775void nfs4_close_state(struct nfs4_state *state, fmode_t fmode)
 776{
 777        __nfs4_close(state, fmode, GFP_NOFS, 0);
 778}
 779
 780void nfs4_close_sync(struct nfs4_state *state, fmode_t fmode)
 781{
 782        __nfs4_close(state, fmode, GFP_KERNEL, 1);
 783}
 784
 785/*
 786 * Search the state->lock_states for an existing lock_owner
 787 * that is compatible with current->files
 788 */
 789static struct nfs4_lock_state *
 790__nfs4_find_lock_state(struct nfs4_state *state, fl_owner_t fl_owner, pid_t fl_pid, unsigned int type)
 791{
 792        struct nfs4_lock_state *pos;
 793        list_for_each_entry(pos, &state->lock_states, ls_locks) {
 794                if (type != NFS4_ANY_LOCK_TYPE && pos->ls_owner.lo_type != type)
 795                        continue;
 796                switch (pos->ls_owner.lo_type) {
 797                case NFS4_POSIX_LOCK_TYPE:
 798                        if (pos->ls_owner.lo_u.posix_owner != fl_owner)
 799                                continue;
 800                        break;
 801                case NFS4_FLOCK_LOCK_TYPE:
 802                        if (pos->ls_owner.lo_u.flock_owner != fl_pid)
 803                                continue;
 804                }
 805                atomic_inc(&pos->ls_count);
 806                return pos;
 807        }
 808        return NULL;
 809}
 810
 811/*
 812 * Return a compatible lock_state. If no initialized lock_state structure
 813 * exists, return an uninitialized one.
 814 *
 815 */
 816static struct nfs4_lock_state *nfs4_alloc_lock_state(struct nfs4_state *state, fl_owner_t fl_owner, pid_t fl_pid, unsigned int type)
 817{
 818        struct nfs4_lock_state *lsp;
 819        struct nfs_server *server = state->owner->so_server;
 820
 821        lsp = kzalloc(sizeof(*lsp), GFP_NOFS);
 822        if (lsp == NULL)
 823                return NULL;
 824        nfs4_init_seqid_counter(&lsp->ls_seqid);
 825        atomic_set(&lsp->ls_count, 1);
 826        lsp->ls_state = state;
 827        lsp->ls_owner.lo_type = type;
 828        switch (lsp->ls_owner.lo_type) {
 829        case NFS4_FLOCK_LOCK_TYPE:
 830                lsp->ls_owner.lo_u.flock_owner = fl_pid;
 831                break;
 832        case NFS4_POSIX_LOCK_TYPE:
 833                lsp->ls_owner.lo_u.posix_owner = fl_owner;
 834                break;
 835        default:
 836                goto out_free;
 837        }
 838        lsp->ls_seqid.owner_id = ida_simple_get(&server->lockowner_id, 0, 0, GFP_NOFS);
 839        if (lsp->ls_seqid.owner_id < 0)
 840                goto out_free;
 841        INIT_LIST_HEAD(&lsp->ls_locks);
 842        return lsp;
 843out_free:
 844        kfree(lsp);
 845        return NULL;
 846}
 847
 848void nfs4_free_lock_state(struct nfs_server *server, struct nfs4_lock_state *lsp)
 849{
 850        ida_simple_remove(&server->lockowner_id, lsp->ls_seqid.owner_id);
 851        nfs4_destroy_seqid_counter(&lsp->ls_seqid);
 852        kfree(lsp);
 853}
 854
 855/*
 856 * Return a compatible lock_state. If no initialized lock_state structure
 857 * exists, return an uninitialized one.
 858 *
 859 */
 860static struct nfs4_lock_state *nfs4_get_lock_state(struct nfs4_state *state, fl_owner_t owner, pid_t pid, unsigned int type)
 861{
 862        struct nfs4_lock_state *lsp, *new = NULL;
 863        
 864        for(;;) {
 865                spin_lock(&state->state_lock);
 866                lsp = __nfs4_find_lock_state(state, owner, pid, type);
 867                if (lsp != NULL)
 868                        break;
 869                if (new != NULL) {
 870                        list_add(&new->ls_locks, &state->lock_states);
 871                        set_bit(LK_STATE_IN_USE, &state->flags);
 872                        lsp = new;
 873                        new = NULL;
 874                        break;
 875                }
 876                spin_unlock(&state->state_lock);
 877                new = nfs4_alloc_lock_state(state, owner, pid, type);
 878                if (new == NULL)
 879                        return NULL;
 880        }
 881        spin_unlock(&state->state_lock);
 882        if (new != NULL)
 883                nfs4_free_lock_state(state->owner->so_server, new);
 884        return lsp;
 885}
 886
 887/*
 888 * Release reference to lock_state, and free it if we see that
 889 * it is no longer in use
 890 */
 891void nfs4_put_lock_state(struct nfs4_lock_state *lsp)
 892{
 893        struct nfs_server *server;
 894        struct nfs4_state *state;
 895
 896        if (lsp == NULL)
 897                return;
 898        state = lsp->ls_state;
 899        if (!atomic_dec_and_lock(&lsp->ls_count, &state->state_lock))
 900                return;
 901        list_del(&lsp->ls_locks);
 902        if (list_empty(&state->lock_states))
 903                clear_bit(LK_STATE_IN_USE, &state->flags);
 904        spin_unlock(&state->state_lock);
 905        server = state->owner->so_server;
 906        if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags)) {
 907                struct nfs_client *clp = server->nfs_client;
 908
 909                clp->cl_mvops->free_lock_state(server, lsp);
 910        } else
 911                nfs4_free_lock_state(server, lsp);
 912}
 913
 914static void nfs4_fl_copy_lock(struct file_lock *dst, struct file_lock *src)
 915{
 916        struct nfs4_lock_state *lsp = src->fl_u.nfs4_fl.owner;
 917
 918        dst->fl_u.nfs4_fl.owner = lsp;
 919        atomic_inc(&lsp->ls_count);
 920}
 921
 922static void nfs4_fl_release_lock(struct file_lock *fl)
 923{
 924        nfs4_put_lock_state(fl->fl_u.nfs4_fl.owner);
 925}
 926
 927static const struct file_lock_operations nfs4_fl_lock_ops = {
 928        .fl_copy_lock = nfs4_fl_copy_lock,
 929        .fl_release_private = nfs4_fl_release_lock,
 930};
 931
 932int nfs4_set_lock_state(struct nfs4_state *state, struct file_lock *fl)
 933{
 934        struct nfs4_lock_state *lsp;
 935
 936        if (fl->fl_ops != NULL)
 937                return 0;
 938        if (fl->fl_flags & FL_POSIX)
 939                lsp = nfs4_get_lock_state(state, fl->fl_owner, 0, NFS4_POSIX_LOCK_TYPE);
 940        else if (fl->fl_flags & FL_FLOCK)
 941                lsp = nfs4_get_lock_state(state, NULL, fl->fl_pid,
 942                                NFS4_FLOCK_LOCK_TYPE);
 943        else
 944                return -EINVAL;
 945        if (lsp == NULL)
 946                return -ENOMEM;
 947        fl->fl_u.nfs4_fl.owner = lsp;
 948        fl->fl_ops = &nfs4_fl_lock_ops;
 949        return 0;
 950}
 951
 952static int nfs4_copy_lock_stateid(nfs4_stateid *dst,
 953                struct nfs4_state *state,
 954                const struct nfs_lockowner *lockowner)
 955{
 956        struct nfs4_lock_state *lsp;
 957        fl_owner_t fl_owner;
 958        pid_t fl_pid;
 959        int ret = -ENOENT;
 960
 961
 962        if (lockowner == NULL)
 963                goto out;
 964
 965        if (test_bit(LK_STATE_IN_USE, &state->flags) == 0)
 966                goto out;
 967
 968        fl_owner = lockowner->l_owner;
 969        fl_pid = lockowner->l_pid;
 970        spin_lock(&state->state_lock);
 971        lsp = __nfs4_find_lock_state(state, fl_owner, fl_pid, NFS4_ANY_LOCK_TYPE);
 972        if (lsp && test_bit(NFS_LOCK_LOST, &lsp->ls_flags))
 973                ret = -EIO;
 974        else if (lsp != NULL && test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags) != 0) {
 975                nfs4_stateid_copy(dst, &lsp->ls_stateid);
 976                ret = 0;
 977        }
 978        spin_unlock(&state->state_lock);
 979        nfs4_put_lock_state(lsp);
 980out:
 981        return ret;
 982}
 983
 984static void nfs4_copy_open_stateid(nfs4_stateid *dst, struct nfs4_state *state)
 985{
 986        const nfs4_stateid *src;
 987        int seq;
 988
 989        do {
 990                src = &zero_stateid;
 991                seq = read_seqbegin(&state->seqlock);
 992                if (test_bit(NFS_OPEN_STATE, &state->flags))
 993                        src = &state->open_stateid;
 994                nfs4_stateid_copy(dst, src);
 995        } while (read_seqretry(&state->seqlock, seq));
 996}
 997
 998/*
 999 * Byte-range lock aware utility to initialize the stateid of read/write
1000 * requests.
1001 */
1002int nfs4_select_rw_stateid(nfs4_stateid *dst, struct nfs4_state *state,
1003                fmode_t fmode, const struct nfs_lockowner *lockowner)
1004{
1005        int ret = nfs4_copy_lock_stateid(dst, state, lockowner);
1006        if (ret == -EIO)
1007                /* A lost lock - don't even consider delegations */
1008                goto out;
1009        /* returns true if delegation stateid found and copied */
1010        if (nfs4_copy_delegation_stateid(dst, state->inode, fmode)) {
1011                ret = 0;
1012                goto out;
1013        }
1014        if (ret != -ENOENT)
1015                /* nfs4_copy_delegation_stateid() didn't over-write
1016                 * dst, so it still has the lock stateid which we now
1017                 * choose to use.
1018                 */
1019                goto out;
1020        nfs4_copy_open_stateid(dst, state);
1021        ret = 0;
1022out:
1023        if (nfs_server_capable(state->inode, NFS_CAP_STATEID_NFSV41))
1024                dst->seqid = 0;
1025        return ret;
1026}
1027
1028struct nfs_seqid *nfs_alloc_seqid(struct nfs_seqid_counter *counter, gfp_t gfp_mask)
1029{
1030        struct nfs_seqid *new;
1031
1032        new = kmalloc(sizeof(*new), gfp_mask);
1033        if (new != NULL) {
1034                new->sequence = counter;
1035                INIT_LIST_HEAD(&new->list);
1036                new->task = NULL;
1037        }
1038        return new;
1039}
1040
1041void nfs_release_seqid(struct nfs_seqid *seqid)
1042{
1043        struct nfs_seqid_counter *sequence;
1044
1045        if (list_empty(&seqid->list))
1046                return;
1047        sequence = seqid->sequence;
1048        spin_lock(&sequence->lock);
1049        list_del_init(&seqid->list);
1050        if (!list_empty(&sequence->list)) {
1051                struct nfs_seqid *next;
1052
1053                next = list_first_entry(&sequence->list,
1054                                struct nfs_seqid, list);
1055                rpc_wake_up_queued_task(&sequence->wait, next->task);
1056        }
1057        spin_unlock(&sequence->lock);
1058}
1059
1060void nfs_free_seqid(struct nfs_seqid *seqid)
1061{
1062        nfs_release_seqid(seqid);
1063        kfree(seqid);
1064}
1065
1066/*
1067 * Increment the seqid if the OPEN/OPEN_DOWNGRADE/CLOSE succeeded, or
1068 * failed with a seqid incrementing error -
1069 * see comments nfs4.h:seqid_mutating_error()
1070 */
1071static void nfs_increment_seqid(int status, struct nfs_seqid *seqid)
1072{
1073        switch (status) {
1074                case 0:
1075                        break;
1076                case -NFS4ERR_BAD_SEQID:
1077                        if (seqid->sequence->flags & NFS_SEQID_CONFIRMED)
1078                                return;
1079                        pr_warn_ratelimited("NFS: v4 server returned a bad"
1080                                        " sequence-id error on an"
1081                                        " unconfirmed sequence %p!\n",
1082                                        seqid->sequence);
1083                case -NFS4ERR_STALE_CLIENTID:
1084                case -NFS4ERR_STALE_STATEID:
1085                case -NFS4ERR_BAD_STATEID:
1086                case -NFS4ERR_BADXDR:
1087                case -NFS4ERR_RESOURCE:
1088                case -NFS4ERR_NOFILEHANDLE:
1089                        /* Non-seqid mutating errors */
1090                        return;
1091        };
1092        /*
1093         * Note: no locking needed as we are guaranteed to be first
1094         * on the sequence list
1095         */
1096        seqid->sequence->counter++;
1097}
1098
1099void nfs_increment_open_seqid(int status, struct nfs_seqid *seqid)
1100{
1101        struct nfs4_state_owner *sp = container_of(seqid->sequence,
1102                                        struct nfs4_state_owner, so_seqid);
1103        struct nfs_server *server = sp->so_server;
1104
1105        if (status == -NFS4ERR_BAD_SEQID)
1106                nfs4_drop_state_owner(sp);
1107        if (!nfs4_has_session(server->nfs_client))
1108                nfs_increment_seqid(status, seqid);
1109}
1110
1111/*
1112 * Increment the seqid if the LOCK/LOCKU succeeded, or
1113 * failed with a seqid incrementing error -
1114 * see comments nfs4.h:seqid_mutating_error()
1115 */
1116void nfs_increment_lock_seqid(int status, struct nfs_seqid *seqid)
1117{
1118        nfs_increment_seqid(status, seqid);
1119}
1120
1121int nfs_wait_on_sequence(struct nfs_seqid *seqid, struct rpc_task *task)
1122{
1123        struct nfs_seqid_counter *sequence = seqid->sequence;
1124        int status = 0;
1125
1126        spin_lock(&sequence->lock);
1127        seqid->task = task;
1128        if (list_empty(&seqid->list))
1129                list_add_tail(&seqid->list, &sequence->list);
1130        if (list_first_entry(&sequence->list, struct nfs_seqid, list) == seqid)
1131                goto unlock;
1132        rpc_sleep_on(&sequence->wait, task, NULL);
1133        status = -EAGAIN;
1134unlock:
1135        spin_unlock(&sequence->lock);
1136        return status;
1137}
1138
1139static int nfs4_run_state_manager(void *);
1140
1141static void nfs4_clear_state_manager_bit(struct nfs_client *clp)
1142{
1143        smp_mb__before_clear_bit();
1144        clear_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state);
1145        smp_mb__after_clear_bit();
1146        wake_up_bit(&clp->cl_state, NFS4CLNT_MANAGER_RUNNING);
1147        rpc_wake_up(&clp->cl_rpcwaitq);
1148}
1149
1150/*
1151 * Schedule the nfs_client asynchronous state management routine
1152 */
1153void nfs4_schedule_state_manager(struct nfs_client *clp)
1154{
1155        struct task_struct *task;
1156        char buf[INET6_ADDRSTRLEN + sizeof("-manager") + 1];
1157
1158        if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0)
1159                return;
1160        __module_get(THIS_MODULE);
1161        atomic_inc(&clp->cl_count);
1162
1163        /* The rcu_read_lock() is not strictly necessary, as the state
1164         * manager is the only thread that ever changes the rpc_xprt
1165         * after it's initialized.  At this point, we're single threaded. */
1166        rcu_read_lock();
1167        snprintf(buf, sizeof(buf), "%s-manager",
1168                        rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_ADDR));
1169        rcu_read_unlock();
1170        task = kthread_run(nfs4_run_state_manager, clp, "%s", buf);
1171        if (IS_ERR(task)) {
1172                printk(KERN_ERR "%s: kthread_run: %ld\n",
1173                        __func__, PTR_ERR(task));
1174                nfs4_clear_state_manager_bit(clp);
1175                nfs_put_client(clp);
1176                module_put(THIS_MODULE);
1177        }
1178}
1179
1180/*
1181 * Schedule a lease recovery attempt
1182 */
1183void nfs4_schedule_lease_recovery(struct nfs_client *clp)
1184{
1185        if (!clp)
1186                return;
1187        if (!test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state))
1188                set_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
1189        dprintk("%s: scheduling lease recovery for server %s\n", __func__,
1190                        clp->cl_hostname);
1191        nfs4_schedule_state_manager(clp);
1192}
1193EXPORT_SYMBOL_GPL(nfs4_schedule_lease_recovery);
1194
1195/**
1196 * nfs4_schedule_migration_recovery - trigger migration recovery
1197 *
1198 * @server: FSID that is migrating
1199 *
1200 * Returns zero if recovery has started, otherwise a negative NFS4ERR
1201 * value is returned.
1202 */
1203int nfs4_schedule_migration_recovery(const struct nfs_server *server)
1204{
1205        struct nfs_client *clp = server->nfs_client;
1206
1207        if (server->fh_expire_type != NFS4_FH_PERSISTENT) {
1208                pr_err("NFS: volatile file handles not supported (server %s)\n",
1209                                clp->cl_hostname);
1210                return -NFS4ERR_IO;
1211        }
1212
1213        if (test_bit(NFS_MIG_FAILED, &server->mig_status))
1214                return -NFS4ERR_IO;
1215
1216        dprintk("%s: scheduling migration recovery for (%llx:%llx) on %s\n",
1217                        __func__,
1218                        (unsigned long long)server->fsid.major,
1219                        (unsigned long long)server->fsid.minor,
1220                        clp->cl_hostname);
1221
1222        set_bit(NFS_MIG_IN_TRANSITION,
1223                        &((struct nfs_server *)server)->mig_status);
1224        set_bit(NFS4CLNT_MOVED, &clp->cl_state);
1225
1226        nfs4_schedule_state_manager(clp);
1227        return 0;
1228}
1229EXPORT_SYMBOL_GPL(nfs4_schedule_migration_recovery);
1230
1231/**
1232 * nfs4_schedule_lease_moved_recovery - start lease-moved recovery
1233 *
1234 * @clp: server to check for moved leases
1235 *
1236 */
1237void nfs4_schedule_lease_moved_recovery(struct nfs_client *clp)
1238{
1239        dprintk("%s: scheduling lease-moved recovery for client ID %llx on %s\n",
1240                __func__, clp->cl_clientid, clp->cl_hostname);
1241
1242        set_bit(NFS4CLNT_LEASE_MOVED, &clp->cl_state);
1243        nfs4_schedule_state_manager(clp);
1244}
1245EXPORT_SYMBOL_GPL(nfs4_schedule_lease_moved_recovery);
1246
1247int nfs4_wait_clnt_recover(struct nfs_client *clp)
1248{
1249        int res;
1250
1251        might_sleep();
1252
1253        atomic_inc(&clp->cl_count);
1254        res = wait_on_bit(&clp->cl_state, NFS4CLNT_MANAGER_RUNNING,
1255                        nfs_wait_bit_killable, TASK_KILLABLE);
1256        if (res)
1257                goto out;
1258        if (clp->cl_cons_state < 0)
1259                res = clp->cl_cons_state;
1260out:
1261        nfs_put_client(clp);
1262        return res;
1263}
1264
1265int nfs4_client_recover_expired_lease(struct nfs_client *clp)
1266{
1267        unsigned int loop;
1268        int ret;
1269
1270        for (loop = NFS4_MAX_LOOP_ON_RECOVER; loop != 0; loop--) {
1271                ret = nfs4_wait_clnt_recover(clp);
1272                if (ret != 0)
1273                        break;
1274                if (!test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) &&
1275                    !test_bit(NFS4CLNT_CHECK_LEASE,&clp->cl_state))
1276                        break;
1277                nfs4_schedule_state_manager(clp);
1278                ret = -EIO;
1279        }
1280        return ret;
1281}
1282
1283/*
1284 * nfs40_handle_cb_pathdown - return all delegations after NFS4ERR_CB_PATH_DOWN
1285 * @clp: client to process
1286 *
1287 * Set the NFS4CLNT_LEASE_EXPIRED state in order to force a
1288 * resend of the SETCLIENTID and hence re-establish the
1289 * callback channel. Then return all existing delegations.
1290 */
1291static void nfs40_handle_cb_pathdown(struct nfs_client *clp)
1292{
1293        set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1294        nfs_expire_all_delegations(clp);
1295        dprintk("%s: handling CB_PATHDOWN recovery for server %s\n", __func__,
1296                        clp->cl_hostname);
1297}
1298
1299void nfs4_schedule_path_down_recovery(struct nfs_client *clp)
1300{
1301        nfs40_handle_cb_pathdown(clp);
1302        nfs4_schedule_state_manager(clp);
1303}
1304
1305static int nfs4_state_mark_reclaim_reboot(struct nfs_client *clp, struct nfs4_state *state)
1306{
1307
1308        set_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags);
1309        /* Don't recover state that expired before the reboot */
1310        if (test_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags)) {
1311                clear_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags);
1312                return 0;
1313        }
1314        set_bit(NFS_OWNER_RECLAIM_REBOOT, &state->owner->so_flags);
1315        set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state);
1316        return 1;
1317}
1318
1319static int nfs4_state_mark_reclaim_nograce(struct nfs_client *clp, struct nfs4_state *state)
1320{
1321        set_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags);
1322        clear_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags);
1323        set_bit(NFS_OWNER_RECLAIM_NOGRACE, &state->owner->so_flags);
1324        set_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state);
1325        return 1;
1326}
1327
1328int nfs4_schedule_stateid_recovery(const struct nfs_server *server, struct nfs4_state *state)
1329{
1330        struct nfs_client *clp = server->nfs_client;
1331
1332        if (!nfs4_valid_open_stateid(state))
1333                return -EBADF;
1334        nfs4_state_mark_reclaim_nograce(clp, state);
1335        dprintk("%s: scheduling stateid recovery for server %s\n", __func__,
1336                        clp->cl_hostname);
1337        nfs4_schedule_state_manager(clp);
1338        return 0;
1339}
1340EXPORT_SYMBOL_GPL(nfs4_schedule_stateid_recovery);
1341
1342void nfs_inode_find_state_and_recover(struct inode *inode,
1343                const nfs4_stateid *stateid)
1344{
1345        struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
1346        struct nfs_inode *nfsi = NFS_I(inode);
1347        struct nfs_open_context *ctx;
1348        struct nfs4_state *state;
1349        bool found = false;
1350
1351        spin_lock(&inode->i_lock);
1352        list_for_each_entry(ctx, &nfsi->open_files, list) {
1353                state = ctx->state;
1354                if (state == NULL)
1355                        continue;
1356                if (!test_bit(NFS_DELEGATED_STATE, &state->flags))
1357                        continue;
1358                if (!nfs4_stateid_match(&state->stateid, stateid))
1359                        continue;
1360                nfs4_state_mark_reclaim_nograce(clp, state);
1361                found = true;
1362        }
1363        spin_unlock(&inode->i_lock);
1364        if (found)
1365                nfs4_schedule_state_manager(clp);
1366}
1367
1368static void nfs4_state_mark_open_context_bad(struct nfs4_state *state)
1369{
1370        struct inode *inode = state->inode;
1371        struct nfs_inode *nfsi = NFS_I(inode);
1372        struct nfs_open_context *ctx;
1373
1374        spin_lock(&inode->i_lock);
1375        list_for_each_entry(ctx, &nfsi->open_files, list) {
1376                if (ctx->state != state)
1377                        continue;
1378                set_bit(NFS_CONTEXT_BAD, &ctx->flags);
1379        }
1380        spin_unlock(&inode->i_lock);
1381}
1382
1383static void nfs4_state_mark_recovery_failed(struct nfs4_state *state, int error)
1384{
1385        set_bit(NFS_STATE_RECOVERY_FAILED, &state->flags);
1386        nfs4_state_mark_open_context_bad(state);
1387}
1388
1389
1390static int nfs4_reclaim_locks(struct nfs4_state *state, const struct nfs4_state_recovery_ops *ops)
1391{
1392        struct inode *inode = state->inode;
1393        struct nfs_inode *nfsi = NFS_I(inode);
1394        struct file_lock *fl;
1395        int status = 0;
1396
1397        if (inode->i_flock == NULL)
1398                return 0;
1399
1400        /* Guard against delegation returns and new lock/unlock calls */
1401        down_write(&nfsi->rwsem);
1402        /* Protect inode->i_flock using the BKL */
1403        spin_lock(&inode->i_lock);
1404        for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
1405                if (!(fl->fl_flags & (FL_POSIX|FL_FLOCK)))
1406                        continue;
1407                if (nfs_file_open_context(fl->fl_file)->state != state)
1408                        continue;
1409                spin_unlock(&inode->i_lock);
1410                status = ops->recover_lock(state, fl);
1411                switch (status) {
1412                        case 0:
1413                                break;
1414                        case -ESTALE:
1415                        case -NFS4ERR_ADMIN_REVOKED:
1416                        case -NFS4ERR_STALE_STATEID:
1417                        case -NFS4ERR_BAD_STATEID:
1418                        case -NFS4ERR_EXPIRED:
1419                        case -NFS4ERR_NO_GRACE:
1420                        case -NFS4ERR_STALE_CLIENTID:
1421                        case -NFS4ERR_BADSESSION:
1422                        case -NFS4ERR_BADSLOT:
1423                        case -NFS4ERR_BAD_HIGH_SLOT:
1424                        case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
1425                                goto out;
1426                        default:
1427                                printk(KERN_ERR "NFS: %s: unhandled error %d\n",
1428                                         __func__, status);
1429                        case -ENOMEM:
1430                        case -NFS4ERR_DENIED:
1431                        case -NFS4ERR_RECLAIM_BAD:
1432                        case -NFS4ERR_RECLAIM_CONFLICT:
1433                                /* kill_proc(fl->fl_pid, SIGLOST, 1); */
1434                                status = 0;
1435                }
1436                spin_lock(&inode->i_lock);
1437        }
1438        spin_unlock(&inode->i_lock);
1439out:
1440        up_write(&nfsi->rwsem);
1441        return status;
1442}
1443
1444static int nfs4_reclaim_open_state(struct nfs4_state_owner *sp, const struct nfs4_state_recovery_ops *ops)
1445{
1446        struct nfs4_state *state;
1447        struct nfs4_lock_state *lock;
1448        int status = 0;
1449
1450        /* Note: we rely on the sp->so_states list being ordered 
1451         * so that we always reclaim open(O_RDWR) and/or open(O_WRITE)
1452         * states first.
1453         * This is needed to ensure that the server won't give us any
1454         * read delegations that we have to return if, say, we are
1455         * recovering after a network partition or a reboot from a
1456         * server that doesn't support a grace period.
1457         */
1458        spin_lock(&sp->so_lock);
1459        write_seqcount_begin(&sp->so_reclaim_seqcount);
1460restart:
1461        list_for_each_entry(state, &sp->so_states, open_states) {
1462                if (!test_and_clear_bit(ops->state_flag_bit, &state->flags))
1463                        continue;
1464                if (!nfs4_valid_open_stateid(state))
1465                        continue;
1466                if (state->state == 0)
1467                        continue;
1468                atomic_inc(&state->count);
1469                spin_unlock(&sp->so_lock);
1470                status = ops->recover_open(sp, state);
1471                if (status >= 0) {
1472                        status = nfs4_reclaim_locks(state, ops);
1473                        if (status >= 0) {
1474                                if (!test_bit(NFS_DELEGATED_STATE, &state->flags)) {
1475                                        spin_lock(&state->state_lock);
1476                                        list_for_each_entry(lock, &state->lock_states, ls_locks) {
1477                                                if (!test_bit(NFS_LOCK_INITIALIZED, &lock->ls_flags))
1478                                                        pr_warn_ratelimited("NFS: "
1479                                                                            "%s: Lock reclaim "
1480                                                                            "failed!\n", __func__);
1481                                        }
1482                                        spin_unlock(&state->state_lock);
1483                                }
1484                                nfs4_put_open_state(state);
1485                                spin_lock(&sp->so_lock);
1486                                goto restart;
1487                        }
1488                }
1489                switch (status) {
1490                        default:
1491                                printk(KERN_ERR "NFS: %s: unhandled error %d\n",
1492                                        __func__, status);
1493                        case -ENOENT:
1494                        case -ENOMEM:
1495                        case -ESTALE:
1496                                /* Open state on this file cannot be recovered */
1497                                nfs4_state_mark_recovery_failed(state, status);
1498                                break;
1499                        case -EAGAIN:
1500                                ssleep(1);
1501                        case -NFS4ERR_ADMIN_REVOKED:
1502                        case -NFS4ERR_STALE_STATEID:
1503                        case -NFS4ERR_BAD_STATEID:
1504                        case -NFS4ERR_RECLAIM_BAD:
1505                        case -NFS4ERR_RECLAIM_CONFLICT:
1506                                nfs4_state_mark_reclaim_nograce(sp->so_server->nfs_client, state);
1507                                break;
1508                        case -NFS4ERR_EXPIRED:
1509                        case -NFS4ERR_NO_GRACE:
1510                                nfs4_state_mark_reclaim_nograce(sp->so_server->nfs_client, state);
1511                        case -NFS4ERR_STALE_CLIENTID:
1512                        case -NFS4ERR_BADSESSION:
1513                        case -NFS4ERR_BADSLOT:
1514                        case -NFS4ERR_BAD_HIGH_SLOT:
1515                        case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
1516                                goto out_err;
1517                }
1518                nfs4_put_open_state(state);
1519                spin_lock(&sp->so_lock);
1520                goto restart;
1521        }
1522        write_seqcount_end(&sp->so_reclaim_seqcount);
1523        spin_unlock(&sp->so_lock);
1524        return 0;
1525out_err:
1526        nfs4_put_open_state(state);
1527        spin_lock(&sp->so_lock);
1528        write_seqcount_end(&sp->so_reclaim_seqcount);
1529        spin_unlock(&sp->so_lock);
1530        return status;
1531}
1532
1533static void nfs4_clear_open_state(struct nfs4_state *state)
1534{
1535        struct nfs4_lock_state *lock;
1536
1537        clear_bit(NFS_DELEGATED_STATE, &state->flags);
1538        clear_bit(NFS_O_RDONLY_STATE, &state->flags);
1539        clear_bit(NFS_O_WRONLY_STATE, &state->flags);
1540        clear_bit(NFS_O_RDWR_STATE, &state->flags);
1541        spin_lock(&state->state_lock);
1542        list_for_each_entry(lock, &state->lock_states, ls_locks) {
1543                lock->ls_seqid.flags = 0;
1544                clear_bit(NFS_LOCK_INITIALIZED, &lock->ls_flags);
1545        }
1546        spin_unlock(&state->state_lock);
1547}
1548
1549static void nfs4_reset_seqids(struct nfs_server *server,
1550        int (*mark_reclaim)(struct nfs_client *clp, struct nfs4_state *state))
1551{
1552        struct nfs_client *clp = server->nfs_client;
1553        struct nfs4_state_owner *sp;
1554        struct rb_node *pos;
1555        struct nfs4_state *state;
1556
1557        spin_lock(&clp->cl_lock);
1558        for (pos = rb_first(&server->state_owners);
1559             pos != NULL;
1560             pos = rb_next(pos)) {
1561                sp = rb_entry(pos, struct nfs4_state_owner, so_server_node);
1562                sp->so_seqid.flags = 0;
1563                spin_lock(&sp->so_lock);
1564                list_for_each_entry(state, &sp->so_states, open_states) {
1565                        if (mark_reclaim(clp, state))
1566                                nfs4_clear_open_state(state);
1567                }
1568                spin_unlock(&sp->so_lock);
1569        }
1570        spin_unlock(&clp->cl_lock);
1571}
1572
1573static void nfs4_state_mark_reclaim_helper(struct nfs_client *clp,
1574        int (*mark_reclaim)(struct nfs_client *clp, struct nfs4_state *state))
1575{
1576        struct nfs_server *server;
1577
1578        rcu_read_lock();
1579        list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
1580                nfs4_reset_seqids(server, mark_reclaim);
1581        rcu_read_unlock();
1582}
1583
1584static void nfs4_state_start_reclaim_reboot(struct nfs_client *clp)
1585{
1586        /* Mark all delegations for reclaim */
1587        nfs_delegation_mark_reclaim(clp);
1588        nfs4_state_mark_reclaim_helper(clp, nfs4_state_mark_reclaim_reboot);
1589}
1590
1591static void nfs4_reclaim_complete(struct nfs_client *clp,
1592                                 const struct nfs4_state_recovery_ops *ops,
1593                                 struct rpc_cred *cred)
1594{
1595        /* Notify the server we're done reclaiming our state */
1596        if (ops->reclaim_complete)
1597                (void)ops->reclaim_complete(clp, cred);
1598}
1599
1600static void nfs4_clear_reclaim_server(struct nfs_server *server)
1601{
1602        struct nfs_client *clp = server->nfs_client;
1603        struct nfs4_state_owner *sp;
1604        struct rb_node *pos;
1605        struct nfs4_state *state;
1606
1607        spin_lock(&clp->cl_lock);
1608        for (pos = rb_first(&server->state_owners);
1609             pos != NULL;
1610             pos = rb_next(pos)) {
1611                sp = rb_entry(pos, struct nfs4_state_owner, so_server_node);
1612                spin_lock(&sp->so_lock);
1613                list_for_each_entry(state, &sp->so_states, open_states) {
1614                        if (!test_and_clear_bit(NFS_STATE_RECLAIM_REBOOT,
1615                                                &state->flags))
1616                                continue;
1617                        nfs4_state_mark_reclaim_nograce(clp, state);
1618                }
1619                spin_unlock(&sp->so_lock);
1620        }
1621        spin_unlock(&clp->cl_lock);
1622}
1623
1624static int nfs4_state_clear_reclaim_reboot(struct nfs_client *clp)
1625{
1626        struct nfs_server *server;
1627
1628        if (!test_and_clear_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state))
1629                return 0;
1630
1631        rcu_read_lock();
1632        list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
1633                nfs4_clear_reclaim_server(server);
1634        rcu_read_unlock();
1635
1636        nfs_delegation_reap_unclaimed(clp);
1637        return 1;
1638}
1639
1640static void nfs4_state_end_reclaim_reboot(struct nfs_client *clp)
1641{
1642        const struct nfs4_state_recovery_ops *ops;
1643        struct rpc_cred *cred;
1644
1645        if (!nfs4_state_clear_reclaim_reboot(clp))
1646                return;
1647        ops = clp->cl_mvops->reboot_recovery_ops;
1648        cred = nfs4_get_clid_cred(clp);
1649        nfs4_reclaim_complete(clp, ops, cred);
1650        put_rpccred(cred);
1651}
1652
1653static void nfs_delegation_clear_all(struct nfs_client *clp)
1654{
1655        nfs_delegation_mark_reclaim(clp);
1656        nfs_delegation_reap_unclaimed(clp);
1657}
1658
1659static void nfs4_state_start_reclaim_nograce(struct nfs_client *clp)
1660{
1661        nfs_delegation_clear_all(clp);
1662        nfs4_state_mark_reclaim_helper(clp, nfs4_state_mark_reclaim_nograce);
1663}
1664
1665static int nfs4_recovery_handle_error(struct nfs_client *clp, int error)
1666{
1667        switch (error) {
1668                case 0:
1669                        break;
1670                case -NFS4ERR_CB_PATH_DOWN:
1671                        nfs40_handle_cb_pathdown(clp);
1672                        break;
1673                case -NFS4ERR_NO_GRACE:
1674                        nfs4_state_end_reclaim_reboot(clp);
1675                        break;
1676                case -NFS4ERR_STALE_CLIENTID:
1677                        set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1678                        nfs4_state_clear_reclaim_reboot(clp);
1679                        nfs4_state_start_reclaim_reboot(clp);
1680                        break;
1681                case -NFS4ERR_EXPIRED:
1682                        set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1683                        nfs4_state_start_reclaim_nograce(clp);
1684                        break;
1685                case -NFS4ERR_BADSESSION:
1686                case -NFS4ERR_BADSLOT:
1687                case -NFS4ERR_BAD_HIGH_SLOT:
1688                case -NFS4ERR_DEADSESSION:
1689                case -NFS4ERR_SEQ_FALSE_RETRY:
1690                case -NFS4ERR_SEQ_MISORDERED:
1691                        set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
1692                        /* Zero session reset errors */
1693                        break;
1694                case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
1695                        set_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state);
1696                        break;
1697                default:
1698                        dprintk("%s: failed to handle error %d for server %s\n",
1699                                        __func__, error, clp->cl_hostname);
1700                        return error;
1701        }
1702        dprintk("%s: handled error %d for server %s\n", __func__, error,
1703                        clp->cl_hostname);
1704        return 0;
1705}
1706
1707static int nfs4_do_reclaim(struct nfs_client *clp, const struct nfs4_state_recovery_ops *ops)
1708{
1709        struct nfs4_state_owner *sp;
1710        struct nfs_server *server;
1711        struct rb_node *pos;
1712        int status = 0;
1713
1714restart:
1715        rcu_read_lock();
1716        list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
1717                nfs4_purge_state_owners(server);
1718                spin_lock(&clp->cl_lock);
1719                for (pos = rb_first(&server->state_owners);
1720                     pos != NULL;
1721                     pos = rb_next(pos)) {
1722                        sp = rb_entry(pos,
1723                                struct nfs4_state_owner, so_server_node);
1724                        if (!test_and_clear_bit(ops->owner_flag_bit,
1725                                                        &sp->so_flags))
1726                                continue;
1727                        atomic_inc(&sp->so_count);
1728                        spin_unlock(&clp->cl_lock);
1729                        rcu_read_unlock();
1730
1731                        status = nfs4_reclaim_open_state(sp, ops);
1732                        if (status < 0) {
1733                                set_bit(ops->owner_flag_bit, &sp->so_flags);
1734                                nfs4_put_state_owner(sp);
1735                                return nfs4_recovery_handle_error(clp, status);
1736                        }
1737
1738                        nfs4_put_state_owner(sp);
1739                        goto restart;
1740                }
1741                spin_unlock(&clp->cl_lock);
1742        }
1743        rcu_read_unlock();
1744        return status;
1745}
1746
1747static int nfs4_check_lease(struct nfs_client *clp)
1748{
1749        struct rpc_cred *cred;
1750        const struct nfs4_state_maintenance_ops *ops =
1751                clp->cl_mvops->state_renewal_ops;
1752        int status;
1753
1754        /* Is the client already known to have an expired lease? */
1755        if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state))
1756                return 0;
1757        spin_lock(&clp->cl_lock);
1758        cred = ops->get_state_renewal_cred_locked(clp);
1759        spin_unlock(&clp->cl_lock);
1760        if (cred == NULL) {
1761                cred = nfs4_get_clid_cred(clp);
1762                status = -ENOKEY;
1763                if (cred == NULL)
1764                        goto out;
1765        }
1766        status = ops->renew_lease(clp, cred);
1767        put_rpccred(cred);
1768        if (status == -ETIMEDOUT) {
1769                set_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
1770                return 0;
1771        }
1772out:
1773        return nfs4_recovery_handle_error(clp, status);
1774}
1775
1776/* Set NFS4CLNT_LEASE_EXPIRED and reclaim reboot state for all v4.0 errors
1777 * and for recoverable errors on EXCHANGE_ID for v4.1
1778 */
1779static int nfs4_handle_reclaim_lease_error(struct nfs_client *clp, int status)
1780{
1781        switch (status) {
1782        case -NFS4ERR_SEQ_MISORDERED:
1783                if (test_and_set_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state))
1784                        return -ESERVERFAULT;
1785                /* Lease confirmation error: retry after purging the lease */
1786                ssleep(1);
1787                clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
1788                break;
1789        case -NFS4ERR_STALE_CLIENTID:
1790                clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
1791                nfs4_state_clear_reclaim_reboot(clp);
1792                nfs4_state_start_reclaim_reboot(clp);
1793                break;
1794        case -NFS4ERR_CLID_INUSE:
1795                pr_err("NFS: Server %s reports our clientid is in use\n",
1796                        clp->cl_hostname);
1797                nfs_mark_client_ready(clp, -EPERM);
1798                clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
1799                return -EPERM;
1800        case -EACCES:
1801        case -NFS4ERR_DELAY:
1802        case -ETIMEDOUT:
1803        case -EAGAIN:
1804                ssleep(1);
1805                break;
1806
1807        case -NFS4ERR_MINOR_VERS_MISMATCH:
1808                if (clp->cl_cons_state == NFS_CS_SESSION_INITING)
1809                        nfs_mark_client_ready(clp, -EPROTONOSUPPORT);
1810                dprintk("%s: exit with error %d for server %s\n",
1811                                __func__, -EPROTONOSUPPORT, clp->cl_hostname);
1812                return -EPROTONOSUPPORT;
1813        case -NFS4ERR_NOT_SAME: /* FixMe: implement recovery
1814                                 * in nfs4_exchange_id */
1815        default:
1816                dprintk("%s: exit with error %d for server %s\n", __func__,
1817                                status, clp->cl_hostname);
1818                return status;
1819        }
1820        set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1821        dprintk("%s: handled error %d for server %s\n", __func__, status,
1822                        clp->cl_hostname);
1823        return 0;
1824}
1825
1826static int nfs4_establish_lease(struct nfs_client *clp)
1827{
1828        struct rpc_cred *cred;
1829        const struct nfs4_state_recovery_ops *ops =
1830                clp->cl_mvops->reboot_recovery_ops;
1831        int status;
1832
1833        cred = nfs4_get_clid_cred(clp);
1834        if (cred == NULL)
1835                return -ENOENT;
1836        status = ops->establish_clid(clp, cred);
1837        put_rpccred(cred);
1838        if (status != 0)
1839                return status;
1840        pnfs_destroy_all_layouts(clp);
1841        return 0;
1842}
1843
1844/*
1845 * Returns zero or a negative errno.  NFS4ERR values are converted
1846 * to local errno values.
1847 */
1848static int nfs4_reclaim_lease(struct nfs_client *clp)
1849{
1850        int status;
1851
1852        status = nfs4_establish_lease(clp);
1853        if (status < 0)
1854                return nfs4_handle_reclaim_lease_error(clp, status);
1855        if (test_and_clear_bit(NFS4CLNT_SERVER_SCOPE_MISMATCH, &clp->cl_state))
1856                nfs4_state_start_reclaim_nograce(clp);
1857        if (!test_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state))
1858                set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state);
1859        clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
1860        clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1861        return 0;
1862}
1863
1864static int nfs4_purge_lease(struct nfs_client *clp)
1865{
1866        int status;
1867
1868        status = nfs4_establish_lease(clp);
1869        if (status < 0)
1870                return nfs4_handle_reclaim_lease_error(clp, status);
1871        clear_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state);
1872        set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1873        nfs4_state_start_reclaim_nograce(clp);
1874        return 0;
1875}
1876
1877/*
1878 * Try remote migration of one FSID from a source server to a
1879 * destination server.  The source server provides a list of
1880 * potential destinations.
1881 *
1882 * Returns zero or a negative NFS4ERR status code.
1883 */
1884static int nfs4_try_migration(struct nfs_server *server, struct rpc_cred *cred)
1885{
1886        struct nfs_client *clp = server->nfs_client;
1887        struct nfs4_fs_locations *locations = NULL;
1888        struct inode *inode;
1889        struct page *page;
1890        int status, result;
1891
1892        dprintk("--> %s: FSID %llx:%llx on \"%s\"\n", __func__,
1893                        (unsigned long long)server->fsid.major,
1894                        (unsigned long long)server->fsid.minor,
1895                        clp->cl_hostname);
1896
1897        result = 0;
1898        page = alloc_page(GFP_KERNEL);
1899        locations = kmalloc(sizeof(struct nfs4_fs_locations), GFP_KERNEL);
1900        if (page == NULL || locations == NULL) {
1901                dprintk("<-- %s: no memory\n", __func__);
1902                goto out;
1903        }
1904
1905        inode = server->super->s_root->d_inode;
1906        result = nfs4_proc_get_locations(inode, locations, page, cred);
1907        if (result) {
1908                dprintk("<-- %s: failed to retrieve fs_locations: %d\n",
1909                        __func__, result);
1910                goto out;
1911        }
1912
1913        result = -NFS4ERR_NXIO;
1914        if (!(locations->fattr.valid & NFS_ATTR_FATTR_V4_LOCATIONS)) {
1915                dprintk("<-- %s: No fs_locations data, migration skipped\n",
1916                        __func__);
1917                goto out;
1918        }
1919
1920        nfs4_begin_drain_session(clp);
1921
1922        status = nfs4_replace_transport(server, locations);
1923        if (status != 0) {
1924                dprintk("<-- %s: failed to replace transport: %d\n",
1925                        __func__, status);
1926                goto out;
1927        }
1928
1929        result = 0;
1930        dprintk("<-- %s: migration succeeded\n", __func__);
1931
1932out:
1933        if (page != NULL)
1934                __free_page(page);
1935        kfree(locations);
1936        if (result) {
1937                pr_err("NFS: migration recovery failed (server %s)\n",
1938                                clp->cl_hostname);
1939                set_bit(NFS_MIG_FAILED, &server->mig_status);
1940        }
1941        return result;
1942}
1943
1944/*
1945 * Returns zero or a negative NFS4ERR status code.
1946 */
1947static int nfs4_handle_migration(struct nfs_client *clp)
1948{
1949        const struct nfs4_state_maintenance_ops *ops =
1950                                clp->cl_mvops->state_renewal_ops;
1951        struct nfs_server *server;
1952        struct rpc_cred *cred;
1953
1954        dprintk("%s: migration reported on \"%s\"\n", __func__,
1955                        clp->cl_hostname);
1956
1957        spin_lock(&clp->cl_lock);
1958        cred = ops->get_state_renewal_cred_locked(clp);
1959        spin_unlock(&clp->cl_lock);
1960        if (cred == NULL)
1961                return -NFS4ERR_NOENT;
1962
1963        clp->cl_mig_gen++;
1964restart:
1965        rcu_read_lock();
1966        list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
1967                int status;
1968
1969                if (server->mig_gen == clp->cl_mig_gen)
1970                        continue;
1971                server->mig_gen = clp->cl_mig_gen;
1972
1973                if (!test_and_clear_bit(NFS_MIG_IN_TRANSITION,
1974                                                &server->mig_status))
1975                        continue;
1976
1977                rcu_read_unlock();
1978                status = nfs4_try_migration(server, cred);
1979                if (status < 0) {
1980                        put_rpccred(cred);
1981                        return status;
1982                }
1983                goto restart;
1984        }
1985        rcu_read_unlock();
1986        put_rpccred(cred);
1987        return 0;
1988}
1989
1990/*
1991 * Test each nfs_server on the clp's cl_superblocks list to see
1992 * if it's moved to another server.  Stop when the server no longer
1993 * returns NFS4ERR_LEASE_MOVED.
1994 */
1995static int nfs4_handle_lease_moved(struct nfs_client *clp)
1996{
1997        const struct nfs4_state_maintenance_ops *ops =
1998                                clp->cl_mvops->state_renewal_ops;
1999        struct nfs_server *server;
2000        struct rpc_cred *cred;
2001
2002        dprintk("%s: lease moved reported on \"%s\"\n", __func__,
2003                        clp->cl_hostname);
2004
2005        spin_lock(&clp->cl_lock);
2006        cred = ops->get_state_renewal_cred_locked(clp);
2007        spin_unlock(&clp->cl_lock);
2008        if (cred == NULL)
2009                return -NFS4ERR_NOENT;
2010
2011        clp->cl_mig_gen++;
2012restart:
2013        rcu_read_lock();
2014        list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
2015                struct inode *inode;
2016                int status;
2017
2018                if (server->mig_gen == clp->cl_mig_gen)
2019                        continue;
2020                server->mig_gen = clp->cl_mig_gen;
2021
2022                rcu_read_unlock();
2023
2024                inode = server->super->s_root->d_inode;
2025                status = nfs4_proc_fsid_present(inode, cred);
2026                if (status != -NFS4ERR_MOVED)
2027                        goto restart;   /* wasn't this one */
2028                if (nfs4_try_migration(server, cred) == -NFS4ERR_LEASE_MOVED)
2029                        goto restart;   /* there are more */
2030                goto out;
2031        }
2032        rcu_read_unlock();
2033
2034out:
2035        put_rpccred(cred);
2036        return 0;
2037}
2038
2039/**
2040 * nfs4_discover_server_trunking - Detect server IP address trunking
2041 *
2042 * @clp: nfs_client under test
2043 * @result: OUT: found nfs_client, or clp
2044 *
2045 * Returns zero or a negative errno.  If zero is returned,
2046 * an nfs_client pointer is planted in "result".
2047 *
2048 * Note: since we are invoked in process context, and
2049 * not from inside the state manager, we cannot use
2050 * nfs4_handle_reclaim_lease_error().
2051 */
2052int nfs4_discover_server_trunking(struct nfs_client *clp,
2053                                  struct nfs_client **result)
2054{
2055        const struct nfs4_state_recovery_ops *ops =
2056                                clp->cl_mvops->reboot_recovery_ops;
2057        struct rpc_clnt *clnt;
2058        struct rpc_cred *cred;
2059        int i, status;
2060
2061        dprintk("NFS: %s: testing '%s'\n", __func__, clp->cl_hostname);
2062
2063        clnt = clp->cl_rpcclient;
2064        i = 0;
2065
2066        mutex_lock(&nfs_clid_init_mutex);
2067again:
2068        status  = -ENOENT;
2069        cred = nfs4_get_clid_cred(clp);
2070        if (cred == NULL)
2071                goto out_unlock;
2072
2073        status = ops->detect_trunking(clp, result, cred);
2074        put_rpccred(cred);
2075        switch (status) {
2076        case 0:
2077                break;
2078        case -NFS4ERR_DELAY:
2079        case -ETIMEDOUT:
2080        case -EAGAIN:
2081                ssleep(1);
2082        case -NFS4ERR_STALE_CLIENTID:
2083                dprintk("NFS: %s after status %d, retrying\n",
2084                        __func__, status);
2085                goto again;
2086        case -EACCES:
2087                if (i++ == 0) {
2088                        nfs4_root_machine_cred(clp);
2089                        goto again;
2090                }
2091                if (clnt->cl_auth->au_flavor == RPC_AUTH_UNIX)
2092                        break;
2093        case -NFS4ERR_CLID_INUSE:
2094        case -NFS4ERR_WRONGSEC:
2095                /* No point in retrying if we already used RPC_AUTH_UNIX */
2096                if (clnt->cl_auth->au_flavor == RPC_AUTH_UNIX) {
2097                        status = -EPERM;
2098                        break;
2099                }
2100                clnt = rpc_clone_client_set_auth(clnt, RPC_AUTH_UNIX);
2101                if (IS_ERR(clnt)) {
2102                        status = PTR_ERR(clnt);
2103                        break;
2104                }
2105                /* Note: this is safe because we haven't yet marked the
2106                 * client as ready, so we are the only user of
2107                 * clp->cl_rpcclient
2108                 */
2109                clnt = xchg(&clp->cl_rpcclient, clnt);
2110                rpc_shutdown_client(clnt);
2111                clnt = clp->cl_rpcclient;
2112                goto again;
2113
2114        case -NFS4ERR_MINOR_VERS_MISMATCH:
2115                status = -EPROTONOSUPPORT;
2116                break;
2117
2118        case -EKEYEXPIRED:
2119        case -NFS4ERR_NOT_SAME: /* FixMe: implement recovery
2120                                 * in nfs4_exchange_id */
2121                status = -EKEYEXPIRED;
2122                break;
2123        default:
2124                pr_warn("NFS: %s unhandled error %d. Exiting with error EIO\n",
2125                                __func__, status);
2126                status = -EIO;
2127        }
2128
2129out_unlock:
2130        mutex_unlock(&nfs_clid_init_mutex);
2131        dprintk("NFS: %s: status = %d\n", __func__, status);
2132        return status;
2133}
2134
2135#ifdef CONFIG_NFS_V4_1
2136void nfs4_schedule_session_recovery(struct nfs4_session *session, int err)
2137{
2138        struct nfs_client *clp = session->clp;
2139
2140        switch (err) {
2141        default:
2142                set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
2143                break;
2144        case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
2145                set_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state);
2146        }
2147        nfs4_schedule_lease_recovery(clp);
2148}
2149EXPORT_SYMBOL_GPL(nfs4_schedule_session_recovery);
2150
2151static void nfs41_ping_server(struct nfs_client *clp)
2152{
2153        /* Use CHECK_LEASE to ping the server with a SEQUENCE */
2154        set_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
2155        nfs4_schedule_state_manager(clp);
2156}
2157
2158void nfs41_server_notify_target_slotid_update(struct nfs_client *clp)
2159{
2160        nfs41_ping_server(clp);
2161}
2162
2163void nfs41_server_notify_highest_slotid_update(struct nfs_client *clp)
2164{
2165        nfs41_ping_server(clp);
2166}
2167
2168static void nfs4_reset_all_state(struct nfs_client *clp)
2169{
2170        if (test_and_set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) == 0) {
2171                set_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state);
2172                clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
2173                nfs4_state_start_reclaim_nograce(clp);
2174                dprintk("%s: scheduling reset of all state for server %s!\n",
2175                                __func__, clp->cl_hostname);
2176                nfs4_schedule_state_manager(clp);
2177        }
2178}
2179
2180static void nfs41_handle_server_reboot(struct nfs_client *clp)
2181{
2182        if (test_and_set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) == 0) {
2183                nfs4_state_start_reclaim_reboot(clp);
2184                dprintk("%s: server %s rebooted!\n", __func__,
2185                                clp->cl_hostname);
2186                nfs4_schedule_state_manager(clp);
2187        }
2188}
2189
2190static void nfs41_handle_state_revoked(struct nfs_client *clp)
2191{
2192        nfs4_reset_all_state(clp);
2193        dprintk("%s: state revoked on server %s\n", __func__, clp->cl_hostname);
2194}
2195
2196static void nfs41_handle_recallable_state_revoked(struct nfs_client *clp)
2197{
2198        /* This will need to handle layouts too */
2199        nfs_expire_all_delegations(clp);
2200        dprintk("%s: Recallable state revoked on server %s!\n", __func__,
2201                        clp->cl_hostname);
2202}
2203
2204static void nfs41_handle_backchannel_fault(struct nfs_client *clp)
2205{
2206        nfs_expire_all_delegations(clp);
2207        if (test_and_set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state) == 0)
2208                nfs4_schedule_state_manager(clp);
2209        dprintk("%s: server %s declared a backchannel fault\n", __func__,
2210                        clp->cl_hostname);
2211}
2212
2213static void nfs41_handle_cb_path_down(struct nfs_client *clp)
2214{
2215        if (test_and_set_bit(NFS4CLNT_BIND_CONN_TO_SESSION,
2216                &clp->cl_state) == 0)
2217                nfs4_schedule_state_manager(clp);
2218}
2219
2220void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags)
2221{
2222        if (!flags)
2223                return;
2224
2225        dprintk("%s: \"%s\" (client ID %llx) flags=0x%08x\n",
2226                __func__, clp->cl_hostname, clp->cl_clientid, flags);
2227
2228        if (flags & SEQ4_STATUS_RESTART_RECLAIM_NEEDED)
2229                nfs41_handle_server_reboot(clp);
2230        if (flags & (SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED |
2231                            SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED |
2232                            SEQ4_STATUS_ADMIN_STATE_REVOKED))
2233                nfs41_handle_state_revoked(clp);
2234        if (flags & SEQ4_STATUS_LEASE_MOVED)
2235                nfs4_schedule_lease_moved_recovery(clp);
2236        if (flags & SEQ4_STATUS_RECALLABLE_STATE_REVOKED)
2237                nfs41_handle_recallable_state_revoked(clp);
2238        if (flags & SEQ4_STATUS_BACKCHANNEL_FAULT)
2239                nfs41_handle_backchannel_fault(clp);
2240        else if (flags & (SEQ4_STATUS_CB_PATH_DOWN |
2241                                SEQ4_STATUS_CB_PATH_DOWN_SESSION))
2242                nfs41_handle_cb_path_down(clp);
2243}
2244
2245static int nfs4_reset_session(struct nfs_client *clp)
2246{
2247        struct rpc_cred *cred;
2248        int status;
2249
2250        if (!nfs4_has_session(clp))
2251                return 0;
2252        nfs4_begin_drain_session(clp);
2253        cred = nfs4_get_clid_cred(clp);
2254        status = nfs4_proc_destroy_session(clp->cl_session, cred);
2255        switch (status) {
2256        case 0:
2257        case -NFS4ERR_BADSESSION:
2258        case -NFS4ERR_DEADSESSION:
2259                break;
2260        case -NFS4ERR_BACK_CHAN_BUSY:
2261        case -NFS4ERR_DELAY:
2262                set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
2263                status = 0;
2264                ssleep(1);
2265                goto out;
2266        default:
2267                status = nfs4_recovery_handle_error(clp, status);
2268                goto out;
2269        }
2270
2271        memset(clp->cl_session->sess_id.data, 0, NFS4_MAX_SESSIONID_LEN);
2272        status = nfs4_proc_create_session(clp, cred);
2273        if (status) {
2274                dprintk("%s: session reset failed with status %d for server %s!\n",
2275                        __func__, status, clp->cl_hostname);
2276                status = nfs4_handle_reclaim_lease_error(clp, status);
2277                goto out;
2278        }
2279        nfs41_finish_session_reset(clp);
2280        dprintk("%s: session reset was successful for server %s!\n",
2281                        __func__, clp->cl_hostname);
2282out:
2283        if (cred)
2284                put_rpccred(cred);
2285        return status;
2286}
2287
2288static int nfs4_bind_conn_to_session(struct nfs_client *clp)
2289{
2290        struct rpc_cred *cred;
2291        int ret;
2292
2293        if (!nfs4_has_session(clp))
2294                return 0;
2295        nfs4_begin_drain_session(clp);
2296        cred = nfs4_get_clid_cred(clp);
2297        ret = nfs4_proc_bind_conn_to_session(clp, cred);
2298        if (cred)
2299                put_rpccred(cred);
2300        clear_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state);
2301        switch (ret) {
2302        case 0:
2303                dprintk("%s: bind_conn_to_session was successful for server %s!\n",
2304                        __func__, clp->cl_hostname);
2305                break;
2306        case -NFS4ERR_DELAY:
2307                ssleep(1);
2308                set_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state);
2309                break;
2310        default:
2311                return nfs4_recovery_handle_error(clp, ret);
2312        }
2313        return 0;
2314}
2315#else /* CONFIG_NFS_V4_1 */
2316static int nfs4_reset_session(struct nfs_client *clp) { return 0; }
2317
2318static int nfs4_bind_conn_to_session(struct nfs_client *clp)
2319{
2320        return 0;
2321}
2322#endif /* CONFIG_NFS_V4_1 */
2323
2324static void nfs4_state_manager(struct nfs_client *clp)
2325{
2326        int status = 0;
2327        const char *section = "", *section_sep = "";
2328
2329        /* Ensure exclusive access to NFSv4 state */
2330        do {
2331                if (test_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state)) {
2332                        section = "purge state";
2333                        status = nfs4_purge_lease(clp);
2334                        if (status < 0)
2335                                goto out_error;
2336                        continue;
2337                }
2338
2339                if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) {
2340                        section = "lease expired";
2341                        /* We're going to have to re-establish a clientid */
2342                        status = nfs4_reclaim_lease(clp);
2343                        if (status < 0)
2344                                goto out_error;
2345                        continue;
2346                }
2347
2348                /* Initialize or reset the session */
2349                if (test_and_clear_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state)) {
2350                        section = "reset session";
2351                        status = nfs4_reset_session(clp);
2352                        if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state))
2353                                continue;
2354                        if (status < 0)
2355                                goto out_error;
2356                }
2357
2358                /* Send BIND_CONN_TO_SESSION */
2359                if (test_and_clear_bit(NFS4CLNT_BIND_CONN_TO_SESSION,
2360                                &clp->cl_state)) {
2361                        section = "bind conn to session";
2362                        status = nfs4_bind_conn_to_session(clp);
2363                        if (status < 0)
2364                                goto out_error;
2365                        continue;
2366                }
2367
2368                if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
2369                        section = "check lease";
2370                        status = nfs4_check_lease(clp);
2371                        if (status < 0)
2372                                goto out_error;
2373                }
2374
2375                if (test_and_clear_bit(NFS4CLNT_MOVED, &clp->cl_state)) {
2376                        section = "migration";
2377                        status = nfs4_handle_migration(clp);
2378                        if (status < 0)
2379                                goto out_error;
2380                }
2381
2382                if (test_and_clear_bit(NFS4CLNT_LEASE_MOVED, &clp->cl_state)) {
2383                        section = "lease moved";
2384                        status = nfs4_handle_lease_moved(clp);
2385                        if (status < 0)
2386                                goto out_error;
2387                }
2388
2389                /* First recover reboot state... */
2390                if (test_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state)) {
2391                        section = "reclaim reboot";
2392                        status = nfs4_do_reclaim(clp,
2393                                clp->cl_mvops->reboot_recovery_ops);
2394                        if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) ||
2395                            test_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state))
2396                                continue;
2397                        nfs4_state_end_reclaim_reboot(clp);
2398                        if (test_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state))
2399                                continue;
2400                        if (status < 0)
2401                                goto out_error;
2402                }
2403
2404                /* Now recover expired state... */
2405                if (test_and_clear_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state)) {
2406                        section = "reclaim nograce";
2407                        status = nfs4_do_reclaim(clp,
2408                                clp->cl_mvops->nograce_recovery_ops);
2409                        if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) ||
2410                            test_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state) ||
2411                            test_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state))
2412                                continue;
2413                        if (status < 0)
2414                                goto out_error;
2415                }
2416
2417                nfs4_end_drain_session(clp);
2418                if (test_and_clear_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state)) {
2419                        nfs_client_return_marked_delegations(clp);
2420                        continue;
2421                }
2422
2423                nfs4_clear_state_manager_bit(clp);
2424                /* Did we race with an attempt to give us more work? */
2425                if (clp->cl_state == 0)
2426                        break;
2427                if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0)
2428                        break;
2429        } while (atomic_read(&clp->cl_count) > 1);
2430        return;
2431out_error:
2432        if (strlen(section))
2433                section_sep = ": ";
2434        pr_warn_ratelimited("NFS: state manager%s%s failed on NFSv4 server %s"
2435                        " with error %d\n", section_sep, section,
2436                        clp->cl_hostname, -status);
2437        ssleep(1);
2438        nfs4_end_drain_session(clp);
2439        nfs4_clear_state_manager_bit(clp);
2440}
2441
2442static int nfs4_run_state_manager(void *ptr)
2443{
2444        struct nfs_client *clp = ptr;
2445
2446        allow_signal(SIGKILL);
2447        nfs4_state_manager(clp);
2448        nfs_put_client(clp);
2449        module_put_and_exit(0);
2450        return 0;
2451}
2452
2453/*
2454 * Local variables:
2455 *  c-basic-offset: 8
2456 * End:
2457 */
2458