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/utsname.h>
  40#include <linux/delay.h>
  41#include <linux/errno.h>
  42#include <linux/string.h>
  43#include <linux/sunrpc/clnt.h>
  44#include <linux/nfs.h>
  45#include <linux/nfs4.h>
  46#include <linux/nfs_fs.h>
  47#include <linux/nfs_page.h>
  48#include <linux/smp_lock.h>
  49#include <linux/namei.h>
  50#include <linux/mount.h>
  51
  52#include "nfs4_fs.h"
  53#include "delegation.h"
  54#include "iostat.h"
  55
  56#define NFSDBG_FACILITY         NFSDBG_PROC
  57
  58#define NFS4_POLL_RETRY_MIN     (HZ/10)
  59#define NFS4_POLL_RETRY_MAX     (15*HZ)
  60
  61struct nfs4_opendata;
  62static int _nfs4_proc_open(struct nfs4_opendata *data);
  63static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *);
  64static int nfs4_async_handle_error(struct rpc_task *, const struct nfs_server *);
  65static int nfs4_handle_exception(const struct nfs_server *server, int errorcode, struct nfs4_exception *exception);
  66static int nfs4_wait_clnt_recover(struct rpc_clnt *clnt, struct nfs_client *clp);
  67static int _nfs4_proc_lookup(struct inode *dir, const struct qstr *name, struct nfs_fh *fhandle, struct nfs_fattr *fattr);
  68static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr);
  69
  70/* Prevent leaks of NFSv4 errors into userland */
  71int nfs4_map_errors(int err)
  72{
  73        if (err < -1000) {
  74                dprintk("%s could not handle NFSv4 error %d\n",
  75                                __FUNCTION__, -err);
  76                return -EIO;
  77        }
  78        return err;
  79}
  80
  81/*
  82 * This is our standard bitmap for GETATTR requests.
  83 */
  84const u32 nfs4_fattr_bitmap[2] = {
  85        FATTR4_WORD0_TYPE
  86        | FATTR4_WORD0_CHANGE
  87        | FATTR4_WORD0_SIZE
  88        | FATTR4_WORD0_FSID
  89        | FATTR4_WORD0_FILEID,
  90        FATTR4_WORD1_MODE
  91        | FATTR4_WORD1_NUMLINKS
  92        | FATTR4_WORD1_OWNER
  93        | FATTR4_WORD1_OWNER_GROUP
  94        | FATTR4_WORD1_RAWDEV
  95        | FATTR4_WORD1_SPACE_USED
  96        | FATTR4_WORD1_TIME_ACCESS
  97        | FATTR4_WORD1_TIME_METADATA
  98        | FATTR4_WORD1_TIME_MODIFY
  99};
 100
 101const u32 nfs4_statfs_bitmap[2] = {
 102        FATTR4_WORD0_FILES_AVAIL
 103        | FATTR4_WORD0_FILES_FREE
 104        | FATTR4_WORD0_FILES_TOTAL,
 105        FATTR4_WORD1_SPACE_AVAIL
 106        | FATTR4_WORD1_SPACE_FREE
 107        | FATTR4_WORD1_SPACE_TOTAL
 108};
 109
 110const u32 nfs4_pathconf_bitmap[2] = {
 111        FATTR4_WORD0_MAXLINK
 112        | FATTR4_WORD0_MAXNAME,
 113        0
 114};
 115
 116const u32 nfs4_fsinfo_bitmap[2] = { FATTR4_WORD0_MAXFILESIZE
 117                        | FATTR4_WORD0_MAXREAD
 118                        | FATTR4_WORD0_MAXWRITE
 119                        | FATTR4_WORD0_LEASE_TIME,
 120                        0
 121};
 122
 123const u32 nfs4_fs_locations_bitmap[2] = {
 124        FATTR4_WORD0_TYPE
 125        | FATTR4_WORD0_CHANGE
 126        | FATTR4_WORD0_SIZE
 127        | FATTR4_WORD0_FSID
 128        | FATTR4_WORD0_FILEID
 129        | FATTR4_WORD0_FS_LOCATIONS,
 130        FATTR4_WORD1_MODE
 131        | FATTR4_WORD1_NUMLINKS
 132        | FATTR4_WORD1_OWNER
 133        | FATTR4_WORD1_OWNER_GROUP
 134        | FATTR4_WORD1_RAWDEV
 135        | FATTR4_WORD1_SPACE_USED
 136        | FATTR4_WORD1_TIME_ACCESS
 137        | FATTR4_WORD1_TIME_METADATA
 138        | FATTR4_WORD1_TIME_MODIFY
 139        | FATTR4_WORD1_MOUNTED_ON_FILEID
 140};
 141
 142static void nfs4_setup_readdir(u64 cookie, __be32 *verifier, struct dentry *dentry,
 143                struct nfs4_readdir_arg *readdir)
 144{
 145        __be32 *start, *p;
 146
 147        BUG_ON(readdir->count < 80);
 148        if (cookie > 2) {
 149                readdir->cookie = cookie;
 150                memcpy(&readdir->verifier, verifier, sizeof(readdir->verifier));
 151                return;
 152        }
 153
 154        readdir->cookie = 0;
 155        memset(&readdir->verifier, 0, sizeof(readdir->verifier));
 156        if (cookie == 2)
 157                return;
 158        
 159        /*
 160         * NFSv4 servers do not return entries for '.' and '..'
 161         * Therefore, we fake these entries here.  We let '.'
 162         * have cookie 0 and '..' have cookie 1.  Note that
 163         * when talking to the server, we always send cookie 0
 164         * instead of 1 or 2.
 165         */
 166        start = p = kmap_atomic(*readdir->pages, KM_USER0);
 167        
 168        if (cookie == 0) {
 169                *p++ = xdr_one;                                  /* next */
 170                *p++ = xdr_zero;                   /* cookie, first word */
 171                *p++ = xdr_one;                   /* cookie, second word */
 172                *p++ = xdr_one;                             /* entry len */
 173                memcpy(p, ".\0\0\0", 4);                        /* entry */
 174                p++;
 175                *p++ = xdr_one;                         /* bitmap length */
 176                *p++ = htonl(FATTR4_WORD0_FILEID);             /* bitmap */
 177                *p++ = htonl(8);              /* attribute buffer length */
 178                p = xdr_encode_hyper(p, NFS_FILEID(dentry->d_inode));
 179        }
 180        
 181        *p++ = xdr_one;                                  /* next */
 182        *p++ = xdr_zero;                   /* cookie, first word */
 183        *p++ = xdr_two;                   /* cookie, second word */
 184        *p++ = xdr_two;                             /* entry len */
 185        memcpy(p, "..\0\0", 4);                         /* entry */
 186        p++;
 187        *p++ = xdr_one;                         /* bitmap length */
 188        *p++ = htonl(FATTR4_WORD0_FILEID);             /* bitmap */
 189        *p++ = htonl(8);              /* attribute buffer length */
 190        p = xdr_encode_hyper(p, NFS_FILEID(dentry->d_parent->d_inode));
 191
 192        readdir->pgbase = (char *)p - (char *)start;
 193        readdir->count -= readdir->pgbase;
 194        kunmap_atomic(start, KM_USER0);
 195}
 196
 197static void renew_lease(const struct nfs_server *server, unsigned long timestamp)
 198{
 199        struct nfs_client *clp = server->nfs_client;
 200        spin_lock(&clp->cl_lock);
 201        if (time_before(clp->cl_last_renewal,timestamp))
 202                clp->cl_last_renewal = timestamp;
 203        spin_unlock(&clp->cl_lock);
 204}
 205
 206static void update_changeattr(struct inode *dir, struct nfs4_change_info *cinfo)
 207{
 208        struct nfs_inode *nfsi = NFS_I(dir);
 209
 210        spin_lock(&dir->i_lock);
 211        nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA;
 212        if (!cinfo->atomic || cinfo->before != nfsi->change_attr)
 213                nfsi->cache_change_attribute = jiffies;
 214        nfsi->change_attr = cinfo->after;
 215        spin_unlock(&dir->i_lock);
 216}
 217
 218struct nfs4_opendata {
 219        struct kref kref;
 220        struct nfs_openargs o_arg;
 221        struct nfs_openres o_res;
 222        struct nfs_open_confirmargs c_arg;
 223        struct nfs_open_confirmres c_res;
 224        struct nfs_fattr f_attr;
 225        struct nfs_fattr dir_attr;
 226        struct path path;
 227        struct dentry *dir;
 228        struct nfs4_state_owner *owner;
 229        struct nfs4_state *state;
 230        struct iattr attrs;
 231        unsigned long timestamp;
 232        unsigned int rpc_done : 1;
 233        int rpc_status;
 234        int cancelled;
 235};
 236
 237
 238static void nfs4_init_opendata_res(struct nfs4_opendata *p)
 239{
 240        p->o_res.f_attr = &p->f_attr;
 241        p->o_res.dir_attr = &p->dir_attr;
 242        p->o_res.server = p->o_arg.server;
 243        nfs_fattr_init(&p->f_attr);
 244        nfs_fattr_init(&p->dir_attr);
 245}
 246
 247static struct nfs4_opendata *nfs4_opendata_alloc(struct path *path,
 248                struct nfs4_state_owner *sp, int flags,
 249                const struct iattr *attrs)
 250{
 251        struct dentry *parent = dget_parent(path->dentry);
 252        struct inode *dir = parent->d_inode;
 253        struct nfs_server *server = NFS_SERVER(dir);
 254        struct nfs4_opendata *p;
 255
 256        p = kzalloc(sizeof(*p), GFP_KERNEL);
 257        if (p == NULL)
 258                goto err;
 259        p->o_arg.seqid = nfs_alloc_seqid(&sp->so_seqid);
 260        if (p->o_arg.seqid == NULL)
 261                goto err_free;
 262        p->path.mnt = mntget(path->mnt);
 263        p->path.dentry = dget(path->dentry);
 264        p->dir = parent;
 265        p->owner = sp;
 266        atomic_inc(&sp->so_count);
 267        p->o_arg.fh = NFS_FH(dir);
 268        p->o_arg.open_flags = flags,
 269        p->o_arg.clientid = server->nfs_client->cl_clientid;
 270        p->o_arg.id = sp->so_owner_id.id;
 271        p->o_arg.name = &p->path.dentry->d_name;
 272        p->o_arg.server = server;
 273        p->o_arg.bitmask = server->attr_bitmask;
 274        p->o_arg.claim = NFS4_OPEN_CLAIM_NULL;
 275        if (flags & O_EXCL) {
 276                u32 *s = (u32 *) p->o_arg.u.verifier.data;
 277                s[0] = jiffies;
 278                s[1] = current->pid;
 279        } else if (flags & O_CREAT) {
 280                p->o_arg.u.attrs = &p->attrs;
 281                memcpy(&p->attrs, attrs, sizeof(p->attrs));
 282        }
 283        p->c_arg.fh = &p->o_res.fh;
 284        p->c_arg.stateid = &p->o_res.stateid;
 285        p->c_arg.seqid = p->o_arg.seqid;
 286        nfs4_init_opendata_res(p);
 287        kref_init(&p->kref);
 288        return p;
 289err_free:
 290        kfree(p);
 291err:
 292        dput(parent);
 293        return NULL;
 294}
 295
 296static void nfs4_opendata_free(struct kref *kref)
 297{
 298        struct nfs4_opendata *p = container_of(kref,
 299                        struct nfs4_opendata, kref);
 300
 301        nfs_free_seqid(p->o_arg.seqid);
 302        if (p->state != NULL)
 303                nfs4_put_open_state(p->state);
 304        nfs4_put_state_owner(p->owner);
 305        dput(p->dir);
 306        dput(p->path.dentry);
 307        mntput(p->path.mnt);
 308        kfree(p);
 309}
 310
 311static void nfs4_opendata_put(struct nfs4_opendata *p)
 312{
 313        if (p != NULL)
 314                kref_put(&p->kref, nfs4_opendata_free);
 315}
 316
 317static int nfs4_wait_for_completion_rpc_task(struct rpc_task *task)
 318{
 319        sigset_t oldset;
 320        int ret;
 321
 322        rpc_clnt_sigmask(task->tk_client, &oldset);
 323        ret = rpc_wait_for_completion_task(task);
 324        rpc_clnt_sigunmask(task->tk_client, &oldset);
 325        return ret;
 326}
 327
 328static int can_open_cached(struct nfs4_state *state, int mode)
 329{
 330        int ret = 0;
 331        switch (mode & (FMODE_READ|FMODE_WRITE|O_EXCL)) {
 332                case FMODE_READ:
 333                        ret |= test_bit(NFS_O_RDONLY_STATE, &state->flags) != 0;
 334                        break;
 335                case FMODE_WRITE:
 336                        ret |= test_bit(NFS_O_WRONLY_STATE, &state->flags) != 0;
 337                        break;
 338                case FMODE_READ|FMODE_WRITE:
 339                        ret |= test_bit(NFS_O_RDWR_STATE, &state->flags) != 0;
 340        }
 341        return ret;
 342}
 343
 344static int can_open_delegated(struct nfs_delegation *delegation, mode_t open_flags)
 345{
 346        if ((delegation->type & open_flags) != open_flags)
 347                return 0;
 348        if (delegation->flags & NFS_DELEGATION_NEED_RECLAIM)
 349                return 0;
 350        return 1;
 351}
 352
 353static void update_open_stateflags(struct nfs4_state *state, mode_t open_flags)
 354{
 355        switch (open_flags) {
 356                case FMODE_WRITE:
 357                        state->n_wronly++;
 358                        break;
 359                case FMODE_READ:
 360                        state->n_rdonly++;
 361                        break;
 362                case FMODE_READ|FMODE_WRITE:
 363                        state->n_rdwr++;
 364        }
 365        nfs4_state_set_mode_locked(state, state->state | open_flags);
 366}
 367
 368static void nfs_set_open_stateid_locked(struct nfs4_state *state, nfs4_stateid *stateid, int open_flags)
 369{
 370        if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0)
 371                memcpy(state->stateid.data, stateid->data, sizeof(state->stateid.data));
 372        memcpy(state->open_stateid.data, stateid->data, sizeof(state->open_stateid.data));
 373        switch (open_flags) {
 374                case FMODE_READ:
 375                        set_bit(NFS_O_RDONLY_STATE, &state->flags);
 376                        break;
 377                case FMODE_WRITE:
 378                        set_bit(NFS_O_WRONLY_STATE, &state->flags);
 379                        break;
 380                case FMODE_READ|FMODE_WRITE:
 381                        set_bit(NFS_O_RDWR_STATE, &state->flags);
 382        }
 383}
 384
 385static void nfs_set_open_stateid(struct nfs4_state *state, nfs4_stateid *stateid, int open_flags)
 386{
 387        write_seqlock(&state->seqlock);
 388        nfs_set_open_stateid_locked(state, stateid, open_flags);
 389        write_sequnlock(&state->seqlock);
 390}
 391
 392static void update_open_stateid(struct nfs4_state *state, nfs4_stateid *open_stateid, nfs4_stateid *deleg_stateid, int open_flags)
 393{
 394        open_flags &= (FMODE_READ|FMODE_WRITE);
 395        /*
 396         * Protect the call to nfs4_state_set_mode_locked and
 397         * serialise the stateid update
 398         */
 399        write_seqlock(&state->seqlock);
 400        if (deleg_stateid != NULL) {
 401                memcpy(state->stateid.data, deleg_stateid->data, sizeof(state->stateid.data));
 402                set_bit(NFS_DELEGATED_STATE, &state->flags);
 403        }
 404        if (open_stateid != NULL)
 405                nfs_set_open_stateid_locked(state, open_stateid, open_flags);
 406        write_sequnlock(&state->seqlock);
 407        spin_lock(&state->owner->so_lock);
 408        update_open_stateflags(state, open_flags);
 409        spin_unlock(&state->owner->so_lock);
 410}
 411
 412static void nfs4_return_incompatible_delegation(struct inode *inode, mode_t open_flags)
 413{
 414        struct nfs_delegation *delegation;
 415
 416        rcu_read_lock();
 417        delegation = rcu_dereference(NFS_I(inode)->delegation);
 418        if (delegation == NULL || (delegation->type & open_flags) == open_flags) {
 419                rcu_read_unlock();
 420                return;
 421        }
 422        rcu_read_unlock();
 423        nfs_inode_return_delegation(inode);
 424}
 425
 426static struct nfs4_state *nfs4_try_open_cached(struct nfs4_opendata *opendata)
 427{
 428        struct nfs4_state *state = opendata->state;
 429        struct nfs_inode *nfsi = NFS_I(state->inode);
 430        struct nfs_delegation *delegation;
 431        int open_mode = opendata->o_arg.open_flags & (FMODE_READ|FMODE_WRITE|O_EXCL);
 432        nfs4_stateid stateid;
 433        int ret = -EAGAIN;
 434
 435        rcu_read_lock();
 436        delegation = rcu_dereference(nfsi->delegation);
 437        for (;;) {
 438                if (can_open_cached(state, open_mode)) {
 439                        spin_lock(&state->owner->so_lock);
 440                        if (can_open_cached(state, open_mode)) {
 441                                update_open_stateflags(state, open_mode);
 442                                spin_unlock(&state->owner->so_lock);
 443                                rcu_read_unlock();
 444                                goto out_return_state;
 445                        }
 446                        spin_unlock(&state->owner->so_lock);
 447                }
 448                if (delegation == NULL)
 449                        break;
 450                if (!can_open_delegated(delegation, open_mode))
 451                        break;
 452                /* Save the delegation */
 453                memcpy(stateid.data, delegation->stateid.data, sizeof(stateid.data));
 454                rcu_read_unlock();
 455                lock_kernel();
 456                ret = nfs_may_open(state->inode, state->owner->so_cred, open_mode);
 457                unlock_kernel();
 458                if (ret != 0)
 459                        goto out;
 460                ret = -EAGAIN;
 461                rcu_read_lock();
 462                delegation = rcu_dereference(nfsi->delegation);
 463                /* If no delegation, try a cached open */
 464                if (delegation == NULL)
 465                        continue;
 466                /* Is the delegation still valid? */
 467                if (memcmp(stateid.data, delegation->stateid.data, sizeof(stateid.data)) != 0)
 468                        continue;
 469                rcu_read_unlock();
 470                update_open_stateid(state, NULL, &stateid, open_mode);
 471                goto out_return_state;
 472        }
 473        rcu_read_unlock();
 474out:
 475        return ERR_PTR(ret);
 476out_return_state:
 477        atomic_inc(&state->count);
 478        return state;
 479}
 480
 481static struct nfs4_state *nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data)
 482{
 483        struct inode *inode;
 484        struct nfs4_state *state = NULL;
 485        struct nfs_delegation *delegation;
 486        nfs4_stateid *deleg_stateid = NULL;
 487        int ret;
 488
 489        if (!data->rpc_done) {
 490                state = nfs4_try_open_cached(data);
 491                goto out;
 492        }
 493
 494        ret = -EAGAIN;
 495        if (!(data->f_attr.valid & NFS_ATTR_FATTR))
 496                goto err;
 497        inode = nfs_fhget(data->dir->d_sb, &data->o_res.fh, &data->f_attr);
 498        ret = PTR_ERR(inode);
 499        if (IS_ERR(inode))
 500                goto err;
 501        ret = -ENOMEM;
 502        state = nfs4_get_open_state(inode, data->owner);
 503        if (state == NULL)
 504                goto err_put_inode;
 505        if (data->o_res.delegation_type != 0) {
 506                int delegation_flags = 0;
 507
 508                rcu_read_lock();
 509                delegation = rcu_dereference(NFS_I(inode)->delegation);
 510                if (delegation)
 511                        delegation_flags = delegation->flags;
 512                rcu_read_unlock();
 513                if (!(delegation_flags & NFS_DELEGATION_NEED_RECLAIM))
 514                        nfs_inode_set_delegation(state->inode,
 515                                        data->owner->so_cred,
 516                                        &data->o_res);
 517                else
 518                        nfs_inode_reclaim_delegation(state->inode,
 519                                        data->owner->so_cred,
 520                                        &data->o_res);
 521        }
 522        rcu_read_lock();
 523        delegation = rcu_dereference(NFS_I(inode)->delegation);
 524        if (delegation != NULL)
 525                deleg_stateid = &delegation->stateid;
 526        update_open_stateid(state, &data->o_res.stateid, deleg_stateid, data->o_arg.open_flags);
 527        rcu_read_unlock();
 528        iput(inode);
 529out:
 530        return state;
 531err_put_inode:
 532        iput(inode);
 533err:
 534        return ERR_PTR(ret);
 535}
 536
 537static struct nfs_open_context *nfs4_state_find_open_context(struct nfs4_state *state)
 538{
 539        struct nfs_inode *nfsi = NFS_I(state->inode);
 540        struct nfs_open_context *ctx;
 541
 542        spin_lock(&state->inode->i_lock);
 543        list_for_each_entry(ctx, &nfsi->open_files, list) {
 544                if (ctx->state != state)
 545                        continue;
 546                get_nfs_open_context(ctx);
 547                spin_unlock(&state->inode->i_lock);
 548                return ctx;
 549        }
 550        spin_unlock(&state->inode->i_lock);
 551        return ERR_PTR(-ENOENT);
 552}
 553
 554static struct nfs4_opendata *nfs4_open_recoverdata_alloc(struct nfs_open_context *ctx, struct nfs4_state *state)
 555{
 556        struct nfs4_opendata *opendata;
 557
 558        opendata = nfs4_opendata_alloc(&ctx->path, state->owner, 0, NULL);
 559        if (opendata == NULL)
 560                return ERR_PTR(-ENOMEM);
 561        opendata->state = state;
 562        atomic_inc(&state->count);
 563        return opendata;
 564}
 565
 566static int nfs4_open_recover_helper(struct nfs4_opendata *opendata, mode_t openflags, struct nfs4_state **res)
 567{
 568        struct nfs4_state *newstate;
 569        int ret;
 570
 571        opendata->o_arg.open_flags = openflags;
 572        memset(&opendata->o_res, 0, sizeof(opendata->o_res));
 573        memset(&opendata->c_res, 0, sizeof(opendata->c_res));
 574        nfs4_init_opendata_res(opendata);
 575        ret = _nfs4_proc_open(opendata);
 576        if (ret != 0)
 577                return ret; 
 578        newstate = nfs4_opendata_to_nfs4_state(opendata);
 579        if (IS_ERR(newstate))
 580                return PTR_ERR(newstate);
 581        nfs4_close_state(&opendata->path, newstate, openflags);
 582        *res = newstate;
 583        return 0;
 584}
 585
 586static int nfs4_open_recover(struct nfs4_opendata *opendata, struct nfs4_state *state)
 587{
 588        struct nfs4_state *newstate;
 589        int ret;
 590
 591        /* memory barrier prior to reading state->n_* */
 592        clear_bit(NFS_DELEGATED_STATE, &state->flags);
 593        smp_rmb();
 594        if (state->n_rdwr != 0) {
 595                ret = nfs4_open_recover_helper(opendata, FMODE_READ|FMODE_WRITE, &newstate);
 596                if (ret != 0)
 597                        return ret;
 598                if (newstate != state)
 599                        return -ESTALE;
 600        }
 601        if (state->n_wronly != 0) {
 602                ret = nfs4_open_recover_helper(opendata, FMODE_WRITE, &newstate);
 603                if (ret != 0)
 604                        return ret;
 605                if (newstate != state)
 606                        return -ESTALE;
 607        }
 608        if (state->n_rdonly != 0) {
 609                ret = nfs4_open_recover_helper(opendata, FMODE_READ, &newstate);
 610                if (ret != 0)
 611                        return ret;
 612                if (newstate != state)
 613                        return -ESTALE;
 614        }
 615        /*
 616         * We may have performed cached opens for all three recoveries.
 617         * Check if we need to update the current stateid.
 618         */
 619        if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0 &&
 620            memcmp(state->stateid.data, state->open_stateid.data, sizeof(state->stateid.data)) != 0) {
 621                write_seqlock(&state->seqlock);
 622                if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0)
 623                        memcpy(state->stateid.data, state->open_stateid.data, sizeof(state->stateid.data));
 624                write_sequnlock(&state->seqlock);
 625        }
 626        return 0;
 627}
 628
 629/*
 630 * OPEN_RECLAIM:
 631 *      reclaim state on the server after a reboot.
 632 */
 633static int _nfs4_do_open_reclaim(struct nfs_open_context *ctx, struct nfs4_state *state)
 634{
 635        struct nfs_delegation *delegation;
 636        struct nfs4_opendata *opendata;
 637        int delegation_type = 0;
 638        int status;
 639
 640        opendata = nfs4_open_recoverdata_alloc(ctx, state);
 641        if (IS_ERR(opendata))
 642                return PTR_ERR(opendata);
 643        opendata->o_arg.claim = NFS4_OPEN_CLAIM_PREVIOUS;
 644        opendata->o_arg.fh = NFS_FH(state->inode);
 645        rcu_read_lock();
 646        delegation = rcu_dereference(NFS_I(state->inode)->delegation);
 647        if (delegation != NULL && (delegation->flags & NFS_DELEGATION_NEED_RECLAIM) != 0)
 648                delegation_type = delegation->type;
 649        rcu_read_unlock();
 650        opendata->o_arg.u.delegation_type = delegation_type;
 651        status = nfs4_open_recover(opendata, state);
 652        nfs4_opendata_put(opendata);
 653        return status;
 654}
 655
 656static int nfs4_do_open_reclaim(struct nfs_open_context *ctx, struct nfs4_state *state)
 657{
 658        struct nfs_server *server = NFS_SERVER(state->inode);
 659        struct nfs4_exception exception = { };
 660        int err;
 661        do {
 662                err = _nfs4_do_open_reclaim(ctx, state);
 663                if (err != -NFS4ERR_DELAY)
 664                        break;
 665                nfs4_handle_exception(server, err, &exception);
 666        } while (exception.retry);
 667        return err;
 668}
 669
 670static int nfs4_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *state)
 671{
 672        struct nfs_open_context *ctx;
 673        int ret;
 674
 675        ctx = nfs4_state_find_open_context(state);
 676        if (IS_ERR(ctx))
 677                return PTR_ERR(ctx);
 678        ret = nfs4_do_open_reclaim(ctx, state);
 679        put_nfs_open_context(ctx);
 680        return ret;
 681}
 682
 683static int _nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid)
 684{
 685        struct nfs4_opendata *opendata;
 686        int ret;
 687
 688        opendata = nfs4_open_recoverdata_alloc(ctx, state);
 689        if (IS_ERR(opendata))
 690                return PTR_ERR(opendata);
 691        opendata->o_arg.claim = NFS4_OPEN_CLAIM_DELEGATE_CUR;
 692        memcpy(opendata->o_arg.u.delegation.data, stateid->data,
 693                        sizeof(opendata->o_arg.u.delegation.data));
 694        ret = nfs4_open_recover(opendata, state);
 695        nfs4_opendata_put(opendata);
 696        return ret;
 697}
 698
 699int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid)
 700{
 701        struct nfs4_exception exception = { };
 702        struct nfs_server *server = NFS_SERVER(state->inode);
 703        int err;
 704        do {
 705                err = _nfs4_open_delegation_recall(ctx, state, stateid);
 706                switch (err) {
 707                        case 0:
 708                                return err;
 709                        case -NFS4ERR_STALE_CLIENTID:
 710                        case -NFS4ERR_STALE_STATEID:
 711                        case -NFS4ERR_EXPIRED:
 712                                /* Don't recall a delegation if it was lost */
 713                                nfs4_schedule_state_recovery(server->nfs_client);
 714                                return err;
 715                }
 716                err = nfs4_handle_exception(server, err, &exception);
 717        } while (exception.retry);
 718        return err;
 719}
 720
 721static void nfs4_open_confirm_prepare(struct rpc_task *task, void *calldata)
 722{
 723        struct nfs4_opendata *data = calldata;
 724        struct  rpc_message msg = {
 725                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_CONFIRM],
 726                .rpc_argp = &data->c_arg,
 727                .rpc_resp = &data->c_res,
 728                .rpc_cred = data->owner->so_cred,
 729        };
 730        data->timestamp = jiffies;
 731        rpc_call_setup(task, &msg, 0);
 732}
 733
 734static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata)
 735{
 736        struct nfs4_opendata *data = calldata;
 737
 738        data->rpc_status = task->tk_status;
 739        if (RPC_ASSASSINATED(task))
 740                return;
 741        if (data->rpc_status == 0) {
 742                memcpy(data->o_res.stateid.data, data->c_res.stateid.data,
 743                                sizeof(data->o_res.stateid.data));
 744                nfs_confirm_seqid(&data->owner->so_seqid, 0);
 745                renew_lease(data->o_res.server, data->timestamp);
 746                data->rpc_done = 1;
 747        }
 748        nfs_increment_open_seqid(data->rpc_status, data->c_arg.seqid);
 749}
 750
 751static void nfs4_open_confirm_release(void *calldata)
 752{
 753        struct nfs4_opendata *data = calldata;
 754        struct nfs4_state *state = NULL;
 755
 756        /* If this request hasn't been cancelled, do nothing */
 757        if (data->cancelled == 0)
 758                goto out_free;
 759        /* In case of error, no cleanup! */
 760        if (!data->rpc_done)
 761                goto out_free;
 762        state = nfs4_opendata_to_nfs4_state(data);
 763        if (!IS_ERR(state))
 764                nfs4_close_state(&data->path, state, data->o_arg.open_flags);
 765out_free:
 766        nfs4_opendata_put(data);
 767}
 768
 769static const struct rpc_call_ops nfs4_open_confirm_ops = {
 770        .rpc_call_prepare = nfs4_open_confirm_prepare,
 771        .rpc_call_done = nfs4_open_confirm_done,
 772        .rpc_release = nfs4_open_confirm_release,
 773};
 774
 775/*
 776 * Note: On error, nfs4_proc_open_confirm will free the struct nfs4_opendata
 777 */
 778static int _nfs4_proc_open_confirm(struct nfs4_opendata *data)
 779{
 780        struct nfs_server *server = NFS_SERVER(data->dir->d_inode);
 781        struct rpc_task *task;
 782        int status;
 783
 784        kref_get(&data->kref);
 785        data->rpc_done = 0;
 786        data->rpc_status = 0;
 787        task = rpc_run_task(server->client, RPC_TASK_ASYNC, &nfs4_open_confirm_ops, data);
 788        if (IS_ERR(task))
 789                return PTR_ERR(task);
 790        status = nfs4_wait_for_completion_rpc_task(task);
 791        if (status != 0) {
 792                data->cancelled = 1;
 793                smp_wmb();
 794        } else
 795                status = data->rpc_status;
 796        rpc_put_task(task);
 797        return status;
 798}
 799
 800static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
 801{
 802        struct nfs4_opendata *data = calldata;
 803        struct nfs4_state_owner *sp = data->owner;
 804        struct rpc_message msg = {
 805                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN],
 806                .rpc_argp = &data->o_arg,
 807                .rpc_resp = &data->o_res,
 808                .rpc_cred = sp->so_cred,
 809        };
 810        
 811        if (nfs_wait_on_sequence(data->o_arg.seqid, task) != 0)
 812                return;
 813        /*
 814         * Check if we still need to send an OPEN call, or if we can use
 815         * a delegation instead.
 816         */
 817        if (data->state != NULL) {
 818                struct nfs_delegation *delegation;
 819
 820                if (can_open_cached(data->state, data->o_arg.open_flags & (FMODE_READ|FMODE_WRITE|O_EXCL)))
 821                        goto out_no_action;
 822                rcu_read_lock();
 823                delegation = rcu_dereference(NFS_I(data->state->inode)->delegation);
 824                if (delegation != NULL &&
 825                   (delegation->flags & NFS_DELEGATION_NEED_RECLAIM) == 0) {
 826                        rcu_read_unlock();
 827                        goto out_no_action;
 828                }
 829                rcu_read_unlock();
 830        }
 831        /* Update sequence id. */
 832        data->o_arg.id = sp->so_owner_id.id;
 833        data->o_arg.clientid = sp->so_client->cl_clientid;
 834        if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS) {
 835                msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR];
 836                nfs_copy_fh(&data->o_res.fh, data->o_arg.fh);
 837        }
 838        data->timestamp = jiffies;
 839        rpc_call_setup(task, &msg, 0);
 840        return;
 841out_no_action:
 842        task->tk_action = NULL;
 843
 844}
 845
 846static void nfs4_open_done(struct rpc_task *task, void *calldata)
 847{
 848        struct nfs4_opendata *data = calldata;
 849
 850        data->rpc_status = task->tk_status;
 851        if (RPC_ASSASSINATED(task))
 852                return;
 853        if (task->tk_status == 0) {
 854                switch (data->o_res.f_attr->mode & S_IFMT) {
 855                        case S_IFREG:
 856                                break;
 857                        case S_IFLNK:
 858                                data->rpc_status = -ELOOP;
 859                                break;
 860                        case S_IFDIR:
 861                                data->rpc_status = -EISDIR;
 862                                break;
 863                        default:
 864                                data->rpc_status = -ENOTDIR;
 865                }
 866                renew_lease(data->o_res.server, data->timestamp);
 867                if (!(data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM))
 868                        nfs_confirm_seqid(&data->owner->so_seqid, 0);
 869        }
 870        nfs_increment_open_seqid(data->rpc_status, data->o_arg.seqid);
 871        data->rpc_done = 1;
 872}
 873
 874static void nfs4_open_release(void *calldata)
 875{
 876        struct nfs4_opendata *data = calldata;
 877        struct nfs4_state *state = NULL;
 878
 879        /* If this request hasn't been cancelled, do nothing */
 880        if (data->cancelled == 0)
 881                goto out_free;
 882        /* In case of error, no cleanup! */
 883        if (data->rpc_status != 0 || !data->rpc_done)
 884                goto out_free;
 885        /* In case we need an open_confirm, no cleanup! */
 886        if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM)
 887                goto out_free;
 888        state = nfs4_opendata_to_nfs4_state(data);
 889        if (!IS_ERR(state))
 890                nfs4_close_state(&data->path, state, data->o_arg.open_flags);
 891out_free:
 892        nfs4_opendata_put(data);
 893}
 894
 895static const struct rpc_call_ops nfs4_open_ops = {
 896        .rpc_call_prepare = nfs4_open_prepare,
 897        .rpc_call_done = nfs4_open_done,
 898        .rpc_release = nfs4_open_release,
 899};
 900
 901/*
 902 * Note: On error, nfs4_proc_open will free the struct nfs4_opendata
 903 */
 904static int _nfs4_proc_open(struct nfs4_opendata *data)
 905{
 906        struct inode *dir = data->dir->d_inode;
 907        struct nfs_server *server = NFS_SERVER(dir);
 908        struct nfs_openargs *o_arg = &data->o_arg;
 909        struct nfs_openres *o_res = &data->o_res;
 910        struct rpc_task *task;
 911        int status;
 912
 913        kref_get(&data->kref);
 914        data->rpc_done = 0;
 915        data->rpc_status = 0;
 916        data->cancelled = 0;
 917        task = rpc_run_task(server->client, RPC_TASK_ASYNC, &nfs4_open_ops, data);
 918        if (IS_ERR(task))
 919                return PTR_ERR(task);
 920        status = nfs4_wait_for_completion_rpc_task(task);
 921        if (status != 0) {
 922                data->cancelled = 1;
 923                smp_wmb();
 924        } else
 925                status = data->rpc_status;
 926        rpc_put_task(task);
 927        if (status != 0 || !data->rpc_done)
 928                return status;
 929
 930        if (o_res->fh.size == 0)
 931                _nfs4_proc_lookup(dir, o_arg->name, &o_res->fh, o_res->f_attr);
 932
 933        if (o_arg->open_flags & O_CREAT) {
 934                update_changeattr(dir, &o_res->cinfo);
 935                nfs_post_op_update_inode(dir, o_res->dir_attr);
 936        } else
 937                nfs_refresh_inode(dir, o_res->dir_attr);
 938        if(o_res->rflags & NFS4_OPEN_RESULT_CONFIRM) {
 939                status = _nfs4_proc_open_confirm(data);
 940                if (status != 0)
 941                        return status;
 942        }
 943        if (!(o_res->f_attr->valid & NFS_ATTR_FATTR))
 944                _nfs4_proc_getattr(server, &o_res->fh, o_res->f_attr);
 945        return 0;
 946}
 947
 948static int nfs4_recover_expired_lease(struct nfs_server *server)
 949{
 950        struct nfs_client *clp = server->nfs_client;
 951        int ret;
 952
 953        for (;;) {
 954                ret = nfs4_wait_clnt_recover(server->client, clp);
 955                if (ret != 0)
 956                        return ret;
 957                if (!test_and_clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state))
 958                        break;
 959                nfs4_schedule_state_recovery(clp);
 960        }
 961        return 0;
 962}
 963
 964/*
 965 * OPEN_EXPIRED:
 966 *      reclaim state on the server after a network partition.
 967 *      Assumes caller holds the appropriate lock
 968 */
 969static int _nfs4_open_expired(struct nfs_open_context *ctx, struct nfs4_state *state)
 970{
 971        struct nfs4_opendata *opendata;
 972        int ret;
 973
 974        opendata = nfs4_open_recoverdata_alloc(ctx, state);
 975        if (IS_ERR(opendata))
 976                return PTR_ERR(opendata);
 977        ret = nfs4_open_recover(opendata, state);
 978        if (ret == -ESTALE) {
 979                /* Invalidate the state owner so we don't ever use it again */
 980                nfs4_drop_state_owner(state->owner);
 981                d_drop(ctx->path.dentry);
 982        }
 983        nfs4_opendata_put(opendata);
 984        return ret;
 985}
 986
 987static inline int nfs4_do_open_expired(struct nfs_open_context *ctx, struct nfs4_state *state)
 988{
 989        struct nfs_server *server = NFS_SERVER(state->inode);
 990        struct nfs4_exception exception = { };
 991        int err;
 992
 993        do {
 994                err = _nfs4_open_expired(ctx, state);
 995                if (err == -NFS4ERR_DELAY)
 996                        nfs4_handle_exception(server, err, &exception);
 997        } while (exception.retry);
 998        return err;
 999}
