linux/fs/nfs/nfs4proc.c
<<
>>
Prefs
   1/*
   2 *  fs/nfs/nfs4proc.c
   3 *
   4 *  Client-side procedure declarations 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 *  Andy Adamson   <andros@umich.edu>
  11 *
  12 *  Redistribution and use in source and binary forms, with or without
  13 *  modification, are permitted provided that the following conditions
  14 *  are met:
  15 *
  16 *  1. Redistributions of source code must retain the above copyright
  17 *     notice, this list of conditions and the following disclaimer.
  18 *  2. Redistributions in binary form must reproduce the above copyright
  19 *     notice, this list of conditions and the following disclaimer in the
  20 *     documentation and/or other materials provided with the distribution.
  21 *  3. Neither the name of the University nor the names of its
  22 *     contributors may be used to endorse or promote products derived
  23 *     from this software without specific prior written permission.
  24 *
  25 *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
  26 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  27 *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  28 *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  29 *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  30 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  31 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  32 *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  33 *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  34 *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  35 *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  36 */
  37
  38#include <linux/mm.h>
  39#include <linux/delay.h>
  40#include <linux/errno.h>
  41#include <linux/string.h>
  42#include <linux/ratelimit.h>
  43#include <linux/printk.h>
  44#include <linux/slab.h>
  45#include <linux/sunrpc/clnt.h>
  46#include <linux/nfs.h>
  47#include <linux/nfs4.h>
  48#include <linux/nfs_fs.h>
  49#include <linux/nfs_page.h>
  50#include <linux/nfs_mount.h>
  51#include <linux/namei.h>
  52#include <linux/mount.h>
  53#include <linux/module.h>
  54#include <linux/xattr.h>
  55#include <linux/utsname.h>
  56#include <linux/freezer.h>
  57#include <linux/iversion.h>
  58
  59#include "nfs4_fs.h"
  60#include "delegation.h"
  61#include "internal.h"
  62#include "iostat.h"
  63#include "callback.h"
  64#include "pnfs.h"
  65#include "netns.h"
  66#include "nfs4idmap.h"
  67#include "nfs4session.h"
  68#include "fscache.h"
  69
  70#include "nfs4trace.h"
  71
  72#define NFSDBG_FACILITY         NFSDBG_PROC
  73
  74#define NFS4_BITMASK_SZ         3
  75
  76#define NFS4_POLL_RETRY_MIN     (HZ/10)
  77#define NFS4_POLL_RETRY_MAX     (15*HZ)
  78
  79/* file attributes which can be mapped to nfs attributes */
  80#define NFS4_VALID_ATTRS (ATTR_MODE \
  81        | ATTR_UID \
  82        | ATTR_GID \
  83        | ATTR_SIZE \
  84        | ATTR_ATIME \
  85        | ATTR_MTIME \
  86        | ATTR_CTIME \
  87        | ATTR_ATIME_SET \
  88        | ATTR_MTIME_SET)
  89
  90struct nfs4_opendata;
  91static int _nfs4_recover_proc_open(struct nfs4_opendata *data);
  92static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *);
  93static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr);
  94static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr, struct nfs4_label *label, struct inode *inode);
  95static int nfs4_do_setattr(struct inode *inode, const struct cred *cred,
  96                            struct nfs_fattr *fattr, struct iattr *sattr,
  97                            struct nfs_open_context *ctx, struct nfs4_label *ilabel,
  98                            struct nfs4_label *olabel);
  99#ifdef CONFIG_NFS_V4_1
 100static struct rpc_task *_nfs41_proc_sequence(struct nfs_client *clp,
 101                const struct cred *cred,
 102                struct nfs4_slot *slot,
 103                bool is_privileged);
 104static int nfs41_test_stateid(struct nfs_server *, nfs4_stateid *,
 105                const struct cred *);
 106static int nfs41_free_stateid(struct nfs_server *, const nfs4_stateid *,
 107                const struct cred *, bool);
 108#endif
 109
 110#ifdef CONFIG_NFS_V4_SECURITY_LABEL
 111static inline struct nfs4_label *
 112nfs4_label_init_security(struct inode *dir, struct dentry *dentry,
 113        struct iattr *sattr, struct nfs4_label *label)
 114{
 115        int err;
 116
 117        if (label == NULL)
 118                return NULL;
 119
 120        if (nfs_server_capable(dir, NFS_CAP_SECURITY_LABEL) == 0)
 121                return NULL;
 122
 123        err = security_dentry_init_security(dentry, sattr->ia_mode,
 124                                &dentry->d_name, (void **)&label->label, &label->len);
 125        if (err == 0)
 126                return label;
 127
 128        return NULL;
 129}
 130static inline void
 131nfs4_label_release_security(struct nfs4_label *label)
 132{
 133        if (label)
 134                security_release_secctx(label->label, label->len);
 135}
 136static inline u32 *nfs4_bitmask(struct nfs_server *server, struct nfs4_label *label)
 137{
 138        if (label)
 139                return server->attr_bitmask;
 140
 141        return server->attr_bitmask_nl;
 142}
 143#else
 144static inline struct nfs4_label *
 145nfs4_label_init_security(struct inode *dir, struct dentry *dentry,
 146        struct iattr *sattr, struct nfs4_label *l)
 147{ return NULL; }
 148static inline void
 149nfs4_label_release_security(struct nfs4_label *label)
 150{ return; }
 151static inline u32 *
 152nfs4_bitmask(struct nfs_server *server, struct nfs4_label *label)
 153{ return server->attr_bitmask; }
 154#endif
 155
 156/* Prevent leaks of NFSv4 errors into userland */
 157static int nfs4_map_errors(int err)
 158{
 159        if (err >= -1000)
 160                return err;
 161        switch (err) {
 162        case -NFS4ERR_RESOURCE:
 163        case -NFS4ERR_LAYOUTTRYLATER:
 164        case -NFS4ERR_RECALLCONFLICT:
 165                return -EREMOTEIO;
 166        case -NFS4ERR_WRONGSEC:
 167        case -NFS4ERR_WRONG_CRED:
 168                return -EPERM;
 169        case -NFS4ERR_BADOWNER:
 170        case -NFS4ERR_BADNAME:
 171                return -EINVAL;
 172        case -NFS4ERR_SHARE_DENIED:
 173                return -EACCES;
 174        case -NFS4ERR_MINOR_VERS_MISMATCH:
 175                return -EPROTONOSUPPORT;
 176        case -NFS4ERR_FILE_OPEN:
 177                return -EBUSY;
 178        default:
 179                dprintk("%s could not handle NFSv4 error %d\n",
 180                                __func__, -err);
 181                break;
 182        }
 183        return -EIO;
 184}
 185
 186/*
 187 * This is our standard bitmap for GETATTR requests.
 188 */
 189const u32 nfs4_fattr_bitmap[3] = {
 190        FATTR4_WORD0_TYPE
 191        | FATTR4_WORD0_CHANGE
 192        | FATTR4_WORD0_SIZE
 193        | FATTR4_WORD0_FSID
 194        | FATTR4_WORD0_FILEID,
 195        FATTR4_WORD1_MODE
 196        | FATTR4_WORD1_NUMLINKS
 197        | FATTR4_WORD1_OWNER
 198        | FATTR4_WORD1_OWNER_GROUP
 199        | FATTR4_WORD1_RAWDEV
 200        | FATTR4_WORD1_SPACE_USED
 201        | FATTR4_WORD1_TIME_ACCESS
 202        | FATTR4_WORD1_TIME_METADATA
 203        | FATTR4_WORD1_TIME_MODIFY
 204        | FATTR4_WORD1_MOUNTED_ON_FILEID,
 205#ifdef CONFIG_NFS_V4_SECURITY_LABEL
 206        FATTR4_WORD2_SECURITY_LABEL
 207#endif
 208};
 209
 210static const u32 nfs4_pnfs_open_bitmap[3] = {
 211        FATTR4_WORD0_TYPE
 212        | FATTR4_WORD0_CHANGE
 213        | FATTR4_WORD0_SIZE
 214        | FATTR4_WORD0_FSID
 215        | FATTR4_WORD0_FILEID,
 216        FATTR4_WORD1_MODE
 217        | FATTR4_WORD1_NUMLINKS
 218        | FATTR4_WORD1_OWNER
 219        | FATTR4_WORD1_OWNER_GROUP
 220        | FATTR4_WORD1_RAWDEV
 221        | FATTR4_WORD1_SPACE_USED
 222        | FATTR4_WORD1_TIME_ACCESS
 223        | FATTR4_WORD1_TIME_METADATA
 224        | FATTR4_WORD1_TIME_MODIFY,
 225        FATTR4_WORD2_MDSTHRESHOLD
 226#ifdef CONFIG_NFS_V4_SECURITY_LABEL
 227        | FATTR4_WORD2_SECURITY_LABEL
 228#endif
 229};
 230
 231static const u32 nfs4_open_noattr_bitmap[3] = {
 232        FATTR4_WORD0_TYPE
 233        | FATTR4_WORD0_FILEID,
 234};
 235
 236const u32 nfs4_statfs_bitmap[3] = {
 237        FATTR4_WORD0_FILES_AVAIL
 238        | FATTR4_WORD0_FILES_FREE
 239        | FATTR4_WORD0_FILES_TOTAL,
 240        FATTR4_WORD1_SPACE_AVAIL
 241        | FATTR4_WORD1_SPACE_FREE
 242        | FATTR4_WORD1_SPACE_TOTAL
 243};
 244
 245const u32 nfs4_pathconf_bitmap[3] = {
 246        FATTR4_WORD0_MAXLINK
 247        | FATTR4_WORD0_MAXNAME,
 248        0
 249};
 250
 251const u32 nfs4_fsinfo_bitmap[3] = { FATTR4_WORD0_MAXFILESIZE
 252                        | FATTR4_WORD0_MAXREAD
 253                        | FATTR4_WORD0_MAXWRITE
 254                        | FATTR4_WORD0_LEASE_TIME,
 255                        FATTR4_WORD1_TIME_DELTA
 256                        | FATTR4_WORD1_FS_LAYOUT_TYPES,
 257                        FATTR4_WORD2_LAYOUT_BLKSIZE
 258                        | FATTR4_WORD2_CLONE_BLKSIZE
 259};
 260
 261const u32 nfs4_fs_locations_bitmap[3] = {
 262        FATTR4_WORD0_CHANGE
 263        | FATTR4_WORD0_SIZE
 264        | FATTR4_WORD0_FSID
 265        | FATTR4_WORD0_FILEID
 266        | FATTR4_WORD0_FS_LOCATIONS,
 267        FATTR4_WORD1_OWNER
 268        | FATTR4_WORD1_OWNER_GROUP
 269        | FATTR4_WORD1_RAWDEV
 270        | FATTR4_WORD1_SPACE_USED
 271        | FATTR4_WORD1_TIME_ACCESS
 272        | FATTR4_WORD1_TIME_METADATA
 273        | FATTR4_WORD1_TIME_MODIFY
 274        | FATTR4_WORD1_MOUNTED_ON_FILEID,
 275};
 276
 277static void nfs4_bitmap_copy_adjust(__u32 *dst, const __u32 *src,
 278                struct inode *inode)
 279{
 280        unsigned long cache_validity;
 281
 282        memcpy(dst, src, NFS4_BITMASK_SZ*sizeof(*dst));
 283        if (!inode || !nfs4_have_delegation(inode, FMODE_READ))
 284                return;
 285
 286        cache_validity = READ_ONCE(NFS_I(inode)->cache_validity);
 287        if (!(cache_validity & NFS_INO_REVAL_FORCED))
 288                cache_validity &= ~(NFS_INO_INVALID_CHANGE
 289                                | NFS_INO_INVALID_SIZE);
 290
 291        if (!(cache_validity & NFS_INO_INVALID_SIZE))
 292                dst[0] &= ~FATTR4_WORD0_SIZE;
 293
 294        if (!(cache_validity & NFS_INO_INVALID_CHANGE))
 295                dst[0] &= ~FATTR4_WORD0_CHANGE;
 296}
 297
 298static void nfs4_bitmap_copy_adjust_setattr(__u32 *dst,
 299                const __u32 *src, struct inode *inode)
 300{
 301        nfs4_bitmap_copy_adjust(dst, src, inode);
 302}
 303
 304static void nfs4_setup_readdir(u64 cookie, __be32 *verifier, struct dentry *dentry,
 305                struct nfs4_readdir_arg *readdir)
 306{
 307        unsigned int attrs = FATTR4_WORD0_FILEID | FATTR4_WORD0_TYPE;
 308        __be32 *start, *p;
 309
 310        if (cookie > 2) {
 311                readdir->cookie = cookie;
 312                memcpy(&readdir->verifier, verifier, sizeof(readdir->verifier));
 313                return;
 314        }
 315
 316        readdir->cookie = 0;
 317        memset(&readdir->verifier, 0, sizeof(readdir->verifier));
 318        if (cookie == 2)
 319                return;
 320        
 321        /*
 322         * NFSv4 servers do not return entries for '.' and '..'
 323         * Therefore, we fake these entries here.  We let '.'
 324         * have cookie 0 and '..' have cookie 1.  Note that
 325         * when talking to the server, we always send cookie 0
 326         * instead of 1 or 2.
 327         */
 328        start = p = kmap_atomic(*readdir->pages);
 329        
 330        if (cookie == 0) {
 331                *p++ = xdr_one;                                  /* next */
 332                *p++ = xdr_zero;                   /* cookie, first word */
 333                *p++ = xdr_one;                   /* cookie, second word */
 334                *p++ = xdr_one;                             /* entry len */
 335                memcpy(p, ".\0\0\0", 4);                        /* entry */
 336                p++;
 337                *p++ = xdr_one;                         /* bitmap length */
 338                *p++ = htonl(attrs);                           /* bitmap */
 339                *p++ = htonl(12);             /* attribute buffer length */
 340                *p++ = htonl(NF4DIR);
 341                p = xdr_encode_hyper(p, NFS_FILEID(d_inode(dentry)));
 342        }
 343        
 344        *p++ = xdr_one;                                  /* next */
 345        *p++ = xdr_zero;                   /* cookie, first word */
 346        *p++ = xdr_two;                   /* cookie, second word */
 347        *p++ = xdr_two;                             /* entry len */
 348        memcpy(p, "..\0\0", 4);                         /* entry */
 349        p++;
 350        *p++ = xdr_one;                         /* bitmap length */
 351        *p++ = htonl(attrs);                           /* bitmap */
 352        *p++ = htonl(12);             /* attribute buffer length */
 353        *p++ = htonl(NF4DIR);
 354        p = xdr_encode_hyper(p, NFS_FILEID(d_inode(dentry->d_parent)));
 355
 356        readdir->pgbase = (char *)p - (char *)start;
 357        readdir->count -= readdir->pgbase;
 358        kunmap_atomic(start);
 359}
 360
 361static void nfs4_test_and_free_stateid(struct nfs_server *server,
 362                nfs4_stateid *stateid,
 363                const struct cred *cred)
 364{
 365        const struct nfs4_minor_version_ops *ops = server->nfs_client->cl_mvops;
 366
 367        ops->test_and_free_expired(server, stateid, cred);
 368}
 369
 370static void __nfs4_free_revoked_stateid(struct nfs_server *server,
 371                nfs4_stateid *stateid,
 372                const struct cred *cred)
 373{
 374        stateid->type = NFS4_REVOKED_STATEID_TYPE;
 375        nfs4_test_and_free_stateid(server, stateid, cred);
 376}
 377
 378static void nfs4_free_revoked_stateid(struct nfs_server *server,
 379                const nfs4_stateid *stateid,
 380                const struct cred *cred)
 381{
 382        nfs4_stateid tmp;
 383
 384        nfs4_stateid_copy(&tmp, stateid);
 385        __nfs4_free_revoked_stateid(server, &tmp, cred);
 386}
 387
 388static long nfs4_update_delay(long *timeout)
 389{
 390        long ret;
 391        if (!timeout)
 392                return NFS4_POLL_RETRY_MAX;
 393        if (*timeout <= 0)
 394                *timeout = NFS4_POLL_RETRY_MIN;
 395        if (*timeout > NFS4_POLL_RETRY_MAX)
 396                *timeout = NFS4_POLL_RETRY_MAX;
 397        ret = *timeout;
 398        *timeout <<= 1;
 399        return ret;
 400}
 401
 402static int nfs4_delay_killable(long *timeout)
 403{
 404        might_sleep();
 405
 406        freezable_schedule_timeout_killable_unsafe(
 407                nfs4_update_delay(timeout));
 408        if (!__fatal_signal_pending(current))
 409                return 0;
 410        return -EINTR;
 411}
 412
 413static int nfs4_delay_interruptible(long *timeout)
 414{
 415        might_sleep();
 416
 417        freezable_schedule_timeout_interruptible(nfs4_update_delay(timeout));
 418        if (!signal_pending(current))
 419                return 0;
 420        return __fatal_signal_pending(current) ? -EINTR :-ERESTARTSYS;
 421}
 422
 423static int nfs4_delay(long *timeout, bool interruptible)
 424{
 425        if (interruptible)
 426                return nfs4_delay_interruptible(timeout);
 427        return nfs4_delay_killable(timeout);
 428}
 429
 430static const nfs4_stateid *
 431nfs4_recoverable_stateid(const nfs4_stateid *stateid)
 432{
 433        if (!stateid)
 434                return NULL;
 435        switch (stateid->type) {
 436        case NFS4_OPEN_STATEID_TYPE:
 437        case NFS4_LOCK_STATEID_TYPE:
 438        case NFS4_DELEGATION_STATEID_TYPE:
 439                return stateid;
 440        default:
 441                break;
 442        }
 443        return NULL;
 444}
 445
 446/* This is the error handling routine for processes that are allowed
 447 * to sleep.
 448 */
 449static int nfs4_do_handle_exception(struct nfs_server *server,
 450                int errorcode, struct nfs4_exception *exception)
 451{
 452        struct nfs_client *clp = server->nfs_client;
 453        struct nfs4_state *state = exception->state;
 454        const nfs4_stateid *stateid;
 455        struct inode *inode = exception->inode;
 456        int ret = errorcode;
 457
 458        exception->delay = 0;
 459        exception->recovering = 0;
 460        exception->retry = 0;
 461
 462        stateid = nfs4_recoverable_stateid(exception->stateid);
 463        if (stateid == NULL && state != NULL)
 464                stateid = nfs4_recoverable_stateid(&state->stateid);
 465
 466        switch(errorcode) {
 467                case 0:
 468                        return 0;
 469                case -NFS4ERR_BADHANDLE:
 470                case -ESTALE:
 471                        if (inode != NULL && S_ISREG(inode->i_mode))
 472                                pnfs_destroy_layout(NFS_I(inode));
 473                        break;
 474                case -NFS4ERR_DELEG_REVOKED:
 475                case -NFS4ERR_ADMIN_REVOKED:
 476                case -NFS4ERR_EXPIRED:
 477                case -NFS4ERR_BAD_STATEID:
 478                case -NFS4ERR_PARTNER_NO_AUTH:
 479                        if (inode != NULL && stateid != NULL) {
 480                                nfs_inode_find_state_and_recover(inode,
 481                                                stateid);
 482                                goto wait_on_recovery;
 483                        }
 484                        /* Fall through */
 485                case -NFS4ERR_OPENMODE:
 486                        if (inode) {
 487                                int err;
 488
 489                                err = nfs_async_inode_return_delegation(inode,
 490                                                stateid);
 491                                if (err == 0)
 492                                        goto wait_on_recovery;
 493                                if (stateid != NULL && stateid->type == NFS4_DELEGATION_STATEID_TYPE) {
 494                                        exception->retry = 1;
 495                                        break;
 496                                }
 497                        }
 498                        if (state == NULL)
 499                                break;
 500                        ret = nfs4_schedule_stateid_recovery(server, state);
 501                        if (ret < 0)
 502                                break;
 503                        goto wait_on_recovery;
 504                case -NFS4ERR_STALE_STATEID:
 505                case -NFS4ERR_STALE_CLIENTID:
 506                        nfs4_schedule_lease_recovery(clp);
 507                        goto wait_on_recovery;
 508                case -NFS4ERR_MOVED:
 509                        ret = nfs4_schedule_migration_recovery(server);
 510                        if (ret < 0)
 511                                break;
 512                        goto wait_on_recovery;
 513                case -NFS4ERR_LEASE_MOVED:
 514                        nfs4_schedule_lease_moved_recovery(clp);
 515                        goto wait_on_recovery;
 516#if defined(CONFIG_NFS_V4_1)
 517                case -NFS4ERR_BADSESSION:
 518                case -NFS4ERR_BADSLOT:
 519                case -NFS4ERR_BAD_HIGH_SLOT:
 520                case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
 521                case -NFS4ERR_DEADSESSION:
 522                case -NFS4ERR_SEQ_FALSE_RETRY:
 523                case -NFS4ERR_SEQ_MISORDERED:
 524                        /* Handled in nfs41_sequence_process() */
 525                        goto wait_on_recovery;
 526#endif /* defined(CONFIG_NFS_V4_1) */
 527                case -NFS4ERR_FILE_OPEN:
 528                        if (exception->timeout > HZ) {
 529                                /* We have retried a decent amount, time to
 530                                 * fail
 531                                 */
 532                                ret = -EBUSY;
 533                                break;
 534                        }
 535                        /* Fall through */
 536                case -NFS4ERR_DELAY:
 537                        nfs_inc_server_stats(server, NFSIOS_DELAY);
 538                        /* Fall through */
 539                case -NFS4ERR_GRACE:
 540                case -NFS4ERR_LAYOUTTRYLATER:
 541                case -NFS4ERR_RECALLCONFLICT:
 542                        exception->delay = 1;
 543                        return 0;
 544
 545                case -NFS4ERR_RETRY_UNCACHED_REP:
 546                case -NFS4ERR_OLD_STATEID:
 547                        exception->retry = 1;
 548                        break;
 549                case -NFS4ERR_BADOWNER:
 550                        /* The following works around a Linux server bug! */
 551                case -NFS4ERR_BADNAME:
 552                        if (server->caps & NFS_CAP_UIDGID_NOMAP) {
 553                                server->caps &= ~NFS_CAP_UIDGID_NOMAP;
 554                                exception->retry = 1;
 555                                printk(KERN_WARNING "NFS: v4 server %s "
 556                                                "does not accept raw "
 557                                                "uid/gids. "
 558                                                "Reenabling the idmapper.\n",
 559                                                server->nfs_client->cl_hostname);
 560                        }
 561        }
 562        /* We failed to handle the error */
 563        return nfs4_map_errors(ret);
 564wait_on_recovery:
 565        exception->recovering = 1;
 566        return 0;
 567}
 568
 569/* This is the error handling routine for processes that are allowed
 570 * to sleep.
 571 */
 572int nfs4_handle_exception(struct nfs_server *server, int errorcode, struct nfs4_exception *exception)
 573{
 574        struct nfs_client *clp = server->nfs_client;
 575        int ret;
 576
 577        ret = nfs4_do_handle_exception(server, errorcode, exception);
 578        if (exception->delay) {
 579                ret = nfs4_delay(&exception->timeout,
 580                                exception->interruptible);
 581                goto out_retry;
 582        }
 583        if (exception->recovering) {
 584                ret = nfs4_wait_clnt_recover(clp);
 585                if (test_bit(NFS_MIG_FAILED, &server->mig_status))
 586                        return -EIO;
 587                goto out_retry;
 588        }
 589        return ret;
 590out_retry:
 591        if (ret == 0)
 592                exception->retry = 1;
 593        return ret;
 594}
 595
 596static int
 597nfs4_async_handle_exception(struct rpc_task *task, struct nfs_server *server,
 598                int errorcode, struct nfs4_exception *exception)
 599{
 600        struct nfs_client *clp = server->nfs_client;
 601        int ret;
 602
 603        ret = nfs4_do_handle_exception(server, errorcode, exception);
 604        if (exception->delay) {
 605                rpc_delay(task, nfs4_update_delay(&exception->timeout));
 606                goto out_retry;
 607        }
 608        if (exception->recovering) {
 609                rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL);
 610                if (test_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) == 0)
 611                        rpc_wake_up_queued_task(&clp->cl_rpcwaitq, task);
 612                goto out_retry;
 613        }
 614        if (test_bit(NFS_MIG_FAILED, &server->mig_status))
 615                ret = -EIO;
 616        return ret;
 617out_retry:
 618        if (ret == 0) {
 619                exception->retry = 1;
 620                /*
 621                 * For NFS4ERR_MOVED, the client transport will need to
 622                 * be recomputed after migration recovery has completed.
 623                 */
 624                if (errorcode == -NFS4ERR_MOVED)
 625                        rpc_task_release_transport(task);
 626        }
 627        return ret;
 628}
 629
 630int
 631nfs4_async_handle_error(struct rpc_task *task, struct nfs_server *server,
 632                        struct nfs4_state *state, long *timeout)
 633{
 634        struct nfs4_exception exception = {
 635                .state = state,
 636        };
 637
 638        if (task->tk_status >= 0)
 639                return 0;
 640        if (timeout)
 641                exception.timeout = *timeout;
 642        task->tk_status = nfs4_async_handle_exception(task, server,
 643                        task->tk_status,
 644                        &exception);
 645        if (exception.delay && timeout)
 646                *timeout = exception.timeout;
 647        if (exception.retry)
 648                return -EAGAIN;
 649        return 0;
 650}
 651
 652/*
 653 * Return 'true' if 'clp' is using an rpc_client that is integrity protected
 654 * or 'false' otherwise.
 655 */
 656static bool _nfs4_is_integrity_protected(struct nfs_client *clp)
 657{
 658        rpc_authflavor_t flavor = clp->cl_rpcclient->cl_auth->au_flavor;
 659        return (flavor == RPC_AUTH_GSS_KRB5I) || (flavor == RPC_AUTH_GSS_KRB5P);
 660}
 661
 662static void do_renew_lease(struct nfs_client *clp, unsigned long timestamp)
 663{
 664        spin_lock(&clp->cl_lock);
 665        if (time_before(clp->cl_last_renewal,timestamp))
 666                clp->cl_last_renewal = timestamp;
 667        spin_unlock(&clp->cl_lock);
 668}
 669
 670static void renew_lease(const struct nfs_server *server, unsigned long timestamp)
 671{
 672        struct nfs_client *clp = server->nfs_client;
 673
 674        if (!nfs4_has_session(clp))
 675                do_renew_lease(clp, timestamp);
 676}
 677
 678struct nfs4_call_sync_data {
 679        const struct nfs_server *seq_server;
 680        struct nfs4_sequence_args *seq_args;
 681        struct nfs4_sequence_res *seq_res;
 682};
 683
 684void nfs4_init_sequence(struct nfs4_sequence_args *args,
 685                        struct nfs4_sequence_res *res, int cache_reply,
 686                        int privileged)
 687{
 688        args->sa_slot = NULL;
 689        args->sa_cache_this = cache_reply;
 690        args->sa_privileged = privileged;
 691
 692        res->sr_slot = NULL;
 693}
 694
 695static void nfs40_sequence_free_slot(struct nfs4_sequence_res *res)
 696{
 697        struct nfs4_slot *slot = res->sr_slot;
 698        struct nfs4_slot_table *tbl;
 699
 700        tbl = slot->table;
 701        spin_lock(&tbl->slot_tbl_lock);
 702        if (!nfs41_wake_and_assign_slot(tbl, slot))
 703                nfs4_free_slot(tbl, slot);
 704        spin_unlock(&tbl->slot_tbl_lock);
 705
 706        res->sr_slot = NULL;
 707}
 708
 709static int nfs40_sequence_done(struct rpc_task *task,
 710                               struct nfs4_sequence_res *res)
 711{
 712        if (res->sr_slot != NULL)
 713                nfs40_sequence_free_slot(res);
 714        return 1;
 715}
 716
 717#if defined(CONFIG_NFS_V4_1)
 718
 719static void nfs41_release_slot(struct nfs4_slot *slot)
 720{
 721        struct nfs4_session *session;
 722        struct nfs4_slot_table *tbl;
 723        bool send_new_highest_used_slotid = false;
 724
 725        if (!slot)
 726                return;
 727        tbl = slot->table;
 728        session = tbl->session;
 729
 730        /* Bump the slot sequence number */
 731        if (slot->seq_done)
 732                slot->seq_nr++;
 733        slot->seq_done = 0;
 734
 735        spin_lock(&tbl->slot_tbl_lock);
 736        /* Be nice to the server: try to ensure that the last transmitted
 737         * value for highest_user_slotid <= target_highest_slotid
 738         */
 739        if (tbl->highest_used_slotid > tbl->target_highest_slotid)
 740                send_new_highest_used_slotid = true;
 741
 742        if (nfs41_wake_and_assign_slot(tbl, slot)) {
 743                send_new_highest_used_slotid = false;
 744                goto out_unlock;
 745        }
 746        nfs4_free_slot(tbl, slot);
 747
 748        if (tbl->highest_used_slotid != NFS4_NO_SLOT)
 749                send_new_highest_used_slotid = false;
 750out_unlock:
 751        spin_unlock(&tbl->slot_tbl_lock);
 752        if (send_new_highest_used_slotid)
 753                nfs41_notify_server(session->clp);
 754        if (waitqueue_active(&tbl->slot_waitq))
 755                wake_up_all(&tbl->slot_waitq);
 756}
 757
 758static void nfs41_sequence_free_slot(struct nfs4_sequence_res *res)
 759{
 760        nfs41_release_slot(res->sr_slot);
 761        res->sr_slot = NULL;
 762}
 763
 764static void nfs4_slot_sequence_record_sent(struct nfs4_slot *slot,
 765                u32 seqnr)
 766{
 767        if ((s32)(seqnr - slot->seq_nr_highest_sent) > 0)
 768                slot->seq_nr_highest_sent = seqnr;
 769}
 770static void nfs4_slot_sequence_acked(struct nfs4_slot *slot,
 771                u32 seqnr)
 772{
 773        slot->seq_nr_highest_sent = seqnr;
 774        slot->seq_nr_last_acked = seqnr;
 775}
 776
 777static int nfs41_sequence_process(struct rpc_task *task,
 778                struct nfs4_sequence_res *res)
 779{
 780        struct nfs4_session *session;
 781        struct nfs4_slot *slot = res->sr_slot;
 782        struct nfs_client *clp;
 783        int status;
 784        int ret = 1;
 785
 786        if (slot == NULL)
 787                goto out_noaction;
 788        /* don't increment the sequence number if the task wasn't sent */
 789        if (!RPC_WAS_SENT(task) || slot->seq_done)
 790                goto out;
 791
 792        session = slot->table->session;
 793
 794        trace_nfs4_sequence_done(session, res);
 795
 796        status = res->sr_status;
 797        if (task->tk_status == -NFS4ERR_DEADSESSION)
 798                status = -NFS4ERR_DEADSESSION;
 799
 800        /* Check the SEQUENCE operation status */
 801        switch (status) {
 802        case 0:
 803                /* Mark this sequence number as having been acked */
 804                nfs4_slot_sequence_acked(slot, slot->seq_nr);
 805                /* Update the slot's sequence and clientid lease timer */
 806                slot->seq_done = 1;
 807                clp = session->clp;
 808                do_renew_lease(clp, res->sr_timestamp);
 809                /* Check sequence flags */
 810                nfs41_handle_sequence_flag_errors(clp, res->sr_status_flags,
 811                                !!slot->privileged);
 812                nfs41_update_target_slotid(slot->table, slot, res);
 813                break;
 814        case 1:
 815                /*
 816                 * sr_status remains 1 if an RPC level error occurred.
 817                 * The server may or may not have processed the sequence
 818                 * operation..
 819                 */
 820                nfs4_slot_sequence_record_sent(slot, slot->seq_nr);
 821                slot->seq_done = 1;
 822                goto out;
 823        case -NFS4ERR_DELAY:
 824                /* The server detected a resend of the RPC call and
 825                 * returned NFS4ERR_DELAY as per Section 2.10.6.2
 826                 * of RFC5661.
 827                 */
 828                dprintk("%s: slot=%u seq=%u: Operation in progress\n",
 829                        __func__,
 830                        slot->slot_nr,
 831                        slot->seq_nr);
 832                nfs4_slot_sequence_acked(slot, slot->seq_nr);
 833                goto out_retry;
 834        case -NFS4ERR_RETRY_UNCACHED_REP:
 835        case -NFS4ERR_SEQ_FALSE_RETRY:
 836                /*
 837                 * The server thinks we tried to replay a request.
 838                 * Retry the call after bumping the sequence ID.
 839                 */
 840                nfs4_slot_sequence_acked(slot, slot->seq_nr);
 841                goto retry_new_seq;
 842        case -NFS4ERR_BADSLOT:
 843                /*
 844                 * The slot id we used was probably retired. Try again
 845                 * using a different slot id.
 846                 */
 847                if (slot->slot_nr < slot->table->target_highest_slotid)
 848                        goto session_recover;
 849                goto retry_nowait;
 850        case -NFS4ERR_SEQ_MISORDERED:
 851                nfs4_slot_sequence_record_sent(slot, slot->seq_nr);
 852                /*
 853                 * Were one or more calls using this slot interrupted?
 854                 * If the server never received the request, then our
 855                 * transmitted slot sequence number may be too high.
 856                 */
 857                if ((s32)(slot->seq_nr - slot->seq_nr_last_acked) > 1) {
 858                        slot->seq_nr--;
 859                        goto retry_nowait;
 860                }
 861                /*
 862                 * RFC5661:
 863                 * A retry might be sent while the original request is
 864                 * still in progress on the replier. The replier SHOULD
 865                 * deal with the issue by returning NFS4ERR_DELAY as the
 866                 * reply to SEQUENCE or CB_SEQUENCE operation, but
 867                 * implementations MAY return NFS4ERR_SEQ_MISORDERED.
 868                 *
 869                 * Restart the search after a delay.
 870                 */
 871                slot->seq_nr = slot->seq_nr_highest_sent;
 872                goto out_retry;
 873        case -NFS4ERR_BADSESSION:
 874        case -NFS4ERR_DEADSESSION:
 875        case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
 876                goto session_recover;
 877        default:
 878                /* Just update the slot sequence no. */
 879                slot->seq_done = 1;
 880        }
 881out:
 882        /* The session may be reset by one of the error handlers. */
 883        dprintk("%s: Error %d free the slot \n", __func__, res->sr_status);
 884out_noaction:
 885        return ret;
 886session_recover:
 887        nfs4_schedule_session_recovery(session, status);
 888        dprintk("%s ERROR: %d Reset session\n", __func__, status);
 889        nfs41_sequence_free_slot(res);
 890        goto out;
 891retry_new_seq:
 892        ++slot->seq_nr;
 893retry_nowait:
 894        if (rpc_restart_call_prepare(task)) {
 895                nfs41_sequence_free_slot(res);
 896                task->tk_status = 0;
 897                ret = 0;
 898        }
 899        goto out;
 900out_retry:
 901        if (!rpc_restart_call(task))
 902                goto out;
 903        rpc_delay(task, NFS4_POLL_RETRY_MAX);
 904        return 0;
 905}
 906
 907int nfs41_sequence_done(struct rpc_task *task, struct nfs4_sequence_res *res)
 908{
 909        if (!nfs41_sequence_process(task, res))
 910                return 0;
 911        if (res->sr_slot != NULL)
 912                nfs41_sequence_free_slot(res);
 913        return 1;
 914
 915}
 916EXPORT_SYMBOL_GPL(nfs41_sequence_done);
 917
 918static int nfs4_sequence_process(struct rpc_task *task, struct nfs4_sequence_res *res)
 919{
 920        if (res->sr_slot == NULL)
 921                return 1;
 922        if (res->sr_slot->table->session != NULL)
 923                return nfs41_sequence_process(task, res);
 924        return nfs40_sequence_done(task, res);
 925}
 926
 927static void nfs4_sequence_free_slot(struct nfs4_sequence_res *res)
 928{
 929        if (res->sr_slot != NULL) {
 930                if (res->sr_slot->table->session != NULL)
 931                        nfs41_sequence_free_slot(res);
 932                else
 933                        nfs40_sequence_free_slot(res);
 934        }
 935}
 936
 937int nfs4_sequence_done(struct rpc_task *task, struct nfs4_sequence_res *res)
 938{
 939        if (res->sr_slot == NULL)
 940                return 1;
 941        if (!res->sr_slot->table->session)
 942                return nfs40_sequence_done(task, res);
 943        return nfs41_sequence_done(task, res);
 944}
 945EXPORT_SYMBOL_GPL(nfs4_sequence_done);
 946
 947static void nfs41_call_sync_prepare(struct rpc_task *task, void *calldata)
 948{
 949        struct nfs4_call_sync_data *data = calldata;
 950
 951        dprintk("--> %s data->seq_server %p\n", __func__, data->seq_server);
 952
 953        nfs4_setup_sequence(data->seq_server->nfs_client,
 954                            data->seq_args, data->seq_res, task);
 955}
 956
 957static void nfs41_call_sync_done(struct rpc_task *task, void *calldata)
 958{
 959        struct nfs4_call_sync_data *data = calldata;
 960
 961        nfs41_sequence_done(task, data->seq_res);
 962}
 963
 964static const struct rpc_call_ops nfs41_call_sync_ops = {
 965        .rpc_call_prepare = nfs41_call_sync_prepare,
 966        .rpc_call_done = nfs41_call_sync_done,
 967};
 968
 969#else   /* !CONFIG_NFS_V4_1 */
 970
 971static int nfs4_sequence_process(struct rpc_task *task, struct nfs4_sequence_res *res)
 972{
 973        return nfs40_sequence_done(task, res);
 974}
 975
 976static void nfs4_sequence_free_slot(struct nfs4_sequence_res *res)
 977{
 978        if (res->sr_slot != NULL)
 979                nfs40_sequence_free_slot(res);
 980}
 981
 982int nfs4_sequence_done(struct rpc_task *task,
 983                       struct nfs4_sequence_res *res)
 984{
 985        return nfs40_sequence_done(task, res);
 986}
 987EXPORT_SYMBOL_GPL(nfs4_sequence_done);
 988
 989#endif  /* !CONFIG_NFS_V4_1 */
 990
 991static void nfs41_sequence_res_init(struct nfs4_sequence_res *res)
 992{
 993        res->sr_timestamp = jiffies;
 994        res->sr_status_flags = 0;
 995        res->sr_status = 1;
 996}
 997
 998static
 999void nfs4_sequence_attach_slot(struct nfs4_sequence_args *args,
1000                struct nfs4_sequence_res *res,
1001                struct nfs4_slot *slot)
1002{
1003        if (!slot)
1004                return;
1005        slot->privileged = args->sa_privileged ? 1 : 0;
1006        args->sa_slot = slot;
1007
1008        res->sr_slot = slot;
1009}
1010
1011int nfs4_setup_sequence(struct nfs_client *client,
1012                        struct nfs4_sequence_args *args,
1013                        struct nfs4_sequence_res *res,
1014                        struct rpc_task *task)
1015{
1016        struct nfs4_session *session = nfs4_get_session(client);
1017        struct nfs4_slot_table *tbl  = client->cl_slot_tbl;
1018        struct nfs4_slot *slot;
1019
1020        /* slot already allocated? */
1021        if (res->sr_slot != NULL)
1022                goto out_start;
1023
1024        if (session)
1025                tbl = &session->fc_slot_table;
1026
1027        spin_lock(&tbl->slot_tbl_lock);
1028        /* The state manager will wait until the slot table is empty */
1029        if (nfs4_slot_tbl_draining(tbl) && !args->sa_privileged)
1030                goto out_sleep;
1031
1032        slot = nfs4_alloc_slot(tbl);
1033        if (IS_ERR(slot)) {
1034                if (slot == ERR_PTR(-ENOMEM))
1035                        goto out_sleep_timeout;
1036                goto out_sleep;
1037        }
1038        spin_unlock(&tbl->slot_tbl_lock);
1039
1040        nfs4_sequence_attach_slot(args, res, slot);
1041
1042        trace_nfs4_setup_sequence(session, args);
1043out_start:
1044        nfs41_sequence_res_init(res);
1045        rpc_call_start(task);
1046        return 0;
1047out_sleep_timeout:
1048        /* Try again in 1/4 second */
1049        if (args->sa_privileged)
1050                rpc_sleep_on_priority_timeout(&tbl->slot_tbl_waitq, task,
1051                                jiffies + (HZ >> 2), RPC_PRIORITY_PRIVILEGED);
1052        else
1053                rpc_sleep_on_timeout(&tbl->slot_tbl_waitq, task,
1054                                NULL, jiffies + (HZ >> 2));
1055        spin_unlock(&tbl->slot_tbl_lock);
1056        return -EAGAIN;
1057out_sleep:
1058        if (args->sa_privileged)
1059                rpc_sleep_on_priority(&tbl->slot_tbl_waitq, task,
1060                                RPC_PRIORITY_PRIVILEGED);
1061        else
1062                rpc_sleep_on(&tbl->slot_tbl_waitq, task, NULL);
1063        spin_unlock(&tbl->slot_tbl_lock);
1064        return -EAGAIN;
1065}
1066EXPORT_SYMBOL_GPL(nfs4_setup_sequence);
1067
1068static void nfs40_call_sync_prepare(struct rpc_task *task, void *calldata)
1069{
1070        struct nfs4_call_sync_data *data = calldata;
1071        nfs4_setup_sequence(data->seq_server->nfs_client,
1072                                data->seq_args, data->seq_res, task);
1073}
1074
1075static void nfs40_call_sync_done(struct rpc_task *task, void *calldata)
1076{
1077        struct nfs4_call_sync_data *data = calldata;
1078        nfs4_sequence_done(task, data->seq_res);
1079}
1080
1081static const struct rpc_call_ops nfs40_call_sync_ops = {
1082        .rpc_call_prepare = nfs40_call_sync_prepare,
1083        .rpc_call_done = nfs40_call_sync_done,
1084};
1085
1086static int nfs4_call_sync_custom(struct rpc_task_setup *task_setup)
1087{
1088        int ret;
1089        struct rpc_task *task;
1090
1091        task = rpc_run_task(task_setup);
1092        if (IS_ERR(task))
1093                return PTR_ERR(task);
1094
1095        ret = task->tk_status;
1096        rpc_put_task(task);
1097        return ret;
1098}
1099
1100static int nfs4_do_call_sync(struct rpc_clnt *clnt,
1101                             struct nfs_server *server,
1102                             struct rpc_message *msg,
1103                             struct nfs4_sequence_args *args,
1104                             struct nfs4_sequence_res *res,
1105                             unsigned short task_flags)
1106{
1107        struct nfs_client *clp = server->nfs_client;
1108        struct nfs4_call_sync_data data = {
1109                .seq_server = server,
1110                .seq_args = args,
1111                .seq_res = res,
1112        };
1113        struct rpc_task_setup task_setup = {
1114                .rpc_client = clnt,
1115                .rpc_message = msg,
1116                .callback_ops = clp->cl_mvops->call_sync_ops,
1117                .callback_data = &data,
1118                .flags = task_flags,
1119        };
1120
1121        return nfs4_call_sync_custom(&task_setup);
1122}
1123
1124static int nfs4_call_sync_sequence(struct rpc_clnt *clnt,
1125                                   struct nfs_server *server,
1126                                   struct rpc_message *msg,
1127                                   struct nfs4_sequence_args *args,
1128                                   struct nfs4_sequence_res *res)
1129{
1130        return nfs4_do_call_sync(clnt, server, msg, args, res, 0);
1131}
1132
1133
1134int nfs4_call_sync(struct rpc_clnt *clnt,
1135                   struct nfs_server *server,
1136                   struct rpc_message *msg,
1137                   struct nfs4_sequence_args *args,
1138                   struct nfs4_sequence_res *res,
1139                   int cache_reply)
1140{
1141        nfs4_init_sequence(args, res, cache_reply, 0);
1142        return nfs4_call_sync_sequence(clnt, server, msg, args, res);
1143}
1144
1145static void
1146nfs4_inc_nlink_locked(struct inode *inode)
1147{
1148        NFS_I(inode)->cache_validity |= NFS_INO_INVALID_OTHER;
1149        inc_nlink(inode);
1150}
1151
1152static void
1153nfs4_dec_nlink_locked(struct inode *inode)
1154{
1155        NFS_I(inode)->cache_validity |= NFS_INO_INVALID_OTHER;
1156        drop_nlink(inode);
1157}
1158
1159static void
1160update_changeattr_locked(struct inode *dir, struct nfs4_change_info *cinfo,
1161                unsigned long timestamp, unsigned long cache_validity)
1162{
1163        struct nfs_inode *nfsi = NFS_I(dir);
1164
1165        nfsi->cache_validity |= NFS_INO_INVALID_CTIME
1166                | NFS_INO_INVALID_MTIME
1167                | NFS_INO_INVALID_DATA
1168                | cache_validity;
1169        if (cinfo->atomic && cinfo->before == inode_peek_iversion_raw(dir)) {
1170                nfsi->cache_validity &= ~NFS_INO_REVAL_PAGECACHE;
1171                nfsi->attrtimeo_timestamp = jiffies;
1172        } else {
1173                nfs_force_lookup_revalidate(dir);
1174                if (cinfo->before != inode_peek_iversion_raw(dir))
1175                        nfsi->cache_validity |= NFS_INO_INVALID_ACCESS |
1176                                NFS_INO_INVALID_ACL;
1177        }
1178        inode_set_iversion_raw(dir, cinfo->after);
1179        nfsi->read_cache_jiffies = timestamp;
1180        nfsi->attr_gencount = nfs_inc_attr_generation_counter();
1181        nfsi->cache_validity &= ~NFS_INO_INVALID_CHANGE;
1182        nfs_fscache_invalidate(dir);
1183}
1184
1185static void
1186update_changeattr(struct inode *dir, struct nfs4_change_info *cinfo,
1187                unsigned long timestamp, unsigned long cache_validity)
1188{
1189        spin_lock(&dir->i_lock);
1190        update_changeattr_locked(dir, cinfo, timestamp, cache_validity);
1191        spin_unlock(&dir->i_lock);
1192}
1193
1194struct nfs4_open_createattrs {
1195        struct nfs4_label *label;
1196        struct iattr *sattr;
1197        const __u32 verf[2];
1198};
1199
1200static bool nfs4_clear_cap_atomic_open_v1(struct nfs_server *server,
1201                int err, struct nfs4_exception *exception)
1202{
1203        if (err != -EINVAL)
1204                return false;
1205        if (!(server->caps & NFS_CAP_ATOMIC_OPEN_V1))
1206                return false;
1207        server->caps &= ~NFS_CAP_ATOMIC_OPEN_V1;
1208        exception->retry = 1;
1209        return true;
1210}
1211
1212static fmode_t _nfs4_ctx_to_accessmode(const struct nfs_open_context *ctx)
1213{
1214         return ctx->mode & (FMODE_READ|FMODE_WRITE|FMODE_EXEC);
1215}
1216
1217static fmode_t _nfs4_ctx_to_openmode(const struct nfs_open_context *ctx)
1218{
1219        fmode_t ret = ctx->mode & (FMODE_READ|FMODE_WRITE);
1220
1221        return (ctx->mode & FMODE_EXEC) ? FMODE_READ | ret : ret;
1222}
1223
1224static u32
1225nfs4_map_atomic_open_share(struct nfs_server *server,
1226                fmode_t fmode, int openflags)
1227{
1228        u32 res = 0;
1229
1230        switch (fmode & (FMODE_READ | FMODE_WRITE)) {
1231        case FMODE_READ:
1232                res = NFS4_SHARE_ACCESS_READ;
1233                break;
1234        case FMODE_WRITE:
1235                res = NFS4_SHARE_ACCESS_WRITE;
1236                break;
1237        case FMODE_READ|FMODE_WRITE:
1238                res = NFS4_SHARE_ACCESS_BOTH;
1239        }
1240        if (!(server->caps & NFS_CAP_ATOMIC_OPEN_V1))
1241                goto out;
1242        /* Want no delegation if we're using O_DIRECT */
1243        if (openflags & O_DIRECT)
1244                res |= NFS4_SHARE_WANT_NO_DELEG;
1245out:
1246        return res;
1247}
1248
1249static enum open_claim_type4
1250nfs4_map_atomic_open_claim(struct nfs_server *server,
1251                enum open_claim_type4 claim)
1252{
1253        if (server->caps & NFS_CAP_ATOMIC_OPEN_V1)
1254                return claim;
1255        switch (claim) {
1256        default:
1257                return claim;
1258        case NFS4_OPEN_CLAIM_FH:
1259                return NFS4_OPEN_CLAIM_NULL;
1260        case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
1261                return NFS4_OPEN_CLAIM_DELEGATE_CUR;
1262        case NFS4_OPEN_CLAIM_DELEG_PREV_FH:
1263                return NFS4_OPEN_CLAIM_DELEGATE_PREV;
1264        }
1265}
1266
1267static void nfs4_init_opendata_res(struct nfs4_opendata *p)
1268{
1269        p->o_res.f_attr = &p->f_attr;
1270        p->o_res.f_label = p->f_label;
1271        p->o_res.seqid = p->o_arg.seqid;
1272        p->c_res.seqid = p->c_arg.seqid;
1273        p->o_res.server = p->o_arg.server;
1274        p->o_res.access_request = p->o_arg.access;
1275        nfs_fattr_init(&p->f_attr);
1276        nfs_fattr_init_names(&p->f_attr, &p->owner_name, &p->group_name);
1277}
1278
1279static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,
1280                struct nfs4_state_owner *sp, fmode_t fmode, int flags,
1281                const struct nfs4_open_createattrs *c,
1282                enum open_claim_type4 claim,
1283                gfp_t gfp_mask)
1284{
1285        struct dentry *parent = dget_parent(dentry);
1286        struct inode *dir = d_inode(parent);
1287        struct nfs_server *server = NFS_SERVER(dir);
1288        struct nfs_seqid *(*alloc_seqid)(struct nfs_seqid_counter *, gfp_t);
1289        struct nfs4_label *label = (c != NULL) ? c->label : NULL;
1290        struct nfs4_opendata *p;
1291
1292        p = kzalloc(sizeof(*p), gfp_mask);
1293        if (p == NULL)
1294                goto err;
1295
1296        p->f_label = nfs4_label_alloc(server, gfp_mask);
1297        if (IS_ERR(p->f_label))
1298                goto err_free_p;
1299
1300        p->a_label = nfs4_label_alloc(server, gfp_mask);
1301        if (IS_ERR(p->a_label))
1302                goto err_free_f;
1303
1304        alloc_seqid = server->nfs_client->cl_mvops->alloc_seqid;
1305        p->o_arg.seqid = alloc_seqid(&sp->so_seqid, gfp_mask);
1306        if (IS_ERR(p->o_arg.seqid))
1307                goto err_free_label;
1308        nfs_sb_active(dentry->d_sb);
1309        p->dentry = dget(dentry);
1310        p->dir = parent;
1311        p->owner = sp;
1312        atomic_inc(&sp->so_count);
1313        p->o_arg.open_flags = flags;
1314        p->o_arg.fmode = fmode & (FMODE_READ|FMODE_WRITE);
1315        p->o_arg.claim = nfs4_map_atomic_open_claim(server, claim);
1316        p->o_arg.share_access = nfs4_map_atomic_open_share(server,
1317                        fmode, flags);
1318        if (flags & O_CREAT) {
1319                p->o_arg.umask = current_umask();
1320                p->o_arg.label = nfs4_label_copy(p->a_label, label);
1321                if (c->sattr != NULL && c->sattr->ia_valid != 0) {
1322                        p->o_arg.u.attrs = &p->attrs;
1323                        memcpy(&p->attrs, c->sattr, sizeof(p->attrs));
1324
1325                        memcpy(p->o_arg.u.verifier.data, c->verf,
1326                                        sizeof(p->o_arg.u.verifier.data));
1327                }
1328        }
1329        /* don't put an ACCESS op in OPEN compound if O_EXCL, because ACCESS
1330         * will return permission denied for all bits until close */
1331        if (!(flags & O_EXCL)) {
1332                /* ask server to check for all possible rights as results
1333                 * are cached */
1334                switch (p->o_arg.claim) {
1335                default:
1336                        break;
1337                case NFS4_OPEN_CLAIM_NULL:
1338                case NFS4_OPEN_CLAIM_FH:
1339                        p->o_arg.access = NFS4_ACCESS_READ |
1340                                NFS4_ACCESS_MODIFY |
1341                                NFS4_ACCESS_EXTEND |
1342                                NFS4_ACCESS_EXECUTE;
1343                }
1344        }
1345        p->o_arg.clientid = server->nfs_client->cl_clientid;
1346        p->o_arg.id.create_time = ktime_to_ns(sp->so_seqid.create_time);
1347        p->o_arg.id.uniquifier = sp->so_seqid.owner_id;
1348        p->o_arg.name = &dentry->d_name;
1349        p->o_arg.server = server;
1350        p->o_arg.bitmask = nfs4_bitmask(server, label);
1351        p->o_arg.open_bitmap = &nfs4_fattr_bitmap[0];
1352        switch (p->o_arg.claim) {
1353        case NFS4_OPEN_CLAIM_NULL:
1354        case NFS4_OPEN_CLAIM_DELEGATE_CUR:
1355        case NFS4_OPEN_CLAIM_DELEGATE_PREV:
1356                p->o_arg.fh = NFS_FH(dir);
1357                break;
1358        case NFS4_OPEN_CLAIM_PREVIOUS:
1359        case NFS4_OPEN_CLAIM_FH:
1360        case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
1361        case NFS4_OPEN_CLAIM_DELEG_PREV_FH:
1362                p->o_arg.fh = NFS_FH(d_inode(dentry));
1363        }
1364        p->c_arg.fh = &p->o_res.fh;
1365        p->c_arg.stateid = &p->o_res.stateid;
1366        p->c_arg.seqid = p->o_arg.seqid;
1367        nfs4_init_opendata_res(p);
1368        kref_init(&p->kref);
1369        return p;
1370
1371err_free_label:
1372        nfs4_label_free(p->a_label);
1373err_free_f:
1374        nfs4_label_free(p->f_label);
1375err_free_p:
1376        kfree(p);
1377err:
1378        dput(parent);
1379        return NULL;
1380}
1381
1382static void nfs4_opendata_free(struct kref *kref)
1383{
1384        struct nfs4_opendata *p = container_of(kref,
1385                        struct nfs4_opendata, kref);
1386        struct super_block *sb = p->dentry->d_sb;
1387
1388        nfs4_lgopen_release(p->lgp);
1389        nfs_free_seqid(p->o_arg.seqid);
1390        nfs4_sequence_free_slot(&p->o_res.seq_res);
1391        if (p->state != NULL)
1392                nfs4_put_open_state(p->state);
1393        nfs4_put_state_owner(p->owner);
1394
1395        nfs4_label_free(p->a_label);
1396        nfs4_label_free(p->f_label);
1397
1398        dput(p->dir);
1399        dput(p->dentry);
1400        nfs_sb_deactive(sb);
1401        nfs_fattr_free_names(&p->f_attr);
1402        kfree(p->f_attr.mdsthreshold);
1403        kfree(p);
1404}
1405
1406static void nfs4_opendata_put(struct nfs4_opendata *p)
1407{
1408        if (p != NULL)
1409                kref_put(&p->kref, nfs4_opendata_free);
1410}
1411
1412static bool nfs4_mode_match_open_stateid(struct nfs4_state *state,
1413                fmode_t fmode)
1414{
1415        switch(fmode & (FMODE_READ|FMODE_WRITE)) {
1416        case FMODE_READ|FMODE_WRITE:
1417                return state->n_rdwr != 0;
1418        case FMODE_WRITE:
1419                return state->n_wronly != 0;
1420        case FMODE_READ:
1421                return state->n_rdonly != 0;
1422        }
1423        WARN_ON_ONCE(1);
1424        return false;
1425}
1426
1427static int can_open_cached(struct nfs4_state *state, fmode_t mode,
1428                int open_mode, enum open_claim_type4 claim)
1429{
1430        int ret = 0;
1431
1432        if (open_mode & (O_EXCL|O_TRUNC))
1433                goto out;
1434        switch (claim) {
1435        case NFS4_OPEN_CLAIM_NULL:
1436        case NFS4_OPEN_CLAIM_FH:
1437                goto out;
1438        default:
1439                break;
1440        }
1441        switch (mode & (FMODE_READ|FMODE_WRITE)) {
1442                case FMODE_READ:
1443                        ret |= test_bit(NFS_O_RDONLY_STATE, &state->flags) != 0
1444                                && state->n_rdonly != 0;
1445                        break;
1446                case FMODE_WRITE:
1447                        ret |= test_bit(NFS_O_WRONLY_STATE, &state->flags) != 0
1448                                && state->n_wronly != 0;
1449                        break;
1450                case FMODE_READ|FMODE_WRITE:
1451                        ret |= test_bit(NFS_O_RDWR_STATE, &state->flags) != 0
1452                                && state->n_rdwr != 0;
1453        }
1454out:
1455        return ret;
1456}
1457
1458static int can_open_delegated(struct nfs_delegation *delegation, fmode_t fmode,
1459                enum open_claim_type4 claim)
1460{
1461        if (delegation == NULL)
1462                return 0;
1463        if ((delegation->type & fmode) != fmode)
1464                return 0;
1465        switch (claim) {
1466        case NFS4_OPEN_CLAIM_NULL:
1467        case NFS4_OPEN_CLAIM_FH:
1468                break;
1469        case NFS4_OPEN_CLAIM_PREVIOUS:
1470                if (!test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags))
1471                        break;
1472                /* Fall through */
1473        default:
1474                return 0;
1475        }
1476        nfs_mark_delegation_referenced(delegation);
1477        return 1;
1478}
1479
1480static void update_open_stateflags(struct nfs4_state *state, fmode_t fmode)
1481{
1482        switch (fmode) {
1483                case FMODE_WRITE:
1484                        state->n_wronly++;
1485                        break;
1486                case FMODE_READ:
1487                        state->n_rdonly++;
1488                        break;
1489                case FMODE_READ|FMODE_WRITE:
1490                        state->n_rdwr++;
1491        }
1492        nfs4_state_set_mode_locked(state, state->state | fmode);
1493}
1494
1495#ifdef CONFIG_NFS_V4_1
1496static bool nfs_open_stateid_recover_openmode(struct nfs4_state *state)
1497{
1498        if (state->n_rdonly && !test_bit(NFS_O_RDONLY_STATE, &state->flags))
1499                return true;
1500        if (state->n_wronly && !test_bit(NFS_O_WRONLY_STATE, &state->flags))
1501                return true;
1502        if (state->n_rdwr && !test_bit(NFS_O_RDWR_STATE, &state->flags))
1503                return true;
1504        return false;
1505}
1506#endif /* CONFIG_NFS_V4_1 */
1507
1508static void nfs_state_log_update_open_stateid(struct nfs4_state *state)
1509{
1510        if (test_and_clear_bit(NFS_STATE_CHANGE_WAIT, &state->flags))
1511                wake_up_all(&state->waitq);
1512}
1513
1514static void nfs_state_log_out_of_order_open_stateid(struct nfs4_state *state,
1515                const nfs4_stateid *stateid)
1516{
1517        u32 state_seqid = be32_to_cpu(state->open_stateid.seqid);
1518        u32 stateid_seqid = be32_to_cpu(stateid->seqid);
1519
1520        if (stateid_seqid == state_seqid + 1U ||
1521            (stateid_seqid == 1U && state_seqid == 0xffffffffU))
1522                nfs_state_log_update_open_stateid(state);
1523        else
1524                set_bit(NFS_STATE_CHANGE_WAIT, &state->flags);
1525}
1526
1527static void nfs_test_and_clear_all_open_stateid(struct nfs4_state *state)
1528{
1529        struct nfs_client *clp = state->owner->so_server->nfs_client;
1530        bool need_recover = false;
1531
1532        if (test_and_clear_bit(NFS_O_RDONLY_STATE, &state->flags) && state->n_rdonly)
1533                need_recover = true;
1534        if (test_and_clear_bit(NFS_O_WRONLY_STATE, &state->flags) && state->n_wronly)
1535                need_recover = true;
1536        if (test_and_clear_bit(NFS_O_RDWR_STATE, &state->flags) && state->n_rdwr)
1537                need_recover = true;
1538        if (need_recover)
1539                nfs4_state_mark_reclaim_nograce(clp, state);
1540}
1541
1542/*
1543 * Check for whether or not the caller may update the open stateid
1544 * to the value passed in by stateid.
1545 *
1546 * Note: This function relies heavily on the server implementing
1547 * RFC7530 Section 9.1.4.2, and RFC5661 Section 8.2.2
1548 * correctly.
1549 * i.e. The stateid seqids have to be initialised to 1, and
1550 * are then incremented on every state transition.
1551 */
1552static bool nfs_need_update_open_stateid(struct nfs4_state *state,
1553                const nfs4_stateid *stateid)
1554{
1555        if (test_bit(NFS_OPEN_STATE, &state->flags) == 0 ||
1556            !nfs4_stateid_match_other(stateid, &state->open_stateid)) {
1557                if (stateid->seqid == cpu_to_be32(1))
1558                        nfs_state_log_update_open_stateid(state);
1559                else
1560                        set_bit(NFS_STATE_CHANGE_WAIT, &state->flags);
1561                return true;
1562        }
1563
1564        if (nfs4_stateid_is_newer(stateid, &state->open_stateid)) {
1565                nfs_state_log_out_of_order_open_stateid(state, stateid);
1566                return true;
1567        }
1568        return false;
1569}
1570
1571static void nfs_resync_open_stateid_locked(struct nfs4_state *state)
1572{
1573        if (!(state->n_wronly || state->n_rdonly || state->n_rdwr))
1574                return;
1575        if (state->n_wronly)
1576                set_bit(NFS_O_WRONLY_STATE, &state->flags);
1577        if (state->n_rdonly)
1578                set_bit(NFS_O_RDONLY_STATE, &state->flags);
1579        if (state->n_rdwr)
1580                set_bit(NFS_O_RDWR_STATE, &state->flags);
1581        set_bit(NFS_OPEN_STATE, &state->flags);
1582}
1583
1584static void nfs_clear_open_stateid_locked(struct nfs4_state *state,
1585                nfs4_stateid *stateid, fmode_t fmode)
1586{
1587        clear_bit(NFS_O_RDWR_STATE, &state->flags);
1588        switch (fmode & (FMODE_READ|FMODE_WRITE)) {
1589        case FMODE_WRITE:
1590                clear_bit(NFS_O_RDONLY_STATE, &state->flags);
1591                break;
1592        case FMODE_READ:
1593                clear_bit(NFS_O_WRONLY_STATE, &state->flags);
1594                break;
1595        case 0:
1596                clear_bit(NFS_O_RDONLY_STATE, &state->flags);
1597                clear_bit(NFS_O_WRONLY_STATE, &state->flags);
1598                clear_bit(NFS_OPEN_STATE, &state->flags);
1599        }
1600        if (stateid == NULL)
1601                return;
1602        /* Handle OPEN+OPEN_DOWNGRADE races */
1603        if (nfs4_stateid_match_other(stateid, &state->open_stateid) &&
1604            !nfs4_stateid_is_newer(stateid, &state->open_stateid)) {
1605                nfs_resync_open_stateid_locked(state);
1606                goto out;
1607        }
1608        if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0)
1609                nfs4_stateid_copy(&state->stateid, stateid);
1610        nfs4_stateid_copy(&state->open_stateid, stateid);
1611        trace_nfs4_open_stateid_update(state->inode, stateid, 0);
1612out:
1613        nfs_state_log_update_open_stateid(state);
1614}
1615
1616static void nfs_clear_open_stateid(struct nfs4_state *state,
1617        nfs4_stateid *arg_stateid,
1618        nfs4_stateid *stateid, fmode_t fmode)
1619{
1620        write_seqlock(&state->seqlock);
1621        /* Ignore, if the CLOSE argment doesn't match the current stateid */
1622        if (nfs4_state_match_open_stateid_other(state, arg_stateid))
1623                nfs_clear_open_stateid_locked(state, stateid, fmode);
1624        write_sequnlock(&state->seqlock);
1625        if (test_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags))
1626                nfs4_schedule_state_manager(state->owner->so_server->nfs_client);
1627}
1628
1629static void nfs_set_open_stateid_locked(struct nfs4_state *state,
1630                const nfs4_stateid *stateid, nfs4_stateid *freeme)
1631        __must_hold(&state->owner->so_lock)
1632        __must_hold(&state->seqlock)
1633        __must_hold(RCU)
1634
1635{
1636        DEFINE_WAIT(wait);
1637        int status = 0;
1638        for (;;) {
1639
1640                if (!nfs_need_update_open_stateid(state, stateid))
1641                        return;
1642                if (!test_bit(NFS_STATE_CHANGE_WAIT, &state->flags))
1643                        break;
1644                if (status)
1645                        break;
1646                /* Rely on seqids for serialisation with NFSv4.0 */
1647                if (!nfs4_has_session(NFS_SERVER(state->inode)->nfs_client))
1648                        break;
1649
1650                prepare_to_wait(&state->waitq, &wait, TASK_KILLABLE);
1651                /*
1652                 * Ensure we process the state changes in the same order
1653                 * in which the server processed them by delaying the
1654                 * update of the stateid until we are in sequence.
1655                 */
1656                write_sequnlock(&state->seqlock);
1657                spin_unlock(&state->owner->so_lock);
1658                rcu_read_unlock();
1659                trace_nfs4_open_stateid_update_wait(state->inode, stateid, 0);
1660                if (!signal_pending(current)) {
1661                        if (schedule_timeout(5*HZ) == 0)
1662                                status = -EAGAIN;
1663                        else
1664                                status = 0;
1665                } else
1666                        status = -EINTR;
1667                finish_wait(&state->waitq, &wait);
1668                rcu_read_lock();
1669                spin_lock(&state->owner->so_lock);
1670                write_seqlock(&state->seqlock);
1671        }
1672
1673        if (test_bit(NFS_OPEN_STATE, &state->flags) &&
1674            !nfs4_stateid_match_other(stateid, &state->open_stateid)) {
1675                nfs4_stateid_copy(freeme, &state->open_stateid);
1676                nfs_test_and_clear_all_open_stateid(state);
1677        }
1678
1679        if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0)
1680                nfs4_stateid_copy(&state->stateid, stateid);
1681        nfs4_stateid_copy(&state->open_stateid, stateid);
1682        trace_nfs4_open_stateid_update(state->inode, stateid, status);
1683        nfs_state_log_update_open_stateid(state);
1684}
1685
1686static void nfs_state_set_open_stateid(struct nfs4_state *state,
1687                const nfs4_stateid *open_stateid,
1688                fmode_t fmode,
1689                nfs4_stateid *freeme)
1690{
1691        /*
1692         * Protect the call to nfs4_state_set_mode_locked and
1693         * serialise the stateid update
1694         */
1695        write_seqlock(&state->seqlock);
1696        nfs_set_open_stateid_locked(state, open_stateid, freeme);
1697        switch (fmode) {
1698        case FMODE_READ:
1699                set_bit(NFS_O_RDONLY_STATE, &state->flags);
1700                break;
1701        case FMODE_WRITE:
1702                set_bit(NFS_O_WRONLY_STATE, &state->flags);
1703                break;
1704        case FMODE_READ|FMODE_WRITE:
1705                set_bit(NFS_O_RDWR_STATE, &state->flags);
1706        }
1707        set_bit(NFS_OPEN_STATE, &state->flags);
1708        write_sequnlock(&state->seqlock);
1709}
1710
1711static void nfs_state_clear_open_state_flags(struct nfs4_state *state)
1712{
1713        clear_bit(NFS_O_RDWR_STATE, &state->flags);
1714        clear_bit(NFS_O_WRONLY_STATE, &state->flags);
1715        clear_bit(NFS_O_RDONLY_STATE, &state->flags);
1716        clear_bit(NFS_OPEN_STATE, &state->flags);
1717}
1718
1719static void nfs_state_set_delegation(struct nfs4_state *state,
1720                const nfs4_stateid *deleg_stateid,
1721                fmode_t fmode)
1722{
1723        /*
1724         * Protect the call to nfs4_state_set_mode_locked and
1725         * serialise the stateid update
1726         */
1727        write_seqlock(&state->seqlock);
1728        nfs4_stateid_copy(&state->stateid, deleg_stateid);
1729        set_bit(NFS_DELEGATED_STATE, &state->flags);
1730        write_sequnlock(&state->seqlock);
1731}
1732
1733static void nfs_state_clear_delegation(struct nfs4_state *state)
1734{
1735        write_seqlock(&state->seqlock);
1736        nfs4_stateid_copy(&state->stateid, &state->open_stateid);
1737        clear_bit(NFS_DELEGATED_STATE, &state->flags);
1738        write_sequnlock(&state->seqlock);
1739}
1740
1741int update_open_stateid(struct nfs4_state *state,
1742                const nfs4_stateid *open_stateid,
1743                const nfs4_stateid *delegation,
1744                fmode_t fmode)
1745{
1746        struct nfs_server *server = NFS_SERVER(state->inode);
1747        struct nfs_client *clp = server->nfs_client;
1748        struct nfs_inode *nfsi = NFS_I(state->inode);
1749        struct nfs_delegation *deleg_cur;
1750        nfs4_stateid freeme = { };
1751        int ret = 0;
1752
1753        fmode &= (FMODE_READ|FMODE_WRITE);
1754
1755        rcu_read_lock();
1756        spin_lock(&state->owner->so_lock);
1757        if (open_stateid != NULL) {
1758                nfs_state_set_open_stateid(state, open_stateid, fmode, &freeme);
1759                ret = 1;
1760        }
1761
1762        deleg_cur = nfs4_get_valid_delegation(state->inode);
1763        if (deleg_cur == NULL)
1764                goto no_delegation;
1765
1766        spin_lock(&deleg_cur->lock);
1767        if (rcu_dereference(nfsi->delegation) != deleg_cur ||
1768           test_bit(NFS_DELEGATION_RETURNING, &deleg_cur->flags) ||
1769            (deleg_cur->type & fmode) != fmode)
1770                goto no_delegation_unlock;
1771
1772        if (delegation == NULL)
1773                delegation = &deleg_cur->stateid;
1774        else if (!nfs4_stateid_match_other(&deleg_cur->stateid, delegation))
1775                goto no_delegation_unlock;
1776
1777        nfs_mark_delegation_referenced(deleg_cur);
1778        nfs_state_set_delegation(state, &deleg_cur->stateid, fmode);
1779        ret = 1;
1780no_delegation_unlock:
1781        spin_unlock(&deleg_cur->lock);
1782no_delegation:
1783        if (ret)
1784                update_open_stateflags(state, fmode);
1785        spin_unlock(&state->owner->so_lock);
1786        rcu_read_unlock();
1787
1788        if (test_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags))
1789                nfs4_schedule_state_manager(clp);
1790        if (freeme.type != 0)
1791                nfs4_test_and_free_stateid(server, &freeme,
1792                                state->owner->so_cred);
1793
1794        return ret;
1795}
1796
1797static bool nfs4_update_lock_stateid(struct nfs4_lock_state *lsp,
1798                const nfs4_stateid *stateid)
1799{
1800        struct nfs4_state *state = lsp->ls_state;
1801        bool ret = false;
1802
1803        spin_lock(&state->state_lock);
1804        if (!nfs4_stateid_match_other(stateid, &lsp->ls_stateid))
1805                goto out_noupdate;
1806        if (!nfs4_stateid_is_newer(stateid, &lsp->ls_stateid))
1807                goto out_noupdate;
1808        nfs4_stateid_copy(&lsp->ls_stateid, stateid);
1809        ret = true;
1810out_noupdate:
1811        spin_unlock(&state->state_lock);
1812        return ret;
1813}
1814
1815static void nfs4_return_incompatible_delegation(struct inode *inode, fmode_t fmode)
1816{
1817        struct nfs_delegation *delegation;
1818
1819        fmode &= FMODE_READ|FMODE_WRITE;
1820        rcu_read_lock();
1821        delegation = nfs4_get_valid_delegation(inode);
1822        if (delegation == NULL || (delegation->type & fmode) == fmode) {
1823                rcu_read_unlock();
1824                return;
1825        }
1826        rcu_read_unlock();
1827        nfs4_inode_return_delegation(inode);
1828}
1829
1830static struct nfs4_state *nfs4_try_open_cached(struct nfs4_opendata *opendata)
1831{
1832        struct nfs4_state *state = opendata->state;
1833        struct nfs_delegation *delegation;
1834        int open_mode = opendata->o_arg.open_flags;
1835        fmode_t fmode = opendata->o_arg.fmode;
1836        enum open_claim_type4 claim = opendata->o_arg.claim;
1837        nfs4_stateid stateid;
1838        int ret = -EAGAIN;
1839
1840        for (;;) {
1841                spin_lock(&state->owner->so_lock);
1842                if (can_open_cached(state, fmode, open_mode, claim)) {
1843                        update_open_stateflags(state, fmode);
1844                        spin_unlock(&state->owner->so_lock);
1845                        goto out_return_state;
1846                }
1847                spin_unlock(&state->owner->so_lock);
1848                rcu_read_lock();
1849                delegation = nfs4_get_valid_delegation(state->inode);
1850                if (!can_open_delegated(delegation, fmode, claim)) {
1851                        rcu_read_unlock();
1852                        break;
1853                }
1854                /* Save the delegation */
1855                nfs4_stateid_copy(&stateid, &delegation->stateid);
1856                rcu_read_unlock();
1857                nfs_release_seqid(opendata->o_arg.seqid);
1858                if (!opendata->is_recover) {
1859                        ret = nfs_may_open(state->inode, state->owner->so_cred, open_mode);
1860                        if (ret != 0)
1861                                goto out;
1862                }
1863                ret = -EAGAIN;
1864
1865                /* Try to update the stateid using the delegation */
1866                if (update_open_stateid(state, NULL, &stateid, fmode))
1867                        goto out_return_state;
1868        }
1869out:
1870        return ERR_PTR(ret);
1871out_return_state:
1872        refcount_inc(&state->count);
1873        return state;
1874}
1875
1876static void
1877nfs4_opendata_check_deleg(struct nfs4_opendata *data, struct nfs4_state *state)
1878{
1879        struct nfs_client *clp = NFS_SERVER(state->inode)->nfs_client;
1880        struct nfs_delegation *delegation;
1881        int delegation_flags = 0;
1882
1883        rcu_read_lock();
1884        delegation = rcu_dereference(NFS_I(state->inode)->delegation);
1885        if (delegation)
1886                delegation_flags = delegation->flags;
1887        rcu_read_unlock();
1888        switch (data->o_arg.claim) {
1889        default:
1890                break;
1891        case NFS4_OPEN_CLAIM_DELEGATE_CUR:
1892        case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
1893                pr_err_ratelimited("NFS: Broken NFSv4 server %s is "
1894                                   "returning a delegation for "
1895                                   "OPEN(CLAIM_DELEGATE_CUR)\n",
1896                                   clp->cl_hostname);
1897                return;
1898        }
1899        if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0)
1900                nfs_inode_set_delegation(state->inode,
1901                                data->owner->so_cred,
1902                                data->o_res.delegation_type,
1903                                &data->o_res.delegation,
1904                                data->o_res.pagemod_limit);
1905        else
1906                nfs_inode_reclaim_delegation(state->inode,
1907                                data->owner->so_cred,
1908                                data->o_res.delegation_type,
1909                                &data->o_res.delegation,
1910                                data->o_res.pagemod_limit);
1911
1912        if (data->o_res.do_recall)
1913                nfs_async_inode_return_delegation(state->inode,
1914                                                  &data->o_res.delegation);
1915}
1916
1917/*
1918 * Check the inode attributes against the CLAIM_PREVIOUS returned attributes
1919 * and update the nfs4_state.
1920 */
1921static struct nfs4_state *
1922_nfs4_opendata_reclaim_to_nfs4_state(struct nfs4_opendata *data)
1923{
1924        struct inode *inode = data->state->inode;
1925        struct nfs4_state *state = data->state;
1926        int ret;
1927
1928        if (!data->rpc_done) {
1929                if (data->rpc_status)
1930                        return ERR_PTR(data->rpc_status);
1931                /* cached opens have already been processed */
1932                goto update;
1933        }
1934
1935        ret = nfs_refresh_inode(inode, &data->f_attr);
1936        if (ret)
1937                return ERR_PTR(ret);
1938
1939        if (data->o_res.delegation_type != 0)
1940                nfs4_opendata_check_deleg(data, state);
1941update:
1942        if (!update_open_stateid(state, &data->o_res.stateid,
1943                                NULL, data->o_arg.fmode))
1944                return ERR_PTR(-EAGAIN);
1945        refcount_inc(&state->count);
1946
1947        return state;
1948}
1949
1950static struct inode *
1951nfs4_opendata_get_inode(struct nfs4_opendata *data)
1952{
1953        struct inode *inode;
1954
1955        switch (data->o_arg.claim) {
1956        case NFS4_OPEN_CLAIM_NULL:
1957        case NFS4_OPEN_CLAIM_DELEGATE_CUR:
1958        case NFS4_OPEN_CLAIM_DELEGATE_PREV:
1959                if (!(data->f_attr.valid & NFS_ATTR_FATTR))
1960                        return ERR_PTR(-EAGAIN);
1961                inode = nfs_fhget(data->dir->d_sb, &data->o_res.fh,
1962                                &data->f_attr, data->f_label);
1963                break;
1964        default:
1965                inode = d_inode(data->dentry);
1966                ihold(inode);
1967                nfs_refresh_inode(inode, &data->f_attr);
1968        }
1969        return inode;
1970}
1971
1972static struct nfs4_state *
1973nfs4_opendata_find_nfs4_state(struct nfs4_opendata *data)
1974{
1975        struct nfs4_state *state;
1976        struct inode *inode;
1977
1978        inode = nfs4_opendata_get_inode(data);
1979        if (IS_ERR(inode))
1980                return ERR_CAST(inode);
1981        if (data->state != NULL && data->state->inode == inode) {
1982                state = data->state;
1983                refcount_inc(&state->count);
1984        } else
1985                state = nfs4_get_open_state(inode, data->owner);
1986        iput(inode);
1987        if (state == NULL)
1988                state = ERR_PTR(-ENOMEM);
1989        return state;
1990}
1991
1992static struct nfs4_state *
1993_nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data)
1994{
1995        struct nfs4_state *state;
1996
1997        if (!data->rpc_done) {
1998                state = nfs4_try_open_cached(data);
1999                trace_nfs4_cached_open(data->state);
2000                goto out;
2001        }
2002
2003        state = nfs4_opendata_find_nfs4_state(data);
2004        if (IS_ERR(state))
2005                goto out;
2006
2007        if (data->o_res.delegation_type != 0)
2008                nfs4_opendata_check_deleg(data, state);
2009        if (!update_open_stateid(state, &data->o_res.stateid,
2010                                NULL, data->o_arg.fmode)) {
2011                nfs4_put_open_state(state);
2012                state = ERR_PTR(-EAGAIN);
2013        }
2014out:
2015        nfs_release_seqid(data->o_arg.seqid);
2016        return state;
2017}
2018
2019static struct nfs4_state *
2020nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data)
2021{
2022        struct nfs4_state *ret;
2023
2024        if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS)
2025                ret =_nfs4_opendata_reclaim_to_nfs4_state(data);
2026        else
2027                ret = _nfs4_opendata_to_nfs4_state(data);
2028        nfs4_sequence_free_slot(&data->o_res.seq_res);
2029        return ret;
2030}
2031
2032static struct nfs_open_context *
2033nfs4_state_find_open_context_mode(struct nfs4_state *state, fmode_t mode)
2034{
2035        struct nfs_inode *nfsi = NFS_I(state->inode);
2036        struct nfs_open_context *ctx;
2037
2038        rcu_read_lock();
2039        list_for_each_entry_rcu(ctx, &nfsi->open_files, list) {
2040                if (ctx->state != state)
2041                        continue;
2042                if ((ctx->mode & mode) != mode)
2043                        continue;
2044                if (!get_nfs_open_context(ctx))
2045                        continue;
2046                rcu_read_unlock();
2047                return ctx;
2048        }
2049        rcu_read_unlock();
2050        return ERR_PTR(-ENOENT);
2051}
2052
2053static struct nfs_open_context *
2054nfs4_state_find_open_context(struct nfs4_state *state)
2055{
2056        struct nfs_open_context *ctx;
2057
2058        ctx = nfs4_state_find_open_context_mode(state, FMODE_READ|FMODE_WRITE);
2059        if (!IS_ERR(ctx))
2060                return ctx;
2061        ctx = nfs4_state_find_open_context_mode(state, FMODE_WRITE);
2062        if (!IS_ERR(ctx))
2063                return ctx;
2064        return nfs4_state_find_open_context_mode(state, FMODE_READ);
2065}
2066
2067static struct nfs4_opendata *nfs4_open_recoverdata_alloc(struct nfs_open_context *ctx,
2068                struct nfs4_state *state, enum open_claim_type4 claim)
2069{
2070        struct nfs4_opendata *opendata;
2071
2072        opendata = nfs4_opendata_alloc(ctx->dentry, state->owner, 0, 0,
2073                        NULL, claim, GFP_NOFS);
2074        if (opendata == NULL)
2075                return ERR_PTR(-ENOMEM);
2076        opendata->state = state;
2077        refcount_inc(&state->count);
2078        return opendata;
2079}
2080
2081static int nfs4_open_recover_helper(struct nfs4_opendata *opendata,
2082                fmode_t fmode)
2083{
2084        struct nfs4_state *newstate;
2085        int ret;
2086
2087        if (!nfs4_mode_match_open_stateid(opendata->state, fmode))
2088                return 0;
2089        opendata->o_arg.open_flags = 0;
2090        opendata->o_arg.fmode = fmode;
2091        opendata->o_arg.share_access = nfs4_map_atomic_open_share(
2092                        NFS_SB(opendata->dentry->d_sb),
2093                        fmode, 0);
2094        memset(&opendata->o_res, 0, sizeof(opendata->o_res));
2095        memset(&opendata->c_res, 0, sizeof(opendata->c_res));
2096        nfs4_init_opendata_res(opendata);
2097        ret = _nfs4_recover_proc_open(opendata);
2098        if (ret != 0)
2099                return ret; 
2100        newstate = nfs4_opendata_to_nfs4_state(opendata);
2101        if (IS_ERR(newstate))
2102                return PTR_ERR(newstate);
2103        if (newstate != opendata->state)
2104                ret = -ESTALE;
2105        nfs4_close_state(newstate, fmode);
2106        return ret;
2107}
2108
2109static int nfs4_open_recover(struct nfs4_opendata *opendata, struct nfs4_state *state)
2110{
2111        int ret;
2112
2113        /* memory barrier prior to reading state->n_* */
2114        smp_rmb();
2115        ret = nfs4_open_recover_helper(opendata, FMODE_READ|FMODE_WRITE);
2116        if (ret != 0)
2117                return ret;
2118        ret = nfs4_open_recover_helper(opendata, FMODE_WRITE);
2119        if (ret != 0)
2120                return ret;
2121        ret = nfs4_open_recover_helper(opendata, FMODE_READ);
2122        if (ret != 0)
2123                return ret;
2124        /*
2125         * We may have performed cached opens for all three recoveries.
2126         * Check if we need to update the current stateid.
2127         */
2128        if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0 &&
2129            !nfs4_stateid_match(&state->stateid, &state->open_stateid)) {
2130                write_seqlock(&state->seqlock);
2131                if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0)
2132                        nfs4_stateid_copy(&state->stateid, &state->open_stateid);
2133                write_sequnlock(&state->seqlock);
2134        }
2135        return 0;
2136}
2137
2138/*
2139 * OPEN_RECLAIM:
2140 *      reclaim state on the server after a reboot.
2141 */
2142static int _nfs4_do_open_reclaim(struct nfs_open_context *ctx, struct nfs4_state *state)
2143{
2144        struct nfs_delegation *delegation;
2145        struct nfs4_opendata *opendata;
2146        fmode_t delegation_type = 0;
2147        int status;
2148
2149        opendata = nfs4_open_recoverdata_alloc(ctx, state,
2150                        NFS4_OPEN_CLAIM_PREVIOUS);
2151        if (IS_ERR(opendata))
2152                return PTR_ERR(opendata);
2153        rcu_read_lock();
2154        delegation = rcu_dereference(NFS_I(state->inode)->delegation);
2155        if (delegation != NULL && test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags) != 0)
2156                delegation_type = delegation->type;
2157        rcu_read_unlock();
2158        opendata->o_arg.u.delegation_type = delegation_type;
2159        status = nfs4_open_recover(opendata, state);
2160        nfs4_opendata_put(opendata);
2161        return status;
2162}
2163
2164static int nfs4_do_open_reclaim(struct nfs_open_context *ctx, struct nfs4_state *state)
2165{
2166        struct nfs_server *server = NFS_SERVER(state->inode);
2167        struct nfs4_exception exception = { };
2168        int err;
2169        do {
2170                err = _nfs4_do_open_reclaim(ctx, state);
2171                trace_nfs4_open_reclaim(ctx, 0, err);
2172                if (nfs4_clear_cap_atomic_open_v1(server, err, &exception))
2173                        continue;
2174                if (err != -NFS4ERR_DELAY)
2175                        break;
2176                nfs4_handle_exception(server, err, &exception);
2177        } while (exception.retry);
2178        return err;
2179}
2180
2181static int nfs4_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *state)
2182{
2183        struct nfs_open_context *ctx;
2184        int ret;
2185
2186        ctx = nfs4_state_find_open_context(state);
2187        if (IS_ERR(ctx))
2188                return -EAGAIN;
2189        clear_bit(NFS_DELEGATED_STATE, &state->flags);
2190        nfs_state_clear_open_state_flags(state);
2191        ret = nfs4_do_open_reclaim(ctx, state);
2192        put_nfs_open_context(ctx);
2193        return ret;
2194}
2195
2196static int nfs4_handle_delegation_recall_error(struct nfs_server *server, struct nfs4_state *state, const nfs4_stateid *stateid, struct file_lock *fl, int err)
2197{
2198        switch (err) {
2199                default:
2200                        printk(KERN_ERR "NFS: %s: unhandled error "
2201                                        "%d.\n", __func__, err);
2202                case 0:
2203                case -ENOENT:
2204                case -EAGAIN:
2205                case -ESTALE:
2206                case -ETIMEDOUT:
2207                        break;
2208                case -NFS4ERR_BADSESSION:
2209                case -NFS4ERR_BADSLOT:
2210                case -NFS4ERR_BAD_HIGH_SLOT:
2211                case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
2212                case -NFS4ERR_DEADSESSION:
2213                        return -EAGAIN;
2214                case -NFS4ERR_STALE_CLIENTID:
2215                case -NFS4ERR_STALE_STATEID:
2216                        /* Don't recall a delegation if it was lost */
2217                        nfs4_schedule_lease_recovery(server->nfs_client);
2218                        return -EAGAIN;
2219                case -NFS4ERR_MOVED:
2220                        nfs4_schedule_migration_recovery(server);
2221                        return -EAGAIN;
2222                case -NFS4ERR_LEASE_MOVED:
2223                        nfs4_schedule_lease_moved_recovery(server->nfs_client);
2224                        return -EAGAIN;
2225                case -NFS4ERR_DELEG_REVOKED:
2226                case -NFS4ERR_ADMIN_REVOKED:
2227                case -NFS4ERR_EXPIRED:
2228                case -NFS4ERR_BAD_STATEID:
2229                case -NFS4ERR_OPENMODE:
2230                        nfs_inode_find_state_and_recover(state->inode,
2231                                        stateid);
2232                        nfs4_schedule_stateid_recovery(server, state);
2233                        return -EAGAIN;
2234                case -NFS4ERR_DELAY:
2235                case -NFS4ERR_GRACE:
2236                        ssleep(1);
2237                        return -EAGAIN;
2238                case -ENOMEM:
2239                case -NFS4ERR_DENIED:
2240                        if (fl) {
2241                                struct nfs4_lock_state *lsp = fl->fl_u.nfs4_fl.owner;
2242                                if (lsp)
2243                                        set_bit(NFS_LOCK_LOST, &lsp->ls_flags);
2244                        }
2245                        return 0;
2246        }
2247        return err;
2248}
2249
2250int nfs4_open_delegation_recall(struct nfs_open_context *ctx,
2251                struct nfs4_state *state, const nfs4_stateid *stateid)
2252{
2253        struct nfs_server *server = NFS_SERVER(state->inode);
2254        struct nfs4_opendata *opendata;
2255        int err = 0;
2256
2257        opendata = nfs4_open_recoverdata_alloc(ctx, state,
2258                        NFS4_OPEN_CLAIM_DELEG_CUR_FH);
2259        if (IS_ERR(opendata))
2260                return PTR_ERR(opendata);
2261        nfs4_stateid_copy(&opendata->o_arg.u.delegation, stateid);
2262        if (!test_bit(NFS_O_RDWR_STATE, &state->flags)) {
2263                err = nfs4_open_recover_helper(opendata, FMODE_READ|FMODE_WRITE);
2264                if (err)
2265                        goto out;
2266        }
2267        if (!test_bit(NFS_O_WRONLY_STATE, &state->flags)) {
2268                err = nfs4_open_recover_helper(opendata, FMODE_WRITE);
2269                if (err)
2270                        goto out;
2271        }
2272        if (!test_bit(NFS_O_RDONLY_STATE, &state->flags)) {
2273                err = nfs4_open_recover_helper(opendata, FMODE_READ);
2274                if (err)
2275                        goto out;
2276        }
2277        nfs_state_clear_delegation(state);
2278out:
2279        nfs4_opendata_put(opendata);
2280        return nfs4_handle_delegation_recall_error(server, state, stateid, NULL, err);
2281}
2282
2283static void nfs4_open_confirm_prepare(struct rpc_task *task, void *calldata)
2284{
2285        struct nfs4_opendata *data = calldata;
2286
2287        nfs4_setup_sequence(data->o_arg.server->nfs_client,
2288                           &data->c_arg.seq_args, &data->c_res.seq_res, task);
2289}
2290
2291static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata)
2292{
2293        struct nfs4_opendata *data = calldata;
2294
2295        nfs40_sequence_done(task, &data->c_res.seq_res);
2296
2297        data->rpc_status = task->tk_status;
2298        if (data->rpc_status == 0) {
2299                nfs4_stateid_copy(&data->o_res.stateid, &data->c_res.stateid);
2300                nfs_confirm_seqid(&data->owner->so_seqid, 0);
2301                renew_lease(data->o_res.server, data->timestamp);
2302                data->rpc_done = true;
2303        }
2304}
2305
2306static void nfs4_open_confirm_release(void *calldata)
2307{
2308        struct nfs4_opendata *data = calldata;
2309        struct nfs4_state *state = NULL;
2310
2311        /* If this request hasn't been cancelled, do nothing */
2312        if (!data->cancelled)
2313                goto out_free;
2314        /* In case of error, no cleanup! */
2315        if (!data->rpc_done)
2316                goto out_free;
2317        state = nfs4_opendata_to_nfs4_state(data);
2318        if (!IS_ERR(state))
2319                nfs4_close_state(state, data->o_arg.fmode);
2320out_free:
2321        nfs4_opendata_put(data);
2322}
2323
2324static const struct rpc_call_ops nfs4_open_confirm_ops = {
2325        .rpc_call_prepare = nfs4_open_confirm_prepare,
2326        .rpc_call_done = nfs4_open_confirm_done,
2327        .rpc_release = nfs4_open_confirm_release,
2328};
2329
2330/*
2331 * Note: On error, nfs4_proc_open_confirm will free the struct nfs4_opendata
2332 */
2333static int _nfs4_proc_open_confirm(struct nfs4_opendata *data)
2334{
2335        struct nfs_server *server = NFS_SERVER(d_inode(data->dir));
2336        struct rpc_task *task;
2337        struct  rpc_message msg = {
2338                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_CONFIRM],
2339                .rpc_argp = &data->c_arg,
2340                .rpc_resp = &data->c_res,
2341                .rpc_cred = data->owner->so_cred,
2342        };
2343        struct rpc_task_setup task_setup_data = {
2344                .rpc_client = server->client,
2345                .rpc_message = &msg,
2346                .callback_ops = &nfs4_open_confirm_ops,
2347                .callback_data = data,
2348                .workqueue = nfsiod_workqueue,
2349                .flags = RPC_TASK_ASYNC,
2350        };
2351        int status;
2352
2353        nfs4_init_sequence(&data->c_arg.seq_args, &data->c_res.seq_res, 1,
2354                                data->is_recover);
2355        kref_get(&data->kref);
2356        data->rpc_done = false;
2357        data->rpc_status = 0;
2358        data->timestamp = jiffies;
2359        task = rpc_run_task(&task_setup_data);
2360        if (IS_ERR(task))
2361                return PTR_ERR(task);
2362        status = rpc_wait_for_completion_task(task);
2363        if (status != 0) {
2364                data->cancelled = true;
2365                smp_wmb();
2366        } else
2367                status = data->rpc_status;
2368        rpc_put_task(task);
2369        return status;
2370}
2371
2372static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
2373{
2374        struct nfs4_opendata *data = calldata;
2375        struct nfs4_state_owner *sp = data->owner;
2376        struct nfs_client *clp = sp->so_server->nfs_client;
2377        enum open_claim_type4 claim = data->o_arg.claim;
2378
2379        if (nfs_wait_on_sequence(data->o_arg.seqid, task) != 0)
2380                goto out_wait;
2381        /*
2382         * Check if we still need to send an OPEN call, or if we can use
2383         * a delegation instead.
2384         */
2385        if (data->state != NULL) {
2386                struct nfs_delegation *delegation;
2387
2388                if (can_open_cached(data->state, data->o_arg.fmode,
2389                                        data->o_arg.open_flags, claim))
2390                        goto out_no_action;
2391                rcu_read_lock();
2392                delegation = nfs4_get_valid_delegation(data->state->inode);
2393                if (can_open_delegated(delegation, data->o_arg.fmode, claim))
2394                        goto unlock_no_action;
2395                rcu_read_unlock();
2396        }
2397        /* Update client id. */
2398        data->o_arg.clientid = clp->cl_clientid;
2399        switch (claim) {
2400        default:
2401                break;
2402        case NFS4_OPEN_CLAIM_PREVIOUS:
2403        case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
2404        case NFS4_OPEN_CLAIM_DELEG_PREV_FH:
2405                data->o_arg.open_bitmap = &nfs4_open_noattr_bitmap[0];
2406                /* Fall through */
2407        case NFS4_OPEN_CLAIM_FH:
2408                task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR];
2409        }
2410        data->timestamp = jiffies;
2411        if (nfs4_setup_sequence(data->o_arg.server->nfs_client,
2412                                &data->o_arg.seq_args,
2413                                &data->o_res.seq_res,
2414                                task) != 0)
2415                nfs_release_seqid(data->o_arg.seqid);
2416
2417        /* Set the create mode (note dependency on the session type) */
2418        data->o_arg.createmode = NFS4_CREATE_UNCHECKED;
2419        if (data->o_arg.open_flags & O_EXCL) {
2420                data->o_arg.createmode = NFS4_CREATE_EXCLUSIVE;
2421                if (nfs4_has_persistent_session(clp))
2422                        data->o_arg.createmode = NFS4_CREATE_GUARDED;
2423                else if (clp->cl_mvops->minor_version > 0)
2424                        data->o_arg.createmode = NFS4_CREATE_EXCLUSIVE4_1;
2425        }
2426        return;
2427unlock_no_action:
2428        trace_nfs4_cached_open(data->state);
2429        rcu_read_unlock();
2430out_no_action:
2431        task->tk_action = NULL;
2432out_wait:
2433        nfs4_sequence_done(task, &data->o_res.seq_res);
2434}
2435
2436static void nfs4_open_done(struct rpc_task *task, void *calldata)
2437{
2438        struct nfs4_opendata *data = calldata;
2439
2440        data->rpc_status = task->tk_status;
2441
2442        if (!nfs4_sequence_process(task, &data->o_res.seq_res))
2443                return;
2444
2445        if (task->tk_status == 0) {
2446                if (data->o_res.f_attr->valid & NFS_ATTR_FATTR_TYPE) {
2447                        switch (data->o_res.f_attr->mode & S_IFMT) {
2448                        case S_IFREG:
2449                                break;
2450                        case S_IFLNK:
2451                                data->rpc_status = -ELOOP;
2452                                break;
2453                        case S_IFDIR:
2454                                data->rpc_status = -EISDIR;
2455                                break;
2456                        default:
2457                                data->rpc_status = -ENOTDIR;
2458                        }
2459                }
2460                renew_lease(data->o_res.server, data->timestamp);
2461                if (!(data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM))
2462                        nfs_confirm_seqid(&data->owner->so_seqid, 0);
2463        }
2464        data->rpc_done = true;
2465}
2466
2467static void nfs4_open_release(void *calldata)
2468{
2469        struct nfs4_opendata *data = calldata;
2470        struct nfs4_state *state = NULL;
2471
2472        /* If this request hasn't been cancelled, do nothing */
2473        if (!data->cancelled)
2474                goto out_free;
2475        /* In case of error, no cleanup! */
2476        if (data->rpc_status != 0 || !data->rpc_done)
2477                goto out_free;
2478        /* In case we need an open_confirm, no cleanup! */
2479        if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM)
2480                goto out_free;
2481        state = nfs4_opendata_to_nfs4_state(data);
2482        if (!IS_ERR(state))
2483                nfs4_close_state(state, data->o_arg.fmode);
2484out_free:
2485        nfs4_opendata_put(data);
2486}
2487
2488static const struct rpc_call_ops nfs4_open_ops = {
2489        .rpc_call_prepare = nfs4_open_prepare,
2490        .rpc_call_done = nfs4_open_done,
2491        .rpc_release = nfs4_open_release,
2492};
2493
2494static int nfs4_run_open_task(struct nfs4_opendata *data,
2495                              struct nfs_open_context *ctx)
2496{
2497        struct inode *dir = d_inode(data->dir);
2498        struct nfs_server *server = NFS_SERVER(dir);
2499        struct nfs_openargs *o_arg = &data->o_arg;
2500        struct nfs_openres *o_res = &data->o_res;
2501        struct rpc_task *task;
2502        struct rpc_message msg = {
2503                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN],
2504                .rpc_argp = o_arg,
2505                .rpc_resp = o_res,
2506                .rpc_cred = data->owner->so_cred,
2507        };
2508        struct rpc_task_setup task_setup_data = {
2509                .rpc_client = server->client,
2510                .rpc_message = &msg,
2511                .callback_ops = &nfs4_open_ops,
2512                .callback_data = data,
2513                .workqueue = nfsiod_workqueue,
2514                .flags = RPC_TASK_ASYNC,
2515        };
2516        int status;
2517
2518        kref_get(&data->kref);
2519        data->rpc_done = false;
2520        data->rpc_status = 0;
2521        data->cancelled = false;
2522        data->is_recover = false;
2523        if (!ctx) {
2524                nfs4_init_sequence(&o_arg->seq_args, &o_res->seq_res, 1, 1);
2525                data->is_recover = true;
2526                task_setup_data.flags |= RPC_TASK_TIMEOUT;
2527        } else {
2528                nfs4_init_sequence(&o_arg->seq_args, &o_res->seq_res, 1, 0);
2529                pnfs_lgopen_prepare(data, ctx);
2530        }
2531        task = rpc_run_task(&task_setup_data);
2532        if (IS_ERR(task))
2533                return PTR_ERR(task);
2534        status = rpc_wait_for_completion_task(task);
2535        if (status != 0) {
2536                data->cancelled = true;
2537                smp_wmb();
2538        } else
2539                status = data->rpc_status;
2540        rpc_put_task(task);
2541
2542        return status;
2543}
2544
2545static int _nfs4_recover_proc_open(struct nfs4_opendata *data)
2546{
2547        struct inode *dir = d_inode(data->dir);
2548        struct nfs_openres *o_res = &data->o_res;
2549        int status;
2550
2551        status = nfs4_run_open_task(data, NULL);
2552        if (status != 0 || !data->rpc_done)
2553                return status;
2554
2555        nfs_fattr_map_and_free_names(NFS_SERVER(dir), &data->f_attr);
2556
2557        if (o_res->rflags & NFS4_OPEN_RESULT_CONFIRM)
2558                status = _nfs4_proc_open_confirm(data);
2559
2560        return status;
2561}
2562
2563/*
2564 * Additional permission checks in order to distinguish between an
2565 * open for read, and an open for execute. This works around the
2566 * fact that NFSv4 OPEN treats read and execute permissions as being
2567 * the same.
2568 * Note that in the non-execute case, we want to turn off permission
2569 * checking if we just created a new file (POSIX open() semantics).
2570 */
2571static int nfs4_opendata_access(const struct cred *cred,
2572                                struct nfs4_opendata *opendata,
2573                                struct nfs4_state *state, fmode_t fmode,
2574                                int openflags)
2575{
2576        struct nfs_access_entry cache;
2577        u32 mask, flags;
2578
2579        /* access call failed or for some reason the server doesn't
2580         * support any access modes -- defer access call until later */
2581        if (opendata->o_res.access_supported == 0)
2582                return 0;
2583
2584        mask = 0;
2585        /*
2586         * Use openflags to check for exec, because fmode won't
2587         * always have FMODE_EXEC set when file open for exec.
2588         */
2589        if (openflags & __FMODE_EXEC) {
2590                /* ONLY check for exec rights */
2591                if (S_ISDIR(state->inode->i_mode))
2592                        mask = NFS4_ACCESS_LOOKUP;
2593                else
2594                        mask = NFS4_ACCESS_EXECUTE;
2595        } else if ((fmode & FMODE_READ) && !opendata->file_created)
2596                mask = NFS4_ACCESS_READ;
2597
2598        cache.cred = cred;
2599        nfs_access_set_mask(&cache, opendata->o_res.access_result);
2600        nfs_access_add_cache(state->inode, &cache);
2601
2602        flags = NFS4_ACCESS_READ | NFS4_ACCESS_EXECUTE | NFS4_ACCESS_LOOKUP;
2603        if ((mask & ~cache.mask & flags) == 0)
2604                return 0;
2605
2606        return -EACCES;
2607}
2608
2609/*
2610 * Note: On error, nfs4_proc_open will free the struct nfs4_opendata
2611 */
2612static int _nfs4_proc_open(struct nfs4_opendata *data,
2613                           struct nfs_open_context *ctx)
2614{
2615        struct inode *dir = d_inode(data->dir);
2616        struct nfs_server *server = NFS_SERVER(dir);
2617        struct nfs_openargs *o_arg = &data->o_arg;
2618        struct nfs_openres *o_res = &data->o_res;
2619        int status;
2620
2621        status = nfs4_run_open_task(data, ctx);
2622        if (!data->rpc_done)
2623                return status;
2624        if (status != 0) {
2625                if (status == -NFS4ERR_BADNAME &&
2626                                !(o_arg->open_flags & O_CREAT))
2627                        return -ENOENT;
2628                return status;
2629        }
2630
2631        nfs_fattr_map_and_free_names(server, &data->f_attr);
2632
2633        if (o_arg->open_flags & O_CREAT) {
2634                if (o_arg->open_flags & O_EXCL)
2635                        data->file_created = true;
2636                else if (o_res->cinfo.before != o_res->cinfo.after)
2637                        data->file_created = true;
2638                if (data->file_created ||
2639                    inode_peek_iversion_raw(dir) != o_res->cinfo.after)
2640                        update_changeattr(dir, &o_res->cinfo,
2641                                        o_res->f_attr->time_start, 0);
2642        }
2643        if ((o_res->rflags & NFS4_OPEN_RESULT_LOCKTYPE_POSIX) == 0)
2644                server->caps &= ~NFS_CAP_POSIX_LOCK;
2645        if(o_res->rflags & NFS4_OPEN_RESULT_CONFIRM) {
2646                status = _nfs4_proc_open_confirm(data);
2647                if (status != 0)
2648                        return status;
2649        }
2650        if (!(o_res->f_attr->valid & NFS_ATTR_FATTR)) {
2651                nfs4_sequence_free_slot(&o_res->seq_res);
2652                nfs4_proc_getattr(server, &o_res->fh, o_res->f_attr,
2653                                o_res->f_label, NULL);
2654        }
2655        return 0;
2656}
2657
2658/*
2659 * OPEN_EXPIRED:
2660 *      reclaim state on the server after a network partition.
2661 *      Assumes caller holds the appropriate lock
2662 */
2663static int _nfs4_open_expired(struct nfs_open_context *ctx, struct nfs4_state *state)
2664{
2665        struct nfs4_opendata *opendata;
2666        int ret;
2667
2668        opendata = nfs4_open_recoverdata_alloc(ctx, state,
2669                        NFS4_OPEN_CLAIM_FH);
2670        if (IS_ERR(opendata))
2671                return PTR_ERR(opendata);
2672        ret = nfs4_open_recover(opendata, state);
2673        if (ret == -ESTALE)
2674                d_drop(ctx->dentry);
2675        nfs4_opendata_put(opendata);
2676        return ret;
2677}
2678
2679static int nfs4_do_open_expired(struct nfs_open_context *ctx, struct nfs4_state *state)
2680{
2681        struct nfs_server *server = NFS_SERVER(state->inode);
2682        struct nfs4_exception exception = { };
2683        int err;
2684
2685        do {
2686                err = _nfs4_open_expired(ctx, state);
2687                trace_nfs4_open_expired(ctx, 0, err);
2688                if (nfs4_clear_cap_atomic_open_v1(server, err, &exception))
2689                        continue;
2690                switch (err) {
2691                default:
2692                        goto out;
2693                case -NFS4ERR_GRACE:
2694                case -NFS4ERR_DELAY:
2695                        nfs4_handle_exception(server, err, &exception);
2696                        err = 0;
2697                }
2698        } while (exception.retry);
2699out:
2700        return err;
2701}
2702
2703static int nfs4_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state)
2704{
2705        struct nfs_open_context *ctx;
2706        int ret;
2707
2708        ctx = nfs4_state_find_open_context(state);
2709        if (IS_ERR(ctx))
2710                return -EAGAIN;
2711        ret = nfs4_do_open_expired(ctx, state);
2712        put_nfs_open_context(ctx);
2713        return ret;
2714}
2715
2716static void nfs_finish_clear_delegation_stateid(struct nfs4_state *state,
2717                const nfs4_stateid *stateid)
2718{
2719        nfs_remove_bad_delegation(state->inode, stateid);
2720        nfs_state_clear_delegation(state);
2721}
2722
2723static void nfs40_clear_delegation_stateid(struct nfs4_state *state)
2724{
2725        if (rcu_access_pointer(NFS_I(state->inode)->delegation) != NULL)
2726                nfs_finish_clear_delegation_stateid(state, NULL);
2727}
2728
2729static int nfs40_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state)
2730{
2731        /* NFSv4.0 doesn't allow for delegation recovery on open expire */
2732        nfs40_clear_delegation_stateid(state);
2733        nfs_state_clear_open_state_flags(state);
2734        return nfs4_open_expired(sp, state);
2735}
2736
2737static int nfs40_test_and_free_expired_stateid(struct nfs_server *server,
2738                nfs4_stateid *stateid,
2739                const struct cred *cred)
2740{
2741        return -NFS4ERR_BAD_STATEID;
2742}
2743
2744#if defined(CONFIG_NFS_V4_1)
2745static int nfs41_test_and_free_expired_stateid(struct nfs_server *server,
2746                nfs4_stateid *stateid,
2747                const struct cred *cred)
2748{
2749        int status;
2750
2751        switch (stateid->type) {
2752        default:
2753                break;
2754        case NFS4_INVALID_STATEID_TYPE:
2755        case NFS4_SPECIAL_STATEID_TYPE:
2756                return -NFS4ERR_BAD_STATEID;
2757        case NFS4_REVOKED_STATEID_TYPE:
2758                goto out_free;
2759        }
2760
2761        status = nfs41_test_stateid(server, stateid, cred);
2762        switch (status) {
2763        case -NFS4ERR_EXPIRED:
2764        case -NFS4ERR_ADMIN_REVOKED:
2765        case -NFS4ERR_DELEG_REVOKED:
2766                break;
2767        default:
2768                return status;
2769        }
2770out_free:
2771        /* Ack the revoked state to the server */
2772        nfs41_free_stateid(server, stateid, cred, true);
2773        return -NFS4ERR_EXPIRED;
2774}
2775
2776static int nfs41_check_delegation_stateid(struct nfs4_state *state)
2777{
2778        struct nfs_server *server = NFS_SERVER(state->inode);
2779        nfs4_stateid stateid;
2780        struct nfs_delegation *delegation;
2781        const struct cred *cred = NULL;
2782        int status, ret = NFS_OK;
2783
2784        /* Get the delegation credential for use by test/free_stateid */
2785        rcu_read_lock();
2786        delegation = rcu_dereference(NFS_I(state->inode)->delegation);
2787        if (delegation == NULL) {
2788                rcu_read_unlock();
2789                nfs_state_clear_delegation(state);
2790                return NFS_OK;
2791        }
2792
2793        nfs4_stateid_copy(&stateid, &delegation->stateid);
2794
2795        if (!test_and_clear_bit(NFS_DELEGATION_TEST_EXPIRED,
2796                                &delegation->flags)) {
2797                rcu_read_unlock();
2798                return NFS_OK;
2799        }
2800
2801        if (delegation->cred)
2802                cred = get_cred(delegation->cred);
2803        rcu_read_unlock();
2804        status = nfs41_test_and_free_expired_stateid(server, &stateid, cred);
2805        trace_nfs4_test_delegation_stateid(state, NULL, status);
2806        if (status == -NFS4ERR_EXPIRED || status == -NFS4ERR_BAD_STATEID)
2807                nfs_finish_clear_delegation_stateid(state, &stateid);
2808        else
2809                ret = status;
2810
2811        put_cred(cred);
2812        return ret;
2813}
2814
2815static void nfs41_delegation_recover_stateid(struct nfs4_state *state)
2816{
2817        nfs4_stateid tmp;
2818
2819        if (test_bit(NFS_DELEGATED_STATE, &state->flags) &&
2820            nfs4_copy_delegation_stateid(state->inode, state->state,
2821                                &tmp, NULL) &&
2822            nfs4_stateid_match_other(&state->stateid, &tmp))
2823                nfs_state_set_delegation(state, &tmp, state->state);
2824        else
2825                nfs_state_clear_delegation(state);
2826}
2827
2828/**
2829 * nfs41_check_expired_locks - possibly free a lock stateid
2830 *
2831 * @state: NFSv4 state for an inode
2832 *
2833 * Returns NFS_OK if recovery for this stateid is now finished.
2834 * Otherwise a negative NFS4ERR value is returned.
2835 */
2836static int nfs41_check_expired_locks(struct nfs4_state *state)
2837{
2838        int status, ret = NFS_OK;
2839        struct nfs4_lock_state *lsp, *prev = NULL;
2840        struct nfs_server *server = NFS_SERVER(state->inode);
2841
2842        if (!test_bit(LK_STATE_IN_USE, &state->flags))
2843                goto out;
2844
2845        spin_lock(&state->state_lock);
2846        list_for_each_entry(lsp, &state->lock_states, ls_locks) {
2847                if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags)) {
2848                        const struct cred *cred = lsp->ls_state->owner->so_cred;
2849
2850                        refcount_inc(&lsp->ls_count);
2851                        spin_unlock(&state->state_lock);
2852
2853                        nfs4_put_lock_state(prev);
2854                        prev = lsp;
2855
2856                        status = nfs41_test_and_free_expired_stateid(server,
2857                                        &lsp->ls_stateid,
2858                                        cred);
2859                        trace_nfs4_test_lock_stateid(state, lsp, status);
2860                        if (status == -NFS4ERR_EXPIRED ||
2861                            status == -NFS4ERR_BAD_STATEID) {
2862                                clear_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags);
2863                                lsp->ls_stateid.type = NFS4_INVALID_STATEID_TYPE;
2864                                if (!recover_lost_locks)
2865                                        set_bit(NFS_LOCK_LOST, &lsp->ls_flags);
2866                        } else if (status != NFS_OK) {
2867                                ret = status;
2868                                nfs4_put_lock_state(prev);
2869                                goto out;
2870                        }
2871                        spin_lock(&state->state_lock);
2872                }
2873        }
2874        spin_unlock(&state->state_lock);
2875        nfs4_put_lock_state(prev);
2876out:
2877        return ret;
2878}
2879
2880/**
2881 * nfs41_check_open_stateid - possibly free an open stateid
2882 *
2883 * @state: NFSv4 state for an inode
2884 *
2885 * Returns NFS_OK if recovery for this stateid is now finished.
2886 * Otherwise a negative NFS4ERR value is returned.
2887 */
2888static int nfs41_check_open_stateid(struct nfs4_state *state)
2889{
2890        struct nfs_server *server = NFS_SERVER(state->inode);
2891        nfs4_stateid *stateid = &state->open_stateid;
2892        const struct cred *cred = state->owner->so_cred;
2893        int status;
2894
2895        if (test_bit(NFS_OPEN_STATE, &state->flags) == 0)
2896                return -NFS4ERR_BAD_STATEID;
2897        status = nfs41_test_and_free_expired_stateid(server, stateid, cred);
2898        trace_nfs4_test_open_stateid(state, NULL, status);
2899        if (status == -NFS4ERR_EXPIRED || status == -NFS4ERR_BAD_STATEID) {
2900                nfs_state_clear_open_state_flags(state);
2901                stateid->type = NFS4_INVALID_STATEID_TYPE;
2902                return status;
2903        }
2904        if (nfs_open_stateid_recover_openmode(state))
2905                return -NFS4ERR_OPENMODE;
2906        return NFS_OK;
2907}
2908
2909static int nfs41_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state)
2910{
2911        int status;
2912
2913        status = nfs41_check_delegation_stateid(state);
2914        if (status != NFS_OK)
2915                return status;
2916        nfs41_delegation_recover_stateid(state);
2917
2918        status = nfs41_check_expired_locks(state);
2919        if (status != NFS_OK)
2920                return status;
2921        status = nfs41_check_open_stateid(state);
2922        if (status != NFS_OK)
2923                status = nfs4_open_expired(sp, state);
2924        return status;
2925}
2926#endif
2927
2928/*
2929 * on an EXCLUSIVE create, the server should send back a bitmask with FATTR4-*
2930 * fields corresponding to attributes that were used to store the verifier.
2931 * Make sure we clobber those fields in the later setattr call
2932 */
2933static unsigned nfs4_exclusive_attrset(struct nfs4_opendata *opendata,
2934                                struct iattr *sattr, struct nfs4_label **label)
2935{
2936        const __u32 *bitmask = opendata->o_arg.server->exclcreat_bitmask;
2937        __u32 attrset[3];
2938        unsigned ret;
2939        unsigned i;
2940
2941        for (i = 0; i < ARRAY_SIZE(attrset); i++) {
2942                attrset[i] = opendata->o_res.attrset[i];
2943                if (opendata->o_arg.createmode == NFS4_CREATE_EXCLUSIVE4_1)
2944                        attrset[i] &= ~bitmask[i];
2945        }
2946
2947        ret = (opendata->o_arg.createmode == NFS4_CREATE_EXCLUSIVE) ?
2948                sattr->ia_valid : 0;
2949
2950        if ((attrset[1] & (FATTR4_WORD1_TIME_ACCESS|FATTR4_WORD1_TIME_ACCESS_SET))) {
2951                if (sattr->ia_valid & ATTR_ATIME_SET)
2952                        ret |= ATTR_ATIME_SET;
2953                else
2954                        ret |= ATTR_ATIME;
2955        }
2956
2957        if ((attrset[1] & (FATTR4_WORD1_TIME_MODIFY|FATTR4_WORD1_TIME_MODIFY_SET))) {
2958                if (sattr->ia_valid & ATTR_MTIME_SET)
2959                        ret |= ATTR_MTIME_SET;
2960                else
2961                        ret |= ATTR_MTIME;
2962        }
2963
2964        if (!(attrset[2] & FATTR4_WORD2_SECURITY_LABEL))
2965                *label = NULL;
2966        return ret;
2967}
2968
2969static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,
2970                int flags, struct nfs_open_context *ctx)
2971{
2972        struct nfs4_state_owner *sp = opendata->owner;
2973        struct nfs_server *server = sp->so_server;
2974        struct dentry *dentry;
2975        struct nfs4_state *state;
2976        fmode_t acc_mode = _nfs4_ctx_to_accessmode(ctx);
2977        struct inode *dir = d_inode(opendata->dir);
2978        unsigned long dir_verifier;
2979        unsigned int seq;
2980        int ret;
2981
2982        seq = raw_seqcount_begin(&sp->so_reclaim_seqcount);
2983        dir_verifier = nfs_save_change_attribute(dir);
2984
2985        ret = _nfs4_proc_open(opendata, ctx);
2986        if (ret != 0)
2987                goto out;
2988
2989        state = _nfs4_opendata_to_nfs4_state(opendata);
2990        ret = PTR_ERR(state);
2991        if (IS_ERR(state))
2992                goto out;
2993        ctx->state = state;
2994        if (server->caps & NFS_CAP_POSIX_LOCK)
2995                set_bit(NFS_STATE_POSIX_LOCKS, &state->flags);
2996        if (opendata->o_res.rflags & NFS4_OPEN_RESULT_MAY_NOTIFY_LOCK)
2997                set_bit(NFS_STATE_MAY_NOTIFY_LOCK, &state->flags);
2998
2999        dentry = opendata->dentry;
3000        if (d_really_is_negative(dentry)) {
3001                struct dentry *alias;
3002                d_drop(dentry);
3003                alias = d_exact_alias(dentry, state->inode);
3004                if (!alias)
3005                        alias = d_splice_alias(igrab(state->inode), dentry);
3006                /* d_splice_alias() can't fail here - it's a non-directory */
3007                if (alias) {
3008                        dput(ctx->dentry);
3009                        ctx->dentry = dentry = alias;
3010                }
3011        }
3012
3013        switch(opendata->o_arg.claim) {
3014        default:
3015                break;
3016        case NFS4_OPEN_CLAIM_NULL:
3017        case NFS4_OPEN_CLAIM_DELEGATE_CUR:
3018        case NFS4_OPEN_CLAIM_DELEGATE_PREV:
3019                if (!opendata->rpc_done)
3020                        break;
3021                if (opendata->o_res.delegation_type != 0)
3022                        dir_verifier = nfs_save_change_attribute(dir);
3023                nfs_set_verifier(dentry, dir_verifier);
3024        }
3025
3026        /* Parse layoutget results before we check for access */
3027        pnfs_parse_lgopen(state->inode, opendata->lgp, ctx);
3028
3029        ret = nfs4_opendata_access(sp->so_cred, opendata, state,
3030                        acc_mode, flags);
3031        if (ret != 0)
3032                goto out;
3033
3034        if (d_inode(dentry) == state->inode) {
3035                nfs_inode_attach_open_context(ctx);
3036                if (read_seqcount_retry(&sp->so_reclaim_seqcount, seq))
3037                        nfs4_schedule_stateid_recovery(server, state);
3038        }
3039
3040out:
3041        if (!opendata->cancelled)
3042                nfs4_sequence_free_slot(&opendata->o_res.seq_res);
3043        return ret;
3044}
3045
3046/*
3047 * Returns a referenced nfs4_state
3048 */
3049static int _nfs4_do_open(struct inode *dir,
3050                        struct nfs_open_context *ctx,
3051                        int flags,
3052                        const struct nfs4_open_createattrs *c,
3053                        int *opened)
3054{
3055        struct nfs4_state_owner  *sp;
3056        struct nfs4_state     *state = NULL;
3057        struct nfs_server       *server = NFS_SERVER(dir);
3058        struct nfs4_opendata *opendata;
3059        struct dentry *dentry = ctx->dentry;
3060        const struct cred *cred = ctx->cred;
3061        struct nfs4_threshold **ctx_th = &ctx->mdsthreshold;
3062        fmode_t fmode = _nfs4_ctx_to_openmode(ctx);
3063        enum open_claim_type4 claim = NFS4_OPEN_CLAIM_NULL;
3064        struct iattr *sattr = c->sattr;
3065        struct nfs4_label *label = c->label;
3066        struct nfs4_label *olabel = NULL;
3067        int status;
3068
3069        /* Protect against reboot recovery conflicts */
3070        status = -ENOMEM;
3071        sp = nfs4_get_state_owner(server, cred, GFP_KERNEL);
3072        if (sp == NULL) {
3073                dprintk("nfs4_do_open: nfs4_get_state_owner failed!\n");
3074                goto out_err;
3075        }
3076        status = nfs4_client_recover_expired_lease(server->nfs_client);
3077        if (status != 0)
3078                goto err_put_state_owner;
3079        if (d_really_is_positive(dentry))
3080                nfs4_return_incompatible_delegation(d_inode(dentry), fmode);
3081        status = -ENOMEM;
3082        if (d_really_is_positive(dentry))
3083                claim = NFS4_OPEN_CLAIM_FH;
3084        opendata = nfs4_opendata_alloc(dentry, sp, fmode, flags,
3085                        c, claim, GFP_KERNEL);
3086        if (opendata == NULL)
3087                goto err_put_state_owner;
3088
3089        if (label) {
3090                olabel = nfs4_label_alloc(server, GFP_KERNEL);
3091                if (IS_ERR(olabel)) {
3092                        status = PTR_ERR(olabel);
3093                        goto err_opendata_put;
3094                }
3095        }
3096
3097        if (server->attr_bitmask[2] & FATTR4_WORD2_MDSTHRESHOLD) {
3098                if (!opendata->f_attr.mdsthreshold) {
3099                        opendata->f_attr.mdsthreshold = pnfs_mdsthreshold_alloc();
3100                        if (!opendata->f_attr.mdsthreshold)
3101                                goto err_free_label;
3102                }
3103                opendata->o_arg.open_bitmap = &nfs4_pnfs_open_bitmap[0];
3104        }
3105        if (d_really_is_positive(dentry))
3106                opendata->state = nfs4_get_open_state(d_inode(dentry), sp);
3107
3108        status = _nfs4_open_and_get_state(opendata, flags, ctx);
3109        if (status != 0)
3110                goto err_free_label;
3111        state = ctx->state;
3112
3113        if ((opendata->o_arg.open_flags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL) &&
3114            (opendata->o_arg.createmode != NFS4_CREATE_GUARDED)) {
3115                unsigned attrs = nfs4_exclusive_attrset(opendata, sattr, &label);
3116                /*
3117                 * send create attributes which was not set by open
3118                 * with an extra setattr.
3119                 */
3120                if (attrs || label) {
3121                        unsigned ia_old = sattr->ia_valid;
3122
3123                        sattr->ia_valid = attrs;
3124                        nfs_fattr_init(opendata->o_res.f_attr);
3125                        status = nfs4_do_setattr(state->inode, cred,
3126                                        opendata->o_res.f_attr, sattr,
3127                                        ctx, label, olabel);
3128                        if (status == 0) {
3129                                nfs_setattr_update_inode(state->inode, sattr,
3130                                                opendata->o_res.f_attr);
3131                                nfs_setsecurity(state->inode, opendata->o_res.f_attr, olabel);
3132                        }
3133                        sattr->ia_valid = ia_old;
3134                }
3135        }
3136        if (opened && opendata->file_created)
3137                *opened = 1;
3138
3139        if (pnfs_use_threshold(ctx_th, opendata->f_attr.mdsthreshold, server)) {
3140                *ctx_th = opendata->f_attr.mdsthreshold;
3141                opendata->f_attr.mdsthreshold = NULL;
3142        }
3143
3144        nfs4_label_free(olabel);
3145
3146        nfs4_opendata_put(opendata);
3147        nfs4_put_state_owner(sp);
3148        return 0;
3149err_free_label:
3150        nfs4_label_free(olabel);
3151err_opendata_put:
3152        nfs4_opendata_put(opendata);
3153err_put_state_owner:
3154        nfs4_put_state_owner(sp);
3155out_err:
3156        return status;
3157}
3158
3159
3160static struct nfs4_state *nfs4_do_open(struct inode *dir,
3161                                        struct nfs_open_context *ctx,
3162                                        int flags,
3163                                        struct iattr *sattr,
3164                                        struct nfs4_label *label,
3165                                        int *opened)
3166{
3167        struct nfs_server *server = NFS_SERVER(dir);
3168        struct nfs4_exception exception = {
3169                .interruptible = true,
3170        };
3171        struct nfs4_state *res;
3172        struct nfs4_open_createattrs c = {
3173                .label = label,
3174                .sattr = sattr,
3175                .verf = {
3176                        [0] = (__u32)jiffies,
3177                        [1] = (__u32)current->pid,
3178                },
3179        };
3180        int status;
3181
3182        do {
3183                status = _nfs4_do_open(dir, ctx, flags, &c, opened);
3184                res = ctx->state;
3185                trace_nfs4_open_file(ctx, flags, status);
3186                if (status == 0)
3187                        break;
3188                /* NOTE: BAD_SEQID means the server and client disagree about the
3189                 * book-keeping w.r.t. state-changing operations
3190                 * (OPEN/CLOSE/LOCK/LOCKU...)
3191                 * It is actually a sign of a bug on the client or on the server.
3192                 *
3193                 * If we receive a BAD_SEQID error in the particular case of
3194                 * doing an OPEN, we assume that nfs_increment_open_seqid() will
3195                 * have unhashed the old state_owner for us, and that we can
3196                 * therefore safely retry using a new one. We should still warn
3197                 * the user though...
3198                 */
3199                if (status == -NFS4ERR_BAD_SEQID) {
3200                        pr_warn_ratelimited("NFS: v4 server %s "
3201                                        " returned a bad sequence-id error!\n",
3202                                        NFS_SERVER(dir)->nfs_client->cl_hostname);
3203                        exception.retry = 1;
3204                        continue;
3205                }
3206                /*
3207                 * BAD_STATEID on OPEN means that the server cancelled our
3208                 * state before it received the OPEN_CONFIRM.
3209                 * Recover by retrying the request as per the discussion
3210                 * on Page 181 of RFC3530.
3211                 */
3212                if (status == -NFS4ERR_BAD_STATEID) {
3213                        exception.retry = 1;
3214                        continue;
3215                }
3216                if (status == -NFS4ERR_EXPIRED) {
3217                        nfs4_schedule_lease_recovery(server->nfs_client);
3218                        exception.retry = 1;
3219                        continue;
3220                }
3221                if (status == -EAGAIN) {
3222                        /* We must have found a delegation */
3223                        exception.retry = 1;
3224                        continue;
3225                }
3226                if (nfs4_clear_cap_atomic_open_v1(server, status, &exception))
3227                        continue;
3228                res = ERR_PTR(nfs4_handle_exception(server,
3229                                        status, &exception));
3230        } while (exception.retry);
3231        return res;
3232}
3233
3234static int _nfs4_do_setattr(struct inode *inode,
3235                            struct nfs_setattrargs *arg,
3236                            struct nfs_setattrres *res,
3237                            const struct cred *cred,
3238                            struct nfs_open_context *ctx)
3239{
3240        struct nfs_server *server = NFS_SERVER(inode);
3241        struct rpc_message msg = {
3242                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_SETATTR],
3243                .rpc_argp       = arg,
3244                .rpc_resp       = res,
3245                .rpc_cred       = cred,
3246        };
3247        const struct cred *delegation_cred = NULL;
3248        unsigned long timestamp = jiffies;
3249        bool truncate;
3250        int status;
3251
3252        nfs_fattr_init(res->fattr);
3253
3254        /* Servers should only apply open mode checks for file size changes */
3255        truncate = (arg->iap->ia_valid & ATTR_SIZE) ? true : false;
3256        if (!truncate)
3257                goto zero_stateid;
3258
3259        if (nfs4_copy_delegation_stateid(inode, FMODE_WRITE, &arg->stateid, &delegation_cred)) {
3260                /* Use that stateid */
3261        } else if (ctx != NULL && ctx->state) {
3262                struct nfs_lock_context *l_ctx;
3263                if (!nfs4_valid_open_stateid(ctx->state))
3264                        return -EBADF;
3265                l_ctx = nfs_get_lock_context(ctx);
3266                if (IS_ERR(l_ctx))
3267                        return PTR_ERR(l_ctx);
3268                status = nfs4_select_rw_stateid(ctx->state, FMODE_WRITE, l_ctx,
3269                                                &arg->stateid, &delegation_cred);
3270                nfs_put_lock_context(l_ctx);
3271                if (status == -EIO)
3272                        return -EBADF;
3273                else if (status == -EAGAIN)
3274                        goto zero_stateid;
3275        } else {
3276zero_stateid:
3277                nfs4_stateid_copy(&arg->stateid, &zero_stateid);
3278        }
3279        if (delegation_cred)
3280                msg.rpc_cred = delegation_cred;
3281
3282        status = nfs4_call_sync(server->client, server, &msg, &arg->seq_args, &res->seq_res, 1);
3283
3284        put_cred(delegation_cred);
3285        if (status == 0 && ctx != NULL)
3286                renew_lease(server, timestamp);
3287        trace_nfs4_setattr(inode, &arg->stateid, status);
3288        return status;
3289}
3290
3291static int nfs4_do_setattr(struct inode *inode, const struct cred *cred,
3292                           struct nfs_fattr *fattr, struct iattr *sattr,
3293                           struct nfs_open_context *ctx, struct nfs4_label *ilabel,
3294                           struct nfs4_label *olabel)
3295{
3296        struct nfs_server *server = NFS_SERVER(inode);
3297        __u32 bitmask[NFS4_BITMASK_SZ];
3298        struct nfs4_state *state = ctx ? ctx->state : NULL;
3299        struct nfs_setattrargs  arg = {
3300                .fh             = NFS_FH(inode),
3301                .iap            = sattr,
3302                .server         = server,
3303                .bitmask = bitmask,
3304                .label          = ilabel,
3305        };
3306        struct nfs_setattrres  res = {
3307                .fattr          = fattr,
3308                .label          = olabel,
3309                .server         = server,
3310        };
3311        struct nfs4_exception exception = {
3312                .state = state,
3313                .inode = inode,
3314                .stateid = &arg.stateid,
3315        };
3316        int err;
3317
3318        do {
3319                nfs4_bitmap_copy_adjust_setattr(bitmask,
3320                                nfs4_bitmask(server, olabel),
3321                                inode);
3322
3323                err = _nfs4_do_setattr(inode, &arg, &res, cred, ctx);
3324                switch (err) {
3325                case -NFS4ERR_OPENMODE:
3326                        if (!(sattr->ia_valid & ATTR_SIZE)) {
3327                                pr_warn_once("NFSv4: server %s is incorrectly "
3328                                                "applying open mode checks to "
3329                                                "a SETATTR that is not "
3330                                                "changing file size.\n",
3331                                                server->nfs_client->cl_hostname);
3332                        }
3333                        if (state && !(state->state & FMODE_WRITE)) {
3334                                err = -EBADF;
3335                                if (sattr->ia_valid & ATTR_OPEN)
3336                                        err = -EACCES;
3337                                goto out;
3338                        }
3339                }
3340                err = nfs4_handle_exception(server, err, &exception);
3341        } while (exception.retry);
3342out:
3343        return err;
3344}
3345
3346static bool
3347nfs4_wait_on_layoutreturn(struct inode *inode, struct rpc_task *task)
3348{
3349        if (inode == NULL || !nfs_have_layout(inode))
3350                return false;
3351
3352        return pnfs_wait_on_layoutreturn(inode, task);
3353}
3354
3355/*
3356 * Update the seqid of an open stateid
3357 */
3358static void nfs4_sync_open_stateid(nfs4_stateid *dst,
3359                struct nfs4_state *state)
3360{
3361        __be32 seqid_open;
3362        u32 dst_seqid;
3363        int seq;
3364
3365        for (;;) {
3366                if (!nfs4_valid_open_stateid(state))
3367                        break;
3368                seq = read_seqbegin(&state->seqlock);
3369                if (!nfs4_state_match_open_stateid_other(state, dst)) {
3370                        nfs4_stateid_copy(dst, &state->open_stateid);
3371                        if (read_seqretry(&state->seqlock, seq))
3372                                continue;
3373                        break;
3374                }
3375                seqid_open = state->open_stateid.seqid;
3376                if (read_seqretry(&state->seqlock, seq))
3377                        continue;
3378
3379                dst_seqid = be32_to_cpu(dst->seqid);
3380                if ((s32)(dst_seqid - be32_to_cpu(seqid_open)) < 0)
3381                        dst->seqid = seqid_open;
3382                break;
3383        }
3384}
3385
3386/*
3387 * Update the seqid of an open stateid after receiving
3388 * NFS4ERR_OLD_STATEID
3389 */
3390static bool nfs4_refresh_open_old_stateid(nfs4_stateid *dst,
3391                struct nfs4_state *state)
3392{
3393        __be32 seqid_open;
3394        u32 dst_seqid;
3395        bool ret;
3396        int seq;
3397
3398        for (;;) {
3399                ret = false;
3400                if (!nfs4_valid_open_stateid(state))
3401                        break;
3402                seq = read_seqbegin(&state->seqlock);
3403                if (!nfs4_state_match_open_stateid_other(state, dst)) {
3404                        if (read_seqretry(&state->seqlock, seq))
3405                                continue;
3406                        break;
3407                }
3408                seqid_open = state->open_stateid.seqid;
3409                if (read_seqretry(&state->seqlock, seq))
3410                        continue;
3411
3412                dst_seqid = be32_to_cpu(dst->seqid);
3413                if ((s32)(dst_seqid - be32_to_cpu(seqid_open)) >= 0)
3414                        dst->seqid = cpu_to_be32(dst_seqid + 1);
3415                else
3416                        dst->seqid = seqid_open;
3417                ret = true;
3418                break;
3419        }
3420
3421        return ret;
3422}
3423
3424struct nfs4_closedata {
3425        struct inode *inode;
3426        struct nfs4_state *state;
3427        struct nfs_closeargs arg;
3428        struct nfs_closeres res;
3429        struct {
3430                struct nfs4_layoutreturn_args arg;
3431                struct nfs4_layoutreturn_res res;
3432                struct nfs4_xdr_opaque_data ld_private;
3433                u32 roc_barrier;
3434                bool roc;
3435        } lr;
3436        struct nfs_fattr fattr;
3437        unsigned long timestamp;
3438};
3439
3440static void nfs4_free_closedata(void *data)
3441{
3442        struct nfs4_closedata *calldata = data;
3443        struct nfs4_state_owner *sp = calldata->state->owner;
3444        struct super_block *sb = calldata->state->inode->i_sb;
3445
3446        if (calldata->lr.roc)
3447                pnfs_roc_release(&calldata->lr.arg, &calldata->lr.res,
3448                                calldata->res.lr_ret);
3449        nfs4_put_open_state(calldata->state);
3450        nfs_free_seqid(calldata->arg.seqid);
3451        nfs4_put_state_owner(sp);
3452        nfs_sb_deactive(sb);
3453        kfree(calldata);
3454}
3455
3456static void nfs4_close_done(struct rpc_task *task, void *data)
3457{
3458        struct nfs4_closedata *calldata = data;
3459        struct nfs4_state *state = calldata->state;
3460        struct nfs_server *server = NFS_SERVER(calldata->inode);
3461        nfs4_stateid *res_stateid = NULL;
3462        struct nfs4_exception exception = {
3463                .state = state,
3464                .inode = calldata->inode,
3465                .stateid = &calldata->arg.stateid,
3466        };
3467
3468        dprintk("%s: begin!\n", __func__);
3469        if (!nfs4_sequence_done(task, &calldata->res.seq_res))
3470                return;
3471        trace_nfs4_close(state, &calldata->arg, &calldata->res, task->tk_status);
3472
3473        /* Handle Layoutreturn errors */
3474        if (pnfs_roc_done(task, calldata->inode,
3475                                &calldata->arg.lr_args,
3476                                &calldata->res.lr_res,
3477                                &calldata->res.lr_ret) == -EAGAIN)
3478                goto out_restart;
3479
3480        /* hmm. we are done with the inode, and in the process of freeing
3481         * the state_owner. we keep this around to process errors
3482         */
3483        switch (task->tk_status) {
3484                case 0:
3485                        res_stateid = &calldata->res.stateid;
3486                        renew_lease(server, calldata->timestamp);
3487                        break;
3488                case -NFS4ERR_ACCESS:
3489                        if (calldata->arg.bitmask != NULL) {
3490                                calldata->arg.bitmask = NULL;
3491                                calldata->res.fattr = NULL;
3492                                goto out_restart;
3493
3494                        }
3495                        break;
3496                case -NFS4ERR_OLD_STATEID:
3497                        /* Did we race with OPEN? */
3498                        if (nfs4_refresh_open_old_stateid(&calldata->arg.stateid,
3499                                                state))
3500                                goto out_restart;
3501                        goto out_release;
3502                case -NFS4ERR_ADMIN_REVOKED:
3503                case -NFS4ERR_STALE_STATEID:
3504                case -NFS4ERR_EXPIRED:
3505                        nfs4_free_revoked_stateid(server,
3506                                        &calldata->arg.stateid,
3507                                        task->tk_msg.rpc_cred);
3508                        /* Fallthrough */
3509                case -NFS4ERR_BAD_STATEID:
3510                        if (calldata->arg.fmode == 0)
3511                                break;
3512                        /* Fallthrough */
3513                default:
3514                        task->tk_status = nfs4_async_handle_exception(task,
3515                                        server, task->tk_status, &exception);
3516                        if (exception.retry)
3517                                goto out_restart;
3518        }
3519        nfs_clear_open_stateid(state, &calldata->arg.stateid,
3520                        res_stateid, calldata->arg.fmode);
3521out_release:
3522        task->tk_status = 0;
3523        nfs_release_seqid(calldata->arg.seqid);
3524        nfs_refresh_inode(calldata->inode, &calldata->fattr);
3525        dprintk("%s: done, ret = %d!\n", __func__, task->tk_status);
3526        return;
3527out_restart:
3528        task->tk_status = 0;
3529        rpc_restart_call_prepare(task);
3530        goto out_release;
3531}
3532
3533static void nfs4_close_prepare(struct rpc_task *task, void *data)
3534{
3535        struct nfs4_closedata *calldata = data;
3536        struct nfs4_state *state = calldata->state;
3537        struct inode *inode = calldata->inode;
3538        struct pnfs_layout_hdr *lo;
3539        bool is_rdonly, is_wronly, is_rdwr;
3540        int call_close = 0;
3541
3542        dprintk("%s: begin!\n", __func__);
3543        if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
3544                goto out_wait;
3545
3546        task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE];
3547        spin_lock(&state->owner->so_lock);
3548        is_rdwr = test_bit(NFS_O_RDWR_STATE, &state->flags);
3549        is_rdonly = test_bit(NFS_O_RDONLY_STATE, &state->flags);
3550        is_wronly = test_bit(NFS_O_WRONLY_STATE, &state->flags);
3551        /* Calculate the change in open mode */
3552        calldata->arg.fmode = 0;
3553        if (state->n_rdwr == 0) {
3554                if (state->n_rdonly == 0)
3555                        call_close |= is_rdonly;
3556                else if (is_rdonly)
3557                        calldata->arg.fmode |= FMODE_READ;
3558                if (state->n_wronly == 0)
3559                        call_close |= is_wronly;
3560                else if (is_wronly)
3561                        calldata->arg.fmode |= FMODE_WRITE;
3562                if (calldata->arg.fmode != (FMODE_READ|FMODE_WRITE))
3563                        call_close |= is_rdwr;
3564        } else if (is_rdwr)
3565                calldata->arg.fmode |= FMODE_READ|FMODE_WRITE;
3566
3567        nfs4_sync_open_stateid(&calldata->arg.stateid, state);
3568        if (!nfs4_valid_open_stateid(state))
3569                call_close = 0;
3570        spin_unlock(&state->owner->so_lock);
3571
3572        if (!call_close) {
3573                /* Note: exit _without_ calling nfs4_close_done */
3574                goto out_no_action;
3575        }
3576
3577        if (!calldata->lr.roc && nfs4_wait_on_layoutreturn(inode, task)) {
3578                nfs_release_seqid(calldata->arg.seqid);
3579                goto out_wait;
3580        }
3581
3582        lo = calldata->arg.lr_args ? calldata->arg.lr_args->layout : NULL;
3583        if (lo && !pnfs_layout_is_valid(lo)) {
3584                calldata->arg.lr_args = NULL;
3585                calldata->res.lr_res = NULL;
3586        }
3587
3588        if (calldata->arg.fmode == 0)
3589                task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE];
3590
3591        if (calldata->arg.fmode == 0 || calldata->arg.fmode == FMODE_READ) {
3592                /* Close-to-open cache consistency revalidation */
3593                if (!nfs4_have_delegation(inode, FMODE_READ))
3594                        calldata->arg.bitmask = NFS_SERVER(inode)->cache_consistency_bitmask;
3595                else
3596                        calldata->arg.bitmask = NULL;
3597        }
3598
3599        calldata->arg.share_access =
3600                nfs4_map_atomic_open_share(NFS_SERVER(inode),
3601                                calldata->arg.fmode, 0);
3602
3603        if (calldata->res.fattr == NULL)
3604                calldata->arg.bitmask = NULL;
3605        else if (calldata->arg.bitmask == NULL)
3606                calldata->res.fattr = NULL;
3607        calldata->timestamp = jiffies;
3608        if (nfs4_setup_sequence(NFS_SERVER(inode)->nfs_client,
3609                                &calldata->arg.seq_args,
3610                                &calldata->res.seq_res,
3611                                task) != 0)
3612                nfs_release_seqid(calldata->arg.seqid);
3613        dprintk("%s: done!\n", __func__);
3614        return;
3615out_no_action:
3616        task->tk_action = NULL;
3617out_wait:
3618        nfs4_sequence_done(task, &calldata->res.seq_res);
3619}
3620
3621static const struct rpc_call_ops nfs4_close_ops = {
3622        .rpc_call_prepare = nfs4_close_prepare,
3623        .rpc_call_done = nfs4_close_done,
3624        .rpc_release = nfs4_free_closedata,
3625};
3626
3627/* 
3628 * It is possible for data to be read/written from a mem-mapped file 
3629 * after the sys_close call (which hits the vfs layer as a flush).
3630 * This means that we can't safely call nfsv4 close on a file until 
3631 * the inode is cleared. This in turn means that we are not good
3632 * NFSv4 citizens - we do not indicate to the server to update the file's 
3633 * share state even when we are done with one of the three share 
3634 * stateid's in the inode.
3635 *
3636 * NOTE: Caller must be holding the sp->so_owner semaphore!
3637 */
3638int nfs4_do_close(struct nfs4_state *state, gfp_t gfp_mask, int wait)
3639{
3640        struct nfs_server *server = NFS_SERVER(state->inode);
3641        struct nfs_seqid *(*alloc_seqid)(struct nfs_seqid_counter *, gfp_t);
3642        struct nfs4_closedata *calldata;
3643        struct nfs4_state_owner *sp = state->owner;
3644        struct rpc_task *task;
3645        struct rpc_message msg = {
3646                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE],
3647                .rpc_cred = state->owner->so_cred,
3648        };
3649        struct rpc_task_setup task_setup_data = {
3650                .rpc_client = server->client,
3651                .rpc_message = &msg,
3652                .callback_ops = &nfs4_close_ops,
3653                .workqueue = nfsiod_workqueue,
3654                .flags = RPC_TASK_ASYNC,
3655        };
3656        int status = -ENOMEM;
3657
3658        nfs4_state_protect(server->nfs_client, NFS_SP4_MACH_CRED_CLEANUP,
3659                &task_setup_data.rpc_client, &msg);
3660
3661        calldata = kzalloc(sizeof(*calldata), gfp_mask);
3662        if (calldata == NULL)
3663                goto out;
3664        nfs4_init_sequence(&calldata->arg.seq_args, &calldata->res.seq_res, 1, 0);
3665        calldata->inode = state->inode;
3666        calldata->state = state;
3667        calldata->arg.fh = NFS_FH(state->inode);
3668        if (!nfs4_copy_open_stateid(&calldata->arg.stateid, state))
3669                goto out_free_calldata;
3670        /* Serialization for the sequence id */
3671        alloc_seqid = server->nfs_client->cl_mvops->alloc_seqid;
3672        calldata->arg.seqid = alloc_seqid(&state->owner->so_seqid, gfp_mask);
3673        if (IS_ERR(calldata->arg.seqid))
3674                goto out_free_calldata;
3675        nfs_fattr_init(&calldata->fattr);
3676        calldata->arg.fmode = 0;
3677        calldata->lr.arg.ld_private = &calldata->lr.ld_private;
3678        calldata->res.fattr = &calldata->fattr;
3679        calldata->res.seqid = calldata->arg.seqid;
3680        calldata->res.server = server;
3681        calldata->res.lr_ret = -NFS4ERR_NOMATCHING_LAYOUT;
3682        calldata->lr.roc = pnfs_roc(state->inode,
3683                        &calldata->lr.arg, &calldata->lr.res, msg.rpc_cred);
3684        if (calldata->lr.roc) {
3685                calldata->arg.lr_args = &calldata->lr.arg;
3686                calldata->res.lr_res = &calldata->lr.res;
3687        }
3688        nfs_sb_active(calldata->inode->i_sb);
3689
3690        msg.rpc_argp = &calldata->arg;
3691        msg.rpc_resp = &calldata->res;
3692        task_setup_data.callback_data = calldata;
3693        task = rpc_run_task(&task_setup_data);
3694        if (IS_ERR(task))
3695                return PTR_ERR(task);
3696        status = 0;
3697        if (wait)
3698                status = rpc_wait_for_completion_task(task);
3699        rpc_put_task(task);
3700        return status;
3701out_free_calldata:
3702        kfree(calldata);
3703out:
3704        nfs4_put_open_state(state);
3705        nfs4_put_state_owner(sp);
3706        return status;
3707}
3708
3709static struct inode *
3710nfs4_atomic_open(struct inode *dir, struct nfs_open_context *ctx,
3711                int open_flags, struct iattr *attr, int *opened)
3712{
3713        struct nfs4_state *state;
3714        struct nfs4_label l = {0, 0, 0, NULL}, *label = NULL;
3715
3716        label = nfs4_label_init_security(dir, ctx->dentry, attr, &l);
3717
3718        /* Protect against concurrent sillydeletes */
3719        state = nfs4_do_open(dir, ctx, open_flags, attr, label, opened);
3720
3721        nfs4_label_release_security(label);
3722
3723        if (IS_ERR(state))
3724                return ERR_CAST(state);
3725        return state->inode;
3726}
3727
3728static void nfs4_close_context(struct nfs_open_context *ctx, int is_sync)
3729{
3730        if (ctx->state == NULL)
3731                return;
3732        if (is_sync)
3733                nfs4_close_sync(ctx->state, _nfs4_ctx_to_openmode(ctx));
3734        else
3735                nfs4_close_state(ctx->state, _nfs4_ctx_to_openmode(ctx));
3736}
3737
3738#define FATTR4_WORD1_NFS40_MASK (2*FATTR4_WORD1_MOUNTED_ON_FILEID - 1UL)
3739#define FATTR4_WORD2_NFS41_MASK (2*FATTR4_WORD2_SUPPATTR_EXCLCREAT - 1UL)
3740#define FATTR4_WORD2_NFS42_MASK (2*FATTR4_WORD2_MODE_UMASK - 1UL)
3741
3742static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
3743{
3744        u32 bitmask[3] = {}, minorversion = server->nfs_client->cl_minorversion;
3745        struct nfs4_server_caps_arg args = {
3746                .fhandle = fhandle,
3747                .bitmask = bitmask,
3748        };
3749        struct nfs4_server_caps_res res = {};
3750        struct rpc_message msg = {
3751                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SERVER_CAPS],
3752                .rpc_argp = &args,
3753                .rpc_resp = &res,
3754        };
3755        int status;
3756        int i;
3757
3758        bitmask[0] = FATTR4_WORD0_SUPPORTED_ATTRS |
3759                     FATTR4_WORD0_FH_EXPIRE_TYPE |
3760                     FATTR4_WORD0_LINK_SUPPORT |
3761                     FATTR4_WORD0_SYMLINK_SUPPORT |
3762                     FATTR4_WORD0_ACLSUPPORT;
3763        if (minorversion)
3764                bitmask[2] = FATTR4_WORD2_SUPPATTR_EXCLCREAT;
3765
3766        status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
3767        if (status == 0) {
3768                /* Sanity check the server answers */
3769                switch (minorversion) {
3770                case 0:
3771                        res.attr_bitmask[1] &= FATTR4_WORD1_NFS40_MASK;
3772                        res.attr_bitmask[2] = 0;
3773                        break;
3774                case 1:
3775                        res.attr_bitmask[2] &= FATTR4_WORD2_NFS41_MASK;
3776                        break;
3777                case 2:
3778                        res.attr_bitmask[2] &= FATTR4_WORD2_NFS42_MASK;
3779                }
3780                memcpy(server->attr_bitmask, res.attr_bitmask, sizeof(server->attr_bitmask));
3781                server->caps &= ~(NFS_CAP_ACLS|NFS_CAP_HARDLINKS|
3782                                NFS_CAP_SYMLINKS|NFS_CAP_FILEID|
3783                                NFS_CAP_MODE|NFS_CAP_NLINK|NFS_CAP_OWNER|
3784                                NFS_CAP_OWNER_GROUP|NFS_CAP_ATIME|
3785                                NFS_CAP_CTIME|NFS_CAP_MTIME|
3786                                NFS_CAP_SECURITY_LABEL);
3787                if (res.attr_bitmask[0] & FATTR4_WORD0_ACL &&
3788                                res.acl_bitmask & ACL4_SUPPORT_ALLOW_ACL)
3789                        server->caps |= NFS_CAP_ACLS;
3790                if (res.has_links != 0)
3791                        server->caps |= NFS_CAP_HARDLINKS;
3792                if (res.has_symlinks != 0)
3793                        server->caps |= NFS_CAP_SYMLINKS;
3794                if (res.attr_bitmask[0] & FATTR4_WORD0_FILEID)
3795                        server->caps |= NFS_CAP_FILEID;
3796                if (res.attr_bitmask[1] & FATTR4_WORD1_MODE)
3797                        server->caps |= NFS_CAP_MODE;
3798                if (res.attr_bitmask[1] & FATTR4_WORD1_NUMLINKS)
3799                        server->caps |= NFS_CAP_NLINK;
3800                if (res.attr_bitmask[1] & FATTR4_WORD1_OWNER)
3801                        server->caps |= NFS_CAP_OWNER;
3802                if (res.attr_bitmask[1] & FATTR4_WORD1_OWNER_GROUP)
3803                        server->caps |= NFS_CAP_OWNER_GROUP;
3804                if (res.attr_bitmask[1] & FATTR4_WORD1_TIME_ACCESS)
3805                        server->caps |= NFS_CAP_ATIME;
3806                if (res.attr_bitmask[1] & FATTR4_WORD1_TIME_METADATA)
3807                        server->caps |= NFS_CAP_CTIME;
3808                if (res.attr_bitmask[1] & FATTR4_WORD1_TIME_MODIFY)
3809                        server->caps |= NFS_CAP_MTIME;
3810#ifdef CONFIG_NFS_V4_SECURITY_LABEL
3811                if (res.attr_bitmask[2] & FATTR4_WORD2_SECURITY_LABEL)
3812                        server->caps |= NFS_CAP_SECURITY_LABEL;
3813#endif
3814                memcpy(server->attr_bitmask_nl, res.attr_bitmask,
3815                                sizeof(server->attr_bitmask));
3816                server->attr_bitmask_nl[2] &= ~FATTR4_WORD2_SECURITY_LABEL;
3817
3818                memcpy(server->cache_consistency_bitmask, res.attr_bitmask, sizeof(server->cache_consistency_bitmask));
3819                server->cache_consistency_bitmask[0] &= FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE;
3820                server->cache_consistency_bitmask[1] &= FATTR4_WORD1_TIME_METADATA|FATTR4_WORD1_TIME_MODIFY;
3821                server->cache_consistency_bitmask[2] = 0;
3822
3823                /* Avoid a regression due to buggy server */
3824                for (i = 0; i < ARRAY_SIZE(res.exclcreat_bitmask); i++)
3825                        res.exclcreat_bitmask[i] &= res.attr_bitmask[i];
3826                memcpy(server->exclcreat_bitmask, res.exclcreat_bitmask,
3827                        sizeof(server->exclcreat_bitmask));
3828
3829                server->acl_bitmask = res.acl_bitmask;
3830                server->fh_expire_type = res.fh_expire_type;
3831        }
3832
3833        return status;
3834}
3835
3836int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
3837{
3838        struct nfs4_exception exception = {
3839                .interruptible = true,
3840        };
3841        int err;
3842        do {
3843                err = nfs4_handle_exception(server,
3844                                _nfs4_server_capabilities(server, fhandle),
3845                                &exception);
3846        } while (exception.retry);
3847        return err;
3848}
3849
3850static int _nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
3851                struct nfs_fsinfo *info)
3852{
3853        u32 bitmask[3];
3854        struct nfs4_lookup_root_arg args = {
3855                .bitmask = bitmask,
3856        };
3857        struct nfs4_lookup_res res = {
3858                .server = server,
3859                .fattr = info->fattr,
3860                .fh = fhandle,
3861        };
3862        struct rpc_message msg = {
3863                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP_ROOT],
3864                .rpc_argp = &args,
3865                .rpc_resp = &res,
3866        };
3867
3868        bitmask[0] = nfs4_fattr_bitmap[0];
3869        bitmask[1] = nfs4_fattr_bitmap[1];
3870        /*
3871         * Process the label in the upcoming getfattr
3872         */
3873        bitmask[2] = nfs4_fattr_bitmap[2] & ~FATTR4_WORD2_SECURITY_LABEL;
3874
3875        nfs_fattr_init(info->fattr);
3876        return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
3877}
3878
3879static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
3880                struct nfs_fsinfo *info)
3881{
3882        struct nfs4_exception exception = {
3883                .interruptible = true,
3884        };
3885        int err;
3886        do {
3887                err = _nfs4_lookup_root(server, fhandle, info);
3888                trace_nfs4_lookup_root(server, fhandle, info->fattr, err);
3889                switch (err) {
3890                case 0:
3891                case -NFS4ERR_WRONGSEC:
3892                        goto out;
3893                default:
3894                        err = nfs4_handle_exception(server, err, &exception);
3895                }
3896        } while (exception.retry);
3897out:
3898        return err;
3899}
3900
3901static int nfs4_lookup_root_sec(struct nfs_server *server, struct nfs_fh *fhandle,
3902                                struct nfs_fsinfo *info, rpc_authflavor_t flavor)
3903{
3904        struct rpc_auth_create_args auth_args = {
3905                .pseudoflavor = flavor,
3906        };
3907        struct rpc_auth *auth;
3908
3909        auth = rpcauth_create(&auth_args, server->client);
3910        if (IS_ERR(auth))
3911                return -EACCES;
3912        return nfs4_lookup_root(server, fhandle, info);
3913}
3914
3915/*
3916 * Retry pseudoroot lookup with various security flavors.  We do this when:
3917 *
3918 *   NFSv4.0: the PUTROOTFH operation returns NFS4ERR_WRONGSEC
3919 *   NFSv4.1: the server does not support the SECINFO_NO_NAME operation
3920 *
3921 * Returns zero on success, or a negative NFS4ERR value, or a
3922 * negative errno value.
3923 */
3924static int nfs4_find_root_sec(struct nfs_server *server, struct nfs_fh *fhandle,
3925                              struct nfs_fsinfo *info)
3926{
3927        /* Per 3530bis 15.33.5 */
3928        static const rpc_authflavor_t flav_array[] = {
3929                RPC_AUTH_GSS_KRB5P,
3930                RPC_AUTH_GSS_KRB5I,
3931                RPC_AUTH_GSS_KRB5,
3932                RPC_AUTH_UNIX,                  /* courtesy */
3933                RPC_AUTH_NULL,
3934        };
3935        int status = -EPERM;
3936        size_t i;
3937
3938        if (server->auth_info.flavor_len > 0) {
3939                /* try each flavor specified by user */
3940                for (i = 0; i < server->auth_info.flavor_len; i++) {
3941                        status = nfs4_lookup_root_sec(server, fhandle, info,
3942                                                server->auth_info.flavors[i]);
3943                        if (status == -NFS4ERR_WRONGSEC || status == -EACCES)
3944                                continue;
3945                        break;
3946                }
3947        } else {
3948                /* no flavors specified by user, try default list */
3949                for (i = 0; i < ARRAY_SIZE(flav_array); i++) {
3950                        status = nfs4_lookup_root_sec(server, fhandle, info,
3951                                                      flav_array[i]);
3952                        if (status == -NFS4ERR_WRONGSEC || status == -EACCES)
3953                                continue;
3954                        break;
3955                }
3956        }
3957
3958        /*
3959         * -EACCES could mean that the user doesn't have correct permissions
3960         * to access the mount.  It could also mean that we tried to mount
3961         * with a gss auth flavor, but rpc.gssd isn't running.  Either way,
3962         * existing mount programs don't handle -EACCES very well so it should
3963         * be mapped to -EPERM instead.
3964         */
3965        if (status == -EACCES)
3966                status = -EPERM;
3967        return status;
3968}
3969
3970/**
3971 * nfs4_proc_get_rootfh - get file handle for server's pseudoroot
3972 * @server: initialized nfs_server handle
3973 * @fhandle: we fill in the pseudo-fs root file handle
3974 * @info: we fill in an FSINFO struct
3975 * @auth_probe: probe the auth flavours
3976 *
3977 * Returns zero on success, or a negative errno.
3978 */
3979int nfs4_proc_get_rootfh(struct nfs_server *server, struct nfs_fh *fhandle,
3980                         struct nfs_fsinfo *info,
3981                         bool auth_probe)
3982{
3983        int status = 0;
3984
3985        if (!auth_probe)
3986                status = nfs4_lookup_root(server, fhandle, info);
3987
3988        if (auth_probe || status == NFS4ERR_WRONGSEC)
3989                status = server->nfs_client->cl_mvops->find_root_sec(server,
3990                                fhandle, info);
3991
3992        if (status == 0)
3993                status = nfs4_server_capabilities(server, fhandle);
3994        if (status == 0)
3995                status = nfs4_do_fsinfo(server, fhandle, info);
3996
3997        return nfs4_map_errors(status);
3998}
3999
4000static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *mntfh,
4001                              struct nfs_fsinfo *info)
4002{
4003        int error;
4004        struct nfs_fattr *fattr = info->fattr;
4005        struct nfs4_label *label = NULL;
4006
4007        error = nfs4_server_capabilities(server, mntfh);
4008        if (error < 0) {
4009                dprintk("nfs4_get_root: getcaps error = %d\n", -error);
4010                return error;
4011        }
4012
4013        label = nfs4_label_alloc(server, GFP_KERNEL);
4014        if (IS_ERR(label))
4015                return PTR_ERR(label);
4016
4017        error = nfs4_proc_getattr(server, mntfh, fattr, label, NULL);
4018        if (error < 0) {
4019                dprintk("nfs4_get_root: getattr error = %d\n", -error);
4020                goto err_free_label;
4021        }
4022
4023        if (fattr->valid & NFS_ATTR_FATTR_FSID &&
4024            !nfs_fsid_equal(&server->fsid, &fattr->fsid))
4025                memcpy(&server->fsid, &fattr->fsid, sizeof(server->fsid));
4026
4027err_free_label:
4028        nfs4_label_free(label);
4029
4030        return error;
4031}
4032
4033/*
4034 * Get locations and (maybe) other attributes of a referral.
4035 * Note that we'll actually follow the referral later when
4036 * we detect fsid mismatch in inode revalidation
4037 */
4038static int nfs4_get_referral(struct rpc_clnt *client, struct inode *dir,
4039                             const struct qstr *name, struct nfs_fattr *fattr,
4040                             struct nfs_fh *fhandle)
4041{
4042        int status = -ENOMEM;
4043        struct page *page = NULL;
4044        struct nfs4_fs_locations *locations = NULL;
4045
4046        page = alloc_page(GFP_KERNEL);
4047        if (page == NULL)
4048                goto out;
4049        locations = kmalloc(sizeof(struct nfs4_fs_locations), GFP_KERNEL);
4050        if (locations == NULL)
4051                goto out;
4052
4053        status = nfs4_proc_fs_locations(client, dir, name, locations, page);
4054        if (status != 0)
4055                goto out;
4056
4057        /*
4058         * If the fsid didn't change, this is a migration event, not a
4059         * referral.  Cause us to drop into the exception handler, which
4060         * will kick off migration recovery.
4061         */
4062        if (nfs_fsid_equal(&NFS_SERVER(dir)->fsid, &locations->fattr.fsid)) {
4063                dprintk("%s: server did not return a different fsid for"
4064                        " a referral at %s\n", __func__, name->name);
4065                status = -NFS4ERR_MOVED;
4066                goto out;
4067        }
4068        /* Fixup attributes for the nfs_lookup() call to nfs_fhget() */
4069        nfs_fixup_referral_attributes(&locations->fattr);
4070
4071        /* replace the lookup nfs_fattr with the locations nfs_fattr */
4072        memcpy(fattr, &locations->fattr, sizeof(struct nfs_fattr));
4073        memset(fhandle, 0, sizeof(struct nfs_fh));
4074out:
4075        if (page)
4076                __free_page(page);
4077        kfree(locations);
4078        return status;
4079}
4080
4081static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
4082                                struct nfs_fattr *fattr, struct nfs4_label *label,
4083                                struct inode *inode)
4084{
4085        __u32 bitmask[NFS4_BITMASK_SZ];
4086        struct nfs4_getattr_arg args = {
4087                .fh = fhandle,
4088                .bitmask = bitmask,
4089        };
4090        struct nfs4_getattr_res res = {
4091                .fattr = fattr,
4092                .label = label,
4093                .server = server,
4094        };
4095        struct rpc_message msg = {
4096                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETATTR],
4097                .rpc_argp = &args,
4098                .rpc_resp = &res,
4099        };
4100        unsigned short task_flags = 0;
4101
4102        /* Is this is an attribute revalidation, subject to softreval? */
4103        if (inode && (server->flags & NFS_MOUNT_SOFTREVAL))
4104                task_flags |= RPC_TASK_TIMEOUT;
4105
4106        nfs4_bitmap_copy_adjust(bitmask, nfs4_bitmask(server, label), inode);
4107
4108        nfs_fattr_init(fattr);
4109        nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 0);
4110        return nfs4_do_call_sync(server->client, server, &msg,
4111                        &args.seq_args, &res.seq_res, task_flags);
4112}
4113
4114int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
4115                                struct nfs_fattr *fattr, struct nfs4_label *label,
4116                                struct inode *inode)
4117{
4118        struct nfs4_exception exception = {
4119                .interruptible = true,
4120        };
4121        int err;
4122        do {
4123                err = _nfs4_proc_getattr(server, fhandle, fattr, label, inode);
4124                trace_nfs4_getattr(server, fhandle, fattr, err);
4125                err = nfs4_handle_exception(server, err,
4126                                &exception);
4127        } while (exception.retry);
4128        return err;
4129}
4130
4131/* 
4132 * The file is not closed if it is opened due to the a request to change
4133 * the size of the file. The open call will not be needed once the
4134 * VFS layer lookup-intents are implemented.
4135 *
4136 * Close is called when the inode is destroyed.
4137 * If we haven't opened the file for O_WRONLY, we
4138 * need to in the size_change case to obtain a stateid.
4139 *
4140 * Got race?
4141 * Because OPEN is always done by name in nfsv4, it is
4142 * possible that we opened a different file by the same
4143 * name.  We can recognize this race condition, but we
4144 * can't do anything about it besides returning an error.
4145 *
4146 * This will be fixed with VFS changes (lookup-intent).
4147 */
4148static int
4149nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
4150                  struct iattr *sattr)
4151{
4152        struct inode *inode = d_inode(dentry);
4153        const struct cred *cred = NULL;
4154        struct nfs_open_context *ctx = NULL;
4155        struct nfs4_label *label = NULL;
4156        int status;
4157
4158        if (pnfs_ld_layoutret_on_setattr(inode) &&
4159            sattr->ia_valid & ATTR_SIZE &&
4160            sattr->ia_size < i_size_read(inode))
4161                pnfs_commit_and_return_layout(inode);
4162
4163        nfs_fattr_init(fattr);
4164        
4165        /* Deal with open(O_TRUNC) */
4166        if (sattr->ia_valid & ATTR_OPEN)
4167                sattr->ia_valid &= ~(ATTR_MTIME|ATTR_CTIME);
4168
4169        /* Optimization: if the end result is no change, don't RPC */
4170        if ((sattr->ia_valid & ~(ATTR_FILE|ATTR_OPEN)) == 0)
4171                return 0;
4172
4173        /* Search for an existing open(O_WRITE) file */
4174        if (sattr->ia_valid & ATTR_FILE) {
4175
4176                ctx = nfs_file_open_context(sattr->ia_file);
4177                if (ctx)
4178                        cred = ctx->cred;
4179        }
4180
4181        label = nfs4_label_alloc(NFS_SERVER(inode), GFP_KERNEL);
4182        if (IS_ERR(label))
4183                return PTR_ERR(label);
4184
4185        /* Return any delegations if we're going to change ACLs */
4186        if ((sattr->ia_valid & (ATTR_MODE|ATTR_UID|ATTR_GID)) != 0)
4187                nfs4_inode_make_writeable(inode);
4188
4189        status = nfs4_do_setattr(inode, cred, fattr, sattr, ctx, NULL, label);
4190        if (status == 0) {
4191                nfs_setattr_update_inode(inode, sattr, fattr);
4192                nfs_setsecurity(inode, fattr, label);
4193        }
4194        nfs4_label_free(label);
4195        return status;
4196}
4197
4198static int _nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir,
4199                struct dentry *dentry, struct nfs_fh *fhandle,
4200                struct nfs_fattr *fattr, struct nfs4_label *label)
4201{
4202        struct nfs_server *server = NFS_SERVER(dir);
4203        int                    status;
4204        struct nfs4_lookup_arg args = {
4205                .bitmask = server->attr_bitmask,
4206                .dir_fh = NFS_FH(dir),
4207                .name = &dentry->d_name,
4208        };
4209        struct nfs4_lookup_res res = {
4210                .server = server,
4211                .fattr = fattr,
4212                .label = label,
4213                .fh = fhandle,
4214        };
4215        struct rpc_message msg = {
4216                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP],
4217                .rpc_argp = &args,
4218                .rpc_resp = &res,
4219        };
4220        unsigned short task_flags = 0;
4221
4222        /* Is this is an attribute revalidation, subject to softreval? */
4223        if (nfs_lookup_is_soft_revalidate(dentry))
4224                task_flags |= RPC_TASK_TIMEOUT;
4225
4226        args.bitmask = nfs4_bitmask(server, label);
4227
4228        nfs_fattr_init(fattr);
4229
4230        dprintk("NFS call  lookup %pd2\n", dentry);
4231        nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 0);
4232        status = nfs4_do_call_sync(clnt, server, &msg,
4233                        &args.seq_args, &res.seq_res, task_flags);
4234        dprintk("NFS reply lookup: %d\n", status);
4235        return status;
4236}
4237
4238static void nfs_fixup_secinfo_attributes(struct nfs_fattr *fattr)
4239{
4240        fattr->valid |= NFS_ATTR_FATTR_TYPE | NFS_ATTR_FATTR_MODE |
4241                NFS_ATTR_FATTR_NLINK | NFS_ATTR_FATTR_MOUNTPOINT;
4242        fattr->mode = S_IFDIR | S_IRUGO | S_IXUGO;
4243        fattr->nlink = 2;
4244}
4245
4246static int nfs4_proc_lookup_common(struct rpc_clnt **clnt, struct inode *dir,
4247                                   struct dentry *dentry, struct nfs_fh *fhandle,
4248                                   struct nfs_fattr *fattr, struct nfs4_label *label)
4249{
4250        struct nfs4_exception exception = {
4251                .interruptible = true,
4252        };
4253        struct rpc_clnt *client = *clnt;
4254        const struct qstr *name = &dentry->d_name;
4255        int err;
4256        do {
4257                err = _nfs4_proc_lookup(client, dir, dentry, fhandle, fattr, label);
4258                trace_nfs4_lookup(dir, name, err);
4259                switch (err) {
4260                case -NFS4ERR_BADNAME:
4261                        err = -ENOENT;
4262                        goto out;
4263                case -NFS4ERR_MOVED:
4264                        err = nfs4_get_referral(client, dir, name, fattr, fhandle);
4265                        if (err == -NFS4ERR_MOVED)
4266                                err = nfs4_handle_exception(NFS_SERVER(dir), err, &exception);
4267                        goto out;
4268                case -NFS4ERR_WRONGSEC:
4269                        err = -EPERM;
4270                        if (client != *clnt)
4271                                goto out;
4272                        client = nfs4_negotiate_security(client, dir, name);
4273                        if (IS_ERR(client))
4274                                return PTR_ERR(client);
4275
4276                        exception.retry = 1;
4277                        break;
4278                default:
4279                        err = nfs4_handle_exception(NFS_SERVER(dir), err, &exception);
4280                }
4281        } while (exception.retry);
4282
4283out:
4284        if (err == 0)
4285                *clnt = client;
4286        else if (client != *clnt)
4287                rpc_shutdown_client(client);
4288
4289        return err;
4290}
4291
4292static int nfs4_proc_lookup(struct inode *dir, struct dentry *dentry,
4293                            struct nfs_fh *fhandle, struct nfs_fattr *fattr,
4294                            struct nfs4_label *label)
4295{
4296        int status;
4297        struct rpc_clnt *client = NFS_CLIENT(dir);
4298
4299        status = nfs4_proc_lookup_common(&client, dir, dentry, fhandle, fattr, label);
4300        if (client != NFS_CLIENT(dir)) {
4301                rpc_shutdown_client(client);
4302                nfs_fixup_secinfo_attributes(fattr);
4303        }
4304        return status;
4305}
4306
4307struct rpc_clnt *
4308nfs4_proc_lookup_mountpoint(struct inode *dir, struct dentry *dentry,
4309                            struct nfs_fh *fhandle, struct nfs_fattr *fattr)
4310{
4311        struct rpc_clnt *client = NFS_CLIENT(dir);
4312        int status;
4313
4314        status = nfs4_proc_lookup_common(&client, dir, dentry, fhandle, fattr, NULL);
4315        if (status < 0)
4316                return ERR_PTR(status);
4317        return (client == NFS_CLIENT(dir)) ? rpc_clone_client(client) : client;
4318}
4319
4320static int _nfs4_proc_lookupp(struct inode *inode,
4321                struct nfs_fh *fhandle, struct nfs_fattr *fattr,
4322                struct nfs4_label *label)
4323{
4324        struct rpc_clnt *clnt = NFS_CLIENT(inode);
4325        struct nfs_server *server = NFS_SERVER(inode);
4326        int                    status;
4327        struct nfs4_lookupp_arg args = {
4328                .bitmask = server->attr_bitmask,
4329                .fh = NFS_FH(inode),
4330        };
4331        struct nfs4_lookupp_res res = {
4332                .server = server,
4333                .fattr = fattr,
4334                .label = label,
4335                .fh = fhandle,
4336        };
4337        struct rpc_message msg = {
4338                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUPP],
4339                .rpc_argp = &args,
4340                .rpc_resp = &res,
4341        };
4342
4343        args.bitmask = nfs4_bitmask(server, label);
4344
4345        nfs_fattr_init(fattr);
4346
4347        dprintk("NFS call  lookupp ino=0x%lx\n", inode->i_ino);
4348        status = nfs4_call_sync(clnt, server, &msg, &args.seq_args,
4349                                &res.seq_res, 0);
4350        dprintk("NFS reply lookupp: %d\n", status);
4351        return status;
4352}
4353
4354static int nfs4_proc_lookupp(struct inode *inode, struct nfs_fh *fhandle,
4355                             struct nfs_fattr *fattr, struct nfs4_label *label)
4356{
4357        struct nfs4_exception exception = {
4358                .interruptible = true,
4359        };
4360        int err;
4361        do {
4362                err = _nfs4_proc_lookupp(inode, fhandle, fattr, label);
4363                trace_nfs4_lookupp(inode, err);
4364                err = nfs4_handle_exception(NFS_SERVER(inode), err,
4365                                &exception);
4366        } while (exception.retry);
4367        return err;
4368}
4369
4370static int _nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
4371{
4372        struct nfs_server *server = NFS_SERVER(inode);
4373        struct nfs4_accessargs args = {
4374                .fh = NFS_FH(inode),
4375                .access = entry->mask,
4376        };
4377        struct nfs4_accessres res = {
4378                .server = server,
4379        };
4380        struct rpc_message msg = {
4381                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_ACCESS],
4382                .rpc_argp = &args,
4383                .rpc_resp = &res,
4384                .rpc_cred = entry->cred,
4385        };
4386        int status = 0;
4387
4388        if (!nfs4_have_delegation(inode, FMODE_READ)) {
4389                res.fattr = nfs_alloc_fattr();
4390                if (res.fattr == NULL)
4391                        return -ENOMEM;
4392                args.bitmask = server->cache_consistency_bitmask;
4393        }
4394        status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
4395        if (!status) {
4396                nfs_access_set_mask(entry, res.access);
4397                if (res.fattr)
4398                        nfs_refresh_inode(inode, res.fattr);
4399        }
4400        nfs_free_fattr(res.fattr);
4401        return status;
4402}
4403
4404static int nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
4405{
4406        struct nfs4_exception exception = {
4407                .interruptible = true,
4408        };
4409        int err;
4410        do {
4411                err = _nfs4_proc_access(inode, entry);
4412                trace_nfs4_access(inode, err);
4413                err = nfs4_handle_exception(NFS_SERVER(inode), err,
4414                                &exception);
4415        } while (exception.retry);
4416        return err;
4417}
4418
4419/*
4420 * TODO: For the time being, we don't try to get any attributes
4421 * along with any of the zero-copy operations READ, READDIR,
4422 * READLINK, WRITE.
4423 *
4424 * In the case of the first three, we want to put the GETATTR
4425 * after the read-type operation -- this is because it is hard
4426 * to predict the length of a GETATTR response in v4, and thus
4427 * align the READ data correctly.  This means that the GETATTR
4428 * may end up partially falling into the page cache, and we should
4429 * shift it into the 'tail' of the xdr_buf before processing.
4430 * To do this efficiently, we need to know the total length
4431 * of data received, which doesn't seem to be available outside
4432 * of the RPC layer.
4433 *
4434 * In the case of WRITE, we also want to put the GETATTR after
4435 * the operation -- in this case because we want to make sure
4436 * we get the post-operation mtime and size.
4437 *
4438 * Both of these changes to the XDR layer would in fact be quite
4439 * minor, but I decided to leave them for a subsequent patch.
4440 */
4441static int _nfs4_proc_readlink(struct inode *inode, struct page *page,
4442                unsigned int pgbase, unsigned int pglen)
4443{
4444        struct nfs4_readlink args = {
4445                .fh       = NFS_FH(inode),
4446                .pgbase   = pgbase,
4447                .pglen    = pglen,
4448                .pages    = &page,
4449        };
4450        struct nfs4_readlink_res res;
4451        struct rpc_message msg = {
4452                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READLINK],
4453                .rpc_argp = &args,
4454                .rpc_resp = &res,
4455        };
4456
4457        return nfs4_call_sync(NFS_SERVER(inode)->client, NFS_SERVER(inode), &msg, &args.seq_args, &res.seq_res, 0);
4458}
4459
4460static int nfs4_proc_readlink(struct inode *inode, struct page *page,
4461                unsigned int pgbase, unsigned int pglen)
4462{
4463        struct nfs4_exception exception = {
4464                .interruptible = true,
4465        };
4466        int err;
4467        do {
4468                err = _nfs4_proc_readlink(inode, page, pgbase, pglen);
4469                trace_nfs4_readlink(inode, err);
4470                err = nfs4_handle_exception(NFS_SERVER(inode), err,
4471                                &exception);
4472        } while (exception.retry);
4473        return err;
4474}
4475
4476/*
4477 * This is just for mknod.  open(O_CREAT) will always do ->open_context().
4478 */
4479static int
4480nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
4481                 int flags)
4482{
4483        struct nfs_server *server = NFS_SERVER(dir);
4484        struct nfs4_label l, *ilabel = NULL;
4485        struct nfs_open_context *ctx;
4486        struct nfs4_state *state;
4487        int status = 0;
4488
4489        ctx = alloc_nfs_open_context(dentry, FMODE_READ, NULL);
4490        if (IS_ERR(ctx))
4491                return PTR_ERR(ctx);
4492
4493        ilabel = nfs4_label_init_security(dir, dentry, sattr, &l);
4494
4495        if (!(server->attr_bitmask[2] & FATTR4_WORD2_MODE_UMASK))
4496                sattr->ia_mode &= ~current_umask();
4497        state = nfs4_do_open(dir, ctx, flags, sattr, ilabel, NULL);
4498        if (IS_ERR(state)) {
4499                status = PTR_ERR(state);
4500                goto out;
4501        }
4502out:
4503        nfs4_label_release_security(ilabel);
4504        put_nfs_open_context(ctx);
4505        return status;
4506}
4507
4508static int
4509_nfs4_proc_remove(struct inode *dir, const struct qstr *name, u32 ftype)
4510{
4511        struct nfs_server *server = NFS_SERVER(dir);
4512        struct nfs_removeargs args = {
4513                .fh = NFS_FH(dir),
4514                .name = *name,
4515        };
4516        struct nfs_removeres res = {
4517                .server = server,
4518        };
4519        struct rpc_message msg = {
4520                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE],
4521                .rpc_argp = &args,
4522                .rpc_resp = &res,
4523        };
4524        unsigned long timestamp = jiffies;
4525        int status;
4526
4527        status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 1);
4528        if (status == 0) {
4529                spin_lock(&dir->i_lock);
4530                update_changeattr_locked(dir, &res.cinfo, timestamp, 0);
4531                /* Removing a directory decrements nlink in the parent */
4532                if (ftype == NF4DIR && dir->i_nlink > 2)
4533                        nfs4_dec_nlink_locked(dir);
4534                spin_unlock(&dir->i_lock);
4535        }
4536        return status;
4537}
4538
4539static int nfs4_proc_remove(struct inode *dir, struct dentry *dentry)
4540{
4541        struct nfs4_exception exception = {
4542                .interruptible = true,
4543        };
4544        struct inode *inode = d_inode(dentry);
4545        int err;
4546
4547        if (inode) {
4548                if (inode->i_nlink == 1)
4549                        nfs4_inode_return_delegation(inode);
4550                else
4551                        nfs4_inode_make_writeable(inode);
4552        }
4553        do {
4554                err = _nfs4_proc_remove(dir, &dentry->d_name, NF4REG);
4555                trace_nfs4_remove(dir, &dentry->d_name, err);
4556                err = nfs4_handle_exception(NFS_SERVER(dir), err,
4557                                &exception);
4558        } while (exception.retry);
4559        return err;
4560}
4561
4562static int nfs4_proc_rmdir(struct inode *dir, const struct qstr *name)
4563{
4564        struct nfs4_exception exception = {
4565                .interruptible = true,
4566        };
4567        int err;
4568
4569        do {
4570                err = _nfs4_proc_remove(dir, name, NF4DIR);
4571                trace_nfs4_remove(dir, name, err);
4572                err = nfs4_handle_exception(NFS_SERVER(dir), err,
4573                                &exception);
4574        } while (exception.retry);
4575        return err;
4576}
4577
4578static void nfs4_proc_unlink_setup(struct rpc_message *msg,
4579                struct dentry *dentry,
4580                struct inode *inode)
4581{
4582        struct nfs_removeargs *args = msg->rpc_argp;
4583        struct nfs_removeres *res = msg->rpc_resp;
4584
4585        res->server = NFS_SB(dentry->d_sb);
4586        msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE];
4587        nfs4_init_sequence(&args->seq_args, &res->seq_res, 1, 0);
4588
4589        nfs_fattr_init(res->dir_attr);
4590
4591        if (inode)
4592                nfs4_inode_return_delegation(inode);
4593}
4594
4595static void nfs4_proc_unlink_rpc_prepare(struct rpc_task *task, struct nfs_unlinkdata *data)
4596{
4597        nfs4_setup_sequence(NFS_SB(data->dentry->d_sb)->nfs_client,
4598                        &data->args.seq_args,
4599                        &data->res.seq_res,
4600                        task);
4601}
4602
4603static int nfs4_proc_unlink_done(struct rpc_task *task, struct inode *dir)
4604{
4605        struct nfs_unlinkdata *data = task->tk_calldata;
4606        struct nfs_removeres *res = &data->res;
4607
4608        if (!nfs4_sequence_done(task, &res->seq_res))
4609                return 0;
4610        if (nfs4_async_handle_error(task, res->server, NULL,
4611                                    &data->timeout) == -EAGAIN)
4612                return 0;
4613        if (task->tk_status == 0)
4614                update_changeattr(dir, &res->cinfo,
4615                                res->dir_attr->time_start, 0);
4616        return 1;
4617}
4618
4619static void nfs4_proc_rename_setup(struct rpc_message *msg,
4620                struct dentry *old_dentry,
4621                struct dentry *new_dentry)
4622{
4623        struct nfs_renameargs *arg = msg->rpc_argp;
4624        struct nfs_renameres *res = msg->rpc_resp;
4625        struct inode *old_inode = d_inode(old_dentry);
4626        struct inode *new_inode = d_inode(new_dentry);
4627
4628        if (old_inode)
4629                nfs4_inode_make_writeable(old_inode);
4630        if (new_inode)
4631                nfs4_inode_return_delegation(new_inode);
4632        msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENAME];
4633        res->server = NFS_SB(old_dentry->d_sb);
4634        nfs4_init_sequence(&arg->seq_args, &res->seq_res, 1, 0);
4635}
4636
4637static void nfs4_proc_rename_rpc_prepare(struct rpc_task *task, struct nfs_renamedata *data)
4638{
4639        nfs4_setup_sequence(NFS_SERVER(data->old_dir)->nfs_client,
4640                        &data->args.seq_args,
4641                        &data->res.seq_res,
4642                        task);
4643}
4644
4645static int nfs4_proc_rename_done(struct rpc_task *task, struct inode *old_dir,
4646                                 struct inode *new_dir)
4647{
4648        struct nfs_renamedata *data = task->tk_calldata;
4649        struct nfs_renameres *res = &data->res;
4650
4651        if (!nfs4_sequence_done(task, &res->seq_res))
4652                return 0;
4653        if (nfs4_async_handle_error(task, res->server, NULL, &data->timeout) == -EAGAIN)
4654                return 0;
4655
4656        if (task->tk_status == 0) {
4657                if (new_dir != old_dir) {
4658                        /* Note: If we moved a directory, nlink will change */
4659                        update_changeattr(old_dir, &res->old_cinfo,
4660                                        res->old_fattr->time_start,
4661                                        NFS_INO_INVALID_OTHER);
4662                        update_changeattr(new_dir, &res->new_cinfo,
4663                                        res->new_fattr->time_start,
4664                                        NFS_INO_INVALID_OTHER);
4665                } else
4666                        update_changeattr(old_dir, &res->old_cinfo,
4667                                        res->old_fattr->time_start,
4668                                        0);
4669        }
4670        return 1;
4671}
4672
4673static int _nfs4_proc_link(struct inode *inode, struct inode *dir, const struct qstr *name)
4674{
4675        struct nfs_server *server = NFS_SERVER(inode);
4676        __u32 bitmask[NFS4_BITMASK_SZ];
4677        struct nfs4_link_arg arg = {
4678                .fh     = NFS_FH(inode),
4679                .dir_fh = NFS_FH(dir),
4680                .name   = name,
4681                .bitmask = bitmask,
4682        };
4683        struct nfs4_link_res res = {
4684                .server = server,
4685                .label = NULL,
4686        };
4687        struct rpc_message msg = {
4688                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LINK],
4689                .rpc_argp = &arg,
4690                .rpc_resp = &res,
4691        };
4692        int status = -ENOMEM;
4693
4694        res.fattr = nfs_alloc_fattr();
4695        if (res.fattr == NULL)
4696                goto out;
4697
4698        res.label = nfs4_label_alloc(server, GFP_KERNEL);
4699        if (IS_ERR(res.label)) {
4700                status = PTR_ERR(res.label);
4701                goto out;
4702        }
4703
4704        nfs4_inode_make_writeable(inode);
4705        nfs4_bitmap_copy_adjust_setattr(bitmask, nfs4_bitmask(server, res.label), inode);
4706
4707        status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
4708        if (!status) {
4709                update_changeattr(dir, &res.cinfo, res.fattr->time_start, 0);
4710                status = nfs_post_op_update_inode(inode, res.fattr);
4711                if (!status)
4712                        nfs_setsecurity(inode, res.fattr, res.label);
4713        }
4714
4715
4716        nfs4_label_free(res.label);
4717
4718out:
4719        nfs_free_fattr(res.fattr);
4720        return status;
4721}
4722
4723static int nfs4_proc_link(struct inode *inode, struct inode *dir, const struct qstr *name)
4724{
4725        struct nfs4_exception exception = {
4726                .interruptible = true,
4727        };
4728        int err;
4729        do {
4730                err = nfs4_handle_exception(NFS_SERVER(inode),
4731                                _nfs4_proc_link(inode, dir, name),
4732                                &exception);
4733        } while (exception.retry);
4734        return err;
4735}
4736
4737struct nfs4_createdata {
4738        struct rpc_message msg;
4739        struct nfs4_create_arg arg;
4740        struct nfs4_create_res res;
4741        struct nfs_fh fh;
4742        struct nfs_fattr fattr;
4743        struct nfs4_label *label;
4744};
4745
4746static struct nfs4_createdata *nfs4_alloc_createdata(struct inode *dir,
4747                const struct qstr *name, struct iattr *sattr, u32 ftype)
4748{
4749        struct nfs4_createdata *data;
4750
4751        data = kzalloc(sizeof(*data), GFP_KERNEL);
4752        if (data != NULL) {
4753                struct nfs_server *server = NFS_SERVER(dir);
4754
4755                data->label = nfs4_label_alloc(server, GFP_KERNEL);
4756                if (IS_ERR(data->label))
4757                        goto out_free;
4758
4759                data->msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE];
4760                data->msg.rpc_argp = &data->arg;
4761                data->msg.rpc_resp = &data->res;
4762                data->arg.dir_fh = NFS_FH(dir);
4763                data->arg.server = server;
4764                data->arg.name = name;
4765                data->arg.attrs = sattr;
4766                data->arg.ftype = ftype;
4767                data->arg.bitmask = nfs4_bitmask(server, data->label);
4768                data->arg.umask = current_umask();
4769                data->res.server = server;
4770                data->res.fh = &data->fh;
4771                data->res.fattr = &data->fattr;
4772                data->res.label = data->label;
4773                nfs_fattr_init(data->res.fattr);
4774        }
4775        return data;
4776out_free:
4777        kfree(data);
4778        return NULL;
4779}
4780
4781static int nfs4_do_create(struct inode *dir, struct dentry *dentry, struct nfs4_createdata *data)
4782{
4783        int status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &data->msg,
4784                                    &data->arg.seq_args, &data->res.seq_res, 1);
4785        if (status == 0) {
4786                spin_lock(&dir->i_lock);
4787                update_changeattr_locked(dir, &data->res.dir_cinfo,
4788                                data->res.fattr->time_start, 0);
4789                /* Creating a directory bumps nlink in the parent */
4790                if (data->arg.ftype == NF4DIR)
4791                        nfs4_inc_nlink_locked(dir);
4792                spin_unlock(&dir->i_lock);
4793                status = nfs_instantiate(dentry, data->res.fh, data->res.fattr, data->res.label);
4794        }
4795        return status;
4796}
4797
4798static void nfs4_free_createdata(struct nfs4_createdata *data)
4799{
4800        nfs4_label_free(data->label);
4801        kfree(data);
4802}
4803
4804static int _nfs4_proc_symlink(struct inode *dir, struct dentry *dentry,
4805                struct page *page, unsigned int len, struct iattr *sattr,
4806                struct nfs4_label *label)
4807{
4808        struct nfs4_createdata *data;
4809        int status = -ENAMETOOLONG;
4810
4811        if (len > NFS4_MAXPATHLEN)
4812                goto out;
4813
4814        status = -ENOMEM;
4815        data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4LNK);
4816        if (data == NULL)
4817                goto out;
4818
4819        data->msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SYMLINK];
4820        data->arg.u.symlink.pages = &page;
4821        data->arg.u.symlink.len = len;
4822        data->arg.label = label;
4823        
4824        status = nfs4_do_create(dir, dentry, data);
4825
4826        nfs4_free_createdata(data);
4827out:
4828        return status;
4829}
4830
4831static int nfs4_proc_symlink(struct inode *dir, struct dentry *dentry,
4832                struct page *page, unsigned int len, struct iattr *sattr)
4833{
4834        struct nfs4_exception exception = {
4835                .interruptible = true,
4836        };
4837        struct nfs4_label l, *label = NULL;
4838        int err;
4839
4840        label = nfs4_label_init_security(dir, dentry, sattr, &l);
4841
4842        do {
4843                err = _nfs4_proc_symlink(dir, dentry, page, len, sattr, label);
4844                trace_nfs4_symlink(dir, &dentry->d_name, err);
4845                err = nfs4_handle_exception(NFS_SERVER(dir), err,
4846                                &exception);
4847        } while (exception.retry);
4848
4849        nfs4_label_release_security(label);
4850        return err;
4851}
4852
4853static int _nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry,
4854                struct iattr *sattr, struct nfs4_label *label)
4855{
4856        struct nfs4_createdata *data;
4857        int status = -ENOMEM;
4858
4859        data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4DIR);
4860        if (data == NULL)
4861                goto out;
4862
4863        data->arg.label = label;
4864        status = nfs4_do_create(dir, dentry, data);
4865
4866        nfs4_free_createdata(data);
4867out:
4868        return status;
4869}
4870
4871static int nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry,
4872                struct iattr *sattr)
4873{
4874        struct nfs_server *server = NFS_SERVER(dir);
4875        struct nfs4_exception exception = {
4876                .interruptible = true,
4877        };
4878        struct nfs4_label l, *label = NULL;
4879        int err;
4880
4881        label = nfs4_label_init_security(dir, dentry, sattr, &l);
4882
4883        if (!(server->attr_bitmask[2] & FATTR4_WORD2_MODE_UMASK))
4884                sattr->ia_mode &= ~current_umask();
4885        do {
4886                err = _nfs4_proc_mkdir(dir, dentry, sattr, label);
4887                trace_nfs4_mkdir(dir, &dentry->d_name, err);
4888                err = nfs4_handle_exception(NFS_SERVER(dir), err,
4889                                &exception);
4890        } while (exception.retry);
4891        nfs4_label_release_security(label);
4892
4893        return err;
4894}
4895
4896static int _nfs4_proc_readdir(struct dentry *dentry, const struct cred *cred,
4897                u64 cookie, struct page **pages, unsigned int count, bool plus)
4898{
4899        struct inode            *dir = d_inode(dentry);
4900        struct nfs4_readdir_arg args = {
4901                .fh = NFS_FH(dir),
4902                .pages = pages,
4903                .pgbase = 0,
4904                .count = count,
4905                .bitmask = NFS_SERVER(d_inode(dentry))->attr_bitmask,
4906                .plus = plus,
4907        };
4908        struct nfs4_readdir_res res;
4909        struct rpc_message msg = {
4910                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READDIR],
4911                .rpc_argp = &args,
4912                .rpc_resp = &res,
4913                .rpc_cred = cred,
4914        };
4915        int                     status;
4916
4917        dprintk("%s: dentry = %pd2, cookie = %Lu\n", __func__,
4918                        dentry,
4919                        (unsigned long long)cookie);
4920        nfs4_setup_readdir(cookie, NFS_I(dir)->cookieverf, dentry, &args);
4921        res.pgbase = args.pgbase;
4922        status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &msg, &args.seq_args, &res.seq_res, 0);
4923        if (status >= 0) {
4924                memcpy(NFS_I(dir)->cookieverf, res.verifier.data, NFS4_VERIFIER_SIZE);
4925                status += args.pgbase;
4926        }
4927
4928        nfs_invalidate_atime(dir);
4929
4930        dprintk("%s: returns %d\n", __func__, status);
4931        return status;
4932}
4933
4934static int nfs4_proc_readdir(struct dentry *dentry, const struct cred *cred,
4935                u64 cookie, struct page **pages, unsigned int count, bool plus)
4936{
4937        struct nfs4_exception exception = {
4938                .interruptible = true,
4939        };
4940        int err;
4941        do {
4942                err = _nfs4_proc_readdir(dentry, cred, cookie,
4943                                pages, count, plus);
4944                trace_nfs4_readdir(d_inode(dentry), err);
4945                err = nfs4_handle_exception(NFS_SERVER(d_inode(dentry)), err,
4946                                &exception);
4947        } while (exception.retry);
4948        return err;
4949}
4950
4951static int _nfs4_proc_mknod(struct inode *dir, struct dentry *dentry,
4952                struct iattr *sattr, struct nfs4_label *label, dev_t rdev)
4953{
4954        struct nfs4_createdata *data;
4955        int mode = sattr->ia_mode;
4956        int status = -ENOMEM;
4957
4958        data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4SOCK);
4959        if (data == NULL)
4960                goto out;
4961
4962        if (S_ISFIFO(mode))
4963                data->arg.ftype = NF4FIFO;
4964        else if (S_ISBLK(mode)) {
4965                data->arg.ftype = NF4BLK;
4966                data->arg.u.device.specdata1 = MAJOR(rdev);
4967                data->arg.u.device.specdata2 = MINOR(rdev);
4968        }
4969        else if (S_ISCHR(mode)) {
4970                data->arg.ftype = NF4CHR;
4971                data->arg.u.device.specdata1 = MAJOR(rdev);
4972                data->arg.u.device.specdata2 = MINOR(rdev);
4973        } else if (!S_ISSOCK(mode)) {
4974                status = -EINVAL;
4975                goto out_free;
4976        }
4977
4978        data->arg.label = label;
4979        status = nfs4_do_create(dir, dentry, data);
4980out_free:
4981        nfs4_free_createdata(data);
4982out:
4983        return status;
4984}
4985
4986static int nfs4_proc_mknod(struct inode *dir, struct dentry *dentry,
4987                struct iattr *sattr, dev_t rdev)
4988{
4989        struct nfs_server *server = NFS_SERVER(dir);
4990        struct nfs4_exception exception = {
4991                .interruptible = true,
4992        };
4993        struct nfs4_label l, *label = NULL;
4994        int err;
4995
4996        label = nfs4_label_init_security(dir, dentry, sattr, &l);
4997
4998        if (!(server->attr_bitmask[2] & FATTR4_WORD2_MODE_UMASK))
4999                sattr->ia_mode &= ~current_umask();
5000        do {
5001                err = _nfs4_proc_mknod(dir, dentry, sattr, label, rdev);
5002                trace_nfs4_mknod(dir, &dentry->d_name, err);
5003                err = nfs4_handle_exception(NFS_SERVER(dir), err,
5004                                &exception);
5005        } while (exception.retry);
5006
5007        nfs4_label_release_security(label);
5008
5009        return err;
5010}
5011
5012static int _nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle,
5013                 struct nfs_fsstat *fsstat)
5014{
5015        struct nfs4_statfs_arg args = {
5016                .fh = fhandle,
5017                .bitmask = server->attr_bitmask,
5018        };
5019        struct nfs4_statfs_res res = {
5020                .fsstat = fsstat,
5021        };
5022        struct rpc_message msg = {
5023                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_STATFS],
5024                .rpc_argp = &args,
5025                .rpc_resp = &res,
5026        };
5027
5028        nfs_fattr_init(fsstat->fattr);
5029        return  nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
5030}
5031
5032static int nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsstat *fsstat)
5033{
5034        struct nfs4_exception exception = {
5035                .interruptible = true,
5036        };
5037        int err;
5038        do {
5039                err = nfs4_handle_exception(server,
5040                                _nfs4_proc_statfs(server, fhandle, fsstat),
5041                                &exception);
5042        } while (exception.retry);
5043        return err;
5044}
5045
5046static int _nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle,
5047                struct nfs_fsinfo *fsinfo)
5048{
5049        struct nfs4_fsinfo_arg args = {
5050                .fh = fhandle,
5051                .bitmask = server->attr_bitmask,
5052        };
5053        struct nfs4_fsinfo_res res = {
5054                .fsinfo = fsinfo,
5055        };
5056        struct rpc_message msg = {
5057                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FSINFO],
5058                .rpc_argp = &args,
5059                .rpc_resp = &res,
5060        };
5061
5062        return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
5063}
5064
5065static int nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
5066{
5067        struct nfs4_exception exception = {
5068                .interruptible = true,
5069        };
5070        int err;
5071
5072        do {
5073                err = _nfs4_do_fsinfo(server, fhandle, fsinfo);
5074                trace_nfs4_fsinfo(server, fhandle, fsinfo->fattr, err);
5075                if (err == 0) {
5076                        nfs4_set_lease_period(server->nfs_client, fsinfo->lease_time * HZ);
5077                        break;
5078                }
5079                err = nfs4_handle_exception(server, err, &exception);
5080        } while (exception.retry);
5081        return err;
5082}
5083
5084static int nfs4_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
5085{
5086        int error;
5087
5088        nfs_fattr_init(fsinfo->fattr);
5089        error = nfs4_do_fsinfo(server, fhandle, fsinfo);
5090        if (error == 0) {
5091                /* block layout checks this! */
5092                server->pnfs_blksize = fsinfo->blksize;
5093                set_pnfs_layoutdriver(server, fhandle, fsinfo);
5094        }
5095
5096        return error;
5097}
5098
5099static int _nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
5100                struct nfs_pathconf *pathconf)
5101{
5102        struct nfs4_pathconf_arg args = {
5103                .fh = fhandle,
5104                .bitmask = server->attr_bitmask,
5105        };
5106        struct nfs4_pathconf_res res = {
5107                .pathconf = pathconf,
5108        };
5109        struct rpc_message msg = {
5110                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_PATHCONF],
5111                .rpc_argp = &args,
5112                .rpc_resp = &res,
5113        };
5114
5115        /* None of the pathconf attributes are mandatory to implement */
5116        if ((args.bitmask[0] & nfs4_pathconf_bitmap[0]) == 0) {
5117                memset(pathconf, 0, sizeof(*pathconf));
5118                return 0;
5119        }
5120
5121        nfs_fattr_init(pathconf->fattr);
5122        return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
5123}
5124
5125static int nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
5126                struct nfs_pathconf *pathconf)
5127{
5128        struct nfs4_exception exception = {
5129                .interruptible = true,
5130        };
5131        int err;
5132
5133        do {
5134                err = nfs4_handle_exception(server,
5135                                _nfs4_proc_pathconf(server, fhandle, pathconf),
5136                                &exception);
5137        } while (exception.retry);
5138        return err;
5139}
5140
5141int nfs4_set_rw_stateid(nfs4_stateid *stateid,
5142                const struct nfs_open_context *ctx,
5143                const struct nfs_lock_context *l_ctx,
5144                fmode_t fmode)
5145{
5146        return nfs4_select_rw_stateid(ctx->state, fmode, l_ctx, stateid, NULL);
5147}
5148EXPORT_SYMBOL_GPL(nfs4_set_rw_stateid);
5149
5150static bool nfs4_stateid_is_current(nfs4_stateid *stateid,
5151                const struct nfs_open_context *ctx,
5152                const struct nfs_lock_context *l_ctx,
5153                fmode_t fmode)
5154{
5155        nfs4_stateid _current_stateid;
5156
5157        /* If the current stateid represents a lost lock, then exit */
5158        if (nfs4_set_rw_stateid(&_current_stateid, ctx, l_ctx, fmode) == -EIO)
5159                return true;
5160        return nfs4_stateid_match(stateid, &_current_stateid);
5161}
5162
5163static bool nfs4_error_stateid_expired(int err)
5164{
5165        switch (err) {
5166        case -NFS4ERR_DELEG_REVOKED:
5167        case -NFS4ERR_ADMIN_REVOKED:
5168        case -NFS4ERR_BAD_STATEID:
5169        case -NFS4ERR_STALE_STATEID:
5170        case -NFS4ERR_OLD_STATEID:
5171        case -NFS4ERR_OPENMODE:
5172        case -NFS4ERR_EXPIRED:
5173                return true;
5174        }
5175        return false;
5176}
5177
5178static int nfs4_read_done_cb(struct rpc_task *task, struct nfs_pgio_header *hdr)
5179{
5180        struct nfs_server *server = NFS_SERVER(hdr->inode);
5181
5182        trace_nfs4_read(hdr, task->tk_status);
5183        if (task->tk_status < 0) {
5184                struct nfs4_exception exception = {
5185                        .inode = hdr->inode,
5186                        .state = hdr->args.context->state,
5187                        .stateid = &hdr->args.stateid,
5188                };
5189                task->tk_status = nfs4_async_handle_exception(task,
5190                                server, task->tk_status, &exception);
5191                if (exception.retry) {
5192                        rpc_restart_call_prepare(task);
5193                        return -EAGAIN;
5194                }
5195        }
5196
5197        if (task->tk_status > 0)
5198                renew_lease(server, hdr->timestamp);
5199        return 0;
5200}
5201
5202static bool nfs4_read_stateid_changed(struct rpc_task *task,
5203                struct nfs_pgio_args *args)
5204{
5205
5206        if (!nfs4_error_stateid_expired(task->tk_status) ||
5207                nfs4_stateid_is_current(&args->stateid,
5208                                args->context,
5209                                args->lock_context,
5210                                FMODE_READ))
5211                return false;
5212        rpc_restart_call_prepare(task);
5213        return true;
5214}
5215
5216static int nfs4_read_done(struct rpc_task *task, struct nfs_pgio_header *hdr)
5217{
5218
5219        dprintk("--> %s\n", __func__);
5220
5221        if (!nfs4_sequence_done(task, &hdr->res.seq_res))
5222                return -EAGAIN;
5223        if (nfs4_read_stateid_changed(task, &hdr->args))
5224                return -EAGAIN;
5225        if (task->tk_status > 0)
5226                nfs_invalidate_atime(hdr->inode);
5227        return hdr->pgio_done_cb ? hdr->pgio_done_cb(task, hdr) :
5228                                    nfs4_read_done_cb(task, hdr);
5229}
5230
5231static void nfs4_proc_read_setup(struct nfs_pgio_header *hdr,
5232                                 struct rpc_message *msg)
5233{
5234        hdr->timestamp   = jiffies;
5235        if (!hdr->pgio_done_cb)
5236                hdr->pgio_done_cb = nfs4_read_done_cb;
5237        msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ];
5238        nfs4_init_sequence(&hdr->args.seq_args, &hdr->res.seq_res, 0, 0);
5239}
5240
5241static int nfs4_proc_pgio_rpc_prepare(struct rpc_task *task,
5242                                      struct nfs_pgio_header *hdr)
5243{
5244        if (nfs4_setup_sequence(NFS_SERVER(hdr->inode)->nfs_client,
5245                        &hdr->args.seq_args,
5246                        &hdr->res.seq_res,
5247                        task))
5248                return 0;
5249        if (nfs4_set_rw_stateid(&hdr->args.stateid, hdr->args.context,
5250                                hdr->args.lock_context,
5251                                hdr->rw_mode) == -EIO)
5252                return -EIO;
5253        if (unlikely(test_bit(NFS_CONTEXT_BAD, &hdr->args.context->flags)))
5254                return -EIO;
5255        return 0;
5256}
5257
5258static int nfs4_write_done_cb(struct rpc_task *task,
5259                              struct nfs_pgio_header *hdr)
5260{
5261        struct inode *inode = hdr->inode;
5262
5263        trace_nfs4_write(hdr, task->tk_status);
5264        if (task->tk_status < 0) {
5265                struct nfs4_exception exception = {
5266                        .inode = hdr->inode,
5267                        .state = hdr->args.context->state,
5268                        .stateid = &hdr->args.stateid,
5269                };
5270                task->tk_status = nfs4_async_handle_exception(task,
5271                                NFS_SERVER(inode), task->tk_status,
5272                                &exception);
5273                if (exception.retry) {
5274                        rpc_restart_call_prepare(task);
5275                        return -EAGAIN;
5276                }
5277        }
5278        if (task->tk_status >= 0) {
5279                renew_lease(NFS_SERVER(inode), hdr->timestamp);
5280                nfs_writeback_update_inode(hdr);
5281        }
5282        return 0;
5283}
5284
5285static bool nfs4_write_stateid_changed(struct rpc_task *task,
5286                struct nfs_pgio_args *args)
5287{
5288
5289        if (!nfs4_error_stateid_expired(task->tk_status) ||
5290                nfs4_stateid_is_current(&args->stateid,
5291                                args->context,
5292                                args->lock_context,
5293                                FMODE_WRITE))
5294                return false;
5295        rpc_restart_call_prepare(task);
5296        return true;
5297}
5298
5299static int nfs4_write_done(struct rpc_task *task, struct nfs_pgio_header *hdr)
5300{
5301        if (!nfs4_sequence_done(task, &hdr->res.seq_res))
5302                return -EAGAIN;
5303        if (nfs4_write_stateid_changed(task, &hdr->args))
5304                return -EAGAIN;
5305        return hdr->pgio_done_cb ? hdr->pgio_done_cb(task, hdr) :
5306                nfs4_write_done_cb(task, hdr);
5307}
5308
5309static
5310bool nfs4_write_need_cache_consistency_data(struct nfs_pgio_header *hdr)
5311{
5312        /* Don't request attributes for pNFS or O_DIRECT writes */
5313        if (hdr->ds_clp != NULL || hdr->dreq != NULL)
5314                return false;
5315        /* Otherwise, request attributes if and only if we don't hold
5316         * a delegation
5317         */
5318        return nfs4_have_delegation(hdr->inode, FMODE_READ) == 0;
5319}
5320
5321static void nfs4_proc_write_setup(struct nfs_pgio_header *hdr,
5322                                  struct rpc_message *msg,
5323                                  struct rpc_clnt **clnt)
5324{
5325        struct nfs_server *server = NFS_SERVER(hdr->inode);
5326
5327        if (!nfs4_write_need_cache_consistency_data(hdr)) {
5328                hdr->args.bitmask = NULL;
5329                hdr->res.fattr = NULL;
5330        } else
5331                hdr->args.bitmask = server->cache_consistency_bitmask;
5332
5333        if (!hdr->pgio_done_cb)
5334                hdr->pgio_done_cb = nfs4_write_done_cb;
5335        hdr->res.server = server;
5336        hdr->timestamp   = jiffies;
5337
5338        msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE];
5339        nfs4_init_sequence(&hdr->args.seq_args, &hdr->res.seq_res, 0, 0);
5340        nfs4_state_protect_write(server->nfs_client, clnt, msg, hdr);
5341}
5342
5343static void nfs4_proc_commit_rpc_prepare(struct rpc_task *task, struct nfs_commit_data *data)
5344{
5345        nfs4_setup_sequence(NFS_SERVER(data->inode)->nfs_client,
5346                        &data->args.seq_args,
5347                        &data->res.seq_res,
5348                        task);
5349}
5350
5351static int nfs4_commit_done_cb(struct rpc_task *task, struct nfs_commit_data *data)
5352{
5353        struct inode *inode = data->inode;
5354
5355        trace_nfs4_commit(data, task->tk_status);
5356        if (nfs4_async_handle_error(task, NFS_SERVER(inode),
5357                                    NULL, NULL) == -EAGAIN) {
5358                rpc_restart_call_prepare(task);
5359                return -EAGAIN;
5360        }
5361        return 0;
5362}
5363
5364static int nfs4_commit_done(struct rpc_task *task, struct nfs_commit_data *data)
5365{
5366        if (!nfs4_sequence_done(task, &data->res.seq_res))
5367                return -EAGAIN;
5368        return data->commit_done_cb(task, data);
5369}
5370
5371static void nfs4_proc_commit_setup(struct nfs_commit_data *data, struct rpc_message *msg,
5372                                   struct rpc_clnt **clnt)
5373{
5374        struct nfs_server *server = NFS_SERVER(data->inode);
5375
5376        if (data->commit_done_cb == NULL)
5377                data->commit_done_cb = nfs4_commit_done_cb;
5378        data->res.server = server;
5379        msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMMIT];
5380        nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1, 0);
5381        nfs4_state_protect(server->nfs_client, NFS_SP4_MACH_CRED_COMMIT, clnt, msg);
5382}
5383
5384static int _nfs4_proc_commit(struct file *dst, struct nfs_commitargs *args,
5385                                struct nfs_commitres *res)
5386{
5387        struct inode *dst_inode = file_inode(dst);
5388        struct nfs_server *server = NFS_SERVER(dst_inode);
5389        struct rpc_message msg = {
5390                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMMIT],
5391                .rpc_argp = args,
5392                .rpc_resp = res,
5393        };
5394
5395        args->fh = NFS_FH(dst_inode);
5396        return nfs4_call_sync(server->client, server, &msg,
5397                        &args->seq_args, &res->seq_res, 1);
5398}
5399
5400int nfs4_proc_commit(struct file *dst, __u64 offset, __u32 count, struct nfs_commitres *res)
5401{
5402        struct nfs_commitargs args = {
5403                .offset = offset,
5404                .count = count,
5405        };
5406        struct nfs_server *dst_server = NFS_SERVER(file_inode(dst));
5407        struct nfs4_exception exception = { };
5408        int status;
5409
5410        do {
5411                status = _nfs4_proc_commit(dst, &args, res);
5412                status = nfs4_handle_exception(dst_server, status, &exception);
5413        } while (exception.retry);
5414
5415        return status;
5416}
5417
5418struct nfs4_renewdata {
5419        struct nfs_client       *client;
5420        unsigned long           timestamp;
5421};
5422
5423/*
5424 * nfs4_proc_async_renew(): This is not one of the nfs_rpc_ops; it is a special
5425 * standalone procedure for queueing an asynchronous RENEW.
5426 */
5427static void nfs4_renew_release(void *calldata)
5428{
5429        struct nfs4_renewdata *data = calldata;
5430        struct nfs_client *clp = data->client;
5431
5432        if (refcount_read(&clp->cl_count) > 1)
5433                nfs4_schedule_state_renewal(clp);
5434        nfs_put_client(clp);
5435        kfree(data);
5436}
5437
5438static void nfs4_renew_done(struct rpc_task *task, void *calldata)
5439{
5440        struct nfs4_renewdata *data = calldata;
5441        struct nfs_client *clp = data->client;
5442        unsigned long timestamp = data->timestamp;
5443
5444        trace_nfs4_renew_async(clp, task->tk_status);
5445        switch (task->tk_status) {
5446        case 0:
5447                break;
5448        case -NFS4ERR_LEASE_MOVED:
5449                nfs4_schedule_lease_moved_recovery(clp);
5450                break;
5451        default:
5452                /* Unless we're shutting down, schedule state recovery! */
5453                if (test_bit(NFS_CS_RENEWD, &clp->cl_res_state) == 0)
5454                        return;
5455                if (task->tk_status != NFS4ERR_CB_PATH_DOWN) {
5456                        nfs4_schedule_lease_recovery(clp);
5457                        return;
5458                }
5459                nfs4_schedule_path_down_recovery(clp);
5460        }
5461        do_renew_lease(clp, timestamp);
5462}
5463
5464static const struct rpc_call_ops nfs4_renew_ops = {
5465        .rpc_call_done = nfs4_renew_done,
5466        .rpc_release = nfs4_renew_release,
5467};
5468
5469static int nfs4_proc_async_renew(struct nfs_client *clp, const struct cred *cred, unsigned renew_flags)
5470{
5471        struct rpc_message msg = {
5472                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
5473                .rpc_argp       = clp,
5474                .rpc_cred       = cred,
5475        };
5476        struct nfs4_renewdata *data;
5477
5478        if (renew_flags == 0)
5479                return 0;
5480        if (!refcount_inc_not_zero(&clp->cl_count))
5481                return -EIO;
5482        data = kmalloc(sizeof(*data), GFP_NOFS);
5483        if (data == NULL) {
5484                nfs_put_client(clp);
5485                return -ENOMEM;
5486        }
5487        data->client = clp;
5488        data->timestamp = jiffies;
5489        return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT,
5490                        &nfs4_renew_ops, data);
5491}
5492
5493static int nfs4_proc_renew(struct nfs_client *clp, const struct cred *cred)
5494{
5495        struct rpc_message msg = {
5496                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
5497                .rpc_argp       = clp,
5498                .rpc_cred       = cred,
5499        };
5500        unsigned long now = jiffies;
5501        int status;
5502
5503        status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
5504        if (status < 0)
5505                return status;
5506        do_renew_lease(clp, now);
5507        return 0;
5508}
5509
5510static inline int nfs4_server_supports_acls(struct nfs_server *server)
5511{
5512        return server->caps & NFS_CAP_ACLS;
5513}
5514
5515/* Assuming that XATTR_SIZE_MAX is a multiple of PAGE_SIZE, and that
5516 * it's OK to put sizeof(void) * (XATTR_SIZE_MAX/PAGE_SIZE) bytes on
5517 * the stack.
5518 */
5519#define NFS4ACL_MAXPAGES DIV_ROUND_UP(XATTR_SIZE_MAX, PAGE_SIZE)
5520
5521static int buf_to_pages_noslab(const void *buf, size_t buflen,
5522                struct page **pages)
5523{
5524        struct page *newpage, **spages;
5525        int rc = 0;
5526        size_t len;
5527        spages = pages;
5528
5529        do {
5530                len = min_t(size_t, PAGE_SIZE, buflen);
5531                newpage = alloc_page(GFP_KERNEL);
5532
5533                if (newpage == NULL)
5534                        goto unwind;
5535                memcpy(page_address(newpage), buf, len);
5536                buf += len;
5537                buflen -= len;
5538                *pages++ = newpage;
5539                rc++;
5540        } while (buflen != 0);
5541
5542        return rc;
5543
5544unwind:
5545        for(; rc > 0; rc--)
5546                __free_page(spages[rc-1]);
5547        return -ENOMEM;
5548}
5549
5550struct nfs4_cached_acl {
5551        int cached;
5552        size_t len;
5553        char data[0];
5554};
5555
5556static void nfs4_set_cached_acl(struct inode *inode, struct nfs4_cached_acl *acl)
5557{
5558        struct nfs_inode *nfsi = NFS_I(inode);
5559
5560        spin_lock(&inode->i_lock);
5561        kfree(nfsi->nfs4_acl);
5562        nfsi->nfs4_acl = acl;
5563        spin_unlock(&inode->i_lock);
5564}
5565
5566static void nfs4_zap_acl_attr(struct inode *inode)
5567{
5568        nfs4_set_cached_acl(inode, NULL);
5569}
5570
5571static inline ssize_t nfs4_read_cached_acl(struct inode *inode, char *buf, size_t buflen)
5572{
5573        struct nfs_inode *nfsi = NFS_I(inode);
5574        struct nfs4_cached_acl *acl;
5575        int ret = -ENOENT;
5576
5577        spin_lock(&inode->i_lock);
5578        acl = nfsi->nfs4_acl;
5579        if (acl == NULL)
5580                goto out;
5581        if (buf == NULL) /* user is just asking for length */
5582                goto out_len;
5583        if (acl->cached == 0)
5584                goto out;
5585        ret = -ERANGE; /* see getxattr(2) man page */
5586        if (acl->len > buflen)
5587                goto out;
5588        memcpy(buf, acl->data, acl->len);
5589out_len:
5590        ret = acl->len;
5591out:
5592        spin_unlock(&inode->i_lock);
5593        return ret;
5594}
5595
5596static void nfs4_write_cached_acl(struct inode *inode, struct page **pages, size_t pgbase, size_t acl_len)
5597{
5598        struct nfs4_cached_acl *acl;
5599        size_t buflen = sizeof(*acl) + acl_len;
5600
5601        if (buflen <= PAGE_SIZE) {
5602                acl = kmalloc(buflen, GFP_KERNEL);
5603                if (acl == NULL)
5604                        goto out;
5605                acl->cached = 1;
5606                _copy_from_pages(acl->data, pages, pgbase, acl_len);
5607        } else {
5608                acl = kmalloc(sizeof(*acl), GFP_KERNEL);
5609                if (acl == NULL)
5610                        goto out;
5611                acl->cached = 0;
5612        }
5613        acl->len = acl_len;
5614out:
5615        nfs4_set_cached_acl(inode, acl);
5616}
5617
5618/*
5619 * The getxattr API returns the required buffer length when called with a
5620 * NULL buf. The NFSv4 acl tool then calls getxattr again after allocating
5621 * the required buf.  On a NULL buf, we send a page of data to the server
5622 * guessing that the ACL request can be serviced by a page. If so, we cache
5623 * up to the page of ACL data, and the 2nd call to getxattr is serviced by
5624 * the cache. If not so, we throw away the page, and cache the required
5625 * length. The next getxattr call will then produce another round trip to
5626 * the server, this time with the input buf of the required size.
5627 */
5628static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
5629{
5630        struct page **pages;
5631        struct nfs_getaclargs args = {
5632                .fh = NFS_FH(inode),
5633                .acl_len = buflen,
5634        };
5635        struct nfs_getaclres res = {
5636                .acl_len = buflen,
5637        };
5638        struct rpc_message msg = {
5639                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETACL],
5640                .rpc_argp = &args,
5641                .rpc_resp = &res,
5642        };
5643        unsigned int npages;
5644        int ret = -ENOMEM, i;
5645        struct nfs_server *server = NFS_SERVER(inode);
5646
5647        if (buflen == 0)
5648                buflen = server->rsize;
5649
5650        npages = DIV_ROUND_UP(buflen, PAGE_SIZE) + 1;
5651        pages = kmalloc_array(npages, sizeof(struct page *), GFP_NOFS);
5652        if (!pages)
5653                return -ENOMEM;
5654
5655        args.acl_pages = pages;
5656
5657        for (i = 0; i < npages; i++) {
5658                pages[i] = alloc_page(GFP_KERNEL);
5659                if (!pages[i])
5660                        goto out_free;
5661        }
5662
5663        /* for decoding across pages */
5664        res.acl_scratch = alloc_page(GFP_KERNEL);
5665        if (!res.acl_scratch)
5666                goto out_free;
5667
5668        args.acl_len = npages * PAGE_SIZE;
5669
5670        dprintk("%s  buf %p buflen %zu npages %d args.acl_len %zu\n",
5671                __func__, buf, buflen, npages, args.acl_len);
5672        ret = nfs4_call_sync(NFS_SERVER(inode)->client, NFS_SERVER(inode),
5673                             &msg, &args.seq_args, &res.seq_res, 0);
5674        if (ret)
5675                goto out_free;
5676
5677        /* Handle the case where the passed-in buffer is too short */
5678        if (res.acl_flags & NFS4_ACL_TRUNC) {
5679                /* Did the user only issue a request for the acl length? */
5680                if (buf == NULL)
5681                        goto out_ok;
5682                ret = -ERANGE;
5683                goto out_free;
5684        }
5685        nfs4_write_cached_acl(inode, pages, res.acl_data_offset, res.acl_len);
5686        if (buf) {
5687                if (res.acl_len > buflen) {
5688                        ret = -ERANGE;
5689                        goto out_free;
5690                }
5691                _copy_from_pages(buf, pages, res.acl_data_offset, res.acl_len);
5692        }
5693out_ok:
5694        ret = res.acl_len;
5695out_free:
5696        for (i = 0; i < npages; i++)
5697                if (pages[i])
5698                        __free_page(pages[i]);
5699        if (res.acl_scratch)
5700                __free_page(res.acl_scratch);
5701        kfree(pages);
5702        return ret;
5703}
5704
5705static ssize_t nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
5706{
5707        struct nfs4_exception exception = {
5708                .interruptible = true,
5709        };
5710        ssize_t ret;
5711        do {
5712                ret = __nfs4_get_acl_uncached(inode, buf, buflen);
5713                trace_nfs4_get_acl(inode, ret);
5714                if (ret >= 0)
5715                        break;
5716                ret = nfs4_handle_exception(NFS_SERVER(inode), ret, &exception);
5717        } while (exception.retry);
5718        return ret;
5719}
5720
5721static ssize_t nfs4_proc_get_acl(struct inode *inode, void *buf, size_t buflen)
5722{
5723        struct nfs_server *server = NFS_SERVER(inode);
5724        int ret;
5725
5726        if (!nfs4_server_supports_acls(server))
5727                return -EOPNOTSUPP;
5728        ret = nfs_revalidate_inode(server, inode);
5729        if (ret < 0)
5730                return ret;
5731        if (NFS_I(inode)->cache_validity & NFS_INO_INVALID_ACL)
5732                nfs_zap_acl_cache(inode);
5733        ret = nfs4_read_cached_acl(inode, buf, buflen);
5734        if (ret != -ENOENT)
5735                /* -ENOENT is returned if there is no ACL or if there is an ACL
5736                 * but no cached acl data, just the acl length */
5737                return ret;
5738        return nfs4_get_acl_uncached(inode, buf, buflen);
5739}
5740
5741static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen)
5742{
5743        struct nfs_server *server = NFS_SERVER(inode);
5744        struct page *pages[NFS4ACL_MAXPAGES];
5745        struct nfs_setaclargs arg = {
5746                .fh             = NFS_FH(inode),
5747                .acl_pages      = pages,
5748                .acl_len        = buflen,
5749        };
5750        struct nfs_setaclres res;
5751        struct rpc_message msg = {
5752                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_SETACL],
5753                .rpc_argp       = &arg,
5754                .rpc_resp       = &res,
5755        };
5756        unsigned int npages = DIV_ROUND_UP(buflen, PAGE_SIZE);
5757        int ret, i;
5758
5759        if (!nfs4_server_supports_acls(server))
5760                return -EOPNOTSUPP;
5761        if (npages > ARRAY_SIZE(pages))
5762                return -ERANGE;
5763        i = buf_to_pages_noslab(buf, buflen, arg.acl_pages);
5764        if (i < 0)
5765                return i;
5766        nfs4_inode_make_writeable(inode);
5767        ret = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
5768
5769        /*
5770         * Free each page after tx, so the only ref left is
5771         * held by the network stack
5772         */
5773        for (; i > 0; i--)
5774                put_page(pages[i-1]);
5775
5776        /*
5777         * Acl update can result in inode attribute update.
5778         * so mark the attribute cache invalid.
5779         */
5780        spin_lock(&inode->i_lock);
5781        NFS_I(inode)->cache_validity |= NFS_INO_INVALID_CHANGE
5782                | NFS_INO_INVALID_CTIME
5783                | NFS_INO_REVAL_FORCED;
5784        spin_unlock(&inode->i_lock);
5785        nfs_access_zap_cache(inode);
5786        nfs_zap_acl_cache(inode);
5787        return ret;
5788}
5789
5790static int nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen)
5791{
5792        struct nfs4_exception exception = { };
5793        int err;
5794        do {
5795                err = __nfs4_proc_set_acl(inode, buf, buflen);
5796                trace_nfs4_set_acl(inode, err);
5797                err = nfs4_handle_exception(NFS_SERVER(inode), err,
5798                                &exception);
5799        } while (exception.retry);
5800        return err;
5801}
5802
5803#ifdef CONFIG_NFS_V4_SECURITY_LABEL
5804static int _nfs4_get_security_label(struct inode *inode, void *buf,
5805                                        size_t buflen)
5806{
5807        struct nfs_server *server = NFS_SERVER(inode);
5808        struct nfs_fattr fattr;
5809        struct nfs4_label label = {0, 0, buflen, buf};
5810
5811        u32 bitmask[3] = { 0, 0, FATTR4_WORD2_SECURITY_LABEL };
5812        struct nfs4_getattr_arg arg = {
5813                .fh             = NFS_FH(inode),
5814                .bitmask        = bitmask,
5815        };
5816        struct nfs4_getattr_res res = {
5817                .fattr          = &fattr,
5818                .label          = &label,
5819                .server         = server,
5820        };
5821        struct rpc_message msg = {
5822                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_GETATTR],
5823                .rpc_argp       = &arg,
5824                .rpc_resp       = &res,
5825        };
5826        int ret;
5827
5828        nfs_fattr_init(&fattr);
5829
5830        ret = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 0);
5831        if (ret)
5832                return ret;
5833        if (!(fattr.valid & NFS_ATTR_FATTR_V4_SECURITY_LABEL))
5834                return -ENOENT;
5835        if (buflen < label.len)
5836                return -ERANGE;
5837        return 0;
5838}
5839
5840static int nfs4_get_security_label(struct inode *inode, void *buf,
5841                                        size_t buflen)
5842{
5843        struct nfs4_exception exception = {
5844                .interruptible = true,
5845        };
5846        int err;
5847
5848        if (!nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL))
5849                return -EOPNOTSUPP;
5850
5851        do {
5852                err = _nfs4_get_security_label(inode, buf, buflen);
5853                trace_nfs4_get_security_label(inode, err);
5854                err = nfs4_handle_exception(NFS_SERVER(inode), err,
5855                                &exception);
5856        } while (exception.retry);
5857        return err;
5858}
5859
5860static int _nfs4_do_set_security_label(struct inode *inode,
5861                struct nfs4_label *ilabel,
5862                struct nfs_fattr *fattr,
5863                struct nfs4_label *olabel)
5864{
5865
5866        struct iattr sattr = {0};
5867        struct nfs_server *server = NFS_SERVER(inode);
5868        const u32 bitmask[3] = { 0, 0, FATTR4_WORD2_SECURITY_LABEL };
5869        struct nfs_setattrargs arg = {
5870                .fh             = NFS_FH(inode),
5871                .iap            = &sattr,
5872                .server         = server,
5873                .bitmask        = bitmask,
5874                .label          = ilabel,
5875        };
5876        struct nfs_setattrres res = {
5877                .fattr          = fattr,
5878                .label          = olabel,
5879                .server         = server,
5880        };
5881        struct rpc_message msg = {
5882                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_SETATTR],
5883                .rpc_argp       = &arg,
5884                .rpc_resp       = &res,
5885        };
5886        int status;
5887
5888        nfs4_stateid_copy(&arg.stateid, &zero_stateid);
5889
5890        status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
5891        if (status)
5892                dprintk("%s failed: %d\n", __func__, status);
5893
5894        return status;
5895}
5896
5897static int nfs4_do_set_security_label(struct inode *inode,
5898                struct nfs4_label *ilabel,
5899                struct nfs_fattr *fattr,
5900                struct nfs4_label *olabel)
5901{
5902        struct nfs4_exception exception = { };
5903        int err;
5904
5905        do {
5906                err = _nfs4_do_set_security_label(inode, ilabel,
5907                                fattr, olabel);
5908                trace_nfs4_set_security_label(inode, err);
5909                err = nfs4_handle_exception(NFS_SERVER(inode), err,
5910                                &exception);
5911        } while (exception.retry);
5912        return err;
5913}
5914
5915static int
5916nfs4_set_security_label(struct inode *inode, const void *buf, size_t buflen)
5917{
5918        struct nfs4_label ilabel, *olabel = NULL;
5919        struct nfs_fattr fattr;
5920        int status;
5921
5922        if (!nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL))
5923                return -EOPNOTSUPP;
5924
5925        nfs_fattr_init(&fattr);
5926
5927        ilabel.pi = 0;
5928        ilabel.lfs = 0;
5929        ilabel.label = (char *)buf;
5930        ilabel.len = buflen;
5931
5932        olabel = nfs4_label_alloc(NFS_SERVER(inode), GFP_KERNEL);
5933        if (IS_ERR(olabel)) {
5934                status = -PTR_ERR(olabel);
5935                goto out;
5936        }
5937
5938        status = nfs4_do_set_security_label(inode, &ilabel, &fattr, olabel);
5939        if (status == 0)
5940                nfs_setsecurity(inode, &fattr, olabel);
5941
5942        nfs4_label_free(olabel);
5943out:
5944        return status;
5945}
5946#endif  /* CONFIG_NFS_V4_SECURITY_LABEL */
5947
5948
5949static void nfs4_init_boot_verifier(const struct nfs_client *clp,
5950                                    nfs4_verifier *bootverf)
5951{
5952        __be32 verf[2];
5953
5954        if (test_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state)) {
5955                /* An impossible timestamp guarantees this value
5956                 * will never match a generated boot time. */
5957                verf[0] = cpu_to_be32(U32_MAX);
5958                verf[1] = cpu_to_be32(U32_MAX);
5959        } else {
5960                struct nfs_net *nn = net_generic(clp->cl_net, nfs_net_id);
5961                u64 ns = ktime_to_ns(nn->boot_time);
5962
5963                verf[0] = cpu_to_be32(ns >> 32);
5964                verf[1] = cpu_to_be32(ns);
5965        }
5966        memcpy(bootverf->data, verf, sizeof(bootverf->data));
5967}
5968
5969static int
5970nfs4_init_nonuniform_client_string(struct nfs_client *clp)
5971{
5972        size_t len;
5973        char *str;
5974
5975        if (clp->cl_owner_id != NULL)
5976                return 0;
5977
5978        rcu_read_lock();
5979        len = 14 +
5980                strlen(clp->cl_rpcclient->cl_nodename) +
5981                1 +
5982                strlen(rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_ADDR)) +
5983                1;
5984        rcu_read_unlock();
5985        if (nfs4_client_id_uniquifier[0] != '\0')
5986                len += strlen(nfs4_client_id_uniquifier) + 1;
5987        if (len > NFS4_OPAQUE_LIMIT + 1)
5988                return -EINVAL;
5989
5990        /*
5991         * Since this string is allocated at mount time, and held until the
5992         * nfs_client is destroyed, we can use GFP_KERNEL here w/o worrying
5993         * about a memory-reclaim deadlock.
5994         */
5995        str = kmalloc(len, GFP_KERNEL);
5996        if (!str)
5997                return -ENOMEM;
5998
5999        rcu_read_lock();
6000        if (nfs4_client_id_uniquifier[0] != '\0')
6001                scnprintf(str, len, "Linux NFSv4.0 %s/%s/%s",
6002                          clp->cl_rpcclient->cl_nodename,
6003                          nfs4_client_id_uniquifier,
6004                          rpc_peeraddr2str(clp->cl_rpcclient,
6005                                           RPC_DISPLAY_ADDR));
6006        else
6007                scnprintf(str, len, "Linux NFSv4.0 %s/%s",
6008                          clp->cl_rpcclient->cl_nodename,
6009                          rpc_peeraddr2str(clp->cl_rpcclient,
6010                                           RPC_DISPLAY_ADDR));
6011        rcu_read_unlock();
6012
6013        clp->cl_owner_id = str;
6014        return 0;
6015}
6016
6017static int
6018nfs4_init_uniquifier_client_string(struct nfs_client *clp)
6019{
6020        size_t len;
6021        char *str;
6022
6023        len = 10 + 10 + 1 + 10 + 1 +
6024                strlen(nfs4_client_id_uniquifier) + 1 +
6025                strlen(clp->cl_rpcclient->cl_nodename) + 1;
6026
6027        if (len > NFS4_OPAQUE_LIMIT + 1)
6028                return -EINVAL;
6029
6030        /*
6031         * Since this string is allocated at mount time, and held until the
6032         * nfs_client is destroyed, we can use GFP_KERNEL here w/o worrying
6033         * about a memory-reclaim deadlock.
6034         */
6035        str = kmalloc(len, GFP_KERNEL);
6036        if (!str)
6037                return -ENOMEM;
6038
6039        scnprintf(str, len, "Linux NFSv%u.%u %s/%s",
6040                        clp->rpc_ops->version, clp->cl_minorversion,
6041                        nfs4_client_id_uniquifier,
6042                        clp->cl_rpcclient->cl_nodename);
6043        clp->cl_owner_id = str;
6044        return 0;
6045}
6046
6047static int
6048nfs4_init_uniform_client_string(struct nfs_client *clp)
6049{
6050        size_t len;
6051        char *str;
6052
6053        if (clp->cl_owner_id != NULL)
6054                return 0;
6055
6056        if (nfs4_client_id_uniquifier[0] != '\0')
6057                return nfs4_init_uniquifier_client_string(clp);
6058
6059        len = 10 + 10 + 1 + 10 + 1 +
6060                strlen(clp->cl_rpcclient->cl_nodename) + 1;
6061
6062        if (len > NFS4_OPAQUE_LIMIT + 1)
6063                return -EINVAL;
6064
6065        /*
6066         * Since this string is allocated at mount time, and held until the
6067         * nfs_client is destroyed, we can use GFP_KERNEL here w/o worrying
6068         * about a memory-reclaim deadlock.
6069         */
6070        str = kmalloc(len, GFP_KERNEL);
6071        if (!str)
6072                return -ENOMEM;
6073
6074        scnprintf(str, len, "Linux NFSv%u.%u %s",
6075                        clp->rpc_ops->version, clp->cl_minorversion,
6076                        clp->cl_rpcclient->cl_nodename);
6077        clp->cl_owner_id = str;
6078        return 0;
6079}
6080
6081/*
6082 * nfs4_callback_up_net() starts only "tcp" and "tcp6" callback
6083 * services.  Advertise one based on the address family of the
6084 * clientaddr.
6085 */
6086static unsigned int
6087nfs4_init_callback_netid(const struct nfs_client *clp, char *buf, size_t len)
6088{
6089        if (strchr(clp->cl_ipaddr, ':') != NULL)
6090                return scnprintf(buf, len, "tcp6");
6091        else
6092                return scnprintf(buf, len, "tcp");
6093}
6094
6095static void nfs4_setclientid_done(struct rpc_task *task, void *calldata)
6096{
6097        struct nfs4_setclientid *sc = calldata;
6098
6099        if (task->tk_status == 0)
6100                sc->sc_cred = get_rpccred(task->tk_rqstp->rq_cred);
6101}
6102
6103static const struct rpc_call_ops nfs4_setclientid_ops = {
6104        .rpc_call_done = nfs4_setclientid_done,
6105};
6106
6107/**
6108 * nfs4_proc_setclientid - Negotiate client ID
6109 * @clp: state data structure
6110 * @program: RPC program for NFSv4 callback service
6111 * @port: IP port number for NFS4 callback service
6112 * @cred: credential to use for this call
6113 * @res: where to place the result
6114 *
6115 * Returns zero, a negative errno, or a negative NFS4ERR status code.
6116 */
6117int nfs4_proc_setclientid(struct nfs_client *clp, u32 program,
6118                unsigned short port, const struct cred *cred,
6119                struct nfs4_setclientid_res *res)
6120{
6121        nfs4_verifier sc_verifier;
6122        struct nfs4_setclientid setclientid = {
6123                .sc_verifier = &sc_verifier,
6124                .sc_prog = program,
6125                .sc_clnt = clp,
6126        };
6127        struct rpc_message msg = {
6128                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID],
6129                .rpc_argp = &setclientid,
6130                .rpc_resp = res,
6131                .rpc_cred = cred,
6132        };
6133        struct rpc_task_setup task_setup_data = {
6134                .rpc_client = clp->cl_rpcclient,
6135                .rpc_message = &msg,
6136                .callback_ops = &nfs4_setclientid_ops,
6137                .callback_data = &setclientid,
6138                .flags = RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN,
6139        };
6140        unsigned long now = jiffies;
6141        int status;
6142
6143        /* nfs_client_id4 */
6144        nfs4_init_boot_verifier(clp, &sc_verifier);
6145
6146        if (test_bit(NFS_CS_MIGRATION, &clp->cl_flags))
6147                status = nfs4_init_uniform_client_string(clp);
6148        else
6149                status = nfs4_init_nonuniform_client_string(clp);
6150
6151        if (status)
6152                goto out;
6153
6154        /* cb_client4 */
6155        setclientid.sc_netid_len =
6156                                nfs4_init_callback_netid(clp,
6157                                                setclientid.sc_netid,
6158                                                sizeof(setclientid.sc_netid));
6159        setclientid.sc_uaddr_len = scnprintf(setclientid.sc_uaddr,
6160                                sizeof(setclientid.sc_uaddr), "%s.%u.%u",
6161                                clp->cl_ipaddr, port >> 8, port & 255);
6162
6163        dprintk("NFS call  setclientid auth=%s, '%s'\n",
6164                clp->cl_rpcclient->cl_auth->au_ops->au_name,
6165                clp->cl_owner_id);
6166
6167        status = nfs4_call_sync_custom(&task_setup_data);
6168        if (setclientid.sc_cred) {
6169                kfree(clp->cl_acceptor);
6170                clp->cl_acceptor = rpcauth_stringify_acceptor(setclientid.sc_cred);
6171                put_rpccred(setclientid.sc_cred);
6172        }
6173
6174        if (status == 0)
6175                do_renew_lease(clp, now);
6176out:
6177        trace_nfs4_setclientid(clp, status);
6178        dprintk("NFS reply setclientid: %d\n", status);
6179        return status;
6180}
6181
6182/**
6183 * nfs4_proc_setclientid_confirm - Confirm client ID
6184 * @clp: state data structure
6185 * @arg: result of a previous SETCLIENTID
6186 * @cred: credential to use for this call
6187 *
6188 * Returns zero, a negative errno, or a negative NFS4ERR status code.
6189 */
6190int nfs4_proc_setclientid_confirm(struct nfs_client *clp,
6191                struct nfs4_setclientid_res *arg,
6192                const struct cred *cred)
6193{
6194        struct rpc_message msg = {
6195                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID_CONFIRM],
6196                .rpc_argp = arg,
6197                .rpc_cred = cred,
6198        };
6199        int status;
6200
6201        dprintk("NFS call  setclientid_confirm auth=%s, (client ID %llx)\n",
6202                clp->cl_rpcclient->cl_auth->au_ops->au_name,
6203                clp->cl_clientid);
6204        status = rpc_call_sync(clp->cl_rpcclient, &msg,
6205                               RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN);
6206        trace_nfs4_setclientid_confirm(clp, status);
6207        dprintk("NFS reply setclientid_confirm: %d\n", status);
6208        return status;
6209}
6210
6211struct nfs4_delegreturndata {
6212        struct nfs4_delegreturnargs args;
6213        struct nfs4_delegreturnres res;
6214        struct nfs_fh fh;
6215        nfs4_stateid stateid;
6216        unsigned long timestamp;
6217        struct {
6218                struct nfs4_layoutreturn_args arg;
6219                struct nfs4_layoutreturn_res res;
6220                struct nfs4_xdr_opaque_data ld_private;
6221                u32 roc_barrier;
6222                bool roc;
6223        } lr;
6224        struct nfs_fattr fattr;
6225        int rpc_status;
6226        struct inode *inode;
6227};
6228
6229static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
6230{
6231        struct nfs4_delegreturndata *data = calldata;
6232        struct nfs4_exception exception = {
6233                .inode = data->inode,
6234                .stateid = &data->stateid,
6235        };
6236
6237        if (!nfs4_sequence_done(task, &data->res.seq_res))
6238                return;
6239
6240        trace_nfs4_delegreturn_exit(&data->args, &data->res, task->tk_status);
6241
6242        /* Handle Layoutreturn errors */
6243        if (pnfs_roc_done(task, data->inode,
6244                                &data->args.lr_args,
6245                                &data->res.lr_res,
6246                                &data->res.lr_ret) == -EAGAIN)
6247                goto out_restart;
6248
6249        switch (task->tk_status) {
6250        case 0:
6251                renew_lease(data->res.server, data->timestamp);
6252                break;
6253        case -NFS4ERR_ADMIN_REVOKED:
6254        case -NFS4ERR_DELEG_REVOKED:
6255        case -NFS4ERR_EXPIRED:
6256                nfs4_free_revoked_stateid(data->res.server,
6257                                data->args.stateid,
6258                                task->tk_msg.rpc_cred);
6259                /* Fallthrough */
6260        case -NFS4ERR_BAD_STATEID:
6261        case -NFS4ERR_STALE_STATEID:
6262                task->tk_status = 0;
6263                break;
6264        case -NFS4ERR_OLD_STATEID:
6265                if (!nfs4_refresh_delegation_stateid(&data->stateid, data->inode))
6266                        nfs4_stateid_seqid_inc(&data->stateid);
6267                if (data->args.bitmask) {
6268                        data->args.bitmask = NULL;
6269                        data->res.fattr = NULL;
6270                }
6271                goto out_restart;
6272        case -NFS4ERR_ACCESS:
6273                if (data->args.bitmask) {
6274                        data->args.bitmask = NULL;
6275                        data->res.fattr = NULL;
6276                        goto out_restart;
6277                }
6278                /* Fallthrough */
6279        default:
6280                task->tk_status = nfs4_async_handle_exception(task,
6281                                data->res.server, task->tk_status,
6282                                &exception);
6283                if (exception.retry)
6284                        goto out_restart;
6285        }
6286        nfs_delegation_mark_returned(data->inode, data->args.stateid);
6287        data->rpc_status = task->tk_status;
6288        return;
6289out_restart:
6290        task->tk_status = 0;
6291        rpc_restart_call_prepare(task);
6292}
6293
6294static void nfs4_delegreturn_release(void *calldata)
6295{
6296        struct nfs4_delegreturndata *data = calldata;
6297        struct inode *inode = data->inode;
6298
6299        if (inode) {
6300                if (data->lr.roc)
6301                        pnfs_roc_release(&data->lr.arg, &data->lr.res,
6302                                        data->res.lr_ret);
6303                nfs_post_op_update_inode_force_wcc(inode, &data->fattr);
6304                nfs_iput_and_deactive(inode);
6305        }
6306        kfree(calldata);
6307}
6308
6309static void nfs4_delegreturn_prepare(struct rpc_task *task, void *data)
6310{
6311        struct nfs4_delegreturndata *d_data;
6312        struct pnfs_layout_hdr *lo;
6313
6314        d_data = (struct nfs4_delegreturndata *)data;
6315
6316        if (!d_data->lr.roc && nfs4_wait_on_layoutreturn(d_data->inode, task)) {
6317                nfs4_sequence_done(task, &d_data->res.seq_res);
6318                return;
6319        }
6320
6321        lo = d_data->args.lr_args ? d_data->args.lr_args->layout : NULL;
6322        if (lo && !pnfs_layout_is_valid(lo)) {
6323                d_data->args.lr_args = NULL;
6324                d_data->res.lr_res = NULL;
6325        }
6326
6327        nfs4_setup_sequence(d_data->res.server->nfs_client,
6328                        &d_data->args.seq_args,
6329                        &d_data->res.seq_res,
6330                        task);
6331}
6332
6333static const struct rpc_call_ops nfs4_delegreturn_ops = {
6334        .rpc_call_prepare = nfs4_delegreturn_prepare,
6335        .rpc_call_done = nfs4_delegreturn_done,
6336        .rpc_release = nfs4_delegreturn_release,
6337};
6338
6339static int _nfs4_proc_delegreturn(struct inode *inode, const struct cred *cred, const nfs4_stateid *stateid, int issync)
6340{
6341        struct nfs4_delegreturndata *data;
6342        struct nfs_server *server = NFS_SERVER(inode);
6343        struct rpc_task *task;
6344        struct rpc_message msg = {
6345                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DELEGRETURN],
6346                .rpc_cred = cred,
6347        };
6348        struct rpc_task_setup task_setup_data = {
6349                .rpc_client = server->client,
6350                .rpc_message = &msg,
6351                .callback_ops = &nfs4_delegreturn_ops,
6352                .flags = RPC_TASK_ASYNC,
6353        };
6354        int status = 0;
6355
6356        data = kzalloc(sizeof(*data), GFP_NOFS);
6357        if (data == NULL)
6358                return -ENOMEM;
6359        nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1, 0);
6360
6361        nfs4_state_protect(server->nfs_client,
6362                        NFS_SP4_MACH_CRED_CLEANUP,
6363                        &task_setup_data.rpc_client, &msg);
6364
6365        data->args.fhandle = &data->fh;
6366        data->args.stateid = &data->stateid;
6367        data->args.bitmask = server->cache_consistency_bitmask;
6368        nfs_copy_fh(&data->fh, NFS_FH(inode));
6369        nfs4_stateid_copy(&data->stateid, stateid);
6370        data->res.fattr = &data->fattr;
6371        data->res.server = server;
6372        data->res.lr_ret = -NFS4ERR_NOMATCHING_LAYOUT;
6373        data->lr.arg.ld_private = &data->lr.ld_private;
6374        nfs_fattr_init(data->res.fattr);
6375        data->timestamp = jiffies;
6376        data->rpc_status = 0;
6377        data->lr.roc = pnfs_roc(inode, &data->lr.arg, &data->lr.res, cred);
6378        data->inode = nfs_igrab_and_active(inode);
6379        if (data->inode) {
6380                if (data->lr.roc) {
6381                        data->args.lr_args = &data->lr.arg;
6382                        data->res.lr_res = &data->lr.res;
6383                }
6384        } else if (data->lr.roc) {
6385                pnfs_roc_release(&data->lr.arg, &data->lr.res, 0);
6386                data->lr.roc = false;
6387        }
6388
6389        task_setup_data.callback_data = data;
6390        msg.rpc_argp = &data->args;
6391        msg.rpc_resp = &data->res;
6392        task = rpc_run_task(&task_setup_data);
6393        if (IS_ERR(task))
6394                return PTR_ERR(task);
6395        if (!issync)
6396                goto out;
6397        status = rpc_wait_for_completion_task(task);
6398        if (status != 0)
6399                goto out;
6400        status = data->rpc_status;
6401out:
6402        rpc_put_task(task);
6403        return status;
6404}
6405
6406int nfs4_proc_delegreturn(struct inode *inode, const struct cred *cred, const nfs4_stateid *stateid, int issync)
6407{
6408        struct nfs_server *server = NFS_SERVER(inode);
6409        struct nfs4_exception exception = { };
6410        int err;
6411        do {
6412                err = _nfs4_proc_delegreturn(inode, cred, stateid, issync);
6413                trace_nfs4_delegreturn(inode, stateid, err);
6414                switch (err) {
6415                        case -NFS4ERR_STALE_STATEID:
6416                        case -NFS4ERR_EXPIRED:
6417                        case 0:
6418                                return 0;
6419                }
6420                err = nfs4_handle_exception(server, err, &exception);
6421        } while (exception.retry);
6422        return err;
6423}
6424
6425static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request)
6426{
6427        struct inode *inode = state->inode;
6428        struct nfs_server *server = NFS_SERVER(inode);
6429        struct nfs_client *clp = server->nfs_client;
6430        struct nfs_lockt_args arg = {
6431                .fh = NFS_FH(inode),
6432                .fl = request,
6433        };
6434        struct nfs_lockt_res res = {
6435                .denied = request,
6436        };
6437        struct rpc_message msg = {
6438                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_LOCKT],
6439                .rpc_argp       = &arg,
6440                .rpc_resp       = &res,
6441                .rpc_cred       = state->owner->so_cred,
6442        };
6443        struct nfs4_lock_state *lsp;
6444        int status;
6445
6446        arg.lock_owner.clientid = clp->cl_clientid;
6447        status = nfs4_set_lock_state(state, request);
6448        if (status != 0)
6449                goto out;
6450        lsp = request->fl_u.nfs4_fl.owner;
6451        arg.lock_owner.id = lsp->ls_seqid.owner_id;
6452        arg.lock_owner.s_dev = server->s_dev;
6453        status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
6454        switch (status) {
6455                case 0:
6456                        request->fl_type = F_UNLCK;
6457                        break;
6458                case -NFS4ERR_DENIED:
6459                        status = 0;
6460        }
6461        request->fl_ops->fl_release_private(request);
6462        request->fl_ops = NULL;
6463out:
6464        return status;
6465}
6466
6467static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request)
6468{
6469        struct nfs4_exception exception = {
6470                .interruptible = true,
6471        };
6472        int err;
6473
6474        do {
6475                err = _nfs4_proc_getlk(state, cmd, request);
6476                trace_nfs4_get_lock(request, state, cmd, err);
6477                err = nfs4_handle_exception(NFS_SERVER(state->inode), err,
6478                                &exception);
6479        } while (exception.retry);
6480        return err;
6481}
6482
6483/*
6484 * Update the seqid of a lock stateid after receiving
6485 * NFS4ERR_OLD_STATEID
6486 */
6487static bool nfs4_refresh_lock_old_stateid(nfs4_stateid *dst,
6488                struct nfs4_lock_state *lsp)
6489{
6490        struct nfs4_state *state = lsp->ls_state;
6491        bool ret = false;
6492
6493        spin_lock(&state->state_lock);
6494        if (!nfs4_stateid_match_other(dst, &lsp->ls_stateid))
6495                goto out;
6496        if (!nfs4_stateid_is_newer(&lsp->ls_stateid, dst))
6497                nfs4_stateid_seqid_inc(dst);
6498        else
6499                dst->seqid = lsp->ls_stateid.seqid;
6500        ret = true;
6501out:
6502        spin_unlock(&state->state_lock);
6503        return ret;
6504}
6505
6506static bool nfs4_sync_lock_stateid(nfs4_stateid *dst,
6507                struct nfs4_lock_state *lsp)
6508{
6509        struct nfs4_state *state = lsp->ls_state;
6510        bool ret;
6511
6512        spin_lock(&state->state_lock);
6513        ret = !nfs4_stateid_match_other(dst, &lsp->ls_stateid);
6514        nfs4_stateid_copy(dst, &lsp->ls_stateid);
6515        spin_unlock(&state->state_lock);
6516        return ret;
6517}
6518
6519struct nfs4_unlockdata {
6520        struct nfs_locku_args arg;
6521        struct nfs_locku_res res;
6522        struct nfs4_lock_state *lsp;
6523        struct nfs_open_context *ctx;
6524        struct nfs_lock_context *l_ctx;
6525        struct file_lock fl;
6526        struct nfs_server *server;
6527        unsigned long timestamp;
6528};
6529
6530static struct nfs4_unlockdata *nfs4_alloc_unlockdata(struct file_lock *fl,
6531                struct nfs_open_context *ctx,
6532                struct nfs4_lock_state *lsp,
6533                struct nfs_seqid *seqid)
6534{
6535        struct nfs4_unlockdata *p;
6536        struct nfs4_state *state = lsp->ls_state;
6537        struct inode *inode = state->inode;
6538
6539        p = kzalloc(sizeof(*p), GFP_NOFS);
6540        if (p == NULL)
6541                return NULL;
6542        p->arg.fh = NFS_FH(inode);
6543        p->arg.fl = &p->fl;
6544        p->arg.seqid = seqid;
6545        p->res.seqid = seqid;
6546        p->lsp = lsp;
6547        /* Ensure we don't close file until we're done freeing locks! */
6548        p->ctx = get_nfs_open_context(ctx);
6549        p->l_ctx = nfs_get_lock_context(ctx);
6550        locks_init_lock(&p->fl);
6551        locks_copy_lock(&p->fl, fl);
6552        p->server = NFS_SERVER(inode);
6553        spin_lock(&state->state_lock);
6554        nfs4_stateid_copy(&p->arg.stateid, &lsp->ls_stateid);
6555        spin_unlock(&state->state_lock);
6556        return p;
6557}
6558
6559static void nfs4_locku_release_calldata(void *data)
6560{
6561        struct nfs4_unlockdata *calldata = data;
6562        nfs_free_seqid(calldata->arg.seqid);
6563        nfs4_put_lock_state(calldata->lsp);
6564        nfs_put_lock_context(calldata->l_ctx);
6565        put_nfs_open_context(calldata->ctx);
6566        kfree(calldata);
6567}
6568
6569static void nfs4_locku_done(struct rpc_task *task, void *data)
6570{
6571        struct nfs4_unlockdata *calldata = data;
6572        struct nfs4_exception exception = {
6573                .inode = calldata->lsp->ls_state->inode,
6574                .stateid = &calldata->arg.stateid,
6575        };
6576
6577        if (!nfs4_sequence_done(task, &calldata->res.seq_res))
6578                return;
6579        switch (task->tk_status) {
6580                case 0:
6581                        renew_lease(calldata->server, calldata->timestamp);
6582                        locks_lock_inode_wait(calldata->lsp->ls_state->inode, &calldata->fl);
6583                        if (nfs4_update_lock_stateid(calldata->lsp,
6584                                        &calldata->res.stateid))
6585                                break;
6586                        /* Fall through */
6587                case -NFS4ERR_ADMIN_REVOKED:
6588                case -NFS4ERR_EXPIRED:
6589                        nfs4_free_revoked_stateid(calldata->server,
6590                                        &calldata->arg.stateid,
6591                                        task->tk_msg.rpc_cred);
6592                        /* Fall through */
6593                case -NFS4ERR_BAD_STATEID:
6594                case -NFS4ERR_STALE_STATEID:
6595                        if (nfs4_sync_lock_stateid(&calldata->arg.stateid,
6596                                                calldata->lsp))
6597                                rpc_restart_call_prepare(task);
6598                        break;
6599                case -NFS4ERR_OLD_STATEID:
6600                        if (nfs4_refresh_lock_old_stateid(&calldata->arg.stateid,
6601                                                calldata->lsp))
6602                                rpc_restart_call_prepare(task);
6603                        break;
6604                default:
6605                        task->tk_status = nfs4_async_handle_exception(task,
6606                                        calldata->server, task->tk_status,
6607                                        &exception);
6608                        if (exception.retry)
6609                                rpc_restart_call_prepare(task);
6610        }
6611        nfs_release_seqid(calldata->arg.seqid);
6612}
6613
6614static void nfs4_locku_prepare(struct rpc_task *task, void *data)
6615{
6616        struct nfs4_unlockdata *calldata = data;
6617
6618        if (test_bit(NFS_CONTEXT_UNLOCK, &calldata->l_ctx->open_context->flags) &&
6619                nfs_async_iocounter_wait(task, calldata->l_ctx))
6620                return;
6621
6622        if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
6623                goto out_wait;
6624        if (test_bit(NFS_LOCK_INITIALIZED, &calldata->lsp->ls_flags) == 0) {
6625                /* Note: exit _without_ running nfs4_locku_done */
6626                goto out_no_action;
6627        }
6628        calldata->timestamp = jiffies;
6629        if (nfs4_setup_sequence(calldata->server->nfs_client,
6630                                &calldata->arg.seq_args,
6631                                &calldata->res.seq_res,
6632                                task) != 0)
6633                nfs_release_seqid(calldata->arg.seqid);
6634        return;
6635out_no_action:
6636        task->tk_action = NULL;
6637out_wait:
6638        nfs4_sequence_done(task, &calldata->res.seq_res);
6639}
6640
6641static const struct rpc_call_ops nfs4_locku_ops = {
6642        .rpc_call_prepare = nfs4_locku_prepare,
6643        .rpc_call_done = nfs4_locku_done,
6644        .rpc_release = nfs4_locku_release_calldata,
6645};
6646
6647static struct rpc_task *nfs4_do_unlck(struct file_lock *fl,
6648                struct nfs_open_context *ctx,
6649                struct nfs4_lock_state *lsp,
6650                struct nfs_seqid *seqid)
6651{
6652        struct nfs4_unlockdata *data;
6653        struct rpc_message msg = {
6654                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKU],
6655                .rpc_cred = ctx->cred,
6656        };
6657        struct rpc_task_setup task_setup_data = {
6658                .rpc_client = NFS_CLIENT(lsp->ls_state->inode),
6659                .rpc_message = &msg,
6660                .callback_ops = &nfs4_locku_ops,
6661                .workqueue = nfsiod_workqueue,
6662                .flags = RPC_TASK_ASYNC,
6663        };
6664
6665        nfs4_state_protect(NFS_SERVER(lsp->ls_state->inode)->nfs_client,
6666                NFS_SP4_MACH_CRED_CLEANUP, &task_setup_data.rpc_client, &msg);
6667
6668        /* Ensure this is an unlock - when canceling a lock, the
6669         * canceled lock is passed in, and it won't be an unlock.
6670         */
6671        fl->fl_type = F_UNLCK;
6672        if (fl->fl_flags & FL_CLOSE)
6673                set_bit(NFS_CONTEXT_UNLOCK, &ctx->flags);
6674
6675        data = nfs4_alloc_unlockdata(fl, ctx, lsp, seqid);
6676        if (data == NULL) {
6677                nfs_free_seqid(seqid);
6678                return ERR_PTR(-ENOMEM);
6679        }
6680
6681        nfs4_init_sequence(&data->arg.seq_args, &data->res.seq_res, 1, 0);
6682        msg.rpc_argp = &data->arg;
6683        msg.rpc_resp = &data->res;
6684        task_setup_data.callback_data = data;
6685        return rpc_run_task(&task_setup_data);
6686}
6687
6688static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock *request)
6689{
6690        struct inode *inode = state->inode;
6691        struct nfs4_state_owner *sp = state->owner;
6692        struct nfs_inode *nfsi = NFS_I(inode);
6693        struct nfs_seqid *seqid;
6694        struct nfs4_lock_state *lsp;
6695        struct rpc_task *task;
6696        struct nfs_seqid *(*alloc_seqid)(struct nfs_seqid_counter *, gfp_t);
6697        int status = 0;
6698        unsigned char fl_flags = request->fl_flags;
6699
6700        status = nfs4_set_lock_state(state, request);
6701        /* Unlock _before_ we do the RPC call */
6702        request->fl_flags |= FL_EXISTS;
6703        /* Exclude nfs_delegation_claim_locks() */
6704        mutex_lock(&sp->so_delegreturn_mutex);
6705        /* Exclude nfs4_reclaim_open_stateid() - note nesting! */
6706        down_read(&nfsi->rwsem);
6707        if (locks_lock_inode_wait(inode, request) == -ENOENT) {
6708                up_read(&nfsi->rwsem);
6709                mutex_unlock(&sp->so_delegreturn_mutex);
6710                goto out;
6711        }
6712        up_read(&nfsi->rwsem);
6713        mutex_unlock(&sp->so_delegreturn_mutex);
6714        if (status != 0)
6715                goto out;
6716        /* Is this a delegated lock? */
6717        lsp = request->fl_u.nfs4_fl.owner;
6718        if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags) == 0)
6719                goto out;
6720        alloc_seqid = NFS_SERVER(inode)->nfs_client->cl_mvops->alloc_seqid;
6721        seqid = alloc_seqid(&lsp->ls_seqid, GFP_KERNEL);
6722        status = -ENOMEM;
6723        if (IS_ERR(seqid))
6724                goto out;
6725        task = nfs4_do_unlck(request, nfs_file_open_context(request->fl_file), lsp, seqid);
6726        status = PTR_ERR(task);
6727        if (IS_ERR(task))
6728                goto out;
6729        status = rpc_wait_for_completion_task(task);
6730        rpc_put_task(task);
6731out:
6732        request->fl_flags = fl_flags;
6733        trace_nfs4_unlock(request, state, F_SETLK, status);
6734        return status;
6735}
6736
6737struct nfs4_lockdata {
6738        struct nfs_lock_args arg;
6739        struct nfs_lock_res res;
6740        struct nfs4_lock_state *lsp;
6741        struct nfs_open_context *ctx;
6742        struct file_lock fl;
6743        unsigned long timestamp;
6744        int rpc_status;
6745        int cancelled;
6746        struct nfs_server *server;
6747};
6748
6749static struct nfs4_lockdata *nfs4_alloc_lockdata(struct file_lock *fl,
6750                struct nfs_open_context *ctx, struct nfs4_lock_state *lsp,
6751                gfp_t gfp_mask)
6752{
6753        struct nfs4_lockdata *p;
6754        struct inode *inode = lsp->ls_state->inode;
6755        struct nfs_server *server = NFS_SERVER(inode);
6756        struct nfs_seqid *(*alloc_seqid)(struct nfs_seqid_counter *, gfp_t);
6757
6758        p = kzalloc(sizeof(*p), gfp_mask);
6759        if (p == NULL)
6760                return NULL;
6761
6762        p->arg.fh = NFS_FH(inode);
6763        p->arg.fl = &p->fl;
6764        p->arg.open_seqid = nfs_alloc_seqid(&lsp->ls_state->owner->so_seqid, gfp_mask);
6765        if (IS_ERR(p->arg.open_seqid))
6766                goto out_free;
6767        alloc_seqid = server->nfs_client->cl_mvops->alloc_seqid;
6768        p->arg.lock_seqid = alloc_seqid(&lsp->ls_seqid, gfp_mask);
6769        if (IS_ERR(p->arg.lock_seqid))
6770                goto out_free_seqid;
6771        p->arg.lock_owner.clientid = server->nfs_client->cl_clientid;
6772        p->arg.lock_owner.id = lsp->ls_seqid.owner_id;
6773        p->arg.lock_owner.s_dev = server->s_dev;
6774        p->res.lock_seqid = p->arg.lock_seqid;
6775        p->lsp = lsp;
6776        p->server = server;
6777        p->ctx = get_nfs_open_context(ctx);
6778        locks_init_lock(&p->fl);
6779        locks_copy_lock(&p->fl, fl);
6780        return p;
6781out_free_seqid:
6782        nfs_free_seqid(p->arg.open_seqid);
6783out_free:
6784        kfree(p);
6785        return NULL;
6786}
6787
6788static void nfs4_lock_prepare(struct rpc_task *task, void *calldata)
6789{
6790        struct nfs4_lockdata *data = calldata;
6791        struct nfs4_state *state = data->lsp->ls_state;
6792
6793        dprintk("%s: begin!\n", __func__);
6794        if (nfs_wait_on_sequence(data->arg.lock_seqid, task) != 0)
6795                goto out_wait;
6796        /* Do we need to do an open_to_lock_owner? */
6797        if (!test_bit(NFS_LOCK_INITIALIZED, &data->lsp->ls_flags)) {
6798                if (nfs_wait_on_sequence(data->arg.open_seqid, task) != 0) {
6799                        goto out_release_lock_seqid;
6800                }
6801                nfs4_stateid_copy(&data->arg.open_stateid,
6802                                &state->open_stateid);
6803                data->arg.new_lock_owner = 1;
6804                data->res.open_seqid = data->arg.open_seqid;
6805        } else {
6806                data->arg.new_lock_owner = 0;
6807                nfs4_stateid_copy(&data->arg.lock_stateid,
6808                                &data->lsp->ls_stateid);
6809        }
6810        if (!nfs4_valid_open_stateid(state)) {
6811                data->rpc_status = -EBADF;
6812                task->tk_action = NULL;
6813                goto out_release_open_seqid;
6814        }
6815        data->timestamp = jiffies;
6816        if (nfs4_setup_sequence(data->server->nfs_client,
6817                                &data->arg.seq_args,
6818                                &data->res.seq_res,
6819                                task) == 0)
6820                return;
6821out_release_open_seqid:
6822        nfs_release_seqid(data->arg.open_seqid);
6823out_release_lock_seqid:
6824        nfs_release_seqid(data->arg.lock_seqid);
6825out_wait:
6826        nfs4_sequence_done(task, &data->res.seq_res);
6827        dprintk("%s: done!, ret = %d\n", __func__, data->rpc_status);
6828}
6829
6830static void nfs4_lock_done(struct rpc_task *task, void *calldata)
6831{
6832        struct nfs4_lockdata *data = calldata;
6833        struct nfs4_lock_state *lsp = data->lsp;
6834
6835        dprintk("%s: begin!\n", __func__);
6836
6837        if (!nfs4_sequence_done(task, &data->res.seq_res))
6838                return;
6839
6840        data->rpc_status = task->tk_status;
6841        switch (task->tk_status) {
6842        case 0:
6843                renew_lease(NFS_SERVER(d_inode(data->ctx->dentry)),
6844                                data->timestamp);
6845                if (data->arg.new_lock && !data->cancelled) {
6846                        data->fl.fl_flags &= ~(FL_SLEEP | FL_ACCESS);
6847                        if (locks_lock_inode_wait(lsp->ls_state->inode, &data->fl) < 0)
6848                                goto out_restart;
6849                }
6850                if (data->arg.new_lock_owner != 0) {
6851                        nfs_confirm_seqid(&lsp->ls_seqid, 0);
6852                        nfs4_stateid_copy(&lsp->ls_stateid, &data->res.stateid);
6853                        set_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags);
6854                } else if (!nfs4_update_lock_stateid(lsp, &data->res.stateid))
6855                        goto out_restart;
6856                break;
6857        case -NFS4ERR_BAD_STATEID:
6858        case -NFS4ERR_OLD_STATEID:
6859        case -NFS4ERR_STALE_STATEID:
6860        case -NFS4ERR_EXPIRED:
6861                if (data->arg.new_lock_owner != 0) {
6862                        if (!nfs4_stateid_match(&data->arg.open_stateid,
6863                                                &lsp->ls_state->open_stateid))
6864                                goto out_restart;
6865                } else if (!nfs4_stateid_match(&data->arg.lock_stateid,
6866                                                &lsp->ls_stateid))
6867                                goto out_restart;
6868        }
6869out_done:
6870        dprintk("%s: done, ret = %d!\n", __func__, data->rpc_status);
6871        return;
6872out_restart:
6873        if (!data->cancelled)
6874                rpc_restart_call_prepare(task);
6875        goto out_done;
6876}
6877
6878static void nfs4_lock_release(void *calldata)
6879{
6880        struct nfs4_lockdata *data = calldata;
6881
6882        dprintk("%s: begin!\n", __func__);
6883        nfs_free_seqid(data->arg.open_seqid);
6884        if (data->cancelled && data->rpc_status == 0) {
6885                struct rpc_task *task;
6886                task = nfs4_do_unlck(&data->fl, data->ctx, data->lsp,
6887                                data->arg.lock_seqid);
6888                if (!IS_ERR(task))
6889                        rpc_put_task_async(task);
6890                dprintk("%s: cancelling lock!\n", __func__);
6891        } else
6892                nfs_free_seqid(data->arg.lock_seqid);
6893        nfs4_put_lock_state(data->lsp);
6894        put_nfs_open_context(data->ctx);
6895        kfree(data);
6896        dprintk("%s: done!\n", __func__);
6897}
6898
6899static const struct rpc_call_ops nfs4_lock_ops = {
6900        .rpc_call_prepare = nfs4_lock_prepare,
6901        .rpc_call_done = nfs4_lock_done,
6902        .rpc_release = nfs4_lock_release,
6903};
6904
6905static void nfs4_handle_setlk_error(struct nfs_server *server, struct nfs4_lock_state *lsp, int new_lock_owner, int error)
6906{
6907        switch (error) {
6908        case -NFS4ERR_ADMIN_REVOKED:
6909        case -NFS4ERR_EXPIRED:
6910        case -NFS4ERR_BAD_STATEID:
6911                lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED;
6912                if (new_lock_owner != 0 ||
6913                   test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags) != 0)
6914                        nfs4_schedule_stateid_recovery(server, lsp->ls_state);
6915                break;
6916        case -NFS4ERR_STALE_STATEID:
6917                lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED;
6918                nfs4_schedule_lease_recovery(server->nfs_client);
6919        }
6920}
6921
6922static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *fl, int recovery_type)
6923{
6924        struct nfs4_lockdata *data;
6925        struct rpc_task *task;
6926        struct rpc_message msg = {
6927                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCK],
6928                .rpc_cred = state->owner->so_cred,
6929        };
6930        struct rpc_task_setup task_setup_data = {
6931                .rpc_client = NFS_CLIENT(state->inode),
6932                .rpc_message = &msg,
6933                .callback_ops = &nfs4_lock_ops,
6934                .workqueue = nfsiod_workqueue,
6935                .flags = RPC_TASK_ASYNC,
6936        };
6937        int ret;
6938
6939        dprintk("%s: begin!\n", __func__);
6940        data = nfs4_alloc_lockdata(fl, nfs_file_open_context(fl->fl_file),
6941                        fl->fl_u.nfs4_fl.owner,
6942                        recovery_type == NFS_LOCK_NEW ? GFP_KERNEL : GFP_NOFS);
6943        if (data == NULL)
6944                return -ENOMEM;
6945        if (IS_SETLKW(cmd))
6946                data->arg.block = 1;
6947        nfs4_init_sequence(&data->arg.seq_args, &data->res.seq_res, 1,
6948                                recovery_type > NFS_LOCK_NEW);
6949        msg.rpc_argp = &data->arg;
6950        msg.rpc_resp = &data->res;
6951        task_setup_data.callback_data = data;
6952        if (recovery_type > NFS_LOCK_NEW) {
6953                if (recovery_type == NFS_LOCK_RECLAIM)
6954                        data->arg.reclaim = NFS_LOCK_RECLAIM;
6955        } else
6956                data->arg.new_lock = 1;
6957        task = rpc_run_task(&task_setup_data);
6958        if (IS_ERR(task))
6959                return PTR_ERR(task);
6960        ret = rpc_wait_for_completion_task(task);
6961        if (ret == 0) {
6962                ret = data->rpc_status;
6963                if (ret)
6964                        nfs4_handle_setlk_error(data->server, data->lsp,
6965                                        data->arg.new_lock_owner, ret);
6966        } else
6967                data->cancelled = true;
6968        rpc_put_task(task);
6969        dprintk("%s: done, ret = %d!\n", __func__, ret);
6970        trace_nfs4_set_lock(fl, state, &data->res.stateid, cmd, ret);
6971        return ret;
6972}
6973
6974static int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request)
6975{
6976        struct nfs_server *server = NFS_SERVER(state->inode);
6977        struct nfs4_exception exception = {
6978                .inode = state->inode,
6979        };
6980        int err;
6981
6982        do {
6983                /* Cache the lock if possible... */
6984                if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0)
6985                        return 0;
6986                err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_RECLAIM);
6987                if (err != -NFS4ERR_DELAY)
6988                        break;
6989                nfs4_handle_exception(server, err, &exception);
6990        } while (exception.retry);
6991        return err;
6992}
6993
6994static int nfs4_lock_expired(struct nfs4_state *state, struct file_lock *request)
6995{
6996        struct nfs_server *server = NFS_SERVER(state->inode);
6997        struct nfs4_exception exception = {
6998                .inode = state->inode,
6999        };
7000        int err;
7001
7002        err = nfs4_set_lock_state(state, request);
7003        if (err != 0)
7004                return err;
7005        if (!recover_lost_locks) {
7006                set_bit(NFS_LOCK_LOST, &request->fl_u.nfs4_fl.owner->ls_flags);
7007                return 0;
7008        }
7009        do {
7010                if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0)
7011                        return 0;
7012                err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_EXPIRED);
7013                switch (err) {
7014                default:
7015                        goto out;
7016                case -NFS4ERR_GRACE:
7017                case -NFS4ERR_DELAY:
7018                        nfs4_handle_exception(server, err, &exception);
7019                        err = 0;
7020                }
7021        } while (exception.retry);
7022out:
7023        return err;
7024}
7025
7026#if defined(CONFIG_NFS_V4_1)
7027static int nfs41_lock_expired(struct nfs4_state *state, struct file_lock *request)
7028{
7029        struct nfs4_lock_state *lsp;
7030        int status;
7031
7032        status = nfs4_set_lock_state(state, request);
7033        if (status != 0)
7034                return status;
7035        lsp = request->fl_u.nfs4_fl.owner;
7036        if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags) ||
7037            test_bit(NFS_LOCK_LOST, &lsp->ls_flags))
7038                return 0;
7039        return nfs4_lock_expired(state, request);
7040}
7041#endif
7042
7043static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
7044{
7045        struct nfs_inode *nfsi = NFS_I(state->inode);
7046        struct nfs4_state_owner *sp = state->owner;
7047        unsigned char fl_flags = request->fl_flags;
7048        int status;
7049
7050        request->fl_flags |= FL_ACCESS;
7051        status = locks_lock_inode_wait(state->inode, request);
7052        if (status < 0)
7053                goto out;
7054        mutex_lock(&sp->so_delegreturn_mutex);
7055        down_read(&nfsi->rwsem);
7056        if (test_bit(NFS_DELEGATED_STATE, &state->flags)) {
7057                /* Yes: cache locks! */
7058                /* ...but avoid races with delegation recall... */
7059                request->fl_flags = fl_flags & ~FL_SLEEP;
7060                status = locks_lock_inode_wait(state->inode, request);
7061                up_read(&nfsi->rwsem);
7062                mutex_unlock(&sp->so_delegreturn_mutex);
7063                goto out;
7064        }
7065        up_read(&nfsi->rwsem);
7066        mutex_unlock(&sp->so_delegreturn_mutex);
7067        status = _nfs4_do_setlk(state, cmd, request, NFS_LOCK_NEW);
7068out:
7069        request->fl_flags = fl_flags;
7070        return status;
7071}
7072
7073static int nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
7074{
7075        struct nfs4_exception exception = {
7076                .state = state,
7077                .inode = state->inode,
7078                .interruptible = true,
7079        };
7080        int err;
7081
7082        do {
7083                err = _nfs4_proc_setlk(state, cmd, request);
7084                if (err == -NFS4ERR_DENIED)
7085                        err = -EAGAIN;
7086                err = nfs4_handle_exception(NFS_SERVER(state->inode),
7087                                err, &exception);
7088        } while (exception.retry);
7089        return err;
7090}
7091
7092#define NFS4_LOCK_MINTIMEOUT (1 * HZ)
7093#define NFS4_LOCK_MAXTIMEOUT (30 * HZ)
7094
7095static int
7096nfs4_retry_setlk_simple(struct nfs4_state *state, int cmd,
7097                        struct file_lock *request)
7098{
7099        int             status = -ERESTARTSYS;
7100        unsigned long   timeout = NFS4_LOCK_MINTIMEOUT;
7101
7102        while(!signalled()) {
7103                status = nfs4_proc_setlk(state, cmd, request);
7104                if ((status != -EAGAIN) || IS_SETLK(cmd))
7105                        break;
7106                freezable_schedule_timeout_interruptible(timeout);
7107                timeout *= 2;
7108                timeout = min_t(unsigned long, NFS4_LOCK_MAXTIMEOUT, timeout);
7109                status = -ERESTARTSYS;
7110        }
7111        return status;
7112}
7113
7114#ifdef CONFIG_NFS_V4_1
7115struct nfs4_lock_waiter {
7116        struct task_struct      *task;
7117        struct inode            *inode;
7118        struct nfs_lowner       *owner;
7119};
7120
7121static int
7122nfs4_wake_lock_waiter(wait_queue_entry_t *wait, unsigned int mode, int flags, void *key)
7123{
7124        int ret;
7125        struct nfs4_lock_waiter *waiter = wait->private;
7126
7127        /* NULL key means to wake up everyone */
7128        if (key) {
7129                struct cb_notify_lock_args      *cbnl = key;
7130                struct nfs_lowner               *lowner = &cbnl->cbnl_owner,
7131                                                *wowner = waiter->owner;
7132
7133                /* Only wake if the callback was for the same owner. */
7134                if (lowner->id != wowner->id || lowner->s_dev != wowner->s_dev)
7135                        return 0;
7136
7137                /* Make sure it's for the right inode */
7138                if (nfs_compare_fh(NFS_FH(waiter->inode), &cbnl->cbnl_fh))
7139                        return 0;
7140        }
7141
7142        /* override "private" so we can use default_wake_function */
7143        wait->private = waiter->task;
7144        ret = woken_wake_function(wait, mode, flags, key);
7145        if (ret)
7146                list_del_init(&wait->entry);
7147        wait->private = waiter;
7148        return ret;
7149}
7150
7151static int
7152nfs4_retry_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
7153{
7154        int status = -ERESTARTSYS;
7155        struct nfs4_lock_state *lsp = request->fl_u.nfs4_fl.owner;
7156        struct nfs_server *server = NFS_SERVER(state->inode);
7157        struct nfs_client *clp = server->nfs_client;
7158        wait_queue_head_t *q = &clp->cl_lock_waitq;
7159        struct nfs_lowner owner = { .clientid = clp->cl_clientid,
7160                                    .id = lsp->ls_seqid.owner_id,
7161                                    .s_dev = server->s_dev };
7162        struct nfs4_lock_waiter waiter = { .task  = current,
7163                                           .inode = state->inode,
7164                                           .owner = &owner};
7165        wait_queue_entry_t wait;
7166
7167        /* Don't bother with waitqueue if we don't expect a callback */
7168        if (!test_bit(NFS_STATE_MAY_NOTIFY_LOCK, &state->flags))
7169                return nfs4_retry_setlk_simple(state, cmd, request);
7170
7171        init_wait(&wait);
7172        wait.private = &waiter;
7173        wait.func = nfs4_wake_lock_waiter;
7174
7175        while(!signalled()) {
7176                add_wait_queue(q, &wait);
7177                status = nfs4_proc_setlk(state, cmd, request);
7178                if ((status != -EAGAIN) || IS_SETLK(cmd)) {
7179                        finish_wait(q, &wait);
7180                        break;
7181                }
7182
7183                status = -ERESTARTSYS;
7184                freezer_do_not_count();
7185                wait_woken(&wait, TASK_INTERRUPTIBLE, NFS4_LOCK_MAXTIMEOUT);
7186                freezer_count();
7187                finish_wait(q, &wait);
7188        }
7189
7190        return status;
7191}
7192#else /* !CONFIG_NFS_V4_1 */
7193static inline int
7194nfs4_retry_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
7195{
7196        return nfs4_retry_setlk_simple(state, cmd, request);
7197}
7198#endif
7199
7200static int
7201nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request)
7202{
7203        struct nfs_open_context *ctx;
7204        struct nfs4_state *state;
7205        int status;
7206
7207        /* verify open state */
7208        ctx = nfs_file_open_context(filp);
7209        state = ctx->state;
7210
7211        if (IS_GETLK(cmd)) {
7212                if (state != NULL)
7213                        return nfs4_proc_getlk(state, F_GETLK, request);
7214                return 0;
7215        }
7216
7217        if (!(IS_SETLK(cmd) || IS_SETLKW(cmd)))
7218                return -EINVAL;
7219
7220        if (request->fl_type == F_UNLCK) {
7221                if (state != NULL)
7222                        return nfs4_proc_unlck(state, cmd, request);
7223                return 0;
7224        }
7225
7226        if (state == NULL)
7227                return -ENOLCK;
7228
7229        if ((request->fl_flags & FL_POSIX) &&
7230            !test_bit(NFS_STATE_POSIX_LOCKS, &state->flags))
7231                return -ENOLCK;
7232
7233        /*
7234         * Don't rely on the VFS having checked the file open mode,
7235         * since it won't do this for flock() locks.
7236         */
7237        switch (request->fl_type) {
7238        case F_RDLCK:
7239                if (!(filp->f_mode & FMODE_READ))
7240                        return -EBADF;
7241                break;
7242        case F_WRLCK:
7243                if (!(filp->f_mode & FMODE_WRITE))
7244                        return -EBADF;
7245        }
7246
7247        status = nfs4_set_lock_state(state, request);
7248        if (status != 0)
7249                return status;
7250
7251        return nfs4_retry_setlk(state, cmd, request);
7252}
7253
7254int nfs4_lock_delegation_recall(struct file_lock *fl, struct nfs4_state *state, const nfs4_stateid *stateid)
7255{
7256        struct nfs_server *server = NFS_SERVER(state->inode);
7257        int err;
7258
7259        err = nfs4_set_lock_state(state, fl);
7260        if (err != 0)
7261                return err;
7262        err = _nfs4_do_setlk(state, F_SETLK, fl, NFS_LOCK_NEW);
7263        return nfs4_handle_delegation_recall_error(server, state, stateid, fl, err);
7264}
7265
7266struct nfs_release_lockowner_data {
7267        struct nfs4_lock_state *lsp;
7268        struct nfs_server *server;
7269        struct nfs_release_lockowner_args args;
7270        struct nfs_release_lockowner_res res;
7271        unsigned long timestamp;
7272};
7273
7274static void nfs4_release_lockowner_prepare(struct rpc_task *task, void *calldata)
7275{
7276        struct nfs_release_lockowner_data *data = calldata;
7277        struct nfs_server *server = data->server;
7278        nfs4_setup_sequence(server->nfs_client, &data->args.seq_args,
7279                           &data->res.seq_res, task);
7280        data->args.lock_owner.clientid = server->nfs_client->cl_clientid;
7281        data->timestamp = jiffies;
7282}
7283
7284static void nfs4_release_lockowner_done(struct rpc_task *task, void *calldata)
7285{
7286        struct nfs_release_lockowner_data *data = calldata;
7287        struct nfs_server *server = data->server;
7288
7289        nfs40_sequence_done(task, &data->res.seq_res);
7290
7291        switch (task->tk_status) {
7292        case 0:
7293                renew_lease(server, data->timestamp);
7294                break;
7295        case -NFS4ERR_STALE_CLIENTID:
7296        case -NFS4ERR_EXPIRED:
7297                nfs4_schedule_lease_recovery(server->nfs_client);
7298                break;
7299        case -NFS4ERR_LEASE_MOVED:
7300        case -NFS4ERR_DELAY:
7301                if (nfs4_async_handle_error(task, server,
7302                                            NULL, NULL) == -EAGAIN)
7303                        rpc_restart_call_prepare(task);
7304        }
7305}
7306
7307static void nfs4_release_lockowner_release(void *calldata)
7308{
7309        struct nfs_release_lockowner_data *data = calldata;
7310        nfs4_free_lock_state(data->server, data->lsp);
7311        kfree(calldata);
7312}
7313
7314static const struct rpc_call_ops nfs4_release_lockowner_ops = {
7315        .rpc_call_prepare = nfs4_release_lockowner_prepare,
7316        .rpc_call_done = nfs4_release_lockowner_done,
7317        .rpc_release = nfs4_release_lockowner_release,
7318};
7319
7320static void
7321nfs4_release_lockowner(struct nfs_server *server, struct nfs4_lock_state *lsp)
7322{
7323        struct nfs_release_lockowner_data *data;
7324        struct rpc_message msg = {
7325                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RELEASE_LOCKOWNER],
7326        };
7327
7328        if (server->nfs_client->cl_mvops->minor_version != 0)
7329                return;
7330
7331        data = kmalloc(sizeof(*data), GFP_NOFS);
7332        if (!data)
7333                return;
7334        data->lsp = lsp;
7335        data->server = server;
7336        data->args.lock_owner.clientid = server->nfs_client->cl_clientid;
7337        data->args.lock_owner.id = lsp->ls_seqid.owner_id;
7338        data->args.lock_owner.s_dev = server->s_dev;
7339
7340        msg.rpc_argp = &data->args;
7341        msg.rpc_resp = &data->res;
7342        nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 0, 0);
7343        rpc_call_async(server->client, &msg, 0, &nfs4_release_lockowner_ops, data);
7344}
7345
7346#define XATTR_NAME_NFSV4_ACL "system.nfs4_acl"
7347
7348static int nfs4_xattr_set_nfs4_acl(const struct xattr_handler *handler,
7349                                   struct dentry *unused, struct inode *inode,
7350                                   const char *key, const void *buf,
7351                                   size_t buflen, int flags)
7352{
7353        return nfs4_proc_set_acl(inode, buf, buflen);
7354}
7355
7356static int nfs4_xattr_get_nfs4_acl(const struct xattr_handler *handler,
7357                                   struct dentry *unused, struct inode *inode,
7358                                   const char *key, void *buf, size_t buflen)
7359{
7360        return nfs4_proc_get_acl(inode, buf, buflen);
7361}
7362
7363static bool nfs4_xattr_list_nfs4_acl(struct dentry *dentry)
7364{
7365        return nfs4_server_supports_acls(NFS_SERVER(d_inode(dentry)));
7366}
7367
7368#ifdef CONFIG_NFS_V4_SECURITY_LABEL
7369
7370static int nfs4_xattr_set_nfs4_label(const struct xattr_handler *handler,
7371                                     struct dentry *unused, struct inode *inode,
7372                                     const char *key, const void *buf,
7373                                     size_t buflen, int flags)
7374{
7375        if (security_ismaclabel(key))
7376                return nfs4_set_security_label(inode, buf, buflen);
7377
7378        return -EOPNOTSUPP;
7379}
7380
7381static int nfs4_xattr_get_nfs4_label(const struct xattr_handler *handler,
7382                                     struct dentry *unused, struct inode *inode,
7383                                     const char *key, void *buf, size_t buflen)
7384{
7385        if (security_ismaclabel(key))
7386                return nfs4_get_security_label(inode, buf, buflen);
7387        return -EOPNOTSUPP;
7388}
7389
7390static ssize_t
7391nfs4_listxattr_nfs4_label(struct inode *inode, char *list, size_t list_len)
7392{
7393        int len = 0;
7394
7395        if (nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL)) {
7396                len = security_inode_listsecurity(inode, list, list_len);
7397                if (list_len && len > list_len)
7398                        return -ERANGE;
7399        }
7400        return len;
7401}
7402
7403static const struct xattr_handler nfs4_xattr_nfs4_label_handler = {
7404        .prefix = XATTR_SECURITY_PREFIX,
7405        .get    = nfs4_xattr_get_nfs4_label,
7406        .set    = nfs4_xattr_set_nfs4_label,
7407};
7408
7409#else
7410
7411static ssize_t
7412nfs4_listxattr_nfs4_label(struct inode *inode, char *list, size_t list_len)
7413{
7414        return 0;
7415}
7416
7417#endif
7418
7419/*
7420 * nfs_fhget will use either the mounted_on_fileid or the fileid
7421 */
7422static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr)
7423{
7424        if (!(((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) ||
7425               (fattr->valid & NFS_ATTR_FATTR_FILEID)) &&
7426              (fattr->valid & NFS_ATTR_FATTR_FSID) &&
7427              (fattr->valid & NFS_ATTR_FATTR_V4_LOCATIONS)))
7428                return;
7429
7430        fattr->valid |= NFS_ATTR_FATTR_TYPE | NFS_ATTR_FATTR_MODE |
7431                NFS_ATTR_FATTR_NLINK | NFS_ATTR_FATTR_V4_REFERRAL;
7432        fattr->mode = S_IFDIR | S_IRUGO | S_IXUGO;
7433        fattr->nlink = 2;
7434}
7435
7436static int _nfs4_proc_fs_locations(struct rpc_clnt *client, struct inode *dir,
7437                                   const struct qstr *name,
7438                                   struct nfs4_fs_locations *fs_locations,
7439                                   struct page *page)
7440{
7441        struct nfs_server *server = NFS_SERVER(dir);
7442        u32 bitmask[3];
7443        struct nfs4_fs_locations_arg args = {
7444                .dir_fh = NFS_FH(dir),
7445                .name = name,
7446                .page = page,
7447                .bitmask = bitmask,
7448        };
7449        struct nfs4_fs_locations_res res = {
7450                .fs_locations = fs_locations,
7451        };
7452        struct rpc_message msg = {
7453                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FS_LOCATIONS],
7454                .rpc_argp = &args,
7455                .rpc_resp = &res,
7456        };
7457        int status;
7458
7459        dprintk("%s: start\n", __func__);
7460
7461        bitmask[0] = nfs4_fattr_bitmap[0] | FATTR4_WORD0_FS_LOCATIONS;
7462        bitmask[1] = nfs4_fattr_bitmap[1];
7463
7464        /* Ask for the fileid of the absent filesystem if mounted_on_fileid
7465         * is not supported */
7466        if (NFS_SERVER(dir)->attr_bitmask[1] & FATTR4_WORD1_MOUNTED_ON_FILEID)
7467                bitmask[0] &= ~FATTR4_WORD0_FILEID;
7468        else
7469                bitmask[1] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID;
7470
7471        nfs_fattr_init(&fs_locations->fattr);
7472        fs_locations->server = server;
7473        fs_locations->nlocations = 0;
7474        status = nfs4_call_sync(client, server, &msg, &args.seq_args, &res.seq_res, 0);
7475        dprintk("%s: returned status = %d\n", __func__, status);
7476        return status;
7477}
7478
7479int nfs4_proc_fs_locations(struct rpc_clnt *client, struct inode *dir,
7480                           const struct qstr *name,
7481                           struct nfs4_fs_locations *fs_locations,
7482                           struct page *page)
7483{
7484        struct nfs4_exception exception = {
7485                .interruptible = true,
7486        };
7487        int err;
7488        do {
7489                err = _nfs4_proc_fs_locations(client, dir, name,
7490                                fs_locations, page);
7491                trace_nfs4_get_fs_locations(dir, name, err);
7492                err = nfs4_handle_exception(NFS_SERVER(dir), err,
7493                                &exception);
7494        } while (exception.retry);
7495        return err;
7496}
7497
7498/*
7499 * This operation also signals the server that this client is
7500 * performing migration recovery.  The server can stop returning
7501 * NFS4ERR_LEASE_MOVED to this client.  A RENEW operation is
7502 * appended to this compound to identify the client ID which is
7503 * performing recovery.
7504 */
7505static int _nfs40_proc_get_locations(struct inode *inode,
7506                                     struct nfs4_fs_locations *locations,
7507                                     struct page *page, const struct cred *cred)
7508{
7509        struct nfs_server *server = NFS_SERVER(inode);
7510        struct rpc_clnt *clnt = server->client;
7511        u32 bitmask[2] = {
7512                [0] = FATTR4_WORD0_FSID | FATTR4_WORD0_FS_LOCATIONS,
7513        };
7514        struct nfs4_fs_locations_arg args = {
7515                .clientid       = server->nfs_client->cl_clientid,
7516                .fh             = NFS_FH(inode),
7517                .page           = page,
7518                .bitmask        = bitmask,
7519                .migration      = 1,            /* skip LOOKUP */
7520                .renew          = 1,            /* append RENEW */
7521        };
7522        struct nfs4_fs_locations_res res = {
7523                .fs_locations   = locations,
7524                .migration      = 1,
7525                .renew          = 1,
7526        };
7527        struct rpc_message msg = {
7528                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_FS_LOCATIONS],
7529                .rpc_argp       = &args,
7530                .rpc_resp       = &res,
7531                .rpc_cred       = cred,
7532        };
7533        unsigned long now = jiffies;
7534        int status;
7535
7536        nfs_fattr_init(&locations->fattr);
7537        locations->server = server;
7538        locations->nlocations = 0;
7539
7540        nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 1);
7541        status = nfs4_call_sync_sequence(clnt, server, &msg,
7542                                        &args.seq_args, &res.seq_res);
7543        if (status)
7544                return status;
7545
7546        renew_lease(server, now);
7547        return 0;
7548}
7549
7550#ifdef CONFIG_NFS_V4_1
7551
7552/*
7553 * This operation also signals the server that this client is
7554 * performing migration recovery.  The server can stop asserting
7555 * SEQ4_STATUS_LEASE_MOVED for this client.  The client ID
7556 * performing this operation is identified in the SEQUENCE
7557 * operation in this compound.
7558 *
7559 * When the client supports GETATTR(fs_locations_info), it can
7560 * be plumbed in here.
7561 */
7562static int _nfs41_proc_get_locations(struct inode *inode,
7563                                     struct nfs4_fs_locations *locations,
7564                                     struct page *page, const struct cred *cred)
7565{
7566        struct nfs_server *server = NFS_SERVER(inode);
7567        struct rpc_clnt *clnt = server->client;
7568        u32 bitmask[2] = {
7569                [0] = FATTR4_WORD0_FSID | FATTR4_WORD0_FS_LOCATIONS,
7570        };
7571        struct nfs4_fs_locations_arg args = {
7572                .fh             = NFS_FH(inode),
7573                .page           = page,
7574                .bitmask        = bitmask,
7575                .migration      = 1,            /* skip LOOKUP */
7576        };
7577        struct nfs4_fs_locations_res res = {
7578                .fs_locations   = locations,
7579                .migration      = 1,
7580        };
7581        struct rpc_message msg = {
7582                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_FS_LOCATIONS],
7583                .rpc_argp       = &args,
7584                .rpc_resp       = &res,
7585                .rpc_cred       = cred,
7586        };
7587        int status;
7588
7589        nfs_fattr_init(&locations->fattr);
7590        locations->server = server;
7591        locations->nlocations = 0;
7592
7593        nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 1);
7594        status = nfs4_call_sync_sequence(clnt, server, &msg,
7595                                        &args.seq_args, &res.seq_res);
7596        if (status == NFS4_OK &&
7597            res.seq_res.sr_status_flags & SEQ4_STATUS_LEASE_MOVED)
7598                status = -NFS4ERR_LEASE_MOVED;
7599        return status;
7600}
7601
7602#endif  /* CONFIG_NFS_V4_1 */
7603
7604/**
7605 * nfs4_proc_get_locations - discover locations for a migrated FSID
7606 * @inode: inode on FSID that is migrating
7607 * @locations: result of query
7608 * @page: buffer
7609 * @cred: credential to use for this operation
7610 *
7611 * Returns NFS4_OK on success, a negative NFS4ERR status code if the
7612 * operation failed, or a negative errno if a local error occurred.
7613 *
7614 * On success, "locations" is filled in, but if the server has
7615 * no locations information, NFS_ATTR_FATTR_V4_LOCATIONS is not
7616 * asserted.
7617 *
7618 * -NFS4ERR_LEASE_MOVED is returned if the server still has leases
7619 * from this client that require migration recovery.
7620 */
7621int nfs4_proc_get_locations(struct inode *inode,
7622                            struct nfs4_fs_locations *locations,
7623                            struct page *page, const struct cred *cred)
7624{
7625        struct nfs_server *server = NFS_SERVER(inode);
7626        struct nfs_client *clp = server->nfs_client;
7627        const struct nfs4_mig_recovery_ops *ops =
7628                                        clp->cl_mvops->mig_recovery_ops;
7629        struct nfs4_exception exception = {
7630                .interruptible = true,
7631        };
7632        int status;
7633
7634        dprintk("%s: FSID %llx:%llx on \"%s\"\n", __func__,
7635                (unsigned long long)server->fsid.major,
7636                (unsigned long long)server->fsid.minor,
7637                clp->cl_hostname);
7638        nfs_display_fhandle(NFS_FH(inode), __func__);
7639
7640        do {
7641                status = ops->get_locations(inode, locations, page, cred);
7642                if (status != -NFS4ERR_DELAY)
7643                        break;
7644                nfs4_handle_exception(server, status, &exception);
7645        } while (exception.retry);
7646        return status;
7647}
7648
7649/*
7650 * This operation also signals the server that this client is
7651 * performing "lease moved" recovery.  The server can stop
7652 * returning NFS4ERR_LEASE_MOVED to this client.  A RENEW operation
7653 * is appended to this compound to identify the client ID which is
7654 * performing recovery.
7655 */
7656static int _nfs40_proc_fsid_present(struct inode *inode, const struct cred *cred)
7657{
7658        struct nfs_server *server = NFS_SERVER(inode);
7659        struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
7660        struct rpc_clnt *clnt = server->client;
7661        struct nfs4_fsid_present_arg args = {
7662                .fh             = NFS_FH(inode),
7663                .clientid       = clp->cl_clientid,
7664                .renew          = 1,            /* append RENEW */
7665        };
7666        struct nfs4_fsid_present_res res = {
7667                .renew          = 1,
7668        };
7669        struct rpc_message msg = {
7670                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_FSID_PRESENT],
7671                .rpc_argp       = &args,
7672                .rpc_resp       = &res,
7673                .rpc_cred       = cred,
7674        };
7675        unsigned long now = jiffies;
7676        int status;
7677
7678        res.fh = nfs_alloc_fhandle();
7679        if (res.fh == NULL)
7680                return -ENOMEM;
7681
7682        nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 1);
7683        status = nfs4_call_sync_sequence(clnt, server, &msg,
7684                                                &args.seq_args, &res.seq_res);
7685        nfs_free_fhandle(res.fh);
7686        if (status)
7687                return status;
7688
7689        do_renew_lease(clp, now);
7690        return 0;
7691}
7692
7693#ifdef CONFIG_NFS_V4_1
7694
7695/*
7696 * This operation also signals the server that this client is
7697 * performing "lease moved" recovery.  The server can stop asserting
7698 * SEQ4_STATUS_LEASE_MOVED for this client.  The client ID performing
7699 * this operation is identified in the SEQUENCE operation in this
7700 * compound.
7701 */
7702static int _nfs41_proc_fsid_present(struct inode *inode, const struct cred *cred)
7703{
7704        struct nfs_server *server = NFS_SERVER(inode);
7705        struct rpc_clnt *clnt = server->client;
7706        struct nfs4_fsid_present_arg args = {
7707                .fh             = NFS_FH(inode),
7708        };
7709        struct nfs4_fsid_present_res res = {
7710        };
7711        struct rpc_message msg = {
7712                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_FSID_PRESENT],
7713                .rpc_argp       = &args,
7714                .rpc_resp       = &res,
7715                .rpc_cred       = cred,
7716        };
7717        int status;
7718
7719        res.fh = nfs_alloc_fhandle();
7720        if (res.fh == NULL)
7721                return -ENOMEM;
7722
7723        nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 1);
7724        status = nfs4_call_sync_sequence(clnt, server, &msg,
7725                                                &args.seq_args, &res.seq_res);
7726        nfs_free_fhandle(res.fh);
7727        if (status == NFS4_OK &&
7728            res.seq_res.sr_status_flags & SEQ4_STATUS_LEASE_MOVED)
7729                status = -NFS4ERR_LEASE_MOVED;
7730        return status;
7731}
7732
7733#endif  /* CONFIG_NFS_V4_1 */
7734
7735/**
7736 * nfs4_proc_fsid_present - Is this FSID present or absent on server?
7737 * @inode: inode on FSID to check
7738 * @cred: credential to use for this operation
7739 *
7740 * Server indicates whether the FSID is present, moved, or not
7741 * recognized.  This operation is necessary to clear a LEASE_MOVED
7742 * condition for this client ID.
7743 *
7744 * Returns NFS4_OK if the FSID is present on this server,
7745 * -NFS4ERR_MOVED if the FSID is no longer present, a negative
7746 *  NFS4ERR code if some error occurred on the server, or a
7747 *  negative errno if a local failure occurred.
7748 */
7749int nfs4_proc_fsid_present(struct inode *inode, const struct cred *cred)
7750{
7751        struct nfs_server *server = NFS_SERVER(inode);
7752        struct nfs_client *clp = server->nfs_client;
7753        const struct nfs4_mig_recovery_ops *ops =
7754                                        clp->cl_mvops->mig_recovery_ops;
7755        struct nfs4_exception exception = {
7756                .interruptible = true,
7757        };
7758        int status;
7759
7760        dprintk("%s: FSID %llx:%llx on \"%s\"\n", __func__,
7761                (unsigned long long)server->fsid.major,
7762                (unsigned long long)server->fsid.minor,
7763                clp->cl_hostname);
7764        nfs_display_fhandle(NFS_FH(inode), __func__);
7765
7766        do {
7767                status = ops->fsid_present(inode, cred);
7768                if (status != -NFS4ERR_DELAY)
7769                        break;
7770                nfs4_handle_exception(server, status, &exception);
7771        } while (exception.retry);
7772        return status;
7773}
7774
7775/*
7776 * If 'use_integrity' is true and the state managment nfs_client
7777 * cl_rpcclient is using krb5i/p, use the integrity protected cl_rpcclient
7778 * and the machine credential as per RFC3530bis and RFC5661 Security
7779 * Considerations sections. Otherwise, just use the user cred with the
7780 * filesystem's rpc_client.
7781 */
7782static int _nfs4_proc_secinfo(struct inode *dir, const struct qstr *name, struct nfs4_secinfo_flavors *flavors, bool use_integrity)
7783{
7784        int status;
7785        struct rpc_clnt *clnt = NFS_SERVER(dir)->client;
7786        struct nfs_client *clp = NFS_SERVER(dir)->nfs_client;
7787        struct nfs4_secinfo_arg args = {
7788                .dir_fh = NFS_FH(dir),
7789                .name   = name,
7790        };
7791        struct nfs4_secinfo_res res = {
7792                .flavors     = flavors,
7793        };
7794        struct rpc_message msg = {
7795                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SECINFO],
7796                .rpc_argp = &args,
7797                .rpc_resp = &res,
7798        };
7799        struct nfs4_call_sync_data data = {
7800                .seq_server = NFS_SERVER(dir),
7801                .seq_args = &args.seq_args,
7802                .seq_res = &res.seq_res,
7803        };
7804        struct rpc_task_setup task_setup = {
7805                .rpc_client = clnt,
7806                .rpc_message = &msg,
7807                .callback_ops = clp->cl_mvops->call_sync_ops,
7808                .callback_data = &data,
7809                .flags = RPC_TASK_NO_ROUND_ROBIN,
7810        };
7811        const struct cred *cred = NULL;
7812
7813        if (use_integrity) {
7814                clnt = clp->cl_rpcclient;
7815                task_setup.rpc_client = clnt;
7816
7817                cred = nfs4_get_clid_cred(clp);
7818                msg.rpc_cred = cred;
7819        }
7820
7821        dprintk("NFS call  secinfo %s\n", name->name);
7822
7823        nfs4_state_protect(clp, NFS_SP4_MACH_CRED_SECINFO, &clnt, &msg);
7824        nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 0);
7825        status = nfs4_call_sync_custom(&task_setup);
7826
7827        dprintk("NFS reply  secinfo: %d\n", status);
7828
7829        put_cred(cred);
7830        return status;
7831}
7832
7833int nfs4_proc_secinfo(struct inode *dir, const struct qstr *name,
7834                      struct nfs4_secinfo_flavors *flavors)
7835{
7836        struct nfs4_exception exception = {
7837                .interruptible = true,
7838        };
7839        int err;
7840        do {
7841                err = -NFS4ERR_WRONGSEC;
7842
7843                /* try to use integrity protection with machine cred */
7844                if (_nfs4_is_integrity_protected(NFS_SERVER(dir)->nfs_client))
7845                        err = _nfs4_proc_secinfo(dir, name, flavors, true);
7846
7847                /*
7848                 * if unable to use integrity protection, or SECINFO with
7849                 * integrity protection returns NFS4ERR_WRONGSEC (which is
7850                 * disallowed by spec, but exists in deployed servers) use
7851                 * the current filesystem's rpc_client and the user cred.
7852                 */
7853                if (err == -NFS4ERR_WRONGSEC)
7854                        err = _nfs4_proc_secinfo(dir, name, flavors, false);
7855
7856                trace_nfs4_secinfo(dir, name, err);
7857                err = nfs4_handle_exception(NFS_SERVER(dir), err,
7858                                &exception);
7859        } while (exception.retry);
7860        return err;
7861}
7862
7863#ifdef CONFIG_NFS_V4_1
7864/*
7865 * Check the exchange flags returned by the server for invalid flags, having
7866 * both PNFS and NON_PNFS flags set, and not having one of NON_PNFS, PNFS, or
7867 * DS flags set.
7868 */
7869static int nfs4_check_cl_exchange_flags(u32 flags)
7870{
7871        if (flags & ~EXCHGID4_FLAG_MASK_R)
7872                goto out_inval;
7873        if ((flags & EXCHGID4_FLAG_USE_PNFS_MDS) &&
7874            (flags & EXCHGID4_FLAG_USE_NON_PNFS))
7875                goto out_inval;
7876        if (!(flags & (EXCHGID4_FLAG_MASK_PNFS)))
7877                goto out_inval;
7878        return NFS_OK;
7879out_inval:
7880        return -NFS4ERR_INVAL;
7881}
7882
7883static bool
7884nfs41_same_server_scope(struct nfs41_server_scope *a,
7885                        struct nfs41_server_scope *b)
7886{
7887        if (a->server_scope_sz != b->server_scope_sz)
7888                return false;
7889        return memcmp(a->server_scope, b->server_scope, a->server_scope_sz) == 0;
7890}
7891
7892static void
7893nfs4_bind_one_conn_to_session_done(struct rpc_task *task, void *calldata)
7894{
7895        struct nfs41_bind_conn_to_session_args *args = task->tk_msg.rpc_argp;
7896        struct nfs_client *clp = args->client;
7897
7898        switch (task->tk_status) {
7899        case -NFS4ERR_BADSESSION:
7900        case -NFS4ERR_DEADSESSION:
7901                nfs4_schedule_session_recovery(clp->cl_session,
7902                                task->tk_status);
7903        }
7904}
7905
7906static const struct rpc_call_ops nfs4_bind_one_conn_to_session_ops = {
7907        .rpc_call_done =  &nfs4_bind_one_conn_to_session_done,
7908};
7909
7910/*
7911 * nfs4_proc_bind_one_conn_to_session()
7912 *
7913 * The 4.1 client currently uses the same TCP connection for the
7914 * fore and backchannel.
7915 */
7916static
7917int nfs4_proc_bind_one_conn_to_session(struct rpc_clnt *clnt,
7918                struct rpc_xprt *xprt,
7919                struct nfs_client *clp,
7920                const struct cred *cred)
7921{
7922        int status;
7923        struct nfs41_bind_conn_to_session_args args = {
7924                .client = clp,
7925                .dir = NFS4_CDFC4_FORE_OR_BOTH,
7926        };
7927        struct nfs41_bind_conn_to_session_res res;
7928        struct rpc_message msg = {
7929                .rpc_proc =
7930                        &nfs4_procedures[NFSPROC4_CLNT_BIND_CONN_TO_SESSION],
7931                .rpc_argp = &args,
7932                .rpc_resp = &res,
7933                .rpc_cred = cred,
7934        };
7935        struct rpc_task_setup task_setup_data = {
7936                .rpc_client = clnt,
7937                .rpc_xprt = xprt,
7938                .callback_ops = &nfs4_bind_one_conn_to_session_ops,
7939                .rpc_message = &msg,
7940                .flags = RPC_TASK_TIMEOUT,
7941        };
7942        struct rpc_task *task;
7943
7944        nfs4_copy_sessionid(&args.sessionid, &clp->cl_session->sess_id);
7945        if (!(clp->cl_session->flags & SESSION4_BACK_CHAN))
7946                args.dir = NFS4_CDFC4_FORE;
7947
7948        /* Do not set the backchannel flag unless this is clnt->cl_xprt */
7949        if (xprt != rcu_access_pointer(clnt->cl_xprt))
7950                args.dir = NFS4_CDFC4_FORE;
7951
7952        task = rpc_run_task(&task_setup_data);
7953        if (!IS_ERR(task)) {
7954                status = task->tk_status;
7955                rpc_put_task(task);
7956        } else
7957                status = PTR_ERR(task);
7958        trace_nfs4_bind_conn_to_session(clp, status);
7959        if (status == 0) {
7960                if (memcmp(res.sessionid.data,
7961                    clp->cl_session->sess_id.data, NFS4_MAX_SESSIONID_LEN)) {
7962                        dprintk("NFS: %s: Session ID mismatch\n", __func__);
7963                        return -EIO;
7964                }
7965                if ((res.dir & args.dir) != res.dir || res.dir == 0) {
7966                        dprintk("NFS: %s: Unexpected direction from server\n",
7967                                __func__);
7968                        return -EIO;
7969                }
7970                if (res.use_conn_in_rdma_mode != args.use_conn_in_rdma_mode) {
7971                        dprintk("NFS: %s: Server returned RDMA mode = true\n",
7972                                __func__);
7973                        return -EIO;
7974                }
7975        }
7976
7977        return status;
7978}
7979
7980struct rpc_bind_conn_calldata {
7981        struct nfs_client *clp;
7982        const struct cred *cred;
7983};
7984
7985static int
7986nfs4_proc_bind_conn_to_session_callback(struct rpc_clnt *clnt,
7987                struct rpc_xprt *xprt,
7988                void *calldata)
7989{
7990        struct rpc_bind_conn_calldata *p = calldata;
7991
7992        return nfs4_proc_bind_one_conn_to_session(clnt, xprt, p->clp, p->cred);
7993}
7994
7995int nfs4_proc_bind_conn_to_session(struct nfs_client *clp, const struct cred *cred)
7996{
7997        struct rpc_bind_conn_calldata data = {
7998                .clp = clp,
7999                .cred = cred,
8000        };
8001        return rpc_clnt_iterate_for_each_xprt(clp->cl_rpcclient,
8002                        nfs4_proc_bind_conn_to_session_callback, &data);
8003}
8004
8005/*
8006 * Minimum set of SP4_MACH_CRED operations from RFC 5661 in the enforce map
8007 * and operations we'd like to see to enable certain features in the allow map
8008 */
8009static const struct nfs41_state_protection nfs4_sp4_mach_cred_request = {
8010        .how = SP4_MACH_CRED,
8011        .enforce.u.words = {
8012                [1] = 1 << (OP_BIND_CONN_TO_SESSION - 32) |
8013                      1 << (OP_EXCHANGE_ID - 32) |
8014                      1 << (OP_CREATE_SESSION - 32) |
8015                      1 << (OP_DESTROY_SESSION - 32) |
8016                      1 << (OP_DESTROY_CLIENTID - 32)
8017        },
8018        .allow.u.words = {
8019                [0] = 1 << (OP_CLOSE) |
8020                      1 << (OP_OPEN_DOWNGRADE) |
8021                      1 << (OP_LOCKU) |
8022                      1 << (OP_DELEGRETURN) |
8023                      1 << (OP_COMMIT),
8024                [1] = 1 << (OP_SECINFO - 32) |
8025                      1 << (OP_SECINFO_NO_NAME - 32) |
8026                      1 << (OP_LAYOUTRETURN - 32) |
8027                      1 << (OP_TEST_STATEID - 32) |
8028                      1 << (OP_FREE_STATEID - 32) |
8029                      1 << (OP_WRITE - 32)
8030        }
8031};
8032
8033/*
8034 * Select the state protection mode for client `clp' given the server results
8035 * from exchange_id in `sp'.
8036 *
8037 * Returns 0 on success, negative errno otherwise.
8038 */
8039static int nfs4_sp4_select_mode(struct nfs_client *clp,
8040                                 struct nfs41_state_protection *sp)
8041{
8042        static const u32 supported_enforce[NFS4_OP_MAP_NUM_WORDS] = {
8043                [1] = 1 << (OP_BIND_CONN_TO_SESSION - 32) |
8044                      1 << (OP_EXCHANGE_ID - 32) |
8045                      1 << (OP_CREATE_SESSION - 32) |
8046                      1 << (OP_DESTROY_SESSION - 32) |
8047                      1 << (OP_DESTROY_CLIENTID - 32)
8048        };
8049        unsigned long flags = 0;
8050        unsigned int i;
8051        int ret = 0;
8052
8053        if (sp->how == SP4_MACH_CRED) {
8054                /* Print state protect result */
8055                dfprintk(MOUNT, "Server SP4_MACH_CRED support:\n");
8056                for (i = 0; i <= LAST_NFS4_OP; i++) {
8057                        if (test_bit(i, sp->enforce.u.longs))
8058                                dfprintk(MOUNT, "  enforce op %d\n", i);
8059                        if (test_bit(i, sp->allow.u.longs))
8060                                dfprintk(MOUNT, "  allow op %d\n", i);
8061                }
8062
8063                /* make sure nothing is on enforce list that isn't supported */
8064                for (i = 0; i < NFS4_OP_MAP_NUM_WORDS; i++) {
8065                        if (sp->enforce.u.words[i] & ~supported_enforce[i]) {
8066                                dfprintk(MOUNT, "sp4_mach_cred: disabled\n");
8067                                ret = -EINVAL;
8068                                goto out;
8069                        }
8070                }
8071
8072                /*
8073                 * Minimal mode - state operations are allowed to use machine
8074                 * credential.  Note this already happens by default, so the
8075                 * client doesn't have to do anything more than the negotiation.
8076                 *
8077                 * NOTE: we don't care if EXCHANGE_ID is in the list -
8078                 *       we're already using the machine cred for exchange_id
8079                 *       and will never use a different cred.
8080                 */
8081                if (test_bit(OP_BIND_CONN_TO_SESSION, sp->enforce.u.longs) &&
8082                    test_bit(OP_CREATE_SESSION, sp->enforce.u.longs) &&
8083                    test_bit(OP_DESTROY_SESSION, sp->enforce.u.longs) &&
8084                    test_bit(OP_DESTROY_CLIENTID, sp->enforce.u.longs)) {
8085                        dfprintk(MOUNT, "sp4_mach_cred:\n");
8086                        dfprintk(MOUNT, "  minimal mode enabled\n");
8087                        __set_bit(NFS_SP4_MACH_CRED_MINIMAL, &flags);
8088                } else {
8089                        dfprintk(MOUNT, "sp4_mach_cred: disabled\n");
8090                        ret = -EINVAL;
8091                        goto out;
8092                }
8093
8094                if (test_bit(OP_CLOSE, sp->allow.u.longs) &&
8095                    test_bit(OP_OPEN_DOWNGRADE, sp->allow.u.longs) &&
8096                    test_bit(OP_DELEGRETURN, sp->allow.u.longs) &&
8097                    test_bit(OP_LOCKU, sp->allow.u.longs)) {
8098                        dfprintk(MOUNT, "  cleanup mode enabled\n");
8099                        __set_bit(NFS_SP4_MACH_CRED_CLEANUP, &flags);
8100                }
8101
8102                if (test_bit(OP_LAYOUTRETURN, sp->allow.u.longs)) {
8103                        dfprintk(MOUNT, "  pnfs cleanup mode enabled\n");
8104                        __set_bit(NFS_SP4_MACH_CRED_PNFS_CLEANUP, &flags);
8105                }
8106
8107                if (test_bit(OP_SECINFO, sp->allow.u.longs) &&
8108                    test_bit(OP_SECINFO_NO_NAME, sp->allow.u.longs)) {
8109                        dfprintk(MOUNT, "  secinfo mode enabled\n");
8110                        __set_bit(NFS_SP4_MACH_CRED_SECINFO, &flags);
8111                }
8112
8113                if (test_bit(OP_TEST_STATEID, sp->allow.u.longs) &&
8114                    test_bit(OP_FREE_STATEID, sp->allow.u.longs)) {
8115                        dfprintk(MOUNT, "  stateid mode enabled\n");
8116                        __set_bit(NFS_SP4_MACH_CRED_STATEID, &flags);
8117                }
8118
8119                if (test_bit(OP_WRITE, sp->allow.u.longs)) {
8120                        dfprintk(MOUNT, "  write mode enabled\n");
8121                        __set_bit(NFS_SP4_MACH_CRED_WRITE, &flags);
8122                }
8123
8124                if (test_bit(OP_COMMIT, sp->allow.u.longs)) {
8125                        dfprintk(MOUNT, "  commit mode enabled\n");
8126                        __set_bit(NFS_SP4_MACH_CRED_COMMIT, &flags);
8127                }
8128        }
8129out:
8130        clp->cl_sp4_flags = flags;
8131        return ret;
8132}
8133
8134struct nfs41_exchange_id_data {
8135        struct nfs41_exchange_id_res res;
8136        struct nfs41_exchange_id_args args;
8137};
8138
8139static void nfs4_exchange_id_release(void *data)
8140{
8141        struct nfs41_exchange_id_data *cdata =
8142                                        (struct nfs41_exchange_id_data *)data;
8143
8144        nfs_put_client(cdata->args.client);
8145        kfree(cdata->res.impl_id);
8146        kfree(cdata->res.server_scope);
8147        kfree(cdata->res.server_owner);
8148        kfree(cdata);
8149}
8150
8151static const struct rpc_call_ops nfs4_exchange_id_call_ops = {
8152        .rpc_release = nfs4_exchange_id_release,
8153};
8154
8155/*
8156 * _nfs4_proc_exchange_id()
8157 *
8158 * Wrapper for EXCHANGE_ID operation.
8159 */
8160static struct rpc_task *
8161nfs4_run_exchange_id(struct nfs_client *clp, const struct cred *cred,
8162                        u32 sp4_how, struct rpc_xprt *xprt)
8163{
8164        struct rpc_message msg = {
8165                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_EXCHANGE_ID],
8166                .rpc_cred = cred,
8167        };
8168        struct rpc_task_setup task_setup_data = {
8169                .rpc_client = clp->cl_rpcclient,
8170                .callback_ops = &nfs4_exchange_id_call_ops,
8171                .rpc_message = &msg,
8172                .flags = RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN,
8173        };
8174        struct nfs41_exchange_id_data *calldata;
8175        int status;
8176
8177        if (!refcount_inc_not_zero(&clp->cl_count))
8178                return ERR_PTR(-EIO);
8179
8180        status = -ENOMEM;
8181        calldata = kzalloc(sizeof(*calldata), GFP_NOFS);
8182        if (!calldata)
8183                goto out;
8184
8185        nfs4_init_boot_verifier(clp, &calldata->args.verifier);
8186
8187        status = nfs4_init_uniform_client_string(clp);
8188        if (status)
8189                goto out_calldata;
8190
8191        calldata->res.server_owner = kzalloc(sizeof(struct nfs41_server_owner),
8192                                                GFP_NOFS);
8193        status = -ENOMEM;
8194        if (unlikely(calldata->res.server_owner == NULL))
8195                goto out_calldata;
8196
8197        calldata->res.server_scope = kzalloc(sizeof(struct nfs41_server_scope),
8198                                        GFP_NOFS);
8199        if (unlikely(calldata->res.server_scope == NULL))
8200                goto out_server_owner;
8201
8202        calldata->res.impl_id = kzalloc(sizeof(struct nfs41_impl_id), GFP_NOFS);
8203        if (unlikely(calldata->res.impl_id == NULL))
8204                goto out_server_scope;
8205
8206        switch (sp4_how) {
8207        case SP4_NONE:
8208                calldata->args.state_protect.how = SP4_NONE;
8209                break;
8210
8211        case SP4_MACH_CRED:
8212                calldata->args.state_protect = nfs4_sp4_mach_cred_request;
8213                break;
8214
8215        default:
8216                /* unsupported! */
8217                WARN_ON_ONCE(1);
8218                status = -EINVAL;
8219                goto out_impl_id;
8220        }
8221        if (xprt) {
8222                task_setup_data.rpc_xprt = xprt;
8223                task_setup_data.flags |= RPC_TASK_SOFTCONN;
8224                memcpy(calldata->args.verifier.data, clp->cl_confirm.data,
8225                                sizeof(calldata->args.verifier.data));
8226        }
8227        calldata->args.client = clp;
8228        calldata->args.flags = EXCHGID4_FLAG_SUPP_MOVED_REFER |
8229        EXCHGID4_FLAG_BIND_PRINC_STATEID;
8230#ifdef CONFIG_NFS_V4_1_MIGRATION
8231        calldata->args.flags |= EXCHGID4_FLAG_SUPP_MOVED_MIGR;
8232#endif
8233        msg.rpc_argp = &calldata->args;
8234        msg.rpc_resp = &calldata->res;
8235        task_setup_data.callback_data = calldata;
8236
8237        return rpc_run_task(&task_setup_data);
8238
8239out_impl_id:
8240        kfree(calldata->res.impl_id);
8241out_server_scope:
8242        kfree(calldata->res.server_scope);
8243out_server_owner:
8244        kfree(calldata->res.server_owner);
8245out_calldata:
8246        kfree(calldata);
8247out:
8248        nfs_put_client(clp);
8249        return ERR_PTR(status);
8250}
8251
8252/*
8253 * _nfs4_proc_exchange_id()
8254 *
8255 * Wrapper for EXCHANGE_ID operation.
8256 */
8257static int _nfs4_proc_exchange_id(struct nfs_client *clp, const struct cred *cred,
8258                        u32 sp4_how)
8259{
8260        struct rpc_task *task;
8261        struct nfs41_exchange_id_args *argp;
8262        struct nfs41_exchange_id_res *resp;
8263        unsigned long now = jiffies;
8264        int status;
8265
8266        task = nfs4_run_exchange_id(clp, cred, sp4_how, NULL);
8267        if (IS_ERR(task))
8268                return PTR_ERR(task);
8269
8270        argp = task->tk_msg.rpc_argp;
8271        resp = task->tk_msg.rpc_resp;
8272        status = task->tk_status;
8273        if (status  != 0)
8274                goto out;
8275
8276        status = nfs4_check_cl_exchange_flags(resp->flags);
8277        if (status  != 0)
8278                goto out;
8279
8280        status = nfs4_sp4_select_mode(clp, &resp->state_protect);
8281        if (status != 0)
8282                goto out;
8283
8284        do_renew_lease(clp, now);
8285
8286        clp->cl_clientid = resp->clientid;
8287        clp->cl_exchange_flags = resp->flags;
8288        clp->cl_seqid = resp->seqid;
8289        /* Client ID is not confirmed */
8290        if (!(resp->flags & EXCHGID4_FLAG_CONFIRMED_R))
8291                clear_bit(NFS4_SESSION_ESTABLISHED,
8292                          &clp->cl_session->session_state);
8293
8294        if (clp->cl_serverscope != NULL &&
8295            !nfs41_same_server_scope(clp->cl_serverscope,
8296                                resp->server_scope)) {
8297                dprintk("%s: server_scope mismatch detected\n",
8298                        __func__);
8299                set_bit(NFS4CLNT_SERVER_SCOPE_MISMATCH, &clp->cl_state);
8300        }
8301
8302        swap(clp->cl_serverowner, resp->server_owner);
8303        swap(clp->cl_serverscope, resp->server_scope);
8304        swap(clp->cl_implid, resp->impl_id);
8305
8306        /* Save the EXCHANGE_ID verifier session trunk tests */
8307        memcpy(clp->cl_confirm.data, argp->verifier.data,
8308               sizeof(clp->cl_confirm.data));
8309out:
8310        trace_nfs4_exchange_id(clp, status);
8311        rpc_put_task(task);
8312        return status;
8313}
8314
8315/*
8316 * nfs4_proc_exchange_id()
8317 *
8318 * Returns zero, a negative errno, or a negative NFS4ERR status code.
8319 *
8320 * Since the clientid has expired, all compounds using sessions
8321 * associated with the stale clientid will be returning
8322 * NFS4ERR_BADSESSION in the sequence operation, and will therefore
8323 * be in some phase of session reset.
8324 *
8325 * Will attempt to negotiate SP4_MACH_CRED if krb5i / krb5p auth is used.
8326 */
8327int nfs4_proc_exchange_id(struct nfs_client *clp, const struct cred *cred)
8328{
8329        rpc_authflavor_t authflavor = clp->cl_rpcclient->cl_auth->au_flavor;
8330        int status;
8331
8332        /* try SP4_MACH_CRED if krb5i/p */
8333        if (authflavor == RPC_AUTH_GSS_KRB5I ||
8334            authflavor == RPC_AUTH_GSS_KRB5P) {
8335                status = _nfs4_proc_exchange_id(clp, cred, SP4_MACH_CRED);
8336                if (!status)
8337                        return 0;
8338        }
8339
8340        /* try SP4_NONE */
8341        return _nfs4_proc_exchange_id(clp, cred, SP4_NONE);
8342}
8343
8344/**
8345 * nfs4_test_session_trunk
8346 *
8347 * This is an add_xprt_test() test function called from
8348 * rpc_clnt_setup_test_and_add_xprt.
8349 *
8350 * The rpc_xprt_switch is referrenced by rpc_clnt_setup_test_and_add_xprt
8351 * and is dereferrenced in nfs4_exchange_id_release
8352 *
8353 * Upon success, add the new transport to the rpc_clnt
8354 *
8355 * @clnt: struct rpc_clnt to get new transport
8356 * @xprt: the rpc_xprt to test
8357 * @data: call data for _nfs4_proc_exchange_id.
8358 */
8359void nfs4_test_session_trunk(struct rpc_clnt *clnt, struct rpc_xprt *xprt,
8360                            void *data)
8361{
8362        struct nfs4_add_xprt_data *adata = (struct nfs4_add_xprt_data *)data;
8363        struct rpc_task *task;
8364        int status;
8365
8366        u32 sp4_how;
8367
8368        dprintk("--> %s try %s\n", __func__,
8369                xprt->address_strings[RPC_DISPLAY_ADDR]);
8370
8371        sp4_how = (adata->clp->cl_sp4_flags == 0 ? SP4_NONE : SP4_MACH_CRED);
8372
8373        /* Test connection for session trunking. Async exchange_id call */
8374        task = nfs4_run_exchange_id(adata->clp, adata->cred, sp4_how, xprt);
8375        if (IS_ERR(task))
8376                return;
8377
8378        status = task->tk_status;
8379        if (status == 0)
8380                status = nfs4_detect_session_trunking(adata->clp,
8381                                task->tk_msg.rpc_resp, xprt);
8382
8383        if (status == 0)
8384                rpc_clnt_xprt_switch_add_xprt(clnt, xprt);
8385
8386        rpc_put_task(task);
8387}
8388EXPORT_SYMBOL_GPL(nfs4_test_session_trunk);
8389
8390static int _nfs4_proc_destroy_clientid(struct nfs_client *clp,
8391                const struct cred *cred)
8392{
8393        struct rpc_message msg = {
8394                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DESTROY_CLIENTID],
8395                .rpc_argp = clp,
8396                .rpc_cred = cred,
8397        };
8398        int status;
8399
8400        status = rpc_call_sync(clp->cl_rpcclient, &msg,
8401                               RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN);
8402        trace_nfs4_destroy_clientid(clp, status);
8403        if (status)
8404                dprintk("NFS: Got error %d from the server %s on "
8405                        "DESTROY_CLIENTID.", status, clp->cl_hostname);
8406        return status;
8407}
8408
8409static int nfs4_proc_destroy_clientid(struct nfs_client *clp,
8410                const struct cred *cred)
8411{
8412        unsigned int loop;
8413        int ret;
8414
8415        for (loop = NFS4_MAX_LOOP_ON_RECOVER; loop != 0; loop--) {
8416                ret = _nfs4_proc_destroy_clientid(clp, cred);
8417                switch (ret) {
8418                case -NFS4ERR_DELAY:
8419                case -NFS4ERR_CLIENTID_BUSY:
8420                        ssleep(1);
8421                        break;
8422                default:
8423                        return ret;
8424                }
8425        }
8426        return 0;
8427}
8428
8429int nfs4_destroy_clientid(struct nfs_client *clp)
8430{
8431        const struct cred *cred;
8432        int ret = 0;
8433
8434        if (clp->cl_mvops->minor_version < 1)
8435                goto out;
8436        if (clp->cl_exchange_flags == 0)
8437                goto out;
8438        if (clp->cl_preserve_clid)
8439                goto out;
8440        cred = nfs4_get_clid_cred(clp);
8441        ret = nfs4_proc_destroy_clientid(clp, cred);
8442        put_cred(cred);
8443        switch (ret) {
8444        case 0:
8445        case -NFS4ERR_STALE_CLIENTID:
8446                clp->cl_exchange_flags = 0;
8447        }
8448out:
8449        return ret;
8450}
8451
8452#endif /* CONFIG_NFS_V4_1 */
8453
8454struct nfs4_get_lease_time_data {
8455        struct nfs4_get_lease_time_args *args;
8456        struct nfs4_get_lease_time_res *res;
8457        struct nfs_client *clp;
8458};
8459
8460static void nfs4_get_lease_time_prepare(struct rpc_task *task,
8461                                        void *calldata)
8462{
8463        struct nfs4_get_lease_time_data *data =
8464                        (struct nfs4_get_lease_time_data *)calldata;
8465
8466        dprintk("--> %s\n", __func__);
8467        /* just setup sequence, do not trigger session recovery
8468           since we're invoked within one */
8469        nfs4_setup_sequence(data->clp,
8470                        &data->args->la_seq_args,
8471                        &data->res->lr_seq_res,
8472                        task);
8473        dprintk("<-- %s\n", __func__);
8474}
8475
8476/*
8477 * Called from nfs4_state_manager thread for session setup, so don't recover
8478 * from sequence operation or clientid errors.
8479 */
8480static void nfs4_get_lease_time_done(struct rpc_task *task, void *calldata)
8481{
8482        struct nfs4_get_lease_time_data *data =
8483                        (struct nfs4_get_lease_time_data *)calldata;
8484
8485        dprintk("--> %s\n", __func__);
8486        if (!nfs4_sequence_done(task, &data->res->lr_seq_res))
8487                return;
8488        switch (task->tk_status) {
8489        case -NFS4ERR_DELAY:
8490        case -NFS4ERR_GRACE:
8491                dprintk("%s Retry: tk_status %d\n", __func__, task->tk_status);
8492                rpc_delay(task, NFS4_POLL_RETRY_MIN);
8493                task->tk_status = 0;
8494                /* fall through */
8495        case -NFS4ERR_RETRY_UNCACHED_REP:
8496                rpc_restart_call_prepare(task);
8497                return;
8498        }
8499        dprintk("<-- %s\n", __func__);
8500}
8501
8502static const struct rpc_call_ops nfs4_get_lease_time_ops = {
8503        .rpc_call_prepare = nfs4_get_lease_time_prepare,
8504        .rpc_call_done = nfs4_get_lease_time_done,
8505};
8506
8507int nfs4_proc_get_lease_time(struct nfs_client *clp, struct nfs_fsinfo *fsinfo)
8508{
8509        struct nfs4_get_lease_time_args args;
8510        struct nfs4_get_lease_time_res res = {
8511                .lr_fsinfo = fsinfo,
8512        };
8513        struct nfs4_get_lease_time_data data = {
8514                .args = &args,
8515                .res = &res,
8516                .clp = clp,
8517        };
8518        struct rpc_message msg = {
8519                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GET_LEASE_TIME],
8520                .rpc_argp = &args,
8521                .rpc_resp = &res,
8522        };
8523        struct rpc_task_setup task_setup = {
8524                .rpc_client = clp->cl_rpcclient,
8525                .rpc_message = &msg,
8526                .callback_ops = &nfs4_get_lease_time_ops,
8527                .callback_data = &data,
8528                .flags = RPC_TASK_TIMEOUT,
8529        };
8530
8531        nfs4_init_sequence(&args.la_seq_args, &res.lr_seq_res, 0, 1);
8532        return nfs4_call_sync_custom(&task_setup);
8533}
8534
8535#ifdef CONFIG_NFS_V4_1
8536
8537/*
8538 * Initialize the values to be used by the client in CREATE_SESSION
8539 * If nfs4_init_session set the fore channel request and response sizes,
8540 * use them.
8541 *
8542 * Set the back channel max_resp_sz_cached to zero to force the client to
8543 * always set csa_cachethis to FALSE because the current implementation
8544 * of the back channel DRC only supports caching the CB_SEQUENCE operation.
8545 */
8546static void nfs4_init_channel_attrs(struct nfs41_create_session_args *args,
8547                                    struct rpc_clnt *clnt)
8548{
8549        unsigned int max_rqst_sz, max_resp_sz;
8550        unsigned int max_bc_payload = rpc_max_bc_payload(clnt);
8551        unsigned int max_bc_slots = rpc_num_bc_slots(clnt);
8552
8553        max_rqst_sz = NFS_MAX_FILE_IO_SIZE + nfs41_maxwrite_overhead;
8554        max_resp_sz = NFS_MAX_FILE_IO_SIZE + nfs41_maxread_overhead;
8555
8556        /* Fore channel attributes */
8557        args->fc_attrs.max_rqst_sz = max_rqst_sz;
8558        args->fc_attrs.max_resp_sz = max_resp_sz;
8559        args->fc_attrs.max_ops = NFS4_MAX_OPS;
8560        args->fc_attrs.max_reqs = max_session_slots;
8561
8562        dprintk("%s: Fore Channel : max_rqst_sz=%u max_resp_sz=%u "
8563                "max_ops=%u max_reqs=%u\n",
8564                __func__,
8565                args->fc_attrs.max_rqst_sz, args->fc_attrs.max_resp_sz,
8566                args->fc_attrs.max_ops, args->fc_attrs.max_reqs);
8567
8568        /* Back channel attributes */
8569        args->bc_attrs.max_rqst_sz = max_bc_payload;
8570        args->bc_attrs.max_resp_sz = max_bc_payload;
8571        args->bc_attrs.max_resp_sz_cached = 0;
8572        args->bc_attrs.max_ops = NFS4_MAX_BACK_CHANNEL_OPS;
8573        args->bc_attrs.max_reqs = max_t(unsigned short, max_session_cb_slots, 1);
8574        if (args->bc_attrs.max_reqs > max_bc_slots)
8575                args->bc_attrs.max_reqs = max_bc_slots;
8576
8577        dprintk("%s: Back Channel : max_rqst_sz=%u max_resp_sz=%u "
8578                "max_resp_sz_cached=%u max_ops=%u max_reqs=%u\n",
8579                __func__,
8580                args->bc_attrs.max_rqst_sz, args->bc_attrs.max_resp_sz,
8581                args->bc_attrs.max_resp_sz_cached, args->bc_attrs.max_ops,
8582                args->bc_attrs.max_reqs);
8583}
8584
8585static int nfs4_verify_fore_channel_attrs(struct nfs41_create_session_args *args,
8586                struct nfs41_create_session_res *res)
8587{
8588        struct nfs4_channel_attrs *sent = &args->fc_attrs;
8589        struct nfs4_channel_attrs *rcvd = &res->fc_attrs;
8590
8591        if (rcvd->max_resp_sz > sent->max_resp_sz)
8592                return -EINVAL;
8593        /*
8594         * Our requested max_ops is the minimum we need; we're not
8595         * prepared to break up compounds into smaller pieces than that.
8596         * So, no point even trying to continue if the server won't
8597         * cooperate:
8598         */
8599        if (rcvd->max_ops < sent->max_ops)
8600                return -EINVAL;
8601        if (rcvd->max_reqs == 0)
8602                return -EINVAL;
8603        if (rcvd->max_reqs > NFS4_MAX_SLOT_TABLE)
8604                rcvd->max_reqs = NFS4_MAX_SLOT_TABLE;
8605        return 0;
8606}
8607
8608static int nfs4_verify_back_channel_attrs(struct nfs41_create_session_args *args,
8609                struct nfs41_create_session_res *res)
8610{
8611        struct nfs4_channel_attrs *sent = &args->bc_attrs;
8612        struct nfs4_channel_attrs *rcvd = &res->bc_attrs;
8613
8614        if (!(res->flags & SESSION4_BACK_CHAN))
8615                goto out;
8616        if (rcvd->max_rqst_sz > sent->max_rqst_sz)
8617                return -EINVAL;
8618        if (rcvd->max_resp_sz < sent->max_resp_sz)
8619                return -EINVAL;
8620        if (rcvd->max_resp_sz_cached > sent->max_resp_sz_cached)
8621                return -EINVAL;
8622        if (rcvd->max_ops > sent->max_ops)
8623                return -EINVAL;
8624        if (rcvd->max_reqs > sent->max_reqs)
8625                return -EINVAL;
8626out:
8627        return 0;
8628}
8629
8630static int nfs4_verify_channel_attrs(struct nfs41_create_session_args *args,
8631                                     struct nfs41_create_session_res *res)
8632{
8633        int ret;
8634
8635        ret = nfs4_verify_fore_channel_attrs(args, res);
8636        if (ret)
8637                return ret;
8638        return nfs4_verify_back_channel_attrs(args, res);
8639}
8640
8641static void nfs4_update_session(struct nfs4_session *session,
8642                struct nfs41_create_session_res *res)
8643{
8644        nfs4_copy_sessionid(&session->sess_id, &res->sessionid);
8645        /* Mark client id and session as being confirmed */
8646        session->clp->cl_exchange_flags |= EXCHGID4_FLAG_CONFIRMED_R;
8647        set_bit(NFS4_SESSION_ESTABLISHED, &session->session_state);
8648        session->flags = res->flags;
8649        memcpy(&session->fc_attrs, &res->fc_attrs, sizeof(session->fc_attrs));
8650        if (res->flags & SESSION4_BACK_CHAN)
8651                memcpy(&session->bc_attrs, &res->bc_attrs,
8652                                sizeof(session->bc_attrs));
8653}
8654
8655static int _nfs4_proc_create_session(struct nfs_client *clp,
8656                const struct cred *cred)
8657{
8658        struct nfs4_session *session = clp->cl_session;
8659        struct nfs41_create_session_args args = {
8660                .client = clp,
8661                .clientid = clp->cl_clientid,
8662                .seqid = clp->cl_seqid,
8663                .cb_program = NFS4_CALLBACK,
8664        };
8665        struct nfs41_create_session_res res;
8666
8667        struct rpc_message msg = {
8668                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE_SESSION],
8669                .rpc_argp = &args,
8670                .rpc_resp = &res,
8671                .rpc_cred = cred,
8672        };
8673        int status;
8674
8675        nfs4_init_channel_attrs(&args, clp->cl_rpcclient);
8676        args.flags = (SESSION4_PERSIST | SESSION4_BACK_CHAN);
8677
8678        status = rpc_call_sync(session->clp->cl_rpcclient, &msg,
8679                               RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN);
8680        trace_nfs4_create_session(clp, status);
8681
8682        switch (status) {
8683        case -NFS4ERR_STALE_CLIENTID:
8684        case -NFS4ERR_DELAY:
8685        case -ETIMEDOUT:
8686        case -EACCES:
8687        case -EAGAIN:
8688                goto out;
8689        }
8690
8691        clp->cl_seqid++;
8692        if (!status) {
8693                /* Verify the session's negotiated channel_attrs values */
8694                status = nfs4_verify_channel_attrs(&args, &res);
8695                /* Increment the clientid slot sequence id */
8696                if (status)
8697                        goto out;
8698                nfs4_update_session(session, &res);
8699        }
8700out:
8701        return status;
8702}
8703
8704/*
8705 * Issues a CREATE_SESSION operation to the server.
8706 * It is the responsibility of the caller to verify the session is
8707 * expired before calling this routine.
8708 */
8709int nfs4_proc_create_session(struct nfs_client *clp, const struct cred *cred)
8710{
8711        int status;
8712        unsigned *ptr;
8713        struct nfs4_session *session = clp->cl_session;
8714
8715        dprintk("--> %s clp=%p session=%p\n", __func__, clp, session);
8716
8717        status = _nfs4_proc_create_session(clp, cred);
8718        if (status)
8719                goto out;
8720
8721        /* Init or reset the session slot tables */
8722        status = nfs4_setup_session_slot_tables(session);
8723        dprintk("slot table setup returned %d\n", status);
8724        if (status)
8725                goto out;
8726
8727        ptr = (unsigned *)&session->sess_id.data[0];
8728        dprintk("%s client>seqid %d sessionid %u:%u:%u:%u\n", __func__,
8729                clp->cl_seqid, ptr[0], ptr[1], ptr[2], ptr[3]);
8730out:
8731        dprintk("<-- %s\n", __func__);
8732        return status;
8733}
8734
8735/*
8736 * Issue the over-the-wire RPC DESTROY_SESSION.
8737 * The caller must serialize access to this routine.
8738 */
8739int nfs4_proc_destroy_session(struct nfs4_session *session,
8740                const struct cred *cred)
8741{
8742        struct rpc_message msg = {
8743                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DESTROY_SESSION],
8744                .rpc_argp = session,
8745                .rpc_cred = cred,
8746        };
8747        int status = 0;
8748
8749        dprintk("--> nfs4_proc_destroy_session\n");
8750
8751        /* session is still being setup */
8752        if (!test_and_clear_bit(NFS4_SESSION_ESTABLISHED, &session->session_state))
8753                return 0;
8754
8755        status = rpc_call_sync(session->clp->cl_rpcclient, &msg,
8756                               RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN);
8757        trace_nfs4_destroy_session(session->clp, status);
8758
8759        if (status)
8760                dprintk("NFS: Got error %d from the server on DESTROY_SESSION. "
8761                        "Session has been destroyed regardless...\n", status);
8762
8763        dprintk("<-- nfs4_proc_destroy_session\n");
8764        return status;
8765}
8766
8767/*
8768 * Renew the cl_session lease.
8769 */
8770struct nfs4_sequence_data {
8771        struct nfs_client *clp;
8772        struct nfs4_sequence_args args;
8773        struct nfs4_sequence_res res;
8774};
8775
8776static void nfs41_sequence_release(void *data)
8777{
8778        struct nfs4_sequence_data *calldata = data;
8779        struct nfs_client *clp = calldata->clp;
8780
8781        if (refcount_read(&clp->cl_count) > 1)
8782                nfs4_schedule_state_renewal(clp);
8783        nfs_put_client(clp);
8784        kfree(calldata);
8785}
8786
8787static int nfs41_sequence_handle_errors(struct rpc_task *task, struct nfs_client *clp)
8788{
8789        switch(task->tk_status) {
8790        case -NFS4ERR_DELAY:
8791                rpc_delay(task, NFS4_POLL_RETRY_MAX);
8792                return -EAGAIN;
8793        default:
8794                nfs4_schedule_lease_recovery(clp);
8795        }
8796        return 0;
8797}
8798
8799static void nfs41_sequence_call_done(struct rpc_task *task, void *data)
8800{
8801        struct nfs4_sequence_data *calldata = data;
8802        struct nfs_client *clp = calldata->clp;
8803
8804        if (!nfs41_sequence_done(task, task->tk_msg.rpc_resp))
8805                return;
8806
8807        trace_nfs4_sequence(clp, task->tk_status);
8808        if (task->tk_status < 0) {
8809                dprintk("%s ERROR %d\n", __func__, task->tk_status);
8810                if (refcount_read(&clp->cl_count) == 1)
8811                        goto out;
8812
8813                if (nfs41_sequence_handle_errors(task, clp) == -EAGAIN) {
8814                        rpc_restart_call_prepare(task);
8815                        return;
8816                }
8817        }
8818        dprintk("%s rpc_cred %p\n", __func__, task->tk_msg.rpc_cred);
8819out:
8820        dprintk("<-- %s\n", __func__);
8821}
8822
8823static void nfs41_sequence_prepare(struct rpc_task *task, void *data)
8824{
8825        struct nfs4_sequence_data *calldata = data;
8826        struct nfs_client *clp = calldata->clp;
8827        struct nfs4_sequence_args *args;
8828        struct nfs4_sequence_res *res;
8829
8830        args = task->tk_msg.rpc_argp;
8831        res = task->tk_msg.rpc_resp;
8832
8833        nfs4_setup_sequence(clp, args, res, task);
8834}
8835
8836static const struct rpc_call_ops nfs41_sequence_ops = {
8837        .rpc_call_done = nfs41_sequence_call_done,
8838        .rpc_call_prepare = nfs41_sequence_prepare,
8839        .rpc_release = nfs41_sequence_release,
8840};
8841
8842static struct rpc_task *_nfs41_proc_sequence(struct nfs_client *clp,
8843                const struct cred *cred,
8844                struct nfs4_slot *slot,
8845                bool is_privileged)
8846{
8847        struct nfs4_sequence_data *calldata;
8848        struct rpc_message msg = {
8849                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SEQUENCE],
8850                .rpc_cred = cred,
8851        };
8852        struct rpc_task_setup task_setup_data = {
8853                .rpc_client = clp->cl_rpcclient,
8854                .rpc_message = &msg,
8855                .callback_ops = &nfs41_sequence_ops,
8856                .flags = RPC_TASK_ASYNC | RPC_TASK_TIMEOUT,
8857        };
8858        struct rpc_task *ret;
8859
8860        ret = ERR_PTR(-EIO);
8861        if (!refcount_inc_not_zero(&clp->cl_count))
8862                goto out_err;
8863
8864        ret = ERR_PTR(-ENOMEM);
8865        calldata = kzalloc(sizeof(*calldata), GFP_NOFS);
8866        if (calldata == NULL)
8867                goto out_put_clp;
8868        nfs4_init_sequence(&calldata->args, &calldata->res, 0, is_privileged);
8869        nfs4_sequence_attach_slot(&calldata->args, &calldata->res, slot);
8870        msg.rpc_argp = &calldata->args;
8871        msg.rpc_resp = &calldata->res;
8872        calldata->clp = clp;
8873        task_setup_data.callback_data = calldata;
8874
8875        ret = rpc_run_task(&task_setup_data);
8876        if (IS_ERR(ret))
8877                goto out_err;
8878        return ret;
8879out_put_clp:
8880        nfs_put_client(clp);
8881out_err:
8882        nfs41_release_slot(slot);
8883        return ret;
8884}
8885
8886static int nfs41_proc_async_sequence(struct nfs_client *clp, const struct cred *cred, unsigned renew_flags)
8887{
8888        struct rpc_task *task;
8889        int ret = 0;
8890
8891        if ((renew_flags & NFS4_RENEW_TIMEOUT) == 0)
8892                return -EAGAIN;
8893        task = _nfs41_proc_sequence(clp, cred, NULL, false);
8894        if (IS_ERR(task))
8895                ret = PTR_ERR(task);
8896        else
8897                rpc_put_task_async(task);
8898        dprintk("<-- %s status=%d\n", __func__, ret);
8899        return ret;
8900}
8901
8902static int nfs4_proc_sequence(struct nfs_client *clp, const struct cred *cred)
8903{
8904        struct rpc_task *task;
8905        int ret;
8906
8907        task = _nfs41_proc_sequence(clp, cred, NULL, true);
8908        if (IS_ERR(task)) {
8909                ret = PTR_ERR(task);
8910                goto out;
8911        }
8912        ret = rpc_wait_for_completion_task(task);
8913        if (!ret)
8914                ret = task->tk_status;
8915        rpc_put_task(task);
8916out:
8917        dprintk("<-- %s status=%d\n", __func__, ret);
8918        return ret;
8919}
8920
8921struct nfs4_reclaim_complete_data {
8922        struct nfs_client *clp;
8923        struct nfs41_reclaim_complete_args arg;
8924        struct nfs41_reclaim_complete_res res;
8925};
8926
8927static void nfs4_reclaim_complete_prepare(struct rpc_task *task, void *data)
8928{
8929        struct nfs4_reclaim_complete_data *calldata = data;
8930
8931        nfs4_setup_sequence(calldata->clp,
8932                        &calldata->arg.seq_args,
8933                        &calldata->res.seq_res,
8934                        task);
8935}
8936
8937static int nfs41_reclaim_complete_handle_errors(struct rpc_task *task, struct nfs_client *clp)
8938{
8939        switch(task->tk_status) {
8940        case 0:
8941                wake_up_all(&clp->cl_lock_waitq);
8942                /* Fallthrough */
8943        case -NFS4ERR_COMPLETE_ALREADY:
8944        case -NFS4ERR_WRONG_CRED: /* What to do here? */
8945                break;
8946        case -NFS4ERR_DELAY:
8947                rpc_delay(task, NFS4_POLL_RETRY_MAX);
8948                /* fall through */
8949        case -NFS4ERR_RETRY_UNCACHED_REP:
8950                return -EAGAIN;
8951        case -NFS4ERR_BADSESSION:
8952        case -NFS4ERR_DEADSESSION:
8953        case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
8954                break;
8955        default:
8956                nfs4_schedule_lease_recovery(clp);
8957        }
8958        return 0;
8959}
8960
8961static void nfs4_reclaim_complete_done(struct rpc_task *task, void *data)
8962{
8963        struct nfs4_reclaim_complete_data *calldata = data;
8964        struct nfs_client *clp = calldata->clp;
8965        struct nfs4_sequence_res *res = &calldata->res.seq_res;
8966
8967        dprintk("--> %s\n", __func__);
8968        if (!nfs41_sequence_done(task, res))
8969                return;
8970
8971        trace_nfs4_reclaim_complete(clp, task->tk_status);
8972        if (nfs41_reclaim_complete_handle_errors(task, clp) == -EAGAIN) {
8973                rpc_restart_call_prepare(task);
8974                return;
8975        }
8976        dprintk("<-- %s\n", __func__);
8977}
8978
8979static void nfs4_free_reclaim_complete_data(void *data)
8980{
8981        struct nfs4_reclaim_complete_data *calldata = data;
8982
8983        kfree(calldata);
8984}
8985
8986static const struct rpc_call_ops nfs4_reclaim_complete_call_ops = {
8987        .rpc_call_prepare = nfs4_reclaim_complete_prepare,
8988        .rpc_call_done = nfs4_reclaim_complete_done,
8989        .rpc_release = nfs4_free_reclaim_complete_data,
8990};
8991
8992/*
8993 * Issue a global reclaim complete.
8994 */
8995static int nfs41_proc_reclaim_complete(struct nfs_client *clp,
8996                const struct cred *cred)
8997{
8998        struct nfs4_reclaim_complete_data *calldata;
8999        struct rpc_message msg = {
9000                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RECLAIM_COMPLETE],
9001                .rpc_cred = cred,
9002        };
9003        struct rpc_task_setup task_setup_data = {
9004                .rpc_client = clp->cl_rpcclient,
9005                .rpc_message = &msg,
9006                .callback_ops = &nfs4_reclaim_complete_call_ops,
9007                .flags = RPC_TASK_NO_ROUND_ROBIN,
9008        };
9009        int status = -ENOMEM;
9010
9011        dprintk("--> %s\n", __func__);
9012        calldata = kzalloc(sizeof(*calldata), GFP_NOFS);
9013        if (calldata == NULL)
9014                goto out;
9015        calldata->clp = clp;
9016        calldata->arg.one_fs = 0;
9017
9018        nfs4_init_sequence(&calldata->arg.seq_args, &calldata->res.seq_res, 0, 1);
9019        msg.rpc_argp = &calldata->arg;
9020        msg.rpc_resp = &calldata->res;
9021        task_setup_data.callback_data = calldata;
9022        status = nfs4_call_sync_custom(&task_setup_data);
9023out:
9024        dprintk("<-- %s status=%d\n", __func__, status);
9025        return status;
9026}
9027
9028static void
9029nfs4_layoutget_prepare(struct rpc_task *task, void *calldata)
9030{
9031        struct nfs4_layoutget *lgp = calldata;
9032        struct nfs_server *server = NFS_SERVER(lgp->args.inode);
9033
9034        dprintk("--> %s\n", __func__);
9035        nfs4_setup_sequence(server->nfs_client, &lgp->args.seq_args,
9036                                &lgp->res.seq_res, task);
9037        dprintk("<-- %s\n", __func__);
9038}
9039
9040static void nfs4_layoutget_done(struct rpc_task *task, void *calldata)
9041{
9042        struct nfs4_layoutget *lgp = calldata;
9043
9044        dprintk("--> %s\n", __func__);
9045        nfs41_sequence_process(task, &lgp->res.seq_res);
9046        dprintk("<-- %s\n", __func__);
9047}
9048
9049static int
9050nfs4_layoutget_handle_exception(struct rpc_task *task,
9051                struct nfs4_layoutget *lgp, struct nfs4_exception *exception)
9052{
9053        struct inode *inode = lgp->args.inode;
9054        struct nfs_server *server = NFS_SERVER(inode);
9055        struct pnfs_layout_hdr *lo;
9056        int nfs4err = task->tk_status;
9057        int err, status = 0;
9058        LIST_HEAD(head);
9059
9060        dprintk("--> %s tk_status => %d\n", __func__, -task->tk_status);
9061
9062        nfs4_sequence_free_slot(&lgp->res.seq_res);
9063
9064        switch (nfs4err) {
9065        case 0:
9066                goto out;
9067
9068        /*
9069         * NFS4ERR_LAYOUTUNAVAILABLE means we are not supposed to use pnfs
9070         * on the file. set tk_status to -ENODATA to tell upper layer to
9071         * retry go inband.
9072         */
9073        case -NFS4ERR_LAYOUTUNAVAILABLE:
9074                status = -ENODATA;
9075                goto out;
9076        /*
9077         * NFS4ERR_BADLAYOUT means the MDS cannot return a layout of
9078         * length lgp->args.minlength != 0 (see RFC5661 section 18.43.3).
9079         */
9080        case -NFS4ERR_BADLAYOUT:
9081                status = -EOVERFLOW;
9082                goto out;
9083        /*
9084         * NFS4ERR_LAYOUTTRYLATER is a conflict with another client
9085         * (or clients) writing to the same RAID stripe except when
9086         * the minlength argument is 0 (see RFC5661 section 18.43.3).
9087         *
9088         * Treat it like we would RECALLCONFLICT -- we retry for a little
9089         * while, and then eventually give up.
9090         */
9091        case -NFS4ERR_LAYOUTTRYLATER:
9092                if (lgp->args.minlength == 0) {
9093                        status = -EOVERFLOW;
9094                        goto out;
9095                }
9096                status = -EBUSY;
9097                break;
9098        case -NFS4ERR_RECALLCONFLICT:
9099                status = -ERECALLCONFLICT;
9100                break;
9101        case -NFS4ERR_DELEG_REVOKED:
9102        case -NFS4ERR_ADMIN_REVOKED:
9103        case -NFS4ERR_EXPIRED:
9104        case -NFS4ERR_BAD_STATEID:
9105                exception->timeout = 0;
9106                spin_lock(&inode->i_lock);
9107                lo = NFS_I(inode)->layout;
9108                /* If the open stateid was bad, then recover it. */
9109                if (!lo || test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags) ||
9110                    !nfs4_stateid_match_other(&lgp->args.stateid, &lo->plh_stateid)) {
9111                        spin_unlock(&inode->i_lock);
9112                        exception->state = lgp->args.ctx->state;
9113                        exception->stateid = &lgp->args.stateid;
9114                        break;
9115                }
9116
9117                /*
9118                 * Mark the bad layout state as invalid, then retry
9119                 */
9120                pnfs_mark_layout_stateid_invalid(lo, &head);
9121                spin_unlock(&inode->i_lock);
9122                nfs_commit_inode(inode, 0);
9123                pnfs_free_lseg_list(&head);
9124                status = -EAGAIN;
9125                goto out;
9126        }
9127
9128        err = nfs4_handle_exception(server, nfs4err, exception);
9129        if (!status) {
9130                if (exception->retry)
9131                        status = -EAGAIN;
9132                else
9133                        status = err;
9134        }
9135out:
9136        dprintk("<-- %s\n", __func__);
9137        return status;
9138}
9139
9140size_t max_response_pages(struct nfs_server *server)
9141{
9142        u32 max_resp_sz = server->nfs_client->cl_session->fc_attrs.max_resp_sz;
9143        return nfs_page_array_len(0, max_resp_sz);
9144}
9145
9146static void nfs4_layoutget_release(void *calldata)
9147{
9148        struct nfs4_layoutget *lgp = calldata;
9149
9150        dprintk("--> %s\n", __func__);
9151        nfs4_sequence_free_slot(&lgp->res.seq_res);
9152        pnfs_layoutget_free(lgp);
9153        dprintk("<-- %s\n", __func__);
9154}
9155
9156static const struct rpc_call_ops nfs4_layoutget_call_ops = {
9157        .rpc_call_prepare = nfs4_layoutget_prepare,
9158        .rpc_call_done = nfs4_layoutget_done,
9159        .rpc_release = nfs4_layoutget_release,
9160};
9161
9162struct pnfs_layout_segment *
9163nfs4_proc_layoutget(struct nfs4_layoutget *lgp, long *timeout)
9164{
9165        struct inode *inode = lgp->args.inode;
9166        struct nfs_server *server = NFS_SERVER(inode);
9167        struct rpc_task *task;
9168        struct rpc_message msg = {
9169                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LAYOUTGET],
9170                .rpc_argp = &lgp->args,
9171                .rpc_resp = &lgp->res,
9172                .rpc_cred = lgp->cred,
9173        };
9174        struct rpc_task_setup task_setup_data = {
9175                .rpc_client = server->client,
9176                .rpc_message = &msg,
9177                .callback_ops = &nfs4_layoutget_call_ops,
9178                .callback_data = lgp,
9179                .flags = RPC_TASK_ASYNC,
9180        };
9181        struct pnfs_layout_segment *lseg = NULL;
9182        struct nfs4_exception exception = {
9183                .inode = inode,
9184                .timeout = *timeout,
9185        };
9186        int status = 0;
9187
9188        dprintk("--> %s\n", __func__);
9189
9190        /* nfs4_layoutget_release calls pnfs_put_layout_hdr */
9191        pnfs_get_layout_hdr(NFS_I(inode)->layout);
9192
9193        nfs4_init_sequence(&lgp->args.seq_args, &lgp->res.seq_res, 0, 0);
9194
9195        task = rpc_run_task(&task_setup_data);
9196        if (IS_ERR(task))
9197                return ERR_CAST(task);
9198        status = rpc_wait_for_completion_task(task);
9199        if (status != 0)
9200                goto out;
9201
9202        if (task->tk_status < 0) {
9203                status = nfs4_layoutget_handle_exception(task, lgp, &exception);
9204                *timeout = exception.timeout;
9205        } else if (lgp->res.layoutp->len == 0) {
9206                status = -EAGAIN;
9207                *timeout = nfs4_update_delay(&exception.timeout);
9208        } else
9209                lseg = pnfs_layout_process(lgp);
9210out:
9211        trace_nfs4_layoutget(lgp->args.ctx,
9212                        &lgp->args.range,
9213                        &lgp->res.range,
9214                        &lgp->res.stateid,
9215                        status);
9216
9217        rpc_put_task(task);
9218        dprintk("<-- %s status=%d\n", __func__, status);
9219        if (status)
9220                return ERR_PTR(status);
9221        return lseg;
9222}
9223
9224static void
9225nfs4_layoutreturn_prepare(struct rpc_task *task, void *calldata)
9226{
9227        struct nfs4_layoutreturn *lrp = calldata;
9228
9229        dprintk("--> %s\n", __func__);
9230        nfs4_setup_sequence(lrp->clp,
9231                        &lrp->args.seq_args,
9232                        &lrp->res.seq_res,
9233                        task);
9234        if (!pnfs_layout_is_valid(lrp->args.layout))
9235                rpc_exit(task, 0);
9236}
9237
9238static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata)
9239{
9240        struct nfs4_layoutreturn *lrp = calldata;
9241        struct nfs_server *server;
9242
9243        dprintk("--> %s\n", __func__);
9244
9245        if (!nfs41_sequence_process(task, &lrp->res.seq_res))
9246                return;
9247
9248        /*
9249         * Was there an RPC level error? Assume the call succeeded,
9250         * and that we need to release the layout
9251         */
9252        if (task->tk_rpc_status != 0 && RPC_WAS_SENT(task)) {
9253                lrp->res.lrs_present = 0;
9254                return;
9255        }
9256
9257        server = NFS_SERVER(lrp->args.inode);
9258        switch (task->tk_status) {
9259        case -NFS4ERR_OLD_STATEID:
9260                if (nfs4_layout_refresh_old_stateid(&lrp->args.stateid,
9261                                        &lrp->args.range,
9262                                        lrp->args.inode))
9263                        goto out_restart;
9264                /* Fallthrough */
9265        default:
9266                task->tk_status = 0;
9267                /* Fallthrough */
9268        case 0:
9269                break;
9270        case -NFS4ERR_DELAY:
9271                if (nfs4_async_handle_error(task, server, NULL, NULL) != -EAGAIN)
9272                        break;
9273                goto out_restart;
9274        }
9275        dprintk("<-- %s\n", __func__);
9276        return;
9277out_restart:
9278        task->tk_status = 0;
9279        nfs4_sequence_free_slot(&lrp->res.seq_res);
9280        rpc_restart_call_prepare(task);
9281}
9282
9283static void nfs4_layoutreturn_release(void *calldata)
9284{
9285        struct nfs4_layoutreturn *lrp = calldata;
9286        struct pnfs_layout_hdr *lo = lrp->args.layout;
9287
9288        dprintk("--> %s\n", __func__);
9289        pnfs_layoutreturn_free_lsegs(lo, &lrp->args.stateid, &lrp->args.range,
9290                        lrp->res.lrs_present ? &lrp->res.stateid : NULL);
9291        nfs4_sequence_free_slot(&lrp->res.seq_res);
9292        if (lrp->ld_private.ops && lrp->ld_private.ops->free)
9293                lrp->ld_private.ops->free(&lrp->ld_private);
9294        pnfs_put_layout_hdr(lrp->args.layout);
9295        nfs_iput_and_deactive(lrp->inode);
9296        kfree(calldata);
9297        dprintk("<-- %s\n", __func__);
9298}
9299
9300static const struct rpc_call_ops nfs4_layoutreturn_call_ops = {
9301        .rpc_call_prepare = nfs4_layoutreturn_prepare,
9302        .rpc_call_done = nfs4_layoutreturn_done,
9303        .rpc_release = nfs4_layoutreturn_release,
9304};
9305
9306int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync)
9307{
9308        struct rpc_task *task;
9309        struct rpc_message msg = {
9310                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LAYOUTRETURN],
9311                .rpc_argp = &lrp->args,
9312                .rpc_resp = &lrp->res,
9313                .rpc_cred = lrp->cred,
9314        };
9315        struct rpc_task_setup task_setup_data = {
9316                .rpc_client = NFS_SERVER(lrp->args.inode)->client,
9317                .rpc_message = &msg,
9318                .callback_ops = &nfs4_layoutreturn_call_ops,
9319                .callback_data = lrp,
9320        };
9321        int status = 0;
9322
9323        nfs4_state_protect(NFS_SERVER(lrp->args.inode)->nfs_client,
9324                        NFS_SP4_MACH_CRED_PNFS_CLEANUP,
9325                        &task_setup_data.rpc_client, &msg);
9326
9327        dprintk("--> %s\n", __func__);
9328        if (!sync) {
9329                lrp->inode = nfs_igrab_and_active(lrp->args.inode);
9330                if (!lrp->inode) {
9331                        nfs4_layoutreturn_release(lrp);
9332                        return -EAGAIN;
9333                }
9334                task_setup_data.flags |= RPC_TASK_ASYNC;
9335        }
9336        nfs4_init_sequence(&lrp->args.seq_args, &lrp->res.seq_res, 1, 0);
9337        task = rpc_run_task(&task_setup_data);
9338        if (IS_ERR(task))
9339                return PTR_ERR(task);
9340        if (sync)
9341                status = task->tk_status;
9342        trace_nfs4_layoutreturn(lrp->args.inode, &lrp->args.stateid, status);
9343        dprintk("<-- %s status=%d\n", __func__, status);
9344        rpc_put_task(task);
9345        return status;
9346}
9347
9348static int
9349_nfs4_proc_getdeviceinfo(struct nfs_server *server,
9350                struct pnfs_device *pdev,
9351                const struct cred *cred)
9352{
9353        struct nfs4_getdeviceinfo_args args = {
9354                .pdev = pdev,
9355                .notify_types = NOTIFY_DEVICEID4_CHANGE |
9356                        NOTIFY_DEVICEID4_DELETE,
9357        };
9358        struct nfs4_getdeviceinfo_res res = {
9359                .pdev = pdev,
9360        };
9361        struct rpc_message msg = {
9362                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETDEVICEINFO],
9363                .rpc_argp = &args,
9364                .rpc_resp = &res,
9365                .rpc_cred = cred,
9366        };
9367        int status;
9368
9369        dprintk("--> %s\n", __func__);
9370        status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
9371        if (res.notification & ~args.notify_types)
9372                dprintk("%s: unsupported notification\n", __func__);
9373        if (res.notification != args.notify_types)
9374                pdev->nocache = 1;
9375
9376        dprintk("<-- %s status=%d\n", __func__, status);
9377
9378        return status;
9379}
9380
9381int nfs4_proc_getdeviceinfo(struct nfs_server *server,
9382                struct pnfs_device *pdev,
9383                const struct cred *cred)
9384{
9385        struct nfs4_exception exception = { };
9386        int err;
9387
9388        do {
9389                err = nfs4_handle_exception(server,
9390                                        _nfs4_proc_getdeviceinfo(server, pdev, cred),
9391                                        &exception);
9392        } while (exception.retry);
9393        return err;
9394}
9395EXPORT_SYMBOL_GPL(nfs4_proc_getdeviceinfo);
9396
9397static void nfs4_layoutcommit_prepare(struct rpc_task *task, void *calldata)
9398{
9399        struct nfs4_layoutcommit_data *data = calldata;
9400        struct nfs_server *server = NFS_SERVER(data->args.inode);
9401
9402        nfs4_setup_sequence(server->nfs_client,
9403                        &data->args.seq_args,
9404                        &data->res.seq_res,
9405                        task);
9406}
9407
9408static void
9409nfs4_layoutcommit_done(struct rpc_task *task, void *calldata)
9410{
9411        struct nfs4_layoutcommit_data *data = calldata;
9412        struct nfs_server *server = NFS_SERVER(data->args.inode);
9413
9414        if (!nfs41_sequence_done(task, &data->res.seq_res))
9415                return;
9416
9417        switch (task->tk_status) { /* Just ignore these failures */
9418        case -NFS4ERR_DELEG_REVOKED: /* layout was recalled */
9419        case -NFS4ERR_BADIOMODE:     /* no IOMODE_RW layout for range */
9420        case -NFS4ERR_BADLAYOUT:     /* no layout */
9421        case -NFS4ERR_GRACE:        /* loca_recalim always false */
9422                task->tk_status = 0;
9423        case 0:
9424                break;
9425        default:
9426                if (nfs4_async_handle_error(task, server, NULL, NULL) == -EAGAIN) {
9427                        rpc_restart_call_prepare(task);
9428                        return;
9429                }
9430        }
9431}
9432
9433static void nfs4_layoutcommit_release(void *calldata)
9434{
9435        struct nfs4_layoutcommit_data *data = calldata;
9436
9437        pnfs_cleanup_layoutcommit(data);
9438        nfs_post_op_update_inode_force_wcc(data->args.inode,
9439                                           data->res.fattr);
9440        put_cred(data->cred);
9441        nfs_iput_and_deactive(data->inode);
9442        kfree(data);
9443}
9444
9445static const struct rpc_call_ops nfs4_layoutcommit_ops = {
9446        .rpc_call_prepare = nfs4_layoutcommit_prepare,
9447        .rpc_call_done = nfs4_layoutcommit_done,
9448        .rpc_release = nfs4_layoutcommit_release,
9449};
9450
9451int
9452nfs4_proc_layoutcommit(struct nfs4_layoutcommit_data *data, bool sync)
9453{
9454        struct rpc_message msg = {
9455                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LAYOUTCOMMIT],
9456                .rpc_argp = &data->args,
9457                .rpc_resp = &data->res,
9458                .rpc_cred = data->cred,
9459        };
9460        struct rpc_task_setup task_setup_data = {
9461                .task = &data->task,
9462                .rpc_client = NFS_CLIENT(data->args.inode),
9463                .rpc_message = &msg,
9464                .callback_ops = &nfs4_layoutcommit_ops,
9465                .callback_data = data,
9466        };
9467        struct rpc_task *task;
9468        int status = 0;
9469
9470        dprintk("NFS: initiating layoutcommit call. sync %d "
9471                "lbw: %llu inode %lu\n", sync,
9472                data->args.lastbytewritten,
9473                data->args.inode->i_ino);
9474
9475        if (!sync) {
9476                data->inode = nfs_igrab_and_active(data->args.inode);
9477                if (data->inode == NULL) {
9478                        nfs4_layoutcommit_release(data);
9479                        return -EAGAIN;
9480                }
9481                task_setup_data.flags = RPC_TASK_ASYNC;
9482        }
9483        nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1, 0);
9484        task = rpc_run_task(&task_setup_data);
9485        if (IS_ERR(task))
9486                return PTR_ERR(task);
9487        if (sync)
9488                status = task->tk_status;
9489        trace_nfs4_layoutcommit(data->args.inode, &data->args.stateid, status);
9490        dprintk("%s: status %d\n", __func__, status);
9491        rpc_put_task(task);
9492        return status;
9493}
9494
9495/*
9496 * Use the state managment nfs_client cl_rpcclient, which uses krb5i (if
9497 * possible) as per RFC3530bis and RFC5661 Security Considerations sections
9498 */
9499static int
9500_nfs41_proc_secinfo_no_name(struct nfs_server *server, struct nfs_fh *fhandle,
9501                    struct nfs_fsinfo *info,
9502                    struct nfs4_secinfo_flavors *flavors, bool use_integrity)
9503{
9504        struct nfs41_secinfo_no_name_args args = {
9505                .style = SECINFO_STYLE_CURRENT_FH,
9506        };
9507        struct nfs4_secinfo_res res = {
9508                .flavors = flavors,
9509        };
9510        struct rpc_message msg = {
9511                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SECINFO_NO_NAME],
9512                .rpc_argp = &args,
9513                .rpc_resp = &res,
9514        };
9515        struct rpc_clnt *clnt = server->client;
9516        struct nfs4_call_sync_data data = {
9517                .seq_server = server,
9518                .seq_args = &args.seq_args,
9519                .seq_res = &res.seq_res,
9520        };
9521        struct rpc_task_setup task_setup = {
9522                .rpc_client = server->client,
9523                .rpc_message = &msg,
9524                .callback_ops = server->nfs_client->cl_mvops->call_sync_ops,
9525                .callback_data = &data,
9526                .flags = RPC_TASK_NO_ROUND_ROBIN,
9527        };
9528        const struct cred *cred = NULL;
9529        int status;
9530
9531        if (use_integrity) {
9532                clnt = server->nfs_client->cl_rpcclient;
9533                task_setup.rpc_client = clnt;
9534
9535                cred = nfs4_get_clid_cred(server->nfs_client);
9536                msg.rpc_cred = cred;
9537        }
9538
9539        dprintk("--> %s\n", __func__);
9540        nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 0);
9541        status = nfs4_call_sync_custom(&task_setup);
9542        dprintk("<-- %s status=%d\n", __func__, status);
9543
9544        put_cred(cred);
9545
9546        return status;
9547}
9548
9549static int
9550nfs41_proc_secinfo_no_name(struct nfs_server *server, struct nfs_fh *fhandle,
9551                           struct nfs_fsinfo *info, struct nfs4_secinfo_flavors *flavors)
9552{
9553        struct nfs4_exception exception = {
9554                .interruptible = true,
9555        };
9556        int err;
9557        do {
9558                /* first try using integrity protection */
9559                err = -NFS4ERR_WRONGSEC;
9560
9561                /* try to use integrity protection with machine cred */
9562                if (_nfs4_is_integrity_protected(server->nfs_client))
9563                        err = _nfs41_proc_secinfo_no_name(server, fhandle, info,
9564                                                          flavors, true);
9565
9566                /*
9567                 * if unable to use integrity protection, or SECINFO with
9568                 * integrity protection returns NFS4ERR_WRONGSEC (which is
9569                 * disallowed by spec, but exists in deployed servers) use
9570                 * the current filesystem's rpc_client and the user cred.
9571                 */
9572                if (err == -NFS4ERR_WRONGSEC)
9573                        err = _nfs41_proc_secinfo_no_name(server, fhandle, info,
9574                                                          flavors, false);
9575
9576                switch (err) {
9577                case 0:
9578                case -NFS4ERR_WRONGSEC:
9579                case -ENOTSUPP:
9580                        goto out;
9581                default:
9582                        err = nfs4_handle_exception(server, err, &exception);
9583                }
9584        } while (exception.retry);
9585out:
9586        return err;
9587}
9588
9589static int
9590nfs41_find_root_sec(struct nfs_server *server, struct nfs_fh *fhandle,
9591                    struct nfs_fsinfo *info)
9592{
9593        int err;
9594        struct page *page;
9595        rpc_authflavor_t flavor = RPC_AUTH_MAXFLAVOR;
9596        struct nfs4_secinfo_flavors *flavors;
9597        struct nfs4_secinfo4 *secinfo;
9598        int i;
9599
9600        page = alloc_page(GFP_KERNEL);
9601        if (!page) {
9602                err = -ENOMEM;
9603                goto out;
9604        }
9605
9606        flavors = page_address(page);
9607        err = nfs41_proc_secinfo_no_name(server, fhandle, info, flavors);
9608
9609        /*
9610         * Fall back on "guess and check" method if
9611         * the server doesn't support SECINFO_NO_NAME
9612         */
9613        if (err == -NFS4ERR_WRONGSEC || err == -ENOTSUPP) {
9614                err = nfs4_find_root_sec(server, fhandle, info);
9615                goto out_freepage;
9616        }
9617        if (err)
9618                goto out_freepage;
9619
9620        for (i = 0; i < flavors->num_flavors; i++) {
9621                secinfo = &flavors->flavors[i];
9622
9623                switch (secinfo->flavor) {
9624                case RPC_AUTH_NULL:
9625                case RPC_AUTH_UNIX:
9626                case RPC_AUTH_GSS:
9627                        flavor = rpcauth_get_pseudoflavor(secinfo->flavor,
9628                                        &secinfo->flavor_info);
9629                        break;
9630                default:
9631                        flavor = RPC_AUTH_MAXFLAVOR;
9632                        break;
9633                }
9634
9635                if (!nfs_auth_info_match(&server->auth_info, flavor))
9636                        flavor = RPC_AUTH_MAXFLAVOR;
9637
9638                if (flavor != RPC_AUTH_MAXFLAVOR) {
9639                        err = nfs4_lookup_root_sec(server, fhandle,
9640                                                   info, flavor);
9641                        if (!err)
9642                                break;
9643                }
9644        }
9645
9646        if (flavor == RPC_AUTH_MAXFLAVOR)
9647                err = -EPERM;
9648
9649out_freepage:
9650        put_page(page);
9651        if (err == -EACCES)
9652                return -EPERM;
9653out:
9654        return err;
9655}
9656
9657static int _nfs41_test_stateid(struct nfs_server *server,
9658                nfs4_stateid *stateid,
9659                const struct cred *cred)
9660{
9661        int status;
9662        struct nfs41_test_stateid_args args = {
9663                .stateid = stateid,
9664        };
9665        struct nfs41_test_stateid_res res;
9666        struct rpc_message msg = {
9667                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_TEST_STATEID],
9668                .rpc_argp = &args,
9669                .rpc_resp = &res,
9670                .rpc_cred = cred,
9671        };
9672        struct rpc_clnt *rpc_client = server->client;
9673
9674        nfs4_state_protect(server->nfs_client, NFS_SP4_MACH_CRED_STATEID,
9675                &rpc_client, &msg);
9676
9677        dprintk("NFS call  test_stateid %p\n", stateid);
9678        nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 1);
9679        status = nfs4_call_sync_sequence(rpc_client, server, &msg,
9680                        &args.seq_args, &res.seq_res);
9681        if (status != NFS_OK) {
9682                dprintk("NFS reply test_stateid: failed, %d\n", status);
9683                return status;
9684        }
9685        dprintk("NFS reply test_stateid: succeeded, %d\n", -res.status);
9686        return -res.status;
9687}
9688
9689static void nfs4_handle_delay_or_session_error(struct nfs_server *server,
9690                int err, struct nfs4_exception *exception)
9691{
9692        exception->retry = 0;
9693        switch(err) {
9694        case -NFS4ERR_DELAY:
9695        case -NFS4ERR_RETRY_UNCACHED_REP:
9696                nfs4_handle_exception(server, err, exception);
9697                break;
9698        case -NFS4ERR_BADSESSION:
9699        case -NFS4ERR_BADSLOT:
9700        case -NFS4ERR_BAD_HIGH_SLOT:
9701        case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
9702        case -NFS4ERR_DEADSESSION:
9703                nfs4_do_handle_exception(server, err, exception);
9704        }
9705}
9706
9707/**
9708 * nfs41_test_stateid - perform a TEST_STATEID operation
9709 *
9710 * @server: server / transport on which to perform the operation
9711 * @stateid: state ID to test
9712 * @cred: credential
9713 *
9714 * Returns NFS_OK if the server recognizes that "stateid" is valid.
9715 * Otherwise a negative NFS4ERR value is returned if the operation
9716 * failed or the state ID is not currently valid.
9717 */
9718static int nfs41_test_stateid(struct nfs_server *server,
9719                nfs4_stateid *stateid,
9720                const struct cred *cred)
9721{
9722        struct nfs4_exception exception = {
9723                .interruptible = true,
9724        };
9725        int err;
9726        do {
9727                err = _nfs41_test_stateid(server, stateid, cred);
9728                nfs4_handle_delay_or_session_error(server, err, &exception);
9729        } while (exception.retry);
9730        return err;
9731}
9732
9733struct nfs_free_stateid_data {
9734        struct nfs_server *server;
9735        struct nfs41_free_stateid_args args;
9736        struct nfs41_free_stateid_res res;
9737};
9738
9739static void nfs41_free_stateid_prepare(struct rpc_task *task, void *calldata)
9740{
9741        struct nfs_free_stateid_data *data = calldata;
9742        nfs4_setup_sequence(data->server->nfs_client,
9743                        &data->args.seq_args,
9744                        &data->res.seq_res,
9745                        task);
9746}
9747
9748static void nfs41_free_stateid_done(struct rpc_task *task, void *calldata)
9749{
9750        struct nfs_free_stateid_data *data = calldata;
9751
9752        nfs41_sequence_done(task, &data->res.seq_res);
9753
9754        switch (task->tk_status) {
9755        case -NFS4ERR_DELAY:
9756                if (nfs4_async_handle_error(task, data->server, NULL, NULL) == -EAGAIN)
9757                        rpc_restart_call_prepare(task);
9758        }
9759}
9760
9761static void nfs41_free_stateid_release(void *calldata)
9762{
9763        kfree(calldata);
9764}
9765
9766static const struct rpc_call_ops nfs41_free_stateid_ops = {
9767        .rpc_call_prepare = nfs41_free_stateid_prepare,
9768        .rpc_call_done = nfs41_free_stateid_done,
9769        .rpc_release = nfs41_free_stateid_release,
9770};
9771
9772/**
9773 * nfs41_free_stateid - perform a FREE_STATEID operation
9774 *
9775 * @server: server / transport on which to perform the operation
9776 * @stateid: state ID to release
9777 * @cred: credential
9778 * @privileged: set to true if this call needs to be privileged
9779 *
9780 * Note: this function is always asynchronous.
9781 */
9782static int nfs41_free_stateid(struct nfs_server *server,
9783                const nfs4_stateid *stateid,
9784                const struct cred *cred,
9785                bool privileged)
9786{
9787        struct rpc_message msg = {
9788                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FREE_STATEID],
9789                .rpc_cred = cred,
9790        };
9791        struct rpc_task_setup task_setup = {
9792                .rpc_client = server->client,
9793                .rpc_message = &msg,
9794                .callback_ops = &nfs41_free_stateid_ops,
9795                .flags = RPC_TASK_ASYNC,
9796        };
9797        struct nfs_free_stateid_data *data;
9798        struct rpc_task *task;
9799
9800        nfs4_state_protect(server->nfs_client, NFS_SP4_MACH_CRED_STATEID,
9801                &task_setup.rpc_client, &msg);
9802
9803        dprintk("NFS call  free_stateid %p\n", stateid);
9804        data = kmalloc(sizeof(*data), GFP_NOFS);
9805        if (!data)
9806                return -ENOMEM;
9807        data->server = server;
9808        nfs4_stateid_copy(&data->args.stateid, stateid);
9809
9810        task_setup.callback_data = data;
9811
9812        msg.rpc_argp = &data->args;
9813        msg.rpc_resp = &data->res;
9814        nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1, privileged);
9815        task = rpc_run_task(&task_setup);
9816        if (IS_ERR(task))
9817                return PTR_ERR(task);
9818        rpc_put_task(task);
9819        return 0;
9820}
9821
9822static void
9823nfs41_free_lock_state(struct nfs_server *server, struct nfs4_lock_state *lsp)
9824{
9825        const struct cred *cred = lsp->ls_state->owner->so_cred;
9826
9827        nfs41_free_stateid(server, &lsp->ls_stateid, cred, false);
9828        nfs4_free_lock_state(server, lsp);
9829}
9830
9831static bool nfs41_match_stateid(const nfs4_stateid *s1,
9832                const nfs4_stateid *s2)
9833{
9834        if (s1->type != s2->type)
9835                return false;
9836
9837        if (memcmp(s1->other, s2->other, sizeof(s1->other)) != 0)
9838                return false;
9839
9840        if (s1->seqid == s2->seqid)
9841                return true;
9842
9843        return s1->seqid == 0 || s2->seqid == 0;
9844}
9845
9846#endif /* CONFIG_NFS_V4_1 */
9847
9848static bool nfs4_match_stateid(const nfs4_stateid *s1,
9849                const nfs4_stateid *s2)
9850{
9851        return nfs4_stateid_match(s1, s2);
9852}
9853
9854
9855static const struct nfs4_state_recovery_ops nfs40_reboot_recovery_ops = {
9856        .owner_flag_bit = NFS_OWNER_RECLAIM_REBOOT,
9857        .state_flag_bit = NFS_STATE_RECLAIM_REBOOT,
9858        .recover_open   = nfs4_open_reclaim,
9859        .recover_lock   = nfs4_lock_reclaim,
9860        .establish_clid = nfs4_init_clientid,
9861        .detect_trunking = nfs40_discover_server_trunking,
9862};
9863
9864#if defined(CONFIG_NFS_V4_1)
9865static const struct nfs4_state_recovery_ops nfs41_reboot_recovery_ops = {
9866        .owner_flag_bit = NFS_OWNER_RECLAIM_REBOOT,
9867        .state_flag_bit = NFS_STATE_RECLAIM_REBOOT,
9868        .recover_open   = nfs4_open_reclaim,
9869        .recover_lock   = nfs4_lock_reclaim,
9870        .establish_clid = nfs41_init_clientid,
9871        .reclaim_complete = nfs41_proc_reclaim_complete,
9872        .detect_trunking = nfs41_discover_server_trunking,
9873};
9874#endif /* CONFIG_NFS_V4_1 */
9875
9876static const struct nfs4_state_recovery_ops nfs40_nograce_recovery_ops = {
9877        .owner_flag_bit = NFS_OWNER_RECLAIM_NOGRACE,
9878        .state_flag_bit = NFS_STATE_RECLAIM_NOGRACE,
9879        .recover_open   = nfs40_open_expired,
9880        .recover_lock   = nfs4_lock_expired,
9881        .establish_clid = nfs4_init_clientid,
9882};
9883
9884#if defined(CONFIG_NFS_V4_1)
9885static const struct nfs4_state_recovery_ops nfs41_nograce_recovery_ops = {
9886        .owner_flag_bit = NFS_OWNER_RECLAIM_NOGRACE,
9887        .state_flag_bit = NFS_STATE_RECLAIM_NOGRACE,
9888        .recover_open   = nfs41_open_expired,
9889        .recover_lock   = nfs41_lock_expired,
9890        .establish_clid = nfs41_init_clientid,
9891};
9892#endif /* CONFIG_NFS_V4_1 */
9893
9894static const struct nfs4_state_maintenance_ops nfs40_state_renewal_ops = {
9895        .sched_state_renewal = nfs4_proc_async_renew,
9896        .get_state_renewal_cred = nfs4_get_renew_cred,
9897        .renew_lease = nfs4_proc_renew,
9898};
9899
9900#if defined(CONFIG_NFS_V4_1)
9901static const struct nfs4_state_maintenance_ops nfs41_state_renewal_ops = {
9902        .sched_state_renewal = nfs41_proc_async_sequence,
9903        .get_state_renewal_cred = nfs4_get_machine_cred,
9904        .renew_lease = nfs4_proc_sequence,
9905};
9906#endif
9907
9908static const struct nfs4_mig_recovery_ops nfs40_mig_recovery_ops = {
9909        .get_locations = _nfs40_proc_get_locations,
9910        .fsid_present = _nfs40_proc_fsid_present,
9911};
9912
9913#if defined(CONFIG_NFS_V4_1)
9914static const struct nfs4_mig_recovery_ops nfs41_mig_recovery_ops = {
9915        .get_locations = _nfs41_proc_get_locations,
9916        .fsid_present = _nfs41_proc_fsid_present,
9917};
9918#endif  /* CONFIG_NFS_V4_1 */
9919
9920static const struct nfs4_minor_version_ops nfs_v4_0_minor_ops = {
9921        .minor_version = 0,
9922        .init_caps = NFS_CAP_READDIRPLUS
9923                | NFS_CAP_ATOMIC_OPEN
9924                | NFS_CAP_POSIX_LOCK,
9925        .init_client = nfs40_init_client,
9926        .shutdown_client = nfs40_shutdown_client,
9927        .match_stateid = nfs4_match_stateid,
9928        .find_root_sec = nfs4_find_root_sec,
9929        .free_lock_state = nfs4_release_lockowner,
9930        .test_and_free_expired = nfs40_test_and_free_expired_stateid,
9931        .alloc_seqid = nfs_alloc_seqid,
9932        .call_sync_ops = &nfs40_call_sync_ops,
9933        .reboot_recovery_ops = &nfs40_reboot_recovery_ops,
9934        .nograce_recovery_ops = &nfs40_nograce_recovery_ops,
9935        .state_renewal_ops = &nfs40_state_renewal_ops,
9936        .mig_recovery_ops = &nfs40_mig_recovery_ops,
9937};
9938
9939#if defined(CONFIG_NFS_V4_1)
9940static struct nfs_seqid *
9941nfs_alloc_no_seqid(struct nfs_seqid_counter *arg1, gfp_t arg2)
9942{
9943        return NULL;
9944}
9945
9946static const struct nfs4_minor_version_ops nfs_v4_1_minor_ops = {
9947        .minor_version = 1,
9948        .init_caps = NFS_CAP_READDIRPLUS
9949                | NFS_CAP_ATOMIC_OPEN
9950                | NFS_CAP_POSIX_LOCK
9951                | NFS_CAP_STATEID_NFSV41
9952                | NFS_CAP_ATOMIC_OPEN_V1
9953                | NFS_CAP_LGOPEN,
9954        .init_client = nfs41_init_client,
9955        .shutdown_client = nfs41_shutdown_client,
9956        .match_stateid = nfs41_match_stateid,
9957        .find_root_sec = nfs41_find_root_sec,
9958        .free_lock_state = nfs41_free_lock_state,
9959        .test_and_free_expired = nfs41_test_and_free_expired_stateid,
9960        .alloc_seqid = nfs_alloc_no_seqid,
9961        .session_trunk = nfs4_test_session_trunk,
9962        .call_sync_ops = &nfs41_call_sync_ops,
9963        .reboot_recovery_ops = &nfs41_reboot_recovery_ops,
9964        .nograce_recovery_ops = &nfs41_nograce_recovery_ops,
9965        .state_renewal_ops = &nfs41_state_renewal_ops,
9966        .mig_recovery_ops = &nfs41_mig_recovery_ops,
9967};
9968#endif
9969
9970#if defined(CONFIG_NFS_V4_2)
9971static const struct nfs4_minor_version_ops nfs_v4_2_minor_ops = {
9972        .minor_version = 2,
9973        .init_caps = NFS_CAP_READDIRPLUS
9974                | NFS_CAP_ATOMIC_OPEN
9975                | NFS_CAP_POSIX_LOCK
9976                | NFS_CAP_STATEID_NFSV41
9977                | NFS_CAP_ATOMIC_OPEN_V1
9978                | NFS_CAP_LGOPEN
9979                | NFS_CAP_ALLOCATE
9980                | NFS_CAP_COPY
9981                | NFS_CAP_OFFLOAD_CANCEL
9982                | NFS_CAP_COPY_NOTIFY
9983                | NFS_CAP_DEALLOCATE
9984                | NFS_CAP_SEEK
9985                | NFS_CAP_LAYOUTSTATS
9986                | NFS_CAP_CLONE
9987                | NFS_CAP_LAYOUTERROR,
9988        .init_client = nfs41_init_client,
9989        .shutdown_client = nfs41_shutdown_client,
9990        .match_stateid = nfs41_match_stateid,
9991        .find_root_sec = nfs41_find_root_sec,
9992        .free_lock_state = nfs41_free_lock_state,
9993        .call_sync_ops = &nfs41_call_sync_ops,
9994        .test_and_free_expired = nfs41_test_and_free_expired_stateid,
9995        .alloc_seqid = nfs_alloc_no_seqid,
9996        .session_trunk = nfs4_test_session_trunk,
9997        .reboot_recovery_ops = &nfs41_reboot_recovery_ops,
9998        .nograce_recovery_ops = &nfs41_nograce_recovery_ops,
9999        .state_renewal_ops = &nfs41_state_renewal_ops,
10000        .mig_recovery_ops = &nfs41_mig_recovery_ops,
10001};
10002#endif
10003
10004const struct nfs4_minor_version_ops *nfs_v4_minor_ops[] = {
10005        [0] = &nfs_v4_0_minor_ops,
10006#if defined(CONFIG_NFS_V4_1)
10007        [1] = &nfs_v4_1_minor_ops,
10008#endif
10009#if defined(CONFIG_NFS_V4_2)
10010        [2] = &nfs_v4_2_minor_ops,
10011#endif
10012};
10013
10014static ssize_t nfs4_listxattr(struct dentry *dentry, char *list, size_t size)
10015{
10016        ssize_t error, error2;
10017
10018        error = generic_listxattr(dentry, list, size);
10019        if (error < 0)
10020                return error;
10021        if (list) {
10022                list += error;
10023                size -= error;
10024        }
10025
10026        error2 = nfs4_listxattr_nfs4_label(d_inode(dentry), list, size);
10027        if (error2 < 0)
10028                return error2;
10029        return error + error2;
10030}
10031
10032static const struct inode_operations nfs4_dir_inode_operations = {
10033        .create         = nfs_create,
10034        .lookup         = nfs_lookup,
10035        .atomic_open    = nfs_atomic_open,
10036        .link           = nfs_link,
10037        .unlink         = nfs_unlink,
10038        .symlink        = nfs_symlink,
10039        .mkdir          = nfs_mkdir,
10040        .rmdir          = nfs_rmdir,
10041        .mknod          = nfs_mknod,
10042        .rename         = nfs_rename,
10043        .permission     = nfs_permission,
10044        .getattr        = nfs_getattr,
10045        .setattr        = nfs_setattr,
10046        .listxattr      = nfs4_listxattr,
10047};
10048
10049static const struct inode_operations nfs4_file_inode_operations = {
10050        .permission     = nfs_permission,
10051        .getattr        = nfs_getattr,
10052        .setattr        = nfs_setattr,
10053        .listxattr      = nfs4_listxattr,
10054};
10055
10056const struct nfs_rpc_ops nfs_v4_clientops = {
10057        .version        = 4,                    /* protocol version */
10058        .dentry_ops     = &nfs4_dentry_operations,
10059        .dir_inode_ops  = &nfs4_dir_inode_operations,
10060        .file_inode_ops = &nfs4_file_inode_operations,
10061        .file_ops       = &nfs4_file_operations,
10062        .getroot        = nfs4_proc_get_root,
10063        .submount       = nfs4_submount,
10064        .try_get_tree   = nfs4_try_get_tree,
10065        .getattr        = nfs4_proc_getattr,
10066        .setattr        = nfs4_proc_setattr,
10067        .lookup         = nfs4_proc_lookup,
10068        .lookupp        = nfs4_proc_lookupp,
10069        .access         = nfs4_proc_access,
10070        .readlink       = nfs4_proc_readlink,
10071        .create         = nfs4_proc_create,
10072        .remove         = nfs4_proc_remove,
10073        .unlink_setup   = nfs4_proc_unlink_setup,
10074        .unlink_rpc_prepare = nfs4_proc_unlink_rpc_prepare,
10075        .unlink_done    = nfs4_proc_unlink_done,
10076        .rename_setup   = nfs4_proc_rename_setup,
10077        .rename_rpc_prepare = nfs4_proc_rename_rpc_prepare,
10078        .rename_done    = nfs4_proc_rename_done,
10079        .link           = nfs4_proc_link,
10080        .symlink        = nfs4_proc_symlink,
10081        .mkdir          = nfs4_proc_mkdir,
10082        .rmdir          = nfs4_proc_rmdir,
10083        .readdir        = nfs4_proc_readdir,
10084        .mknod          = nfs4_proc_mknod,
10085        .statfs         = nfs4_proc_statfs,
10086        .fsinfo         = nfs4_proc_fsinfo,
10087        .pathconf       = nfs4_proc_pathconf,
10088        .set_capabilities = nfs4_server_capabilities,
10089        .decode_dirent  = nfs4_decode_dirent,
10090        .pgio_rpc_prepare = nfs4_proc_pgio_rpc_prepare,
10091        .read_setup     = nfs4_proc_read_setup,
10092        .read_done      = nfs4_read_done,
10093        .write_setup    = nfs4_proc_write_setup,
10094        .write_done     = nfs4_write_done,
10095        .commit_setup   = nfs4_proc_commit_setup,
10096        .commit_rpc_prepare = nfs4_proc_commit_rpc_prepare,
10097        .commit_done    = nfs4_commit_done,
10098        .lock           = nfs4_proc_lock,
10099        .clear_acl_cache = nfs4_zap_acl_attr,
10100        .close_context  = nfs4_close_context,
10101        .open_context   = nfs4_atomic_open,
10102        .have_delegation = nfs4_have_delegation,
10103        .alloc_client   = nfs4_alloc_client,
10104        .init_client    = nfs4_init_client,
10105        .free_client    = nfs4_free_client,
10106        .create_server  = nfs4_create_server,
10107        .clone_server   = nfs_clone_server,
10108};
10109
10110static const struct xattr_handler nfs4_xattr_nfs4_acl_handler = {
10111        .name   = XATTR_NAME_NFSV4_ACL,
10112        .list   = nfs4_xattr_list_nfs4_acl,
10113        .get    = nfs4_xattr_get_nfs4_acl,
10114        .set    = nfs4_xattr_set_nfs4_acl,
10115};
10116
10117const struct xattr_handler *nfs4_xattr_handlers[] = {
10118        &nfs4_xattr_nfs4_acl_handler,
10119#ifdef CONFIG_NFS_V4_SECURITY_LABEL
10120        &nfs4_xattr_nfs4_label_handler,
10121#endif
10122        NULL
10123};
10124
10125/*
10126 * Local variables:
10127 *  c-basic-offset: 8
10128 * End:
10129 */
10130