1000
1001static int nfs4_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state)
1002{
1003        struct nfs_open_context *ctx;
1004        int ret;
1005
1006        ctx = nfs4_state_find_open_context(state);
1007        if (IS_ERR(ctx))
1008                return PTR_ERR(ctx);
1009        ret = nfs4_do_open_expired(ctx, state);
1010        put_nfs_open_context(ctx);
1011        return ret;
1012}
1013
1014/*
1015 * on an EXCLUSIVE create, the server should send back a bitmask with FATTR4-*
1016 * fields corresponding to attributes that were used to store the verifier.
1017 * Make sure we clobber those fields in the later setattr call
1018 */
1019static inline void nfs4_exclusive_attrset(struct nfs4_opendata *opendata, struct iattr *sattr)
1020{
1021        if ((opendata->o_res.attrset[1] & FATTR4_WORD1_TIME_ACCESS) &&
1022            !(sattr->ia_valid & ATTR_ATIME_SET))
1023                sattr->ia_valid |= ATTR_ATIME;
1024
1025        if ((opendata->o_res.attrset[1] & FATTR4_WORD1_TIME_MODIFY) &&
1026            !(sattr->ia_valid & ATTR_MTIME_SET))
1027                sattr->ia_valid |= ATTR_MTIME;
1028}
1029
1030/*
1031 * Returns a referenced nfs4_state
1032 */
1033static int _nfs4_do_open(struct inode *dir, struct path *path, int flags, struct iattr *sattr, struct rpc_cred *cred, struct nfs4_state **res)
1034{
1035        struct nfs4_state_owner  *sp;
1036        struct nfs4_state     *state = NULL;
1037        struct nfs_server       *server = NFS_SERVER(dir);
1038        struct nfs_client *clp = server->nfs_client;
1039        struct nfs4_opendata *opendata;
1040        int status;
1041
1042        /* Protect against reboot recovery conflicts */
1043        status = -ENOMEM;
1044        if (!(sp = nfs4_get_state_owner(server, cred))) {
1045                dprintk("nfs4_do_open: nfs4_get_state_owner failed!\n");
1046                goto out_err;
1047        }
1048        status = nfs4_recover_expired_lease(server);
1049        if (status != 0)
1050                goto err_put_state_owner;
1051        if (path->dentry->d_inode != NULL)
1052                nfs4_return_incompatible_delegation(path->dentry->d_inode, flags & (FMODE_READ|FMODE_WRITE));
1053        down_read(&clp->cl_sem);
1054        status = -ENOMEM;
1055        opendata = nfs4_opendata_alloc(path, sp, flags, sattr);
1056        if (opendata == NULL)
1057                goto err_release_rwsem;
1058
1059        if (path->dentry->d_inode != NULL)
1060                opendata->state = nfs4_get_open_state(path->dentry->d_inode, sp);
1061
1062        status = _nfs4_proc_open(opendata);
1063        if (status != 0)
1064                goto err_opendata_put;
1065
1066        if (opendata->o_arg.open_flags & O_EXCL)
1067                nfs4_exclusive_attrset(opendata, sattr);
1068
1069        state = nfs4_opendata_to_nfs4_state(opendata);
1070        status = PTR_ERR(state);
1071        if (IS_ERR(state))
1072                goto err_opendata_put;
1073        nfs4_opendata_put(opendata);
1074        nfs4_put_state_owner(sp);
1075        up_read(&clp->cl_sem);
1076        *res = state;
1077        return 0;
1078err_opendata_put:
1079        nfs4_opendata_put(opendata);
1080err_release_rwsem:
1081        up_read(&clp->cl_sem);
1082err_put_state_owner:
1083        nfs4_put_state_owner(sp);
1084out_err:
1085        *res = NULL;
1086        return status;
1087}
1088
1089
1090static struct nfs4_state *nfs4_do_open(struct inode *dir, struct path *path, int flags, struct iattr *sattr, struct rpc_cred *cred)
1091{
1092        struct nfs4_exception exception = { };
1093        struct nfs4_state *res;
1094        int status;
1095
1096        do {
1097                status = _nfs4_do_open(dir, path, flags, sattr, cred, &res);
1098                if (status == 0)
1099                        break;
1100                /* NOTE: BAD_SEQID means the server and client disagree about the
1101                 * book-keeping w.r.t. state-changing operations
1102                 * (OPEN/CLOSE/LOCK/LOCKU...)
1103                 * It is actually a sign of a bug on the client or on the server.
1104                 *
1105                 * If we receive a BAD_SEQID error in the particular case of
1106                 * doing an OPEN, we assume that nfs_increment_open_seqid() will
1107                 * have unhashed the old state_owner for us, and that we can
1108                 * therefore safely retry using a new one. We should still warn
1109                 * the user though...
1110                 */
1111                if (status == -NFS4ERR_BAD_SEQID) {
1112                        printk(KERN_WARNING "NFS: v4 server %s "
1113                                        " returned a bad sequence-id error!\n",
1114                                        NFS_SERVER(dir)->nfs_client->cl_hostname);
1115                        exception.retry = 1;
1116                        continue;
1117                }
1118                /*
1119                 * BAD_STATEID on OPEN means that the server cancelled our
1120                 * state before it received the OPEN_CONFIRM.
1121                 * Recover by retrying the request as per the discussion
1122                 * on Page 181 of RFC3530.
1123                 */
1124                if (status == -NFS4ERR_BAD_STATEID) {
1125                        exception.retry = 1;
1126                        continue;
1127                }
1128                if (status == -EAGAIN) {
1129                        /* We must have found a delegation */
1130                        exception.retry = 1;
1131                        continue;
1132                }
1133                res = ERR_PTR(nfs4_handle_exception(NFS_SERVER(dir),
1134                                        status, &exception));
1135        } while (exception.retry);
1136        return res;
1137}
1138
1139static int _nfs4_do_setattr(struct inode *inode, struct nfs_fattr *fattr,
1140                struct iattr *sattr, struct nfs4_state *state)
1141{
1142        struct nfs_server *server = NFS_SERVER(inode);
1143        struct nfs_setattrargs  arg = {
1144                .fh             = NFS_FH(inode),
1145                .iap            = sattr,
1146                .server         = server,
1147                .bitmask = server->attr_bitmask,
1148        };
1149        struct nfs_setattrres  res = {
1150                .fattr          = fattr,
1151                .server         = server,
1152        };
1153        struct rpc_message msg = {
1154                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_SETATTR],
1155                .rpc_argp       = &arg,
1156                .rpc_resp       = &res,
1157        };
1158        unsigned long timestamp = jiffies;
1159        int status;
1160
1161        nfs_fattr_init(fattr);
1162
1163        if (nfs4_copy_delegation_stateid(&arg.stateid, inode)) {
1164                /* Use that stateid */
1165        } else if (state != NULL) {
1166                msg.rpc_cred = state->owner->so_cred;
1167                nfs4_copy_stateid(&arg.stateid, state, current->files);
1168        } else
1169                memcpy(&arg.stateid, &zero_stateid, sizeof(arg.stateid));
1170
1171        status = rpc_call_sync(server->client, &msg, 0);
1172        if (status == 0 && state != NULL)
1173                renew_lease(server, timestamp);
1174        return status;
1175}
1176
1177static int nfs4_do_setattr(struct inode *inode, struct nfs_fattr *fattr,
1178                struct iattr *sattr, struct nfs4_state *state)
1179{
1180        struct nfs_server *server = NFS_SERVER(inode);
1181        struct nfs4_exception exception = { };
1182        int err;
1183        do {
1184                err = nfs4_handle_exception(server,
1185                                _nfs4_do_setattr(inode, fattr, sattr, state),
1186                                &exception);
1187        } while (exception.retry);
1188        return err;
1189}
1190
1191struct nfs4_closedata {
1192        struct path path;
1193        struct inode *inode;
1194        struct nfs4_state *state;
1195        struct nfs_closeargs arg;
1196        struct nfs_closeres res;
1197        struct nfs_fattr fattr;
1198        unsigned long timestamp;
1199};
1200
1201static void nfs4_free_closedata(void *data)
1202{
1203        struct nfs4_closedata *calldata = data;
1204        struct nfs4_state_owner *sp = calldata->state->owner;
1205
1206        nfs4_put_open_state(calldata->state);
1207        nfs_free_seqid(calldata->arg.seqid);
1208        nfs4_put_state_owner(sp);
1209        dput(calldata->path.dentry);
1210        mntput(calldata->path.mnt);
1211        kfree(calldata);
1212}
1213
1214static void nfs4_close_done(struct rpc_task *task, void *data)
1215{
1216        struct nfs4_closedata *calldata = data;
1217        struct nfs4_state *state = calldata->state;
1218        struct nfs_server *server = NFS_SERVER(calldata->inode);
1219
1220        if (RPC_ASSASSINATED(task))
1221                return;
1222        /* hmm. we are done with the inode, and in the process of freeing
1223         * the state_owner. we keep this around to process errors
1224         */
1225        nfs_increment_open_seqid(task->tk_status, calldata->arg.seqid);
1226        switch (task->tk_status) {
1227                case 0:
1228                        nfs_set_open_stateid(state, &calldata->res.stateid, 0);
1229                        renew_lease(server, calldata->timestamp);
1230                        break;
1231                case -NFS4ERR_STALE_STATEID:
1232                case -NFS4ERR_EXPIRED:
1233                        break;
1234                default:
1235                        if (nfs4_async_handle_error(task, server) == -EAGAIN) {
1236                                rpc_restart_call(task);
1237                                return;
1238                        }
1239        }
1240        nfs_refresh_inode(calldata->inode, calldata->res.fattr);
1241}
1242
1243static void nfs4_close_prepare(struct rpc_task *task, void *data)
1244{
1245        struct nfs4_closedata *calldata = data;
1246        struct nfs4_state *state = calldata->state;
1247        struct rpc_message msg = {
1248                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE],
1249                .rpc_argp = &calldata->arg,
1250                .rpc_resp = &calldata->res,
1251                .rpc_cred = state->owner->so_cred,
1252        };
1253        int clear_rd, clear_wr, clear_rdwr;
1254
1255        if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
1256                return;
1257
1258        clear_rd = clear_wr = clear_rdwr = 0;
1259        spin_lock(&state->owner->so_lock);
1260        /* Calculate the change in open mode */
1261        if (state->n_rdwr == 0) {
1262                if (state->n_rdonly == 0) {
1263                        clear_rd |= test_and_clear_bit(NFS_O_RDONLY_STATE, &state->flags);
1264                        clear_rdwr |= test_and_clear_bit(NFS_O_RDWR_STATE, &state->flags);
1265                }
1266                if (state->n_wronly == 0) {
1267                        clear_wr |= test_and_clear_bit(NFS_O_WRONLY_STATE, &state->flags);
1268                        clear_rdwr |= test_and_clear_bit(NFS_O_RDWR_STATE, &state->flags);
1269                }
1270        }
1271        spin_unlock(&state->owner->so_lock);
1272        if (!clear_rd && !clear_wr && !clear_rdwr) {
1273                /* Note: exit _without_ calling nfs4_close_done */
1274                task->tk_action = NULL;
1275                return;
1276        }
1277        nfs_fattr_init(calldata->res.fattr);
1278        if (test_bit(NFS_O_RDONLY_STATE, &state->flags) != 0) {
1279                msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE];
1280                calldata->arg.open_flags = FMODE_READ;
1281        } else if (test_bit(NFS_O_WRONLY_STATE, &state->flags) != 0) {
1282                msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE];
1283                calldata->arg.open_flags = FMODE_WRITE;
1284        }
1285        calldata->timestamp = jiffies;
1286        rpc_call_setup(task, &msg, 0);
1287}
1288
1289static const struct rpc_call_ops nfs4_close_ops = {
1290        .rpc_call_prepare = nfs4_close_prepare,
1291        .rpc_call_done = nfs4_close_done,
1292        .rpc_release = nfs4_free_closedata,
1293};
1294
1295/* 
1296 * It is possible for data to be read/written from a mem-mapped file 
1297 * after the sys_close call (which hits the vfs layer as a flush).
1298 * This means that we can't safely call nfsv4 close on a file until 
1299 * the inode is cleared. This in turn means that we are not good
1300 * NFSv4 citizens - we do not indicate to the server to update the file's 
1301 * share state even when we are done with one of the three share 
1302 * stateid's in the inode.
1303 *
1304 * NOTE: Caller must be holding the sp->so_owner semaphore!
1305 */
1306int nfs4_do_close(struct path *path, struct nfs4_state *state, int wait)
1307{
1308        struct nfs_server *server = NFS_SERVER(state->inode);
1309        struct nfs4_closedata *calldata;
1310        struct nfs4_state_owner *sp = state->owner;
1311        struct rpc_task *task;
1312        int status = -ENOMEM;
1313
1314        calldata = kmalloc(sizeof(*calldata), GFP_KERNEL);
1315        if (calldata == NULL)
1316                goto out;
1317        calldata->inode = state->inode;
1318        calldata->state = state;
1319        calldata->arg.fh = NFS_FH(state->inode);
1320        calldata->arg.stateid = &state->open_stateid;
1321        /* Serialization for the sequence id */
1322        calldata->arg.seqid = nfs_alloc_seqid(&state->owner->so_seqid);
1323        if (calldata->arg.seqid == NULL)
1324                goto out_free_calldata;
1325        calldata->arg.bitmask = server->attr_bitmask;
1326        calldata->res.fattr = &calldata->fattr;
1327        calldata->res.server = server;
1328        calldata->path.mnt = mntget(path->mnt);
1329        calldata->path.dentry = dget(path->dentry);
1330
1331        task = rpc_run_task(server->client, RPC_TASK_ASYNC, &nfs4_close_ops, calldata);
1332        if (IS_ERR(task))
1333                return PTR_ERR(task);
1334        status = 0;
1335        if (wait)
1336                status = rpc_wait_for_completion_task(task);
1337        rpc_put_task(task);
1338        return status;
1339out_free_calldata:
1340        kfree(calldata);
1341out:
1342        nfs4_put_open_state(state);
1343        nfs4_put_state_owner(sp);
1344        return status;
1345}
1346
1347static int nfs4_intent_set_file(struct nameidata *nd, struct path *path, struct nfs4_state *state)
1348{
1349        struct file *filp;
1350        int ret;
1351
1352        /* If the open_intent is for execute, we have an extra check to make */
1353        if (nd->intent.open.flags & FMODE_EXEC) {
1354                ret = nfs_may_open(state->inode,
1355                                state->owner->so_cred,
1356                                nd->intent.open.flags);
1357                if (ret < 0)
1358                        goto out_close;
1359        }
1360        filp = lookup_instantiate_filp(nd, path->dentry, NULL);
1361        if (!IS_ERR(filp)) {
1362                struct nfs_open_context *ctx;
1363                ctx = nfs_file_open_context(filp);
1364                ctx->state = state;
1365                return 0;
1366        }
1367        ret = PTR_ERR(filp);
1368out_close:
1369        nfs4_close_sync(path, state, nd->intent.open.flags);
1370        return ret;
1371}
1372
1373struct dentry *
1374nfs4_atomic_open(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
1375{
1376        struct dentry *parent;
1377        struct path path = {
1378                .mnt = nd->mnt,
1379                .dentry = dentry,
1380        };
1381        struct iattr attr;
1382        struct rpc_cred *cred;
1383        struct nfs4_state *state;
1384        struct dentry *res;
1385
1386        if (nd->flags & LOOKUP_CREATE) {
1387                attr.ia_mode = nd->intent.open.create_mode;
1388                attr.ia_valid = ATTR_MODE;
1389                if (!IS_POSIXACL(dir))
1390                        attr.ia_mode &= ~current->fs->umask;
1391        } else {
1392                attr.ia_valid = 0;
1393                BUG_ON(nd->intent.open.flags & O_CREAT);
1394        }
1395
1396        cred = rpcauth_lookupcred(NFS_CLIENT(dir)->cl_auth, 0);
1397        if (IS_ERR(cred))
1398                return (struct dentry *)cred;
1399        parent = dentry->d_parent;
1400        /* Protect against concurrent sillydeletes */
1401        nfs_block_sillyrename(parent);
1402        state = nfs4_do_open(dir, &path, nd->intent.open.flags, &attr, cred);
1403        put_rpccred(cred);
1404        if (IS_ERR(state)) {
1405                if (PTR_ERR(state) == -ENOENT) {
1406                        d_add(dentry, NULL);
1407                        nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
1408                }
1409                nfs_unblock_sillyrename(parent);
1410                return (struct dentry *)state;
1411        }
1412        res = d_add_unique(dentry, igrab(state->inode));
1413        if (res != NULL)
1414                path.dentry = res;
1415        nfs_set_verifier(path.dentry, nfs_save_change_attribute(dir));
1416        nfs_unblock_sillyrename(parent);
1417        nfs4_intent_set_file(nd, &path, state);
1418        return res;
1419}
1420
1421int
1422nfs4_open_revalidate(struct inode *dir, struct dentry *dentry, int openflags, struct nameidata *nd)
1423{
1424        struct path path = {
1425                .mnt = nd->mnt,
1426                .dentry = dentry,
1427        };
1428        struct rpc_cred *cred;
1429        struct nfs4_state *state;
1430
1431        cred = rpcauth_lookupcred(NFS_CLIENT(dir)->cl_auth, 0);
1432        if (IS_ERR(cred))
1433                return PTR_ERR(cred);
1434        state = nfs4_do_open(dir, &path, openflags, NULL, cred);
1435        put_rpccred(cred);
1436        if (IS_ERR(state)) {
1437                switch (PTR_ERR(state)) {
1438                        case -EPERM:
1439                        case -EACCES:
1440                        case -EDQUOT:
1441                        case -ENOSPC:
1442                        case -EROFS:
1443                                lookup_instantiate_filp(nd, (struct dentry *)state, NULL);
1444                                return 1;
1445                        default:
1446                                goto out_drop;
1447                }
1448        }
1449        if (state->inode == dentry->d_inode) {
1450                nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
1451                nfs4_intent_set_file(nd, &path, state);
1452                return 1;
1453        }
1454        nfs4_close_sync(&path, state, openflags);
1455out_drop:
1456        d_drop(dentry);
1457        return 0;
1458}
1459
1460
1461static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
1462{
1463        struct nfs4_server_caps_res res = {};
1464        struct rpc_message msg = {
1465                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SERVER_CAPS],
1466                .rpc_argp = fhandle,
1467                .rpc_resp = &res,
1468        };
1469        int status;
1470
1471        status = rpc_call_sync(server->client, &msg, 0);
1472        if (status == 0) {
1473                memcpy(server->attr_bitmask, res.attr_bitmask, sizeof(server->attr_bitmask));
1474                if (res.attr_bitmask[0] & FATTR4_WORD0_ACL)
1475                        server->caps |= NFS_CAP_ACLS;
1476                if (res.has_links != 0)
1477                        server->caps |= NFS_CAP_HARDLINKS;
1478                if (res.has_symlinks != 0)
1479                        server->caps |= NFS_CAP_SYMLINKS;
1480                server->acl_bitmask = res.acl_bitmask;
1481        }
1482        return status;
1483}
1484
1485int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
1486{
1487        struct nfs4_exception exception = { };
1488        int err;
1489        do {
1490                err = nfs4_handle_exception(server,
1491                                _nfs4_server_capabilities(server, fhandle),
1492                                &exception);
1493        } while (exception.retry);
1494        return err;
1495}
1496
1497static int _nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
1498                struct nfs_fsinfo *info)
1499{
1500        struct nfs4_lookup_root_arg args = {
1501                .bitmask = nfs4_fattr_bitmap,
1502        };
1503        struct nfs4_lookup_res res = {
1504                .server = server,
1505                .fattr = info->fattr,
1506                .fh = fhandle,
1507        };
1508        struct rpc_message msg = {
1509                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP_ROOT],
1510                .rpc_argp = &args,
1511                .rpc_resp = &res,
1512        };
1513        nfs_fattr_init(info->fattr);
1514        return rpc_call_sync(server->client, &msg, 0);
1515}
1516
1517static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
1518                struct nfs_fsinfo *info)
1519{
1520        struct nfs4_exception exception = { };
1521        int err;
1522        do {
1523                err = nfs4_handle_exception(server,
1524                                _nfs4_lookup_root(server, fhandle, info),
1525                                &exception);
1526        } while (exception.retry);
1527        return err;
1528}
1529
1530/*
1531 * get the file handle for the "/" directory on the server
1532 */
1533static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
1534                              struct nfs_fsinfo *info)
1535{
1536        int status;
1537
1538        status = nfs4_lookup_root(server, fhandle, info);
1539        if (status == 0)
1540                status = nfs4_server_capabilities(server, fhandle);
1541        if (status == 0)
1542                status = nfs4_do_fsinfo(server, fhandle, info);
1543        return nfs4_map_errors(status);
1544}
1545
1546/*
1547 * Get locations and (maybe) other attributes of a referral.
1548 * Note that we'll actually follow the referral later when
1549 * we detect fsid mismatch in inode revalidation
1550 */
1551static int nfs4_get_referral(struct inode *dir, const struct qstr *name, struct nfs_fattr *fattr, struct nfs_fh *fhandle)
1552{
1553        int status = -ENOMEM;
1554        struct page *page = NULL;
1555        struct nfs4_fs_locations *locations = NULL;
1556
1557        page = alloc_page(GFP_KERNEL);
1558        if (page == NULL)
1559                goto out;
1560        locations = kmalloc(sizeof(struct nfs4_fs_locations), GFP_KERNEL);
1561        if (locations == NULL)
1562                goto out;
1563
1564        status = nfs4_proc_fs_locations(dir, name, locations, page);
1565        if (status != 0)
1566                goto out;
1567        /* Make sure server returned a different fsid for the referral */
1568        if (nfs_fsid_equal(&NFS_SERVER(dir)->fsid, &locations->fattr.fsid)) {
1569                dprintk("%s: server did not return a different fsid for a referral at %s\n", __FUNCTION__, name->name);
1570                status = -EIO;
1571                goto out;
1572        }
1573
1574        memcpy(fattr, &locations->fattr, sizeof(struct nfs_fattr));
1575        fattr->valid |= NFS_ATTR_FATTR_V4_REFERRAL;
1576        if (!fattr->mode)
1577                fattr->mode = S_IFDIR;
1578        memset(fhandle, 0, sizeof(struct nfs_fh));
1579out:
1580        if (page)
1581                __free_page(page);
1582        if (locations)
1583                kfree(locations);
1584        return status;
1585}
1586
1587static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr)
1588{
1589        struct nfs4_getattr_arg args = {
1590                .fh = fhandle,
1591                .bitmask = server->attr_bitmask,
1592        };
1593        struct nfs4_getattr_res res = {
1594                .fattr = fattr,
1595                .server = server,
1596        };
1597        struct rpc_message msg = {
1598                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETATTR],
1599                .rpc_argp = &args,
1600                .rpc_resp = &res,
1601        };
1602        
1603        nfs_fattr_init(fattr);
1604        return rpc_call_sync(server->client, &msg, 0);
1605}
1606
1607static int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr)
1608{
1609        struct nfs4_exception exception = { };
1610        int err;
1611        do {
1612                err = nfs4_handle_exception(server,
1613                                _nfs4_proc_getattr(server, fhandle, fattr),
1614                                &exception);
1615        } while (exception.retry);
1616        return err;
1617}
1618
1619/* 
1620 * The file is not closed if it is opened due to the a request to change
1621 * the size of the file. The open call will not be needed once the
1622 * VFS layer lookup-intents are implemented.
1623 *
1624 * Close is called when the inode is destroyed.
1625 * If we haven't opened the file for O_WRONLY, we
1626 * need to in the size_change case to obtain a stateid.
1627 *
1628 * Got race?
1629 * Because OPEN is always done by name in nfsv4, it is
1630 * possible that we opened a different file by the same
1631 * name.  We can recognize this race condition, but we
1632 * can't do anything about it besides returning an error.
1633 *
1634 * This will be fixed with VFS changes (lookup-intent).
1635 */
1636static int
1637nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
1638                  struct iattr *sattr)
1639{
1640        struct rpc_cred *cred;
1641        struct inode *inode = dentry->d_inode;
1642        struct nfs_open_context *ctx;
1643        struct nfs4_state *state = NULL;
1644        int status;
1645
1646        nfs_fattr_init(fattr);
1647        
1648        cred = rpcauth_lookupcred(NFS_CLIENT(inode)->cl_auth, 0);
1649        if (IS_ERR(cred))
1650                return PTR_ERR(cred);
1651
1652        /* Search for an existing open(O_WRITE) file */
1653        ctx = nfs_find_open_context(inode, cred, FMODE_WRITE);
1654        if (ctx != NULL)
1655                state = ctx->state;
1656
1657        status = nfs4_do_setattr(inode, fattr, sattr, state);
1658        if (status == 0)
1659                nfs_setattr_update_inode(inode, sattr);
1660        if (ctx != NULL)
1661                put_nfs_open_context(ctx);
1662        put_rpccred(cred);
1663        return status;
1664}
1665
1666static int _nfs4_proc_lookupfh(struct nfs_server *server, const struct nfs_fh *dirfh,
1667                const struct qstr *name, struct nfs_fh *fhandle,
1668                struct nfs_fattr *fattr)
1669{
1670        int                    status;
1671        struct nfs4_lookup_arg args = {
1672                .bitmask = server->attr_bitmask,
1673                .dir_fh = dirfh,
1674                .name = name,
1675        };
1676        struct nfs4_lookup_res res = {
1677                .server = server,
1678                .fattr = fattr,
1679                .fh = fhandle,
1680        };
1681        struct rpc_message msg = {
1682                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP],
1683                .rpc_argp = &args,
1684                .rpc_resp = &res,
1685        };
1686
1687        nfs_fattr_init(fattr);
1688
1689        dprintk("NFS call  lookupfh %s\n", name->name);
1690        status = rpc_call_sync(server->client, &msg, 0);
1691        dprintk("NFS reply lookupfh: %d\n", status);
1692        return status;
1693}
1694
1695static int nfs4_proc_lookupfh(struct nfs_server *server, struct nfs_fh *dirfh,
1696                              struct qstr *name, struct nfs_fh *fhandle,
1697                              struct nfs_fattr *fattr)
1698{
1699        struct nfs4_exception exception = { };
1700        int err;
1701        do {
1702                err = _nfs4_proc_lookupfh(server, dirfh, name, fhandle, fattr);
1703                /* FIXME: !!!! */
1704                if (err == -NFS4ERR_MOVED) {
1705                        err = -EREMOTE;
1706                        break;
1707                }
1708                err = nfs4_handle_exception(server, err, &exception);
1709        } while (exception.retry);
1710        return err;
1711}
1712
1713static int _nfs4_proc_lookup(struct inode *dir, const struct qstr *name,
1714                struct nfs_fh *fhandle, struct nfs_fattr *fattr)
1715{
1716        int status;
1717        
1718        dprintk("NFS call  lookup %s\n", name->name);
1719        status = _nfs4_proc_lookupfh(NFS_SERVER(dir), NFS_FH(dir), name, fhandle, fattr);
1720        if (status == -NFS4ERR_MOVED)
1721                status = nfs4_get_referral(dir, name, fattr, fhandle);
1722        dprintk("NFS reply lookup: %d\n", status);
1723        return status;
1724}
1725
1726static int nfs4_proc_lookup(struct inode *dir, struct qstr *name, struct nfs_fh *fhandle, struct nfs_fattr *fattr)
1727{
1728        struct nfs4_exception exception = { };
1729        int err;
1730        do {
1731                err = nfs4_handle_exception(NFS_SERVER(dir),
1732                                _nfs4_proc_lookup(dir, name, fhandle, fattr),
1733                                &exception);
1734        } while (exception.retry);
1735        return err;
1736}
1737
1738static int _nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
1739{
1740        struct nfs_server *server = NFS_SERVER(inode);
1741        struct nfs_fattr fattr;
1742        struct nfs4_accessargs args = {
1743                .fh = NFS_FH(inode),
1744                .bitmask = server->attr_bitmask,
1745        };
1746        struct nfs4_accessres res = {
1747                .server = server,
1748                .fattr = &fattr,
1749        };
1750        struct rpc_message msg = {
1751                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_ACCESS],
1752                .rpc_argp = &args,
1753                .rpc_resp = &res,
1754                .rpc_cred = entry->cred,
1755        };
1756        int mode = entry->mask;
1757        int status;
1758
1759        /*
1760         * Determine which access bits we want to ask for...
1761         */
1762        if (mode & MAY_READ)
1763                args.access |= NFS4_ACCESS_READ;
1764        if (S_ISDIR(inode->i_mode)) {
1765                if (mode & MAY_WRITE)
1766                        args.access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND | NFS4_ACCESS_DELETE;
1767                if (mode & MAY_EXEC)
1768                        args.access |= NFS4_ACCESS_LOOKUP;
1769        } else {
1770                if (mode & MAY_WRITE)
1771                        args.access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND;
1772                if (mode & MAY_EXEC)
1773                        args.access |= NFS4_ACCESS_EXECUTE;
1774        }
1775        nfs_fattr_init(&fattr);
1776        status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
1777        if (!status) {
1778                entry->mask = 0;
1779                if (res.access & NFS4_ACCESS_READ)
1780                        entry->mask |= MAY_READ;
1781                if (res.access & (NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND | NFS4_ACCESS_DELETE))
1782                        entry->mask |= MAY_WRITE;
1783                if (res.access & (NFS4_ACCESS_LOOKUP|NFS4_ACCESS_EXECUTE))
1784                        entry->mask |= MAY_EXEC;
1785                nfs_refresh_inode(inode, &fattr);
1786        }
1787        return status;
1788}
1789
1790static int nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
1791{
1792        struct nfs4_exception exception = { };
1793        int err;
1794        do {
1795                err = nfs4_handle_exception(NFS_SERVER(inode),
1796                                _nfs4_proc_access(inode, entry),
1797                                &exception);
1798        } while (exception.retry);
1799        return err;
1800}
1801
1802/*
1803 * TODO: For the time being, we don't try to get any attributes
1804 * along with any of the zero-copy operations READ, READDIR,
1805 * READLINK, WRITE.
1806 *
1807 * In the case of the first three, we want to put the GETATTR
1808 * after the read-type operation -- this is because it is hard
1809 * to predict the length of a GETATTR response in v4, and thus
1810 * align the READ data correctly.  This means that the GETATTR
1811 * may end up partially falling into the page cache, and we should
1812 * shift it into the 'tail' of the xdr_buf before processing.
1813 * To do this efficiently, we need to know the total length
1814 * of data received, which doesn't seem to be available outside
1815 * of the RPC layer.
1816 *
1817 * In the case of WRITE, we also want to put the GETATTR after
1818 * the operation -- in this case because we want to make sure
1819 * we get the post-operation mtime and size.  This means that
1820 * we can't use xdr_encode_pages() as written: we need a variant
1821 * of it which would leave room in the 'tail' iovec.
1822 *
1823 * Both of these changes to the XDR layer would in fact be quite
1824 * minor, but I decided to leave them for a subsequent patch.
1825 */
1826static int _nfs4_proc_readlink(struct inode *inode, struct page *page,
1827                unsigned int pgbase, unsigned int pglen)
1828{
1829        struct nfs4_readlink args = {
1830                .fh       = NFS_FH(inode),
1831                .pgbase   = pgbase,
1832                .pglen    = pglen,
1833                .pages    = &page,
1834        };
1835        struct rpc_message msg = {
1836                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READLINK],
1837                .rpc_argp = &args,
1838                .rpc_resp = NULL,
1839        };
1840
1841        return rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
1842}
1843
1844static int nfs4_proc_readlink(struct inode *inode, struct page *page,
1845                unsigned int pgbase, unsigned int pglen)
1846{
1847        struct nfs4_exception exception = { };
1848        int err;
1849        do {
1850                err = nfs4_handle_exception(NFS_SERVER(inode),
1851                                _nfs4_proc_readlink(inode, page, pgbase, pglen),
1852                                &exception);
1853        } while (exception.retry);
1854        return err;
1855}
1856
1857/*
1858 * Got race?
1859 * We will need to arrange for the VFS layer to provide an atomic open.
1860 * Until then, this create/open method is prone to inefficiency and race
1861 * conditions due to the lookup, create, and open VFS calls from sys_open()
1862 * placed on the wire.
1863 *
1864 * Given the above sorry state of affairs, I'm simply sending an OPEN.
1865 * The file will be opened again in the subsequent VFS open call
1866 * (nfs4_proc_file_open).
1867 *
1868 * The open for read will just hang around to be used by any process that
1869 * opens the file O_RDONLY. This will all be resolved with the VFS changes.
1870 */
1871
1872static int
1873nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
1874                 int flags, struct nameidata *nd)
1875{
1876        struct path path = {
1877                .mnt = nd->mnt,
1878                .dentry = dentry,
1879        };
1880        struct nfs4_state *state;
1881        struct rpc_cred *cred;
1882        int status = 0;
1883
1884        cred = rpcauth_lookupcred(NFS_CLIENT(dir)->cl_auth, 0);
1885        if (IS_ERR(cred)) {
1886                status = PTR_ERR(cred);
1887                goto out;
1888        }
1889        state = nfs4_do_open(dir, &path, flags, sattr, cred);
1890        put_rpccred(cred);
1891        d_drop(dentry);
1892        if (IS_ERR(state)) {
1893                status = PTR_ERR(state);
1894                goto out;
1895        }
1896        d_add(dentry, igrab(state->inode));
1897        nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
1898        if (flags & O_EXCL) {
1899                struct nfs_fattr fattr;
1900                status = nfs4_do_setattr(state->inode, &fattr, sattr, state);
1901                if (status == 0)
1902                        nfs_setattr_update_inode(state->inode, sattr);
1903                nfs_post_op_update_inode(state->inode, &fattr);
1904        }
1905        if (status == 0 && (nd->flags & LOOKUP_OPEN) != 0)
1906                status = nfs4_intent_set_file(nd, &path, state);
1907        else
1908                nfs4_close_sync(&path, state, flags);
1909out:
1910        return status;
1911}
1912
1913static int _nfs4_proc_remove(struct inode *dir, struct qstr *name)
1914{
1915        struct nfs_server *server = NFS_SERVER(dir);
1916        struct nfs_removeargs args = {
1917                .fh = NFS_FH(dir),
1918                .name.len = name->len,
1919                .name.name = name->name,
1920                .bitmask = server->attr_bitmask,
1921        };
1922        struct nfs_removeres res = {
1923                .server = server,
1924        };
1925        struct rpc_message msg = {
1926                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE],
1927                .rpc_argp = &args,
1928                .rpc_resp = &res,
1929        };
1930        int                     status;
1931
1932        nfs_fattr_init(&res.dir_attr);
1933        status = rpc_call_sync(server->client, &msg, 0);
1934        if (status == 0) {
1935                update_changeattr(dir, &res.cinfo);
1936                nfs_post_op_update_inode(dir, &res.dir_attr);
1937        }
1938        return status;
1939}
1940
1941static int nfs4_proc_remove(struct inode *dir, struct qstr *name)
1942{
1943        struct nfs4_exception exception = { };
1944        int err;
1945        do {
1946                err = nfs4_handle_exception(NFS_SERVER(dir),
1947                                _nfs4_proc_remove(dir, name),
1948                                &exception);
1949        } while (exception.retry);
1950        return err;
1951}
1952
1953static void nfs4_proc_unlink_setup(struct rpc_message *msg, struct inode *dir)
1954{
1955        struct nfs_server *server = NFS_SERVER(dir);
1956        struct nfs_removeargs *args = msg->rpc_argp;
1957        struct nfs_removeres *res = msg->rpc_resp;
1958
1959        args->bitmask = server->attr_bitmask;
1960        res->server = server;
1961        msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE];
1962}
1963
1964static int nfs4_proc_unlink_done(struct rpc_task *task, struct inode *dir)
1965{
1966        struct nfs_removeres *res = task->tk_msg.rpc_resp;
1967
1968        if (nfs4_async_handle_error(task, res->server) == -EAGAIN)
1969                return 0;
1970        update_changeattr(dir, &res->cinfo);
1971        nfs_post_op_update_inode(dir, &res->dir_attr);
1972        return 1;
1973}
1974
1975static int _nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name,
1976                struct inode *new_dir, struct qstr *new_name)
1977{
1978        struct nfs_server *server = NFS_SERVER(old_dir);
1979        struct nfs4_rename_arg arg = {
1980                .old_dir = NFS_FH(old_dir),
1981                .new_dir = NFS_FH(new_dir),
1982                .old_name = old_name,
1983                .new_name = new_name,
1984                .bitmask = server->attr_bitmask,
1985        };
1986        struct nfs_fattr old_fattr, new_fattr;
1987        struct nfs4_rename_res res = {
1988                .server = server,
1989                .old_fattr = &old_fattr,
1990                .new_fattr = &new_fattr,
1991        };
1992        struct rpc_message msg = {
1993                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENAME],
1994                .rpc_argp = &arg,
1995                .rpc_resp = &res,
1996        };
1997        int                     status;
1998        
1999        nfs_fattr_init(res.old_fattr);
2000        nfs_fattr_init(res.new_fattr);
2001        status = rpc_call_sync(server->client, &msg, 0);
2002
2003        if (!status) {
2004                update_changeattr(old_dir, &res.old_cinfo);
2005                nfs_post_op_update_inode(old_dir, res.old_fattr);
2006                update_changeattr(new_dir, &res.new_cinfo);
2007                nfs_post_op_update_inode(new_dir, res.new_fattr);
2008        }
2009        return status;
2010}
2011
2012static int nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name,
2013                struct inode *new_dir, struct qstr *new_name)
2014{
2015        struct nfs4_exception exception = { };
2016        int err;
2017        do {
2018                err = nfs4_handle_exception(NFS_SERVER(old_dir),
2019                                _nfs4_proc_rename(old_dir, old_name,
2020                                        new_dir, new_name),
2021                                &exception);
2022        } while (exception.retry);
2023        return err;
2024}
2025
2026static int _nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name)
2027{
2028        struct nfs_server *server = NFS_SERVER(inode);
2029        struct nfs4_link_arg arg = {
2030                .fh     = NFS_FH(inode),
2031                .dir_fh = NFS_FH(dir),
2032                .name   = name,
2033                .bitmask = server->attr_bitmask,
2034        };
2035        struct nfs_fattr fattr, dir_attr;
2036        struct nfs4_link_res res = {
2037                .server = server,
2038                .fattr = &fattr,
2039                .dir_attr = &dir_attr,
2040        };
2041        struct rpc_message msg = {
2042                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LINK],
2043                .rpc_argp = &arg,
2044                .rpc_resp = &res,
2045        };
2046        int                     status;
2047
2048        nfs_fattr_init(res.fattr);
2049        nfs_fattr_init(res.dir_attr);
2050        status = rpc_call_sync(server->client, &msg, 0);
2051        if (!status) {
2052                update_changeattr(dir, &res.cinfo);
2053                nfs_post_op_update_inode(dir, res.dir_attr);
2054                nfs_post_op_update_inode(inode, res.fattr);
2055        }
2056
2057        return status;
2058}
2059
2060static int nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name)
2061{
2062        struct nfs4_exception exception = { };
2063        int err;
2064        do {
2065                err = nfs4_handle_exception(NFS_SERVER(inode),
2066                                _nfs4_proc_link(inode, dir, name),
2067                                &exception);
2068        } while (exception.retry);
2069        return err;
2070}
2071
2072static int _nfs4_proc_symlink(struct inode *dir, struct dentry *dentry,
2073                struct page *page, unsigned int len, struct iattr *sattr)
2074{
2075        struct nfs_server *server = NFS_SERVER(dir);
2076        struct nfs_fh fhandle;
2077        struct nfs_fattr fattr, dir_fattr;
2078        struct nfs4_create_arg arg = {
2079                .dir_fh = NFS_FH(dir),
2080                .server = server,
2081                .name = &dentry->d_name,
2082                .attrs = sattr,
2083                .ftype = NF4LNK,
2084                .bitmask = server->attr_bitmask,
2085        };
2086        struct nfs4_create_res res = {
2087                .server = server,
2088                .fh = &fhandle,
2089                .fattr = &fattr,
2090                .dir_fattr = &dir_fattr,
2091        };
2092        struct rpc_message msg = {
2093                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SYMLINK],
2094                .rpc_argp = &arg,
2095                .rpc_resp = &res,
2096        };
2097        int                     status;
2098
2099        if (len > NFS4_MAXPATHLEN)
2100                return -ENAMETOOLONG;
2101
2102        arg.u.symlink.pages = &page;
2103        arg.u.symlink.len = len;
2104        nfs_fattr_init(&fattr);
2105        nfs_fattr_init(&dir_fattr);
2106        
2107        status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
2108        if (!status) {
2109                update_changeattr(dir, &res.dir_cinfo);
2110                nfs_post_op_update_inode(dir, res.dir_fattr);
2111                status = nfs_instantiate(dentry, &fhandle, &fattr);
2112        }
2113        return status;
2114}
2115
2116static int nfs4_proc_symlink(struct inode *dir, struct dentry *dentry,
2117                struct page *page, unsigned int len, struct iattr *sattr)
2118{
2119        struct nfs4_exception exception = { };
2120        int err;
2121        do {
2122                err = nfs4_handle_exception(NFS_SERVER(dir),
2123                                _nfs4_proc_symlink(dir, dentry, page,
2124                                                        len, sattr),
2125                                &exception);
2126        } while (exception.retry);
2127        return err;
2128}
2129
2130static int _nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry,
2131                struct iattr *sattr)
2132{
2133        struct nfs_server *server = NFS_SERVER(dir);
2134        struct nfs_fh fhandle;
2135        struct nfs_fattr fattr, dir_fattr;
2136        struct nfs4_create_arg arg = {
2137                .dir_fh = NFS_FH(dir),
2138                .server = server,
2139                .name = &dentry->d_name,
2140                .attrs = sattr,
2141                .ftype = NF4DIR,
2142                .bitmask = server->attr_bitmask,
2143        };
2144        struct nfs4_create_res res = {
2145                .server = server,
2146                .fh = &fhandle,
2147                .fattr = &fattr,
2148                .dir_fattr = &dir_fattr,
2149        };
2150        struct rpc_message msg = {
2151                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE],
2152                .rpc_argp = &arg,
2153                .rpc_resp = &res,
2154        };
2155        int                     status;
2156
2157        nfs_fattr_init(&fattr);
2158        nfs_fattr_init(&dir_fattr);
2159        
2160        status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
2161        if (!status) {
2162                update_changeattr(dir, &res.dir_cinfo);
2163                nfs_post_op_update_inode(dir, res.dir_fattr);
2164                status = nfs_instantiate(dentry, &fhandle, &fattr);
2165        }
2166        return status;
2167}
2168
2169static int nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry,
2170                struct iattr *sattr)
2171{
2172        struct nfs4_exception exception = { };
2173        int err;
2174        do {
2175                err = nfs4_handle_exception(NFS_SERVER(dir),
2176                                _nfs4_proc_mkdir(dir, dentry, sattr),
2177                                &exception);
2178        } while (exception.retry);
2179        return err;
2180}
2181
2182static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
2183                  u64 cookie, struct page *page, unsigned int count, int plus)
2184{
2185        struct inode            *dir = dentry->d_inode;
2186        struct nfs4_readdir_arg args = {
2187                .fh = NFS_FH(dir),
2188                .pages = &page,
2189                .pgbase = 0,
2190                .count = count,
2191                .bitmask = NFS_SERVER(dentry->d_inode)->attr_bitmask,
2192        };
2193        struct nfs4_readdir_res res;
2194        struct rpc_message msg = {
2195                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READDIR],
2196                .rpc_argp = &args,
2197                .rpc_resp = &res,
2198                .rpc_cred = cred,
2199        };
2200        int                     status;
2201
2202        dprintk("%s: dentry = %s/%s, cookie = %Lu\n", __FUNCTION__,
2203                        dentry->d_parent->d_name.name,
2204                        dentry->d_name.name,
2205                        (unsigned long long)cookie);
2206        nfs4_setup_readdir(cookie, NFS_COOKIEVERF(dir), dentry, &args);
2207        res.pgbase = args.pgbase;
2208        status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
2209        if (status == 0)
2210                memcpy(NFS_COOKIEVERF(dir), res.verifier.data, NFS4_VERIFIER_SIZE);
2211
2212        nfs_invalidate_atime(dir);
2213
2214        dprintk("%s: returns %d\n", __FUNCTION__, status);
2215        return status;
2216}
2217
2218static int nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
2219                  u64 cookie, struct page *page, unsigned int count, int plus)
2220{
2221        struct nfs4_exception exception = { };
2222        int err;
2223        do {
2224                err = nfs4_handle_exception(NFS_SERVER(dentry->d_inode),
2225                                _nfs4_proc_readdir(dentry, cred, cookie,
2226                                        page, count, plus),
2227                                &exception);
2228        } while (exception.retry);
2229        return err;
2230}
2231
2232static int _nfs4_proc_mknod(struct inode *dir, struct dentry *dentry,
2233                struct iattr *sattr, dev_t rdev)
2234{
2235        struct nfs_server *server = NFS_SERVER(dir);
2236        struct nfs_fh fh;
2237        struct nfs_fattr fattr, dir_fattr;
2238        struct nfs4_create_arg arg = {
2239                .dir_fh = NFS_FH(dir),
2240                .server = server,
2241                .name = &dentry->d_name,
2242                .attrs = sattr,
2243                .bitmask = server->attr_bitmask,
2244        };
2245        struct nfs4_create_res res = {
2246                .server = server,
2247                .fh = &fh,
2248                .fattr = &fattr,
2249                .dir_fattr = &dir_fattr,
2250        };
2251        struct rpc_message msg = {
2252                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE],
2253                .rpc_argp = &arg,
2254                .rpc_resp = &res,
2255        };
2256        int                     status;
2257        int                     mode = sattr->ia_mode;
2258
2259        nfs_fattr_init(&fattr);
2260        nfs_fattr_init(&dir_fattr);
2261
2262        BUG_ON(!(sattr->ia_valid & ATTR_MODE));
2263        BUG_ON(!S_ISFIFO(mode) && !S_ISBLK(mode) && !S_ISCHR(mode) && !S_ISSOCK(mode));
2264        if (S_ISFIFO(mode))
2265                arg.ftype = NF4FIFO;
2266        else if (S_ISBLK(mode)) {
2267                arg.ftype = NF4BLK;
2268                arg.u.device.specdata1 = MAJOR(rdev);
2269                arg.u.device.specdata2 = MINOR(rdev);
2270        }
2271        else if (S_ISCHR(mode)) {
2272                arg.ftype = NF4CHR;
2273                arg.u.device.specdata1 = MAJOR(rdev);
2274                arg.u.device.specdata2 = MINOR(rdev);
2275        }
2276        else
2277                arg.ftype = NF4SOCK;
2278        
2279        status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
2280        if (status == 0) {
2281                update_changeattr(dir, &res.dir_cinfo);
2282                nfs_post_op_update_inode(dir, res.dir_fattr);
2283                status = nfs_instantiate(dentry, &fh, &fattr);
2284        }
2285        return status;
2286}
2287
2288static int nfs4_proc_mknod(struct inode *dir, struct dentry *dentry,
2289                struct iattr *sattr, dev_t rdev)
2290{
2291        struct nfs4_exception exception = { };
2292        int err;
2293        do {
2294                err = nfs4_handle_exception(NFS_SERVER(dir),
2295                                _nfs4_proc_mknod(dir, dentry, sattr, rdev),
2296                                &exception);
2297        } while (exception.retry);
2298        return err;
2299}
2300
2301static int _nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle,
2302                 struct nfs_fsstat *fsstat)
2303{
2304        struct nfs4_statfs_arg args = {
2305                .fh = fhandle,
2306                .bitmask = server->attr_bitmask,
2307        };
2308        struct rpc_message msg = {
2309                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_STATFS],
2310                .rpc_argp = &args,
2311                .rpc_resp = fsstat,
2312        };
2313
2314        nfs_fattr_init(fsstat->fattr);
2315        return rpc_call_sync(server->client, &msg, 0);
2316}
2317
2318static int nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsstat *fsstat)
2319{
2320        struct nfs4_exception exception = { };
2321        int err;
2322        do {
2323                err = nfs4_handle_exception(server,
2324                                _nfs4_proc_statfs(server, fhandle, fsstat),
2325                                &exception);
2326        } while (exception.retry);
2327        return err;
2328}
2329
2330static int _nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle,
2331                struct nfs_fsinfo *fsinfo)
2332{
2333        struct nfs4_fsinfo_arg args = {
2334                .fh = fhandle,
2335                .bitmask = server->attr_bitmask,
2336        };
2337        struct rpc_message msg = {
2338                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FSINFO],
2339                .rpc_argp = &args,
2340                .rpc_resp = fsinfo,
2341        };
2342
2343        return rpc_call_sync(server->client, &msg, 0);
2344}
2345
2346static int nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
2347{
2348        struct nfs4_exception exception = { };
2349        int err;
2350
2351        do {
2352                err = nfs4_handle_exception(server,
2353                                _nfs4_do_fsinfo(server, fhandle, fsinfo),
2354                                &exception);
2355        } while (exception.retry);
2356        return err;
2357}
2358
2359static int nfs4_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
2360{
2361        nfs_fattr_init(fsinfo->fattr);
2362        return nfs4_do_fsinfo(server, fhandle, fsinfo);
2363}
2364
2365static int _nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
2366                struct nfs_pathconf *pathconf)
2367{
2368        struct nfs4_pathconf_arg args = {
2369                .fh = fhandle,
2370                .bitmask = server->attr_bitmask,
2371        };
2372        struct rpc_message msg = {
2373                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_PATHCONF],
2374                .rpc_argp = &args,
2375                .rpc_resp = pathconf,
2376        };
2377
2378        /* None of the pathconf attributes are mandatory to implement */
2379        if ((args.bitmask[0] & nfs4_pathconf_bitmap[0]) == 0) {
2380                memset(pathconf, 0, sizeof(*pathconf));
2381                return 0;
2382        }
2383
2384        nfs_fattr_init(pathconf->fattr);
2385        return rpc_call_sync(server->client, &msg, 0);
2386}
2387
2388static int nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
2389                struct nfs_pathconf *pathconf)
2390{
2391        struct nfs4_exception exception = { };
2392        int err;
2393
2394        do {
2395                err = nfs4_handle_exception(server,
2396                                _nfs4_proc_pathconf(server, fhandle, pathconf),
2397                                &exception);
2398        } while (exception.retry);
2399        return err;
2400}
2401
2402static int nfs4_read_done(struct rpc_task *task, struct nfs_read_data *data)
2403{
2404        struct nfs_server *server = NFS_SERVER(data->inode);
2405
2406        if (nfs4_async_handle_error(task, server) == -EAGAIN) {
2407                rpc_restart_call(task);
2408                return -EAGAIN;
2409        }
2410
2411        nfs_invalidate_atime(data->inode);
2412        if (task->tk_status > 0)
2413                renew_lease(server, data->timestamp);
2414        return 0;
2415}
2416
2417static void nfs4_proc_read_setup(struct nfs_read_data *data)
2418{
2419        struct rpc_message msg = {
2420                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ],
2421                .rpc_argp = &data->args,
2422                .rpc_resp = &data->res,
2423                .rpc_cred = data->cred,
2424        };
2425
2426        data->timestamp   = jiffies;
2427
2428        rpc_call_setup(&data->task, &msg, 0);
2429}
2430
2431static int nfs4_write_done(struct rpc_task *task, struct nfs_write_data *data)
2432{
2433        struct inode *inode = data->inode;
2434        
2435        if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) {
2436                rpc_restart_call(task);
2437                return -EAGAIN;
2438        }
2439        if (task->tk_status >= 0) {
2440                renew_lease(NFS_SERVER(inode), data->timestamp);
2441                nfs_post_op_update_inode_force_wcc(inode, data->res.fattr);
2442        }
2443        return 0;
2444}
2445
2446static void nfs4_proc_write_setup(struct nfs_write_data *data, int how)
2447{
2448        struct rpc_message msg = {
2449                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE],
2450                .rpc_argp = &data->args,
2451                .rpc_resp = &data->res,
2452                .rpc_cred = data->cred,
2453        };
2454        struct inode *inode = data->inode;
2455        struct nfs_server *server = NFS_SERVER(inode);
2456        int stable;
2457        
2458        if (how & FLUSH_STABLE) {
2459                if (!NFS_I(inode)->ncommit)
2460                        stable = NFS_FILE_SYNC;
2461                else
2462                        stable = NFS_DATA_SYNC;
2463        } else
2464                stable = NFS_UNSTABLE;
2465        data->args.stable = stable;
2466        data->args.bitmask = server->attr_bitmask;
2467        data->res.server = server;
2468
2469        data->timestamp   = jiffies;
2470
2471        /* Finalize the task. */
2472        rpc_call_setup(&data->task, &msg, 0);
2473}
2474
2475static int nfs4_commit_done(struct rpc_task *task, struct nfs_write_data *data)
2476{
2477        struct inode *inode = data->inode;
2478        
2479        if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) {
2480                rpc_restart_call(task);
2481                return -EAGAIN;
2482        }
2483        nfs_refresh_inode(inode, data->res.fattr);
2484        return 0;
2485}
2486
2487static void nfs4_proc_commit_setup(struct nfs_write_data *data, int how)
2488{
2489        struct rpc_message msg = {
2490                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMMIT],
2491                .rpc_argp = &data->args,
2492                .rpc_resp = &data->res,
2493                .rpc_cred = data->cred,
2494        };      
2495        struct nfs_server *server = NFS_SERVER(data->inode);
2496        
2497        data->args.bitmask = server->attr_bitmask;
2498        data->res.server = server;
2499
2500        rpc_call_setup(&data->task, &msg, 0);
2501}
2502
2503/*
2504 * nfs4_proc_async_renew(): This is not one of the nfs_rpc_ops; it is a special
2505 * standalone procedure for queueing an asynchronous RENEW.
2506 */
2507static void nfs4_renew_done(struct rpc_task *task, void *data)
2508{
2509        struct nfs_client *clp = (struct nfs_client *)task->tk_msg.rpc_argp;
2510        unsigned long timestamp = (unsigned long)data;
2511
2512        if (task->tk_status < 0) {
2513                switch (task->tk_status) {
2514                        case -NFS4ERR_STALE_CLIENTID:
2515                        case -NFS4ERR_EXPIRED:
2516                        case -NFS4ERR_CB_PATH_DOWN:
2517                                nfs4_schedule_state_recovery(clp);
2518                }
2519                return;
2520        }
2521        spin_lock(&clp->cl_lock);
2522        if (time_before(clp->cl_last_renewal,timestamp))
2523                clp->cl_last_renewal = timestamp;
2524        spin_unlock(&clp->cl_lock);
2525}
2526
2527static const struct rpc_call_ops nfs4_renew_ops = {
2528        .rpc_call_done = nfs4_renew_done,
2529};
2530
2531int nfs4_proc_async_renew(struct nfs_client *clp, struct rpc_cred *cred)
2532{
2533        struct rpc_message msg = {
2534                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
2535                .rpc_argp       = clp,
2536                .rpc_cred       = cred,
2537        };
2538
2539        return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_SOFT,
2540                        &nfs4_renew_ops, (void *)jiffies);
2541}
2542
2543int nfs4_proc_renew(struct nfs_client *clp, struct rpc_cred *cred)
2544{
2545        struct rpc_message msg = {
2546                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
2547                .rpc_argp       = clp,
2548                .rpc_cred       = cred,
2549        };
2550        unsigned long now = jiffies;
2551        int status;
2552
2553        status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
2554        if (status < 0)
2555                return status;
2556        spin_lock(&clp->cl_lock);
2557        if (time_before(clp->cl_last_renewal,now))
2558                clp->cl_last_renewal = now;
2559        spin_unlock(&clp->cl_lock);
2560        return 0;
2561}
2562
2563static inline int nfs4_server_supports_acls(struct nfs_server *server)
2564{
2565        return (server->caps & NFS_CAP_ACLS)
2566                && (server->acl_bitmask & ACL4_SUPPORT_ALLOW_ACL)
2567                && (server->acl_bitmask & ACL4_SUPPORT_DENY_ACL);
2568}
2569
2570/* Assuming that XATTR_SIZE_MAX is a multiple of PAGE_CACHE_SIZE, and that
2571 * it's OK to put sizeof(void) * (XATTR_SIZE_MAX/PAGE_CACHE_SIZE) bytes on
2572 * the stack.
2573 */
2574#define NFS4ACL_MAXPAGES (XATTR_SIZE_MAX >> PAGE_CACHE_SHIFT)
2575
2576static void buf_to_pages(const void *buf, size_t buflen,
2577                struct page **pages, unsigned int *pgbase)
2578{
2579        const void *p = buf;
2580
2581        *pgbase = offset_in_page(buf);
2582        p -= *pgbase;
2583        while (p < buf + buflen) {
2584                *(pages++) = virt_to_page(p);
2585                p += PAGE_CACHE_SIZE;
2586        }
2587}
2588
2589struct nfs4_cached_acl {
2590        int cached;
2591        size_t len;
2592        char data[0];
2593};
2594
2595static void nfs4_set_cached_acl(struct inode *inode, struct nfs4_cached_acl *acl)
2596{
2597        struct nfs_inode *nfsi = NFS_I(inode);
2598
2599        spin_lock(&inode->i_lock);
2600        kfree(nfsi->nfs4_acl);
2601        nfsi->nfs4_acl = acl;
2602        spin_unlock(&inode->i_lock);
2603}
2604
2605static void nfs4_zap_acl_attr(struct inode *inode)
2606{
2607        nfs4_set_cached_acl(inode, NULL);
2608}
2609
2610static inline ssize_t nfs4_read_cached_acl(struct inode *inode, char *buf, size_t buflen)
2611{
2612        struct nfs_inode *nfsi = NFS_I(inode);
2613        struct nfs4_cached_acl *acl;
2614        int ret = -ENOENT;
2615
2616        spin_lock(&inode->i_lock);
2617        acl = nfsi->nfs4_acl;
2618        if (acl == NULL)
2619                goto out;
2620        if (buf == NULL) /* user is just asking for length */
2621                goto out_len;
2622        if (acl->cached == 0)
2623                goto out;
2624        ret = -ERANGE; /* see getxattr(2) man page */
2625        if (acl->len > buflen)
2626                goto out;
2627        memcpy(buf, acl->data, acl->len);
2628out_len:
2629        ret = acl->len;
2630out:
2631        spin_unlock(&inode->i_lock);
2632        return ret;
2633}
2634
2635static void nfs4_write_cached_acl(struct inode *inode, const char *buf, size_t acl_len)
2636{
2637        struct nfs4_cached_acl *acl;
2638
2639        if (buf && acl_len <= PAGE_SIZE) {
2640                acl = kmalloc(sizeof(*acl) + acl_len, GFP_KERNEL);
2641                if (acl == NULL)
2642                        goto out;
2643                acl->cached = 1;
2644                memcpy(acl->data, buf, acl_len);
2645        } else {
2646                acl = kmalloc(sizeof(*acl), GFP_KERNEL);
2647                if (acl == NULL)
2648                        goto out;
2649                acl->cached = 0;
2650        }
2651        acl->len = acl_len;
2652out:
2653        nfs4_set_cached_acl(inode, acl);
2654}
2655
2656static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
2657{
2658        struct page *pages[NFS4ACL_MAXPAGES];
2659        struct nfs_getaclargs args = {
2660                .fh = NFS_FH(inode),
2661                .acl_pages = pages,
2662                .acl_len = buflen,
2663        };
2664        size_t resp_len = buflen;
2665        void *resp_buf;
2666        struct rpc_message msg = {
2667                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETACL],
2668                .rpc_argp = &args,
2669                .rpc_resp = &resp_len,
2670        };
2671        struct page *localpage = NULL;
2672        int ret;
2673
2674        if (buflen < PAGE_SIZE) {
2675                /* As long as we're doing a round trip to the server anyway,
2676                 * let's be prepared for a page of acl data. */
2677                localpage = alloc_page(GFP_KERNEL);
2678                resp_buf = page_address(localpage);
2679                if (localpage == NULL)
2680                        return -ENOMEM;
2681                args.acl_pages[0] = localpage;
2682                args.acl_pgbase = 0;
2683                resp_len = args.acl_len = PAGE_SIZE;
2684        } else {
2685                resp_buf = buf;
2686                buf_to_pages(buf, buflen, args.acl_pages, &args.acl_pgbase);
2687        }
2688        ret = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
2689        if (ret)
2690                goto out_free;
2691        if (resp_len > args.acl_len)
2692                nfs4_write_cached_acl(inode, NULL, resp_len);
2693        else
2694                nfs4_write_cached_acl(inode, resp_buf, resp_len);
2695        if (buf) {
2696                ret = -ERANGE;
2697                if (resp_len > buflen)
2698                        goto out_free;
2699                if (localpage)
2700                        memcpy(buf, resp_buf, resp_len);
2701        }
2702        ret = resp_len;
2703out_free:
2704        if (localpage)
2705                __free_page(localpage);
2706        return ret;
2707}
2708
2709static ssize_t nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
2710{
2711        struct nfs4_exception exception = { };
2712        ssize_t ret;
2713        do {
2714                ret = __nfs4_get_acl_uncached(inode, buf, buflen);
2715                if (ret >= 0)
2716                        break;
2717                ret = nfs4_handle_exception(NFS_SERVER(inode), ret, &exception);
2718        } while (exception.retry);
2719        return ret;
2720}
2721
2722static ssize_t nfs4_proc_get_acl(struct inode *inode, void *buf, size_t buflen)
2723{
2724        struct nfs_server *server = NFS_SERVER(inode);
2725        int ret;
2726
2727        if (!nfs4_server_supports_acls(server))
2728                return -EOPNOTSUPP;
2729        ret = nfs_revalidate_inode(server, inode);
2730        if (ret < 0)
2731                return ret;
2732        ret = nfs4_read_cached_acl(inode, buf, buflen);
2733        if (ret != -ENOENT)
2734                return ret;
2735        return nfs4_get_acl_uncached(inode, buf, buflen);
2736}
2737
2738static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen)
2739{
2740        struct nfs_server *server = NFS_SERVER(inode);
2741        struct page *pages[NFS4ACL_MAXPAGES];
2742        struct nfs_setaclargs arg = {
2743                .fh             = NFS_FH(inode),
2744                .acl_pages      = pages,
2745                .acl_len        = buflen,
2746        };
2747        struct rpc_message msg = {
2748                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_SETACL],
2749                .rpc_argp       = &arg,
2750                .rpc_resp       = NULL,
2751        };
2752        int ret;
2753
2754        if (!nfs4_server_supports_acls(server))
2755                return -EOPNOTSUPP;
2756        nfs_inode_return_delegation(inode);
2757        buf_to_pages(buf, buflen, arg.acl_pages, &arg.acl_pgbase);
2758        ret = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
2759        nfs_zap_caches(inode);
2760        return ret;
2761}
2762
2763static int nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen)
2764{
2765        struct nfs4_exception exception = { };
2766        int err;
2767        do {
2768                err = nfs4_handle_exception(NFS_SERVER(inode),
2769                                __nfs4_proc_set_acl(inode, buf, buflen),
2770                                &exception);
2771        } while (exception.retry);
2772        return err;
2773}
2774
2775static int
2776nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server)
2777{
2778        struct nfs_client *clp = server->nfs_client;
2779
2780        if (!clp || task->tk_status >= 0)
2781                return 0;
2782        switch(task->tk_status) {
2783                case -NFS4ERR_STALE_CLIENTID:
2784                case -NFS4ERR_STALE_STATEID:
2785                case -NFS4ERR_EXPIRED:
2786                        rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL, NULL);
2787                        nfs4_schedule_state_recovery(clp);
2788                        if (test_bit(NFS4CLNT_STATE_RECOVER, &clp->cl_state) == 0)
2789                                rpc_wake_up_task(task);
2790                        task->tk_status = 0;
2791                        return -EAGAIN;
2792                case -NFS4ERR_DELAY:
2793                        nfs_inc_server_stats((struct nfs_server *) server,
2794                                                NFSIOS_DELAY);
2795                case -NFS4ERR_GRACE:
2796                        rpc_delay(task, NFS4_POLL_RETRY_MAX);
2797                        task->tk_status = 0;
2798                        return -EAGAIN;
2799                case -NFS4ERR_OLD_STATEID:
2800                        task->tk_status = 0;
2801                        return -EAGAIN;
2802        }
2803        task->tk_status = nfs4_map_errors(task->tk_status);
2804        return 0;
2805}
2806
2807static int nfs4_wait_bit_interruptible(void *word)
2808{
2809        if (signal_pending(current))
2810                return -ERESTARTSYS;
2811        schedule();
2812        return 0;
2813}
2814
2815static int nfs4_wait_clnt_recover(struct rpc_clnt *clnt, struct nfs_client *clp)
2816{
2817        sigset_t oldset;
2818        int res;
2819
2820        might_sleep();
2821
2822        rwsem_acquire(&clp->cl_sem.dep_map, 0, 0, _RET_IP_);
2823
2824        rpc_clnt_sigmask(clnt, &oldset);
2825        res = wait_on_bit(&clp->cl_state, NFS4CLNT_STATE_RECOVER,
2826                        nfs4_wait_bit_interruptible,
2827                        TASK_INTERRUPTIBLE);
2828        rpc_clnt_sigunmask(clnt, &oldset);
2829
2830        rwsem_release(&clp->cl_sem.dep_map, 1, _RET_IP_);
2831        return res;
2832}
2833
2834static int nfs4_delay(struct rpc_clnt *clnt, long *timeout)
2835{
2836        sigset_t oldset;
2837        int res = 0;
2838
2839        might_sleep();
2840
2841        if (*timeout <= 0)
2842                *timeout = NFS4_POLL_RETRY_MIN;
2843        if (*timeout > NFS4_POLL_RETRY_MAX)
2844                *timeout = NFS4_POLL_RETRY_MAX;
2845        rpc_clnt_sigmask(clnt, &oldset);
2846        if (clnt->cl_intr) {
2847                schedule_timeout_interruptible(*timeout);
2848                if (signalled())
2849                        res = -ERESTARTSYS;
2850        } else
2851                schedule_timeout_uninterruptible(*timeout);
2852        rpc_clnt_sigunmask(clnt, &oldset);
2853        *timeout <<= 1;
2854        return res;
2855}
2856
2857/* This is the error handling routine for processes that are allowed
2858 * to sleep.
2859 */
2860static int nfs4_handle_exception(const struct nfs_server *server, int errorcode, struct nfs4_exception *exception)
2861{
2862        struct nfs_client *clp = server->nfs_client;
2863        int ret = errorcode;
2864
2865        exception->retry = 0;
2866        switch(errorcode) {
2867                case 0:
2868                        return 0;
2869                case -NFS4ERR_STALE_CLIENTID:
2870                case -NFS4ERR_STALE_STATEID:
2871                case -NFS4ERR_EXPIRED:
2872                        nfs4_schedule_state_recovery(clp);
2873                        ret = nfs4_wait_clnt_recover(server->client, clp);
2874                        if (ret == 0)
2875                                exception->retry = 1;
2876                        break;
2877                case -NFS4ERR_FILE_OPEN:
2878                case -NFS4ERR_GRACE:
2879                case -NFS4ERR_DELAY:
2880                        ret = nfs4_delay(server->client, &exception->timeout);
2881                        if (ret != 0)
2882                                break;
2883                case -NFS4ERR_OLD_STATEID:
2884                        exception->retry = 1;
2885        }
2886        /* We failed to handle the error */
2887        return nfs4_map_errors(ret);
2888}
2889
2890int nfs4_proc_setclientid(struct nfs_client *clp, u32 program, unsigned short port, struct rpc_cred *cred)
2891{
2892        nfs4_verifier sc_verifier;
2893        struct nfs4_setclientid setclientid = {
2894                .sc_verifier = &sc_verifier,
2895                .sc_prog = program,
2896        };
2897        struct rpc_message msg = {
2898                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID],
2899                .rpc_argp = &setclientid,
2900                .rpc_resp = clp,
2901                .rpc_cred = cred,
2902        };
2903        __be32 *p;
2904        int loop = 0;
2905        int status;
2906
2907        p = (__be32*)sc_verifier.data;
2908        *p++ = htonl((u32)clp->cl_boot_time.tv_sec);
2909        *p = htonl((u32)clp->cl_boot_time.tv_nsec);
2910
2911        for(;;) {
2912                setclientid.sc_name_len = scnprintf(setclientid.sc_name,
2913                                sizeof(setclientid.sc_name), "%s/%u.%u.%u.%u %s %u",
2914                                clp->cl_ipaddr, NIPQUAD(clp->cl_addr.sin_addr),
2915                                cred->cr_ops->cr_name,
2916                                clp->cl_id_uniquifier);
2917                setclientid.sc_netid_len = scnprintf(setclientid.sc_netid,
2918                                sizeof(setclientid.sc_netid), "tcp");
2919                setclientid.sc_uaddr_len = scnprintf(setclientid.sc_uaddr,
2920                                sizeof(setclientid.sc_uaddr), "%s.%d.%d",
2921                                clp->cl_ipaddr, port >> 8, port & 255);
2922
2923                status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
2924                if (status != -NFS4ERR_CLID_INUSE)
2925                        break;
2926                if (signalled())
2927                        break;
2928                if (loop++ & 1)
2929                        ssleep(clp->cl_lease_time + 1);
2930                else
2931                        if (++clp->cl_id_uniquifier == 0)
2932                                break;
2933        }
2934        return status;
2935}
2936
2937static int _nfs4_proc_setclientid_confirm(struct nfs_client *clp, struct rpc_cred *cred)
2938{
2939        struct nfs_fsinfo fsinfo;
2940        struct rpc_message msg = {
2941                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID_CONFIRM],
2942                .rpc_argp = clp,
2943                .rpc_resp = &fsinfo,
2944                .rpc_cred = cred,
2945        };
2946        unsigned long now;
2947        int status;
2948
2949        now = jiffies;
2950        status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
2951        if (status == 0) {
2952                spin_lock(&clp->cl_lock);
2953                clp->cl_lease_time = fsinfo.lease_time * HZ;
2954                clp->cl_last_renewal = now;
2955                clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
2956                spin_unlock(&clp->cl_lock);
2957        }
2958        return status;
2959}
2960
2961int nfs4_proc_setclientid_confirm(struct nfs_client *clp, struct rpc_cred *cred)
2962{
2963        long timeout;
2964        int err;
2965        do {
2966                err = _nfs4_proc_setclientid_confirm(clp, cred);
2967                switch (err) {
2968                        case 0:
2969                                return err;
2970                        case -NFS4ERR_RESOURCE:
2971                                /* The IBM lawyers misread another document! */
2972                        case -NFS4ERR_DELAY:
2973                                err = nfs4_delay(clp->cl_rpcclient, &timeout);
2974                }
2975        } while (err == 0);
2976        return err;
2977}
2978
2979struct nfs4_delegreturndata {
2980        struct nfs4_delegreturnargs args;
2981        struct nfs4_delegreturnres res;
2982        struct nfs_fh fh;
2983        nfs4_stateid stateid;
2984        struct rpc_cred *cred;
2985        unsigned long timestamp;
2986        struct nfs_fattr fattr;
2987        int rpc_status;
2988};
2989
2990static void nfs4_delegreturn_prepare(struct rpc_task *task, void *calldata)
2991{
2992        struct nfs4_delegreturndata *data = calldata;
2993        struct rpc_message msg = {
2994                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DELEGRETURN],
2995                .rpc_argp = &data->args,
2996                .rpc_resp = &data->res,
2997                .rpc_cred = data->cred,
2998        };
2999        nfs_fattr_init(data->res.fattr);
3000        rpc_call_setup(task, &msg, 0);
3001}
3002
3003static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
3004{
3005        struct nfs4_delegreturndata *data = calldata;
3006        data->rpc_status = task->tk_status;
3007        if (data->rpc_status == 0)
3008                renew_lease(data->res.server, data->timestamp);
3009}
3010
3011static void nfs4_delegreturn_release(void *calldata)
3012{
3013        struct nfs4_delegreturndata *data = calldata;
3014
3015        put_rpccred(data->cred);
3016        kfree(calldata);
3017}
3018
3019static const struct rpc_call_ops nfs4_delegreturn_ops = {
3020        .rpc_call_prepare = nfs4_delegreturn_prepare,
3021        .rpc_call_done = nfs4_delegreturn_done,
3022        .rpc_release = nfs4_delegreturn_release,
3023};
3024
3025static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid)
3026{
3027        struct nfs4_delegreturndata *data;
3028        struct nfs_server *server = NFS_SERVER(inode);
3029        struct rpc_task *task;
3030        int status;
3031
3032        data = kmalloc(sizeof(*data), GFP_KERNEL);
3033        if (data == NULL)
3034                return -ENOMEM;
3035        data->args.fhandle = &data->fh;
3036        data->args.stateid = &data->stateid;
3037        data->args.bitmask = server->attr_bitmask;
3038        nfs_copy_fh(&data->fh, NFS_FH(inode));
3039        memcpy(&data->stateid, stateid, sizeof(data->stateid));
3040        data->res.fattr = &data->fattr;
3041        data->res.server = server;
3042        data->cred = get_rpccred(cred);
3043        data->timestamp = jiffies;
3044        data->rpc_status = 0;
3045
3046        task = rpc_run_task(NFS_CLIENT(inode), RPC_TASK_ASYNC, &nfs4_delegreturn_ops, data);
3047        if (IS_ERR(task))
3048                return PTR_ERR(task);
3049        status = nfs4_wait_for_completion_rpc_task(task);
3050        if (status == 0) {
3051                status = data->rpc_status;
3052                if (status == 0)
3053                        nfs_refresh_inode(inode, &data->fattr);
3054        }
3055        rpc_put_task(task);
3056        return status;
3057}
3058
3059int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid)
3060{
3061        struct nfs_server *server = NFS_SERVER(inode);
3062        struct nfs4_exception exception = { };
3063        int err;
3064        do {
3065                err = _nfs4_proc_delegreturn(inode, cred, stateid);
3066                switch (err) {
3067                        case -NFS4ERR_STALE_STATEID:
3068                        case -NFS4ERR_EXPIRED:
3069                        case 0:
3070                                return 0;
3071                }
3072                err = nfs4_handle_exception(server, err, &exception);
3073        } while (exception.retry);
3074        return err;
3075}
3076
3077#define NFS4_LOCK_MINTIMEOUT (1 * HZ)
3078#define NFS4_LOCK_MAXTIMEOUT (30 * HZ)
3079
3080/* 
3081 * sleep, with exponential backoff, and retry the LOCK operation. 
3082 */
3083static unsigned long
3084nfs4_set_lock_task_retry(unsigned long timeout)
3085{
3086        schedule_timeout_interruptible(timeout);
3087        timeout <<= 1;
3088        if (timeout > NFS4_LOCK_MAXTIMEOUT)
3089                return NFS4_LOCK_MAXTIMEOUT;
3090        return timeout;
3091}
3092
3093static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request)
3094{
3095        struct inode *inode = state->inode;
3096        struct nfs_server *server = NFS_SERVER(inode);
3097        struct nfs_client *clp = server->nfs_client;
3098        struct nfs_lockt_args arg = {
3099                .fh = NFS_FH(inode),
3100                .fl = request,
3101        };
3102        struct nfs_lockt_res res = {
3103                .denied = request,
3104        };
3105        struct rpc_message msg = {
3106                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_LOCKT],
3107                .rpc_argp       = &arg,
3108                .rpc_resp       = &res,
3109                .rpc_cred       = state->owner->so_cred,
3110        };
3111        struct nfs4_lock_state *lsp;
3112        int status;
3113
3114        down_read(&clp->cl_sem);
3115        arg.lock_owner.clientid = clp->cl_clientid;
3116        status = nfs4_set_lock_state(state, request);
3117        if (status != 0)
3118                goto out;
3119        lsp = request->fl_u.nfs4_fl.owner;
3120        arg.lock_owner.id = lsp->ls_id.id;
3121        status = rpc_call_sync(server->client, &msg, 0);
3122        switch (status) {
3123                case 0:
3124                        request->fl_type = F_UNLCK;
3125                        break;
3126                case -NFS4ERR_DENIED:
3127                        status = 0;
3128        }
3129        request->fl_ops->fl_release_private(request);
3130out:
3131        up_read(&clp->cl_sem);
3132        return status;
3133}
3134
3135static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request)
3136{
3137        struct nfs4_exception exception = { };
3138        int err;
3139
3140        do {
3141                err = nfs4_handle_exception(NFS_SERVER(state->inode),
3142                                _nfs4_proc_getlk(state, cmd, request),
3143                                &exception);
3144        } while (exception.retry);
3145        return err;
3146}
3147
3148static int do_vfs_lock(struct file *file, struct file_lock *fl)
3149{
3150        int res = 0;
3151        switch (fl->fl_flags & (FL_POSIX|FL_FLOCK)) {
3152                case FL_POSIX:
3153                        res = posix_lock_file_wait(file, fl);
3154                        break;
3155                case FL_FLOCK:
3156                        res = flock_lock_file_wait(file, fl);
3157                        break;
3158                default:
3159                        BUG();
3160        }
3161        return res;
3162}
3163
3164struct nfs4_unlockdata {
3165        struct nfs_locku_args arg;
3166        struct nfs_locku_res res;
3167        struct nfs4_lock_state *lsp;
3168        struct nfs_open_context *ctx;
3169        struct file_lock fl;
3170        const struct nfs_server *server;
3171        unsigned long timestamp;
3172};
3173
3174static struct nfs4_unlockdata *nfs4_alloc_unlockdata(struct file_lock *fl,
3175                struct nfs_open_context *ctx,
3176                struct nfs4_lock_state *lsp,
3177                struct nfs_seqid *seqid)
3178{
3179        struct nfs4_unlockdata *p;
3180        struct inode *inode = lsp->ls_state->inode;
3181
3182        p = kmalloc(sizeof(*p), GFP_KERNEL);
3183        if (p == NULL)
3184                return NULL;
3185        p->arg.fh = NFS_FH(inode);
3186        p->arg.fl = &p->fl;
3187        p->arg.seqid = seqid;
3188        p->arg.stateid = &lsp->ls_stateid;
3189        p->lsp = lsp;
3190        atomic_inc(&lsp->ls_count);
3191        /* Ensure we don't close file until we're done freeing locks! */
3192        p->ctx = get_nfs_open_context(ctx);
3193        memcpy(&p->fl, fl, sizeof(p->fl));
3194        p->server = NFS_SERVER(inode);
3195        return p;
3196}
3197
3198static void nfs4_locku_release_calldata(void *data)
3199{
3200        struct nfs4_unlockdata *calldata = data;
3201        nfs_free_seqid(calldata->arg.seqid);
3202        nfs4_put_lock_state(calldata->lsp);
3203        put_nfs_open_context(calldata->ctx);
3204        kfree(calldata);
3205}
3206
3207static void nfs4_locku_done(struct rpc_task *task, void *data)
3208{
3209        struct nfs4_unlockdata *calldata = data;
3210
3211        if (RPC_ASSASSINATED(task))
3212                return;
3213        nfs_increment_lock_seqid(task->tk_status, calldata->arg.seqid);
3214        switch (task->tk_status) {
3215                case 0:
3216                        memcpy(calldata->lsp->ls_stateid.data,
3217                                        calldata->res.stateid.data,
3218                                        sizeof(calldata->lsp->ls_stateid.data));
3219                        renew_lease(calldata->server, calldata->timestamp);
3220                        break;
3221                case -NFS4ERR_STALE_STATEID:
3222                case -NFS4ERR_EXPIRED:
3223                        break;
3224                default:
3225                        if (nfs4_async_handle_error(task, calldata->server) == -EAGAIN)
3226                                rpc_restart_call(task);
3227        }
3228}
3229
3230static void nfs4_locku_prepare(struct rpc_task *task, void *data)
3231{
3232        struct nfs4_unlockdata *calldata = data;
3233        struct rpc_message msg = {
3234                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_LOCKU],
3235                .rpc_argp       = &calldata->arg,
3236                .rpc_resp       = &calldata->res,
3237                .rpc_cred       = calldata->lsp->ls_state->owner->so_cred,
3238        };
3239
3240        if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
3241                return;
3242        if ((calldata->lsp->ls_flags & NFS_LOCK_INITIALIZED) == 0) {
3243                /* Note: exit _without_ running nfs4_locku_done */
3244                task->tk_action = NULL;
3245                return;
3246        }
3247        calldata->timestamp = jiffies;
3248        rpc_call_setup(task, &msg, 0);
3249}
3250
3251static const struct rpc_call_ops nfs4_locku_ops = {
3252        .rpc_call_prepare = nfs4_locku_prepare,
3253        .rpc_call_done = nfs4_locku_done,
3254        .rpc_release = nfs4_locku_release_calldata,
3255};
3256
3257static struct rpc_task *nfs4_do_unlck(struct file_lock *fl,
3258                struct nfs_open_context *ctx,
3259                struct nfs4_lock_state *lsp,
3260                struct nfs_seqid *seqid)
3261{
3262        struct nfs4_unlockdata *data;
3263
3264        /* Ensure this is an unlock - when canceling a lock, the
3265         * canceled lock is passed in, and it won't be an unlock.
3266         */
3267        fl->fl_type = F_UNLCK;
3268
3269        data = nfs4_alloc_unlockdata(fl, ctx, lsp, seqid);
3270        if (data == NULL) {
3271                nfs_free_seqid(seqid);
3272                return ERR_PTR(-ENOMEM);
3273        }
3274
3275        return rpc_run_task(NFS_CLIENT(lsp->ls_state->inode), RPC_TASK_ASYNC, &nfs4_locku_ops, data);
3276}
3277
3278static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock *request)
3279{
3280        struct nfs_seqid *seqid;
3281        struct nfs4_lock_state *lsp;
3282        struct rpc_task *task;
3283        int status = 0;
3284
3285        status = nfs4_set_lock_state(state, request);
3286        /* Unlock _before_ we do the RPC call */
3287        request->fl_flags |= FL_EXISTS;
3288        if (do_vfs_lock(request->fl_file, request) == -ENOENT)
3289                goto out;
3290        if (status != 0)
3291                goto out;
3292        /* Is this a delegated lock? */
3293        if (test_bit(NFS_DELEGATED_STATE, &state->flags))
3294                goto out;
3295        lsp = request->fl_u.nfs4_fl.owner;
3296        seqid = nfs_alloc_seqid(&lsp->ls_seqid);
3297        status = -ENOMEM;
3298        if (seqid == NULL)
3299                goto out;
3300        task = nfs4_do_unlck(request, nfs_file_open_context(request->fl_file), lsp, seqid);
3301        status = PTR_ERR(task);
3302        if (IS_ERR(task))
3303                goto out;
3304        status = nfs4_wait_for_completion_rpc_task(task);
3305        rpc_put_task(task);
3306out:
3307        return status;
3308}
3309
3310struct nfs4_lockdata {
3311        struct nfs_lock_args arg;
3312        struct nfs_lock_res res;
3313        struct nfs4_lock_state *lsp;
3314        struct nfs_open_context *ctx;
3315        struct file_lock fl;
3316        unsigned long timestamp;
3317        int rpc_status;
3318        int cancelled;
3319};
3320
3321static struct nfs4_lockdata *nfs4_alloc_lockdata(struct file_lock *fl,
3322                struct nfs_open_context *ctx, struct nfs4_lock_state *lsp)
3323{
3324        struct nfs4_lockdata *p;
3325        struct inode *inode = lsp->ls_state->inode;
3326        struct nfs_server *server = NFS_SERVER(inode);
3327
3328        p = kzalloc(sizeof(*p), GFP_KERNEL);
3329        if (p == NULL)
3330                return NULL;
3331
3332        p->arg.fh = NFS_FH(inode);
3333        p->arg.fl = &p->fl;
3334        if (!(lsp->ls_seqid.flags & NFS_SEQID_CONFIRMED)) {
3335                p->arg.open_seqid = nfs_alloc_seqid(&lsp->ls_state->owner->so_seqid);
3336                if (p->arg.open_seqid == NULL)
3337                        goto out_free;
3338
3339        }
3340        p->arg.lock_seqid = nfs_alloc_seqid(&lsp->ls_seqid);
3341        if (p->arg.lock_seqid == NULL)
3342                goto out_free;
3343        p->arg.lock_stateid = &lsp->ls_stateid;
3344        p->arg.lock_owner.clientid = server->nfs_client->cl_clientid;
3345        p->arg.lock_owner.id = lsp->ls_id.id;
3346        p->lsp = lsp;
3347        atomic_inc(&lsp->ls_count);
3348        p->ctx = get_nfs_open_context(ctx);
3349        memcpy(&p->fl, fl, sizeof(p->fl));
3350        return p;
3351out_free:
3352        if (p->arg.open_seqid != NULL)
3353                nfs_free_seqid(p->arg.open_seqid);
3354        kfree(p);
3355        return NULL;
3356}
3357
3358static void nfs4_lock_prepare(struct rpc_task *task, void *calldata)
3359{
3360        struct nfs4_lockdata *data = calldata;
3361        struct nfs4_state *state = data->lsp->ls_state;
3362        struct nfs4_state_owner *sp = state->owner;
3363        struct rpc_message msg = {
3364                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCK],
3365                .rpc_argp = &data->arg,
3366                .rpc_resp = &data->res,
3367                .rpc_cred = sp->so_cred,
3368        };
3369
3370        dprintk("%s: begin!\n", __FUNCTION__);
3371        /* Do we need to do an open_to_lock_owner? */
3372        if (!(data->arg.lock_seqid->sequence->flags & NFS_SEQID_CONFIRMED)) {
3373                if (nfs_wait_on_sequence(data->arg.open_seqid, task) != 0)
3374                        return;
3375                data->arg.open_stateid = &state->stateid;
3376                data->arg.new_lock_owner = 1;
3377                /* Retest in case we raced... */
3378                if (!(data->arg.lock_seqid->sequence->flags & NFS_SEQID_CONFIRMED))
3379                        goto do_rpc;
3380        }
3381        if (nfs_wait_on_sequence(data->arg.lock_seqid, task) != 0)
3382                return;
3383        data->arg.new_lock_owner = 0;
3384do_rpc: 
3385        data->timestamp = jiffies;
3386        rpc_call_setup(task, &msg, 0);
3387        dprintk("%s: done!, ret = %d\n", __FUNCTION__, data->rpc_status);
3388}
3389
3390static void nfs4_lock_done(struct rpc_task *task, void *calldata)
3391{
3392        struct nfs4_lockdata *data = calldata;
3393
3394        dprintk("%s: begin!\n", __FUNCTION__);
3395
3396        data->rpc_status = task->tk_status;
3397        if (RPC_ASSASSINATED(task))
3398                goto out;
3399        if (data->arg.new_lock_owner != 0) {
3400                nfs_increment_open_seqid(data->rpc_status, data->arg.open_seqid);
3401                if (data->rpc_status == 0)
3402                        nfs_confirm_seqid(&data->lsp->ls_seqid, 0);
3403                else
3404                        goto out;
3405        }
3406        if (data->rpc_status == 0) {
3407                memcpy(data->lsp->ls_stateid.data, data->res.stateid.data,
3408                                        sizeof(data->lsp->ls_stateid.data));
3409                data->lsp->ls_flags |= NFS_LOCK_INITIALIZED;
3410                renew_lease(NFS_SERVER(data->ctx->path.dentry->d_inode), data->timestamp);
3411        }
3412        nfs_increment_lock_seqid(data->rpc_status, data->arg.lock_seqid);
3413out:
3414        dprintk("%s: done, ret = %d!\n", __FUNCTION__, data->rpc_status);
3415}
3416
3417static void nfs4_lock_release(void *calldata)
3418{
3419        struct nfs4_lockdata *data = calldata;
3420
3421        dprintk("%s: begin!\n", __FUNCTION__);
3422        if (data->cancelled != 0) {
3423                struct rpc_task *task;
3424                task = nfs4_do_unlck(&data->fl, data->ctx, data->lsp,
3425                                data->arg.lock_seqid);
3426                if (!IS_ERR(task))
3427                        rpc_put_task(task);
3428                dprintk("%s: cancelling lock!\n", __FUNCTION__);
3429        } else
3430                nfs_free_seqid(data->arg.lock_seqid);
3431        if (data->arg.open_seqid != NULL)
3432                nfs_free_seqid(data->arg.open_seqid);
3433        nfs4_put_lock_state(data->lsp);
3434        put_nfs_open_context(data->ctx);
3435        kfree(data);
3436        dprintk("%s: done!\n", __FUNCTION__);
3437}
3438
3439static const struct rpc_call_ops nfs4_lock_ops = {
3440        .rpc_call_prepare = nfs4_lock_prepare,
3441        .rpc_call_done = nfs4_lock_done,
3442        .rpc_release = nfs4_lock_release,
3443};
3444
3445static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *fl, int reclaim)
3446{
3447        struct nfs4_lockdata *data;
3448        struct rpc_task *task;
3449        int ret;
3450
3451        dprintk("%s: begin!\n", __FUNCTION__);
3452        data = nfs4_alloc_lockdata(fl, nfs_file_open_context(fl->fl_file),
3453                        fl->fl_u.nfs4_fl.owner);
3454        if (data == NULL)
3455                return -ENOMEM;
3456        if (IS_SETLKW(cmd))
3457                data->arg.block = 1;
3458        if (reclaim != 0)
3459                data->arg.reclaim = 1;
3460        task = rpc_run_task(NFS_CLIENT(state->inode), RPC_TASK_ASYNC,
3461                        &nfs4_lock_ops, data);
3462        if (IS_ERR(task))
3463                return PTR_ERR(task);
3464        ret = nfs4_wait_for_completion_rpc_task(task);
3465        if (ret == 0) {
3466                ret = data->rpc_status;
3467                if (ret == -NFS4ERR_DENIED)
3468                        ret = -EAGAIN;
3469        } else
3470                data->cancelled = 1;
3471        rpc_put_task(task);
3472        dprintk("%s: done, ret = %d!\n", __FUNCTION__, ret);
3473        return ret;
3474}
3475
3476static int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request)
3477{
3478        struct nfs_server *server = NFS_SERVER(state->inode);
3479        struct nfs4_exception exception = { };
3480        int err;
3481
3482        do {
3483                /* Cache the lock if possible... */
3484                if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0)
3485                        return 0;
3486                err = _nfs4_do_setlk(state, F_SETLK, request, 1);
3487                if (err != -NFS4ERR_DELAY)
3488                        break;
3489                nfs4_handle_exception(server, err, &exception);
3490        } while (exception.retry);
3491        return err;
3492}
3493
3494static int nfs4_lock_expired(struct nfs4_state *state, struct file_lock *request)
3495{
3496        struct nfs_server *server = NFS_SERVER(state->inode);
3497        struct nfs4_exception exception = { };
3498        int err;
3499
3500        err = nfs4_set_lock_state(state, request);
3501        if (err != 0)
3502                return err;
3503        do {
3504                if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0)
3505                        return 0;
3506                err = _nfs4_do_setlk(state, F_SETLK, request, 0);
3507                if (err != -NFS4ERR_DELAY)
3508                        break;
3509                nfs4_handle_exception(server, err, &exception);
3510        } while (exception.retry);
3511        return err;
3512}
3513
3514static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
3515{
3516        struct nfs_client *clp = state->owner->so_client;
3517        unsigned char fl_flags = request->fl_flags;
3518        int status;
3519
3520        /* Is this a delegated open? */
3521        status = nfs4_set_lock_state(state, request);
3522        if (status != 0)
3523                goto out;
3524        request->fl_flags |= FL_ACCESS;
3525        status = do_vfs_lock(request->fl_file, request);
3526        if (status < 0)
3527                goto out;
3528        down_read(&clp->cl_sem);
3529        if (test_bit(NFS_DELEGATED_STATE, &state->flags)) {
3530                struct nfs_inode *nfsi = NFS_I(state->inode);
3531                /* Yes: cache locks! */
3532                down_read(&nfsi->rwsem);
3533                /* ...but avoid races with delegation recall... */
3534                if (test_bit(NFS_DELEGATED_STATE, &state->flags)) {
3535                        request->fl_flags = fl_flags & ~FL_SLEEP;
3536                        status = do_vfs_lock(request->fl_file, request);
3537                        up_read(&nfsi->rwsem);
3538                        goto out_unlock;
3539                }
3540                up_read(&nfsi->rwsem);
3541        }
3542        status = _nfs4_do_setlk(state, cmd, request, 0);
3543        if (status != 0)
3544                goto out_unlock;
3545        /* Note: we always want to sleep here! */
3546        request->fl_flags = fl_flags | FL_SLEEP;
3547        if (do_vfs_lock(request->fl_file, request) < 0)
3548                printk(KERN_WARNING "%s: VFS is out of sync with lock manager!\n", __FUNCTION__);
3549out_unlock:
3550        up_read(&clp->cl_sem);
3551out:
3552        request->fl_flags = fl_flags;
3553        return status;
3554}
3555
3556static int nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
3557{
3558        struct nfs4_exception exception = { };
3559        int err;
3560
3561        do {
3562                err = nfs4_handle_exception(NFS_SERVER(state->inode),
3563                                _nfs4_proc_setlk(state, cmd, request),
3564                                &exception);
3565        } while (exception.retry);
3566        return err;
3567}
3568
3569static int
3570nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request)
3571{
3572        struct nfs_open_context *ctx;
3573        struct nfs4_state *state;
3574        unsigned long timeout = NFS4_LOCK_MINTIMEOUT;
3575        int status;
3576
3577        /* verify open state */
3578        ctx = nfs_file_open_context(filp);
3579        state = ctx->state;
3580
3581        if (request->fl_start < 0 || request->fl_end < 0)
3582                return -EINVAL;
3583
3584        if (IS_GETLK(cmd))
3585                return nfs4_proc_getlk(state, F_GETLK, request);
3586
3587        if (!(IS_SETLK(cmd) || IS_SETLKW(cmd)))
3588                return -EINVAL;
3589
3590        if (request->fl_type == F_UNLCK)
3591                return nfs4_proc_unlck(state, cmd, request);
3592
3593        do {
3594                status = nfs4_proc_setlk(state, cmd, request);
3595                if ((status != -EAGAIN) || IS_SETLK(cmd))
3596                        break;
3597                timeout = nfs4_set_lock_task_retry(timeout);
3598                status = -ERESTARTSYS;
3599                if (signalled())
3600                        break;
3601        } while(status < 0);
3602        return status;
3603}
3604
3605int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl)
3606{
3607        struct nfs_server *server = NFS_SERVER(state->inode);
3608        struct nfs4_exception exception = { };
3609        int err;
3610
3611        err = nfs4_set_lock_state(state, fl);
3612        if (err != 0)
3613                goto out;
3614        do {
3615                err = _nfs4_do_setlk(state, F_SETLK, fl, 0);
3616                if (err != -NFS4ERR_DELAY)
3617                        break;
3618                err = nfs4_handle_exception(server, err, &exception);
3619        } while (exception.retry);
3620out:
3621        return err;
3622}
3623
3624#define XATTR_NAME_NFSV4_ACL "system.nfs4_acl"
3625
3626int nfs4_setxattr(struct dentry *dentry, const char *key, const void *buf,
3627                size_t buflen, int flags)
3628{
3629        struct inode *inode = dentry->d_inode;
3630
3631        if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0)
3632                return -EOPNOTSUPP;
3633
3634        if (!S_ISREG(inode->i_mode) &&
3635            (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX))
3636                return -EPERM;
3637
3638        return nfs4_proc_set_acl(inode, buf, buflen);
3639}
3640
3641/* The getxattr man page suggests returning -ENODATA for unknown attributes,
3642 * and that's what we'll do for e.g. user attributes that haven't been set.
3643 * But we'll follow ext2/ext3's lead by returning -EOPNOTSUPP for unsupported
3644 * attributes in kernel-managed attribute namespaces. */
3645ssize_t nfs4_getxattr(struct dentry *dentry, const char *key, void *buf,
3646                size_t buflen)
3647{
3648        struct inode *inode = dentry->d_inode;
3649
3650        if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0)
3651                return -EOPNOTSUPP;
3652
3653        return nfs4_proc_get_acl(inode, buf, buflen);
3654}
3655
3656ssize_t nfs4_listxattr(struct dentry *dentry, char *buf, size_t buflen)
3657{
3658        size_t len = strlen(XATTR_NAME_NFSV4_ACL) + 1;
3659
3660        if (!nfs4_server_supports_acls(NFS_SERVER(dentry->d_inode)))
3661                return 0;
3662        if (buf && buflen < len)
3663                return -ERANGE;
3664        if (buf)
3665                memcpy(buf, XATTR_NAME_NFSV4_ACL, len);
3666        return len;
3667}
3668
3669int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
3670                struct nfs4_fs_locations *fs_locations, struct page *page)
3671{
3672        struct nfs_server *server = NFS_SERVER(dir);
3673        u32 bitmask[2] = {
3674                [0] = FATTR4_WORD0_FSID | FATTR4_WORD0_FS_LOCATIONS,
3675                [1] = FATTR4_WORD1_MOUNTED_ON_FILEID,
3676        };
3677        struct nfs4_fs_locations_arg args = {
3678                .dir_fh = NFS_FH(dir),
3679                .name = name,
3680                .page = page,
3681                .bitmask = bitmask,
3682        };
3683        struct rpc_message msg = {
3684                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FS_LOCATIONS],
3685                .rpc_argp = &args,
3686                .rpc_resp = fs_locations,
3687        };
3688        int status;
3689
3690        dprintk("%s: start\n", __FUNCTION__);
3691        nfs_fattr_init(&fs_locations->fattr);
3692        fs_locations->server = server;
3693        fs_locations->nlocations = 0;
3694        status = rpc_call_sync(server->client, &msg, 0);
3695        dprintk("%s: returned status = %d\n", __FUNCTION__, status);
3696        return status;
3697}
3698
3699struct nfs4_state_recovery_ops nfs4_reboot_recovery_ops = {
3700        .recover_open   = nfs4_open_reclaim,
3701        .recover_lock   = nfs4_lock_reclaim,
3702};
3703
3704struct nfs4_state_recovery_ops nfs4_network_partition_recovery_ops = {
3705        .recover_open   = nfs4_open_expired,
3706        .recover_lock   = nfs4_lock_expired,
3707};
3708
3709static const struct inode_operations nfs4_file_inode_operations = {
3710        .permission     = nfs_permission,
3711        .getattr        = nfs_getattr,
3712        .setattr        = nfs_setattr,
3713        .getxattr       = nfs4_getxattr,
3714        .setxattr       = nfs4_setxattr,
3715        .listxattr      = nfs4_listxattr,
3716};
3717
3718const struct nfs_rpc_ops nfs_v4_clientops = {
3719        .version        = 4,                    /* protocol version */
3720        .dentry_ops     = &nfs4_dentry_operations,
3721        .dir_inode_ops  = &nfs4_dir_inode_operations,
3722        .file_inode_ops = &nfs4_file_inode_operations,
3723        .getroot        = nfs4_proc_get_root,
3724        .getattr        = nfs4_proc_getattr,
3725        .setattr        = nfs4_proc_setattr,
3726        .lookupfh       = nfs4_proc_lookupfh,
3727        .lookup         = nfs4_proc_lookup,
3728        .access         = nfs4_proc_access,
3729        .readlink       = nfs4_proc_readlink,
3730        .create         = nfs4_proc_create,
3731        .remove         = nfs4_proc_remove,
3732        .unlink_setup   = nfs4_proc_unlink_setup,
3733        .unlink_done    = nfs4_proc_unlink_done,
3734        .rename         = nfs4_proc_rename,
3735        .link           = nfs4_proc_link,
3736        .symlink        = nfs4_proc_symlink,
3737        .mkdir          = nfs4_proc_mkdir,
3738        .rmdir          = nfs4_proc_remove,
3739        .readdir        = nfs4_proc_readdir,
3740        .mknod          = nfs4_proc_mknod,
3741        .statfs         = nfs4_proc_statfs,
3742        .fsinfo         = nfs4_proc_fsinfo,
3743        .pathconf       = nfs4_proc_pathconf,
3744        .set_capabilities = nfs4_server_capabilities,
3745        .decode_dirent  = nfs4_decode_dirent,
3746        .read_setup     = nfs4_proc_read_setup,
3747        .read_done      = nfs4_read_done,
3748        .write_setup    = nfs4_proc_write_setup,
3749        .write_done     = nfs4_write_done,
3750        .commit_setup   = nfs4_proc_commit_setup,
3751        .commit_done    = nfs4_commit_done,
3752        .file_open      = nfs_open,
3753        .file_release   = nfs_release,
3754        .lock           = nfs4_proc_lock,
3755        .clear_acl_cache = nfs4_zap_acl_attr,
3756};
3757
3758/*
3759 * Local variables:
3760 *  c-basic-offset: 8
3761 * End:
3762 */
3763