linux/fs/nfs/nfs4proc.c
<<
>>
Prefs
   1/*
   2 *  fs/nfs/nfs4proc.c
   3 *
   4 *  Client-side procedure declarations for NFSv4.
   5 *
   6 *  Copyright (c) 2002 The Regents of the University of Michigan.
   7 *  All rights reserved.
   8 *
   9 *  Kendrick Smith <kmsmith@umich.edu>
  10 *  Andy Adamson   <andros@umich.edu>
  11 *
  12 *  Redistribution and use in source and binary forms, with or without
  13 *  modification, are permitted provided that the following conditions
  14 *  are met:
  15 *
  16 *  1. Redistributions of source code must retain the above copyright
  17 *     notice, this list of conditions and the following disclaimer.
  18 *  2. Redistributions in binary form must reproduce the above copyright
  19 *     notice, this list of conditions and the following disclaimer in the
  20 *     documentation and/or other materials provided with the distribution.
  21 *  3. Neither the name of the University nor the names of its
  22 *     contributors may be used to endorse or promote products derived
  23 *     from this software without specific prior written permission.
  24 *
  25 *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
  26 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  27 *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  28 *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  29 *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  30 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  31 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  32 *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  33 *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  34 *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  35 *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  36 */
  37
  38#include <linux/mm.h>
  39#include <linux/delay.h>
  40#include <linux/errno.h>
  41#include <linux/string.h>
  42#include <linux/sunrpc/clnt.h>
  43#include <linux/nfs.h>
  44#include <linux/nfs4.h>
  45#include <linux/nfs_fs.h>
  46#include <linux/nfs_page.h>
  47#include <linux/namei.h>
  48#include <linux/mount.h>
  49#include <linux/module.h>
  50#include <linux/sunrpc/bc_xprt.h>
  51
  52#include "nfs4_fs.h"
  53#include "delegation.h"
  54#include "internal.h"
  55#include "iostat.h"
  56#include "callback.h"
  57
  58#define NFSDBG_FACILITY         NFSDBG_PROC
  59
  60#define NFS4_POLL_RETRY_MIN     (HZ/10)
  61#define NFS4_POLL_RETRY_MAX     (15*HZ)
  62
  63#define NFS4_MAX_LOOP_ON_RECOVER (10)
  64
  65struct nfs4_opendata;
  66static int _nfs4_proc_open(struct nfs4_opendata *data);
  67static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *);
  68static int nfs4_async_handle_error(struct rpc_task *, const struct nfs_server *, struct nfs4_state *);
  69static int _nfs4_proc_lookup(struct inode *dir, const struct qstr *name, struct nfs_fh *fhandle, struct nfs_fattr *fattr);
  70static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr);
  71
  72/* Prevent leaks of NFSv4 errors into userland */
  73static int nfs4_map_errors(int err)
  74{
  75        if (err >= -1000)
  76                return err;
  77        switch (err) {
  78        case -NFS4ERR_RESOURCE:
  79                return -EREMOTEIO;
  80        default:
  81                dprintk("%s could not handle NFSv4 error %d\n",
  82                                __func__, -err);
  83                break;
  84        }
  85        return -EIO;
  86}
  87
  88/*
  89 * This is our standard bitmap for GETATTR requests.
  90 */
  91const u32 nfs4_fattr_bitmap[2] = {
  92        FATTR4_WORD0_TYPE
  93        | FATTR4_WORD0_CHANGE
  94        | FATTR4_WORD0_SIZE
  95        | FATTR4_WORD0_FSID
  96        | FATTR4_WORD0_FILEID,
  97        FATTR4_WORD1_MODE
  98        | FATTR4_WORD1_NUMLINKS
  99        | FATTR4_WORD1_OWNER
 100        | FATTR4_WORD1_OWNER_GROUP
 101        | FATTR4_WORD1_RAWDEV
 102        | FATTR4_WORD1_SPACE_USED
 103        | FATTR4_WORD1_TIME_ACCESS
 104        | FATTR4_WORD1_TIME_METADATA
 105        | FATTR4_WORD1_TIME_MODIFY
 106};
 107
 108const u32 nfs4_statfs_bitmap[2] = {
 109        FATTR4_WORD0_FILES_AVAIL
 110        | FATTR4_WORD0_FILES_FREE
 111        | FATTR4_WORD0_FILES_TOTAL,
 112        FATTR4_WORD1_SPACE_AVAIL
 113        | FATTR4_WORD1_SPACE_FREE
 114        | FATTR4_WORD1_SPACE_TOTAL
 115};
 116
 117const u32 nfs4_pathconf_bitmap[2] = {
 118        FATTR4_WORD0_MAXLINK
 119        | FATTR4_WORD0_MAXNAME,
 120        0
 121};
 122
 123const u32 nfs4_fsinfo_bitmap[2] = { FATTR4_WORD0_MAXFILESIZE
 124                        | FATTR4_WORD0_MAXREAD
 125                        | FATTR4_WORD0_MAXWRITE
 126                        | FATTR4_WORD0_LEASE_TIME,
 127                        0
 128};
 129
 130const u32 nfs4_fs_locations_bitmap[2] = {
 131        FATTR4_WORD0_TYPE
 132        | FATTR4_WORD0_CHANGE
 133        | FATTR4_WORD0_SIZE
 134        | FATTR4_WORD0_FSID
 135        | FATTR4_WORD0_FILEID
 136        | FATTR4_WORD0_FS_LOCATIONS,
 137        FATTR4_WORD1_MODE
 138        | FATTR4_WORD1_NUMLINKS
 139        | FATTR4_WORD1_OWNER
 140        | FATTR4_WORD1_OWNER_GROUP
 141        | FATTR4_WORD1_RAWDEV
 142        | FATTR4_WORD1_SPACE_USED
 143        | FATTR4_WORD1_TIME_ACCESS
 144        | FATTR4_WORD1_TIME_METADATA
 145        | FATTR4_WORD1_TIME_MODIFY
 146        | FATTR4_WORD1_MOUNTED_ON_FILEID
 147};
 148
 149static void nfs4_setup_readdir(u64 cookie, __be32 *verifier, struct dentry *dentry,
 150                struct nfs4_readdir_arg *readdir)
 151{
 152        __be32 *start, *p;
 153
 154        BUG_ON(readdir->count < 80);
 155        if (cookie > 2) {
 156                readdir->cookie = cookie;
 157                memcpy(&readdir->verifier, verifier, sizeof(readdir->verifier));
 158                return;
 159        }
 160
 161        readdir->cookie = 0;
 162        memset(&readdir->verifier, 0, sizeof(readdir->verifier));
 163        if (cookie == 2)
 164                return;
 165        
 166        /*
 167         * NFSv4 servers do not return entries for '.' and '..'
 168         * Therefore, we fake these entries here.  We let '.'
 169         * have cookie 0 and '..' have cookie 1.  Note that
 170         * when talking to the server, we always send cookie 0
 171         * instead of 1 or 2.
 172         */
 173        start = p = kmap_atomic(*readdir->pages, KM_USER0);
 174        
 175        if (cookie == 0) {
 176                *p++ = xdr_one;                                  /* next */
 177                *p++ = xdr_zero;                   /* cookie, first word */
 178                *p++ = xdr_one;                   /* cookie, second word */
 179                *p++ = xdr_one;                             /* entry len */
 180                memcpy(p, ".\0\0\0", 4);                        /* entry */
 181                p++;
 182                *p++ = xdr_one;                         /* bitmap length */
 183                *p++ = htonl(FATTR4_WORD0_FILEID);             /* bitmap */
 184                *p++ = htonl(8);              /* attribute buffer length */
 185                p = xdr_encode_hyper(p, NFS_FILEID(dentry->d_inode));
 186        }
 187        
 188        *p++ = xdr_one;                                  /* next */
 189        *p++ = xdr_zero;                   /* cookie, first word */
 190        *p++ = xdr_two;                   /* cookie, second word */
 191        *p++ = xdr_two;                             /* entry len */
 192        memcpy(p, "..\0\0", 4);                         /* entry */
 193        p++;
 194        *p++ = xdr_one;                         /* bitmap length */
 195        *p++ = htonl(FATTR4_WORD0_FILEID);             /* bitmap */
 196        *p++ = htonl(8);              /* attribute buffer length */
 197        p = xdr_encode_hyper(p, NFS_FILEID(dentry->d_parent->d_inode));
 198
 199        readdir->pgbase = (char *)p - (char *)start;
 200        readdir->count -= readdir->pgbase;
 201        kunmap_atomic(start, KM_USER0);
 202}
 203
 204static int nfs4_wait_clnt_recover(struct nfs_client *clp)
 205{
 206        int res;
 207
 208        might_sleep();
 209
 210        res = wait_on_bit(&clp->cl_state, NFS4CLNT_MANAGER_RUNNING,
 211                        nfs_wait_bit_killable, TASK_KILLABLE);
 212        return res;
 213}
 214
 215static int nfs4_delay(struct rpc_clnt *clnt, long *timeout)
 216{
 217        int res = 0;
 218
 219        might_sleep();
 220
 221        if (*timeout <= 0)
 222                *timeout = NFS4_POLL_RETRY_MIN;
 223        if (*timeout > NFS4_POLL_RETRY_MAX)
 224                *timeout = NFS4_POLL_RETRY_MAX;
 225        schedule_timeout_killable(*timeout);
 226        if (fatal_signal_pending(current))
 227                res = -ERESTARTSYS;
 228        *timeout <<= 1;
 229        return res;
 230}
 231
 232/* This is the error handling routine for processes that are allowed
 233 * to sleep.
 234 */
 235static int nfs4_handle_exception(const struct nfs_server *server, int errorcode, struct nfs4_exception *exception)
 236{
 237        struct nfs_client *clp = server->nfs_client;
 238        struct nfs4_state *state = exception->state;
 239        int ret = errorcode;
 240
 241        exception->retry = 0;
 242        switch(errorcode) {
 243                case 0:
 244                        return 0;
 245                case -NFS4ERR_ADMIN_REVOKED:
 246                case -NFS4ERR_BAD_STATEID:
 247                case -NFS4ERR_OPENMODE:
 248                        if (state == NULL)
 249                                break;
 250                        nfs4_state_mark_reclaim_nograce(clp, state);
 251                case -NFS4ERR_STALE_CLIENTID:
 252                case -NFS4ERR_STALE_STATEID:
 253                case -NFS4ERR_EXPIRED:
 254                        nfs4_schedule_state_recovery(clp);
 255                        ret = nfs4_wait_clnt_recover(clp);
 256                        if (ret == 0)
 257                                exception->retry = 1;
 258#if !defined(CONFIG_NFS_V4_1)
 259                        break;
 260#else /* !defined(CONFIG_NFS_V4_1) */
 261                        if (!nfs4_has_session(server->nfs_client))
 262                                break;
 263                        /* FALLTHROUGH */
 264                case -NFS4ERR_BADSESSION:
 265                case -NFS4ERR_BADSLOT:
 266                case -NFS4ERR_BAD_HIGH_SLOT:
 267                case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
 268                case -NFS4ERR_DEADSESSION:
 269                case -NFS4ERR_SEQ_FALSE_RETRY:
 270                case -NFS4ERR_SEQ_MISORDERED:
 271                        dprintk("%s ERROR: %d Reset session\n", __func__,
 272                                errorcode);
 273                        set_bit(NFS4CLNT_SESSION_SETUP, &clp->cl_state);
 274                        exception->retry = 1;
 275                        /* FALLTHROUGH */
 276#endif /* !defined(CONFIG_NFS_V4_1) */
 277                case -NFS4ERR_FILE_OPEN:
 278                case -NFS4ERR_GRACE:
 279                case -NFS4ERR_DELAY:
 280                        ret = nfs4_delay(server->client, &exception->timeout);
 281                        if (ret != 0)
 282                                break;
 283                case -NFS4ERR_OLD_STATEID:
 284                        exception->retry = 1;
 285        }
 286        /* We failed to handle the error */
 287        return nfs4_map_errors(ret);
 288}
 289
 290
 291static void renew_lease(const struct nfs_server *server, unsigned long timestamp)
 292{
 293        struct nfs_client *clp = server->nfs_client;
 294        spin_lock(&clp->cl_lock);
 295        if (time_before(clp->cl_last_renewal,timestamp))
 296                clp->cl_last_renewal = timestamp;
 297        spin_unlock(&clp->cl_lock);
 298}
 299
 300#if defined(CONFIG_NFS_V4_1)
 301
 302/*
 303 * nfs4_free_slot - free a slot and efficiently update slot table.
 304 *
 305 * freeing a slot is trivially done by clearing its respective bit
 306 * in the bitmap.
 307 * If the freed slotid equals highest_used_slotid we want to update it
 308 * so that the server would be able to size down the slot table if needed,
 309 * otherwise we know that the highest_used_slotid is still in use.
 310 * When updating highest_used_slotid there may be "holes" in the bitmap
 311 * so we need to scan down from highest_used_slotid to 0 looking for the now
 312 * highest slotid in use.
 313 * If none found, highest_used_slotid is set to -1.
 314 */
 315static void
 316nfs4_free_slot(struct nfs4_slot_table *tbl, u8 free_slotid)
 317{
 318        int slotid = free_slotid;
 319
 320        spin_lock(&tbl->slot_tbl_lock);
 321        /* clear used bit in bitmap */
 322        __clear_bit(slotid, tbl->used_slots);
 323
 324        /* update highest_used_slotid when it is freed */
 325        if (slotid == tbl->highest_used_slotid) {
 326                slotid = find_last_bit(tbl->used_slots, tbl->max_slots);
 327                if (slotid >= 0 && slotid < tbl->max_slots)
 328                        tbl->highest_used_slotid = slotid;
 329                else
 330                        tbl->highest_used_slotid = -1;
 331        }
 332        rpc_wake_up_next(&tbl->slot_tbl_waitq);
 333        spin_unlock(&tbl->slot_tbl_lock);
 334        dprintk("%s: free_slotid %u highest_used_slotid %d\n", __func__,
 335                free_slotid, tbl->highest_used_slotid);
 336}
 337
 338void nfs41_sequence_free_slot(const struct nfs_client *clp,
 339                              struct nfs4_sequence_res *res)
 340{
 341        struct nfs4_slot_table *tbl;
 342
 343        if (!nfs4_has_session(clp)) {
 344                dprintk("%s: No session\n", __func__);
 345                return;
 346        }
 347        tbl = &clp->cl_session->fc_slot_table;
 348        if (res->sr_slotid == NFS4_MAX_SLOT_TABLE) {
 349                dprintk("%s: No slot\n", __func__);
 350                /* just wake up the next guy waiting since
 351                 * we may have not consumed a slot after all */
 352                rpc_wake_up_next(&tbl->slot_tbl_waitq);
 353                return;
 354        }
 355        nfs4_free_slot(tbl, res->sr_slotid);
 356        res->sr_slotid = NFS4_MAX_SLOT_TABLE;
 357}
 358
 359static void nfs41_sequence_done(struct nfs_client *clp,
 360                                struct nfs4_sequence_res *res,
 361                                int rpc_status)
 362{
 363        unsigned long timestamp;
 364        struct nfs4_slot_table *tbl;
 365        struct nfs4_slot *slot;
 366
 367        /*
 368         * sr_status remains 1 if an RPC level error occurred. The server
 369         * may or may not have processed the sequence operation..
 370         * Proceed as if the server received and processed the sequence
 371         * operation.
 372         */
 373        if (res->sr_status == 1)
 374                res->sr_status = NFS_OK;
 375
 376        /* -ERESTARTSYS can result in skipping nfs41_sequence_setup */
 377        if (res->sr_slotid == NFS4_MAX_SLOT_TABLE)
 378                goto out;
 379
 380        tbl = &clp->cl_session->fc_slot_table;
 381        slot = tbl->slots + res->sr_slotid;
 382
 383        if (res->sr_status == 0) {
 384                /* Update the slot's sequence and clientid lease timer */
 385                ++slot->seq_nr;
 386                timestamp = res->sr_renewal_time;
 387                spin_lock(&clp->cl_lock);
 388                if (time_before(clp->cl_last_renewal, timestamp))
 389                        clp->cl_last_renewal = timestamp;
 390                spin_unlock(&clp->cl_lock);
 391                return;
 392        }
 393out:
 394        /* The session may be reset by one of the error handlers. */
 395        dprintk("%s: Error %d free the slot \n", __func__, res->sr_status);
 396        nfs41_sequence_free_slot(clp, res);
 397}
 398
 399/*
 400 * nfs4_find_slot - efficiently look for a free slot
 401 *
 402 * nfs4_find_slot looks for an unset bit in the used_slots bitmap.
 403 * If found, we mark the slot as used, update the highest_used_slotid,
 404 * and respectively set up the sequence operation args.
 405 * The slot number is returned if found, or NFS4_MAX_SLOT_TABLE otherwise.
 406 *
 407 * Note: must be called with under the slot_tbl_lock.
 408 */
 409static u8
 410nfs4_find_slot(struct nfs4_slot_table *tbl, struct rpc_task *task)
 411{
 412        int slotid;
 413        u8 ret_id = NFS4_MAX_SLOT_TABLE;
 414        BUILD_BUG_ON((u8)NFS4_MAX_SLOT_TABLE != (int)NFS4_MAX_SLOT_TABLE);
 415
 416        dprintk("--> %s used_slots=%04lx highest_used=%d max_slots=%d\n",
 417                __func__, tbl->used_slots[0], tbl->highest_used_slotid,
 418                tbl->max_slots);
 419        slotid = find_first_zero_bit(tbl->used_slots, tbl->max_slots);
 420        if (slotid >= tbl->max_slots)
 421                goto out;
 422        __set_bit(slotid, tbl->used_slots);
 423        if (slotid > tbl->highest_used_slotid)
 424                tbl->highest_used_slotid = slotid;
 425        ret_id = slotid;
 426out:
 427        dprintk("<-- %s used_slots=%04lx highest_used=%d slotid=%d \n",
 428                __func__, tbl->used_slots[0], tbl->highest_used_slotid, ret_id);
 429        return ret_id;
 430}
 431
 432static int nfs4_recover_session(struct nfs4_session *session)
 433{
 434        struct nfs_client *clp = session->clp;
 435        unsigned int loop;
 436        int ret;
 437
 438        for (loop = NFS4_MAX_LOOP_ON_RECOVER; loop != 0; loop--) {
 439                ret = nfs4_wait_clnt_recover(clp);
 440                if (ret != 0)
 441                        break;
 442                if (!test_bit(NFS4CLNT_SESSION_SETUP, &clp->cl_state))
 443                        break;
 444                nfs4_schedule_state_manager(clp);
 445                ret = -EIO;
 446        }
 447        return ret;
 448}
 449
 450static int nfs41_setup_sequence(struct nfs4_session *session,
 451                                struct nfs4_sequence_args *args,
 452                                struct nfs4_sequence_res *res,
 453                                int cache_reply,
 454                                struct rpc_task *task)
 455{
 456        struct nfs4_slot *slot;
 457        struct nfs4_slot_table *tbl;
 458        int status = 0;
 459        u8 slotid;
 460
 461        dprintk("--> %s\n", __func__);
 462        /* slot already allocated? */
 463        if (res->sr_slotid != NFS4_MAX_SLOT_TABLE)
 464                return 0;
 465
 466        memset(res, 0, sizeof(*res));
 467        res->sr_slotid = NFS4_MAX_SLOT_TABLE;
 468        tbl = &session->fc_slot_table;
 469
 470        spin_lock(&tbl->slot_tbl_lock);
 471        if (test_bit(NFS4CLNT_SESSION_SETUP, &session->clp->cl_state)) {
 472                if (tbl->highest_used_slotid != -1) {
 473                        rpc_sleep_on(&tbl->slot_tbl_waitq, task, NULL);
 474                        spin_unlock(&tbl->slot_tbl_lock);
 475                        dprintk("<-- %s: Session reset: draining\n", __func__);
 476                        return -EAGAIN;
 477                }
 478
 479                /* The slot table is empty; start the reset thread */
 480                dprintk("%s Session Reset\n", __func__);
 481                spin_unlock(&tbl->slot_tbl_lock);
 482                status = nfs4_recover_session(session);
 483                if (status)
 484                        return status;
 485                spin_lock(&tbl->slot_tbl_lock);
 486        }
 487
 488        slotid = nfs4_find_slot(tbl, task);
 489        if (slotid == NFS4_MAX_SLOT_TABLE) {
 490                rpc_sleep_on(&tbl->slot_tbl_waitq, task, NULL);
 491                spin_unlock(&tbl->slot_tbl_lock);
 492                dprintk("<-- %s: no free slots\n", __func__);
 493                return -EAGAIN;
 494        }
 495        spin_unlock(&tbl->slot_tbl_lock);
 496
 497        slot = tbl->slots + slotid;
 498        args->sa_session = session;
 499        args->sa_slotid = slotid;
 500        args->sa_cache_this = cache_reply;
 501
 502        dprintk("<-- %s slotid=%d seqid=%d\n", __func__, slotid, slot->seq_nr);
 503
 504        res->sr_session = session;
 505        res->sr_slotid = slotid;
 506        res->sr_renewal_time = jiffies;
 507        /*
 508         * sr_status is only set in decode_sequence, and so will remain
 509         * set to 1 if an rpc level failure occurs.
 510         */
 511        res->sr_status = 1;
 512        return 0;
 513}
 514
 515int nfs4_setup_sequence(struct nfs_client *clp,
 516                        struct nfs4_sequence_args *args,
 517                        struct nfs4_sequence_res *res,
 518                        int cache_reply,
 519                        struct rpc_task *task)
 520{
 521        int ret = 0;
 522
 523        dprintk("--> %s clp %p session %p sr_slotid %d\n",
 524                __func__, clp, clp->cl_session, res->sr_slotid);
 525
 526        if (!nfs4_has_session(clp))
 527                goto out;
 528        ret = nfs41_setup_sequence(clp->cl_session, args, res, cache_reply,
 529                                   task);
 530        if (ret != -EAGAIN) {
 531                /* terminate rpc task */
 532                task->tk_status = ret;
 533                task->tk_action = NULL;
 534        }
 535out:
 536        dprintk("<-- %s status=%d\n", __func__, ret);
 537        return ret;
 538}
 539
 540struct nfs41_call_sync_data {
 541        struct nfs_client *clp;
 542        struct nfs4_sequence_args *seq_args;
 543        struct nfs4_sequence_res *seq_res;
 544        int cache_reply;
 545};
 546
 547static void nfs41_call_sync_prepare(struct rpc_task *task, void *calldata)
 548{
 549        struct nfs41_call_sync_data *data = calldata;
 550
 551        dprintk("--> %s data->clp->cl_session %p\n", __func__,
 552                data->clp->cl_session);
 553        if (nfs4_setup_sequence(data->clp, data->seq_args,
 554                                data->seq_res, data->cache_reply, task))
 555                return;
 556        rpc_call_start(task);
 557}
 558
 559static void nfs41_call_sync_done(struct rpc_task *task, void *calldata)
 560{
 561        struct nfs41_call_sync_data *data = calldata;
 562
 563        nfs41_sequence_done(data->clp, data->seq_res, task->tk_status);
 564        nfs41_sequence_free_slot(data->clp, data->seq_res);
 565}
 566
 567struct rpc_call_ops nfs41_call_sync_ops = {
 568        .rpc_call_prepare = nfs41_call_sync_prepare,
 569        .rpc_call_done = nfs41_call_sync_done,
 570};
 571
 572static int nfs4_call_sync_sequence(struct nfs_client *clp,
 573                                   struct rpc_clnt *clnt,
 574                                   struct rpc_message *msg,
 575                                   struct nfs4_sequence_args *args,
 576                                   struct nfs4_sequence_res *res,
 577                                   int cache_reply)
 578{
 579        int ret;
 580        struct rpc_task *task;
 581        struct nfs41_call_sync_data data = {
 582                .clp = clp,
 583                .seq_args = args,
 584                .seq_res = res,
 585                .cache_reply = cache_reply,
 586        };
 587        struct rpc_task_setup task_setup = {
 588                .rpc_client = clnt,
 589                .rpc_message = msg,
 590                .callback_ops = &nfs41_call_sync_ops,
 591                .callback_data = &data
 592        };
 593
 594        res->sr_slotid = NFS4_MAX_SLOT_TABLE;
 595        task = rpc_run_task(&task_setup);
 596        if (IS_ERR(task))
 597                ret = PTR_ERR(task);
 598        else {
 599                ret = task->tk_status;
 600                rpc_put_task(task);
 601        }
 602        return ret;
 603}
 604
 605int _nfs4_call_sync_session(struct nfs_server *server,
 606                            struct rpc_message *msg,
 607                            struct nfs4_sequence_args *args,
 608                            struct nfs4_sequence_res *res,
 609                            int cache_reply)
 610{
 611        return nfs4_call_sync_sequence(server->nfs_client, server->client,
 612                                       msg, args, res, cache_reply);
 613}
 614
 615#endif /* CONFIG_NFS_V4_1 */
 616
 617int _nfs4_call_sync(struct nfs_server *server,
 618                    struct rpc_message *msg,
 619                    struct nfs4_sequence_args *args,
 620                    struct nfs4_sequence_res *res,
 621                    int cache_reply)
 622{
 623        args->sa_session = res->sr_session = NULL;
 624        return rpc_call_sync(server->client, msg, 0);
 625}
 626
 627#define nfs4_call_sync(server, msg, args, res, cache_reply) \
 628        (server)->nfs_client->cl_call_sync((server), (msg), &(args)->seq_args, \
 629                        &(res)->seq_res, (cache_reply))
 630
 631static void nfs4_sequence_done(const struct nfs_server *server,
 632                               struct nfs4_sequence_res *res, int rpc_status)
 633{
 634#ifdef CONFIG_NFS_V4_1
 635        if (nfs4_has_session(server->nfs_client))
 636                nfs41_sequence_done(server->nfs_client, res, rpc_status);
 637#endif /* CONFIG_NFS_V4_1 */
 638}
 639
 640/* no restart, therefore free slot here */
 641static void nfs4_sequence_done_free_slot(const struct nfs_server *server,
 642                                         struct nfs4_sequence_res *res,
 643                                         int rpc_status)
 644{
 645        nfs4_sequence_done(server, res, rpc_status);
 646        nfs4_sequence_free_slot(server->nfs_client, res);
 647}
 648
 649static void update_changeattr(struct inode *dir, struct nfs4_change_info *cinfo)
 650{
 651        struct nfs_inode *nfsi = NFS_I(dir);
 652
 653        spin_lock(&dir->i_lock);
 654        nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA;
 655        if (!cinfo->atomic || cinfo->before != nfsi->change_attr)
 656                nfs_force_lookup_revalidate(dir);
 657        nfsi->change_attr = cinfo->after;
 658        spin_unlock(&dir->i_lock);
 659}
 660
 661struct nfs4_opendata {
 662        struct kref kref;
 663        struct nfs_openargs o_arg;
 664        struct nfs_openres o_res;
 665        struct nfs_open_confirmargs c_arg;
 666        struct nfs_open_confirmres c_res;
 667        struct nfs_fattr f_attr;
 668        struct nfs_fattr dir_attr;
 669        struct path path;
 670        struct dentry *dir;
 671        struct nfs4_state_owner *owner;
 672        struct nfs4_state *state;
 673        struct iattr attrs;
 674        unsigned long timestamp;
 675        unsigned int rpc_done : 1;
 676        int rpc_status;
 677        int cancelled;
 678};
 679
 680
 681static void nfs4_init_opendata_res(struct nfs4_opendata *p)
 682{
 683        p->o_res.f_attr = &p->f_attr;
 684        p->o_res.dir_attr = &p->dir_attr;
 685        p->o_res.seqid = p->o_arg.seqid;
 686        p->c_res.seqid = p->c_arg.seqid;
 687        p->o_res.server = p->o_arg.server;
 688        nfs_fattr_init(&p->f_attr);
 689        nfs_fattr_init(&p->dir_attr);
 690        p->o_res.seq_res.sr_slotid = NFS4_MAX_SLOT_TABLE;
 691}
 692
 693static struct nfs4_opendata *nfs4_opendata_alloc(struct path *path,
 694                struct nfs4_state_owner *sp, fmode_t fmode, int flags,
 695                const struct iattr *attrs)
 696{
 697        struct dentry *parent = dget_parent(path->dentry);
 698        struct inode *dir = parent->d_inode;
 699        struct nfs_server *server = NFS_SERVER(dir);
 700        struct nfs4_opendata *p;
 701
 702        p = kzalloc(sizeof(*p), GFP_KERNEL);
 703        if (p == NULL)
 704                goto err;
 705        p->o_arg.seqid = nfs_alloc_seqid(&sp->so_seqid);
 706        if (p->o_arg.seqid == NULL)
 707                goto err_free;
 708        p->path.mnt = mntget(path->mnt);
 709        p->path.dentry = dget(path->dentry);
 710        p->dir = parent;
 711        p->owner = sp;
 712        atomic_inc(&sp->so_count);
 713        p->o_arg.fh = NFS_FH(dir);
 714        p->o_arg.open_flags = flags;
 715        p->o_arg.fmode = fmode & (FMODE_READ|FMODE_WRITE);
 716        p->o_arg.clientid = server->nfs_client->cl_clientid;
 717        p->o_arg.id = sp->so_owner_id.id;
 718        p->o_arg.name = &p->path.dentry->d_name;
 719        p->o_arg.server = server;
 720        p->o_arg.bitmask = server->attr_bitmask;
 721        p->o_arg.claim = NFS4_OPEN_CLAIM_NULL;
 722        if (flags & O_EXCL) {
 723                u32 *s = (u32 *) p->o_arg.u.verifier.data;
 724                s[0] = jiffies;
 725                s[1] = current->pid;
 726        } else if (flags & O_CREAT) {
 727                p->o_arg.u.attrs = &p->attrs;
 728                memcpy(&p->attrs, attrs, sizeof(p->attrs));
 729        }
 730        p->c_arg.fh = &p->o_res.fh;
 731        p->c_arg.stateid = &p->o_res.stateid;
 732        p->c_arg.seqid = p->o_arg.seqid;
 733        nfs4_init_opendata_res(p);
 734        kref_init(&p->kref);
 735        return p;
 736err_free:
 737        kfree(p);
 738err:
 739        dput(parent);
 740        return NULL;
 741}
 742
 743static void nfs4_opendata_free(struct kref *kref)
 744{
 745        struct nfs4_opendata *p = container_of(kref,
 746                        struct nfs4_opendata, kref);
 747
 748        nfs_free_seqid(p->o_arg.seqid);
 749        if (p->state != NULL)
 750                nfs4_put_open_state(p->state);
 751        nfs4_put_state_owner(p->owner);
 752        dput(p->dir);
 753        path_put(&p->path);
 754        kfree(p);
 755}
 756
 757static void nfs4_opendata_put(struct nfs4_opendata *p)
 758{
 759        if (p != NULL)
 760                kref_put(&p->kref, nfs4_opendata_free);
 761}
 762
 763static int nfs4_wait_for_completion_rpc_task(struct rpc_task *task)
 764{
 765        int ret;
 766
 767        ret = rpc_wait_for_completion_task(task);
 768        return ret;
 769}
 770
 771static int can_open_cached(struct nfs4_state *state, fmode_t mode, int open_mode)
 772{
 773        int ret = 0;
 774
 775        if (open_mode & O_EXCL)
 776                goto out;
 777        switch (mode & (FMODE_READ|FMODE_WRITE)) {
 778                case FMODE_READ:
 779                        ret |= test_bit(NFS_O_RDONLY_STATE, &state->flags) != 0;
 780                        break;
 781                case FMODE_WRITE:
 782                        ret |= test_bit(NFS_O_WRONLY_STATE, &state->flags) != 0;
 783                        break;
 784                case FMODE_READ|FMODE_WRITE:
 785                        ret |= test_bit(NFS_O_RDWR_STATE, &state->flags) != 0;
 786        }
 787out:
 788        return ret;
 789}
 790
 791static int can_open_delegated(struct nfs_delegation *delegation, fmode_t fmode)
 792{
 793        if ((delegation->type & fmode) != fmode)
 794                return 0;
 795        if (test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags))
 796                return 0;
 797        nfs_mark_delegation_referenced(delegation);
 798        return 1;
 799}
 800
 801static void update_open_stateflags(struct nfs4_state *state, fmode_t fmode)
 802{
 803        switch (fmode) {
 804                case FMODE_WRITE:
 805                        state->n_wronly++;
 806                        break;
 807                case FMODE_READ:
 808                        state->n_rdonly++;
 809                        break;
 810                case FMODE_READ|FMODE_WRITE:
 811                        state->n_rdwr++;
 812        }
 813        nfs4_state_set_mode_locked(state, state->state | fmode);
 814}
 815
 816static void nfs_set_open_stateid_locked(struct nfs4_state *state, nfs4_stateid *stateid, fmode_t fmode)
 817{
 818        if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0)
 819                memcpy(state->stateid.data, stateid->data, sizeof(state->stateid.data));
 820        memcpy(state->open_stateid.data, stateid->data, sizeof(state->open_stateid.data));
 821        switch (fmode) {
 822                case FMODE_READ:
 823                        set_bit(NFS_O_RDONLY_STATE, &state->flags);
 824                        break;
 825                case FMODE_WRITE:
 826                        set_bit(NFS_O_WRONLY_STATE, &state->flags);
 827                        break;
 828                case FMODE_READ|FMODE_WRITE:
 829                        set_bit(NFS_O_RDWR_STATE, &state->flags);
 830        }
 831}
 832
 833static void nfs_set_open_stateid(struct nfs4_state *state, nfs4_stateid *stateid, fmode_t fmode)
 834{
 835        write_seqlock(&state->seqlock);
 836        nfs_set_open_stateid_locked(state, stateid, fmode);
 837        write_sequnlock(&state->seqlock);
 838}
 839
 840static void __update_open_stateid(struct nfs4_state *state, nfs4_stateid *open_stateid, const nfs4_stateid *deleg_stateid, fmode_t fmode)
 841{
 842        /*
 843         * Protect the call to nfs4_state_set_mode_locked and
 844         * serialise the stateid update
 845         */
 846        write_seqlock(&state->seqlock);
 847        if (deleg_stateid != NULL) {
 848                memcpy(state->stateid.data, deleg_stateid->data, sizeof(state->stateid.data));
 849                set_bit(NFS_DELEGATED_STATE, &state->flags);
 850        }
 851        if (open_stateid != NULL)
 852                nfs_set_open_stateid_locked(state, open_stateid, fmode);
 853        write_sequnlock(&state->seqlock);
 854        spin_lock(&state->owner->so_lock);
 855        update_open_stateflags(state, fmode);
 856        spin_unlock(&state->owner->so_lock);
 857}
 858
 859static int update_open_stateid(struct nfs4_state *state, nfs4_stateid *open_stateid, nfs4_stateid *delegation, fmode_t fmode)
 860{
 861        struct nfs_inode *nfsi = NFS_I(state->inode);
 862        struct nfs_delegation *deleg_cur;
 863        int ret = 0;
 864
 865        fmode &= (FMODE_READ|FMODE_WRITE);
 866
 867        rcu_read_lock();
 868        deleg_cur = rcu_dereference(nfsi->delegation);
 869        if (deleg_cur == NULL)
 870                goto no_delegation;
 871
 872        spin_lock(&deleg_cur->lock);
 873        if (nfsi->delegation != deleg_cur ||
 874            (deleg_cur->type & fmode) != fmode)
 875                goto no_delegation_unlock;
 876
 877        if (delegation == NULL)
 878                delegation = &deleg_cur->stateid;
 879        else if (memcmp(deleg_cur->stateid.data, delegation->data, NFS4_STATEID_SIZE) != 0)
 880                goto no_delegation_unlock;
 881
 882        nfs_mark_delegation_referenced(deleg_cur);
 883        __update_open_stateid(state, open_stateid, &deleg_cur->stateid, fmode);
 884        ret = 1;
 885no_delegation_unlock:
 886        spin_unlock(&deleg_cur->lock);
 887no_delegation:
 888        rcu_read_unlock();
 889
 890        if (!ret && open_stateid != NULL) {
 891                __update_open_stateid(state, open_stateid, NULL, fmode);
 892                ret = 1;
 893        }
 894
 895        return ret;
 896}
 897
 898
 899static void nfs4_return_incompatible_delegation(struct inode *inode, fmode_t fmode)
 900{
 901        struct nfs_delegation *delegation;
 902
 903        rcu_read_lock();
 904        delegation = rcu_dereference(NFS_I(inode)->delegation);
 905        if (delegation == NULL || (delegation->type & fmode) == fmode) {
 906                rcu_read_unlock();
 907                return;
 908        }
 909        rcu_read_unlock();
 910        nfs_inode_return_delegation(inode);
 911}
 912
 913static struct nfs4_state *nfs4_try_open_cached(struct nfs4_opendata *opendata)
 914{
 915        struct nfs4_state *state = opendata->state;
 916        struct nfs_inode *nfsi = NFS_I(state->inode);
 917        struct nfs_delegation *delegation;
 918        int open_mode = opendata->o_arg.open_flags & O_EXCL;
 919        fmode_t fmode = opendata->o_arg.fmode;
 920        nfs4_stateid stateid;
 921        int ret = -EAGAIN;
 922
 923        for (;;) {
 924                if (can_open_cached(state, fmode, open_mode)) {
 925                        spin_lock(&state->owner->so_lock);
 926                        if (can_open_cached(state, fmode, open_mode)) {
 927                                update_open_stateflags(state, fmode);
 928                                spin_unlock(&state->owner->so_lock);
 929                                goto out_return_state;
 930                        }
 931                        spin_unlock(&state->owner->so_lock);
 932                }
 933                rcu_read_lock();
 934                delegation = rcu_dereference(nfsi->delegation);
 935                if (delegation == NULL ||
 936                    !can_open_delegated(delegation, fmode)) {
 937                        rcu_read_unlock();
 938                        break;
 939                }
 940                /* Save the delegation */
 941                memcpy(stateid.data, delegation->stateid.data, sizeof(stateid.data));
 942                rcu_read_unlock();
 943                ret = nfs_may_open(state->inode, state->owner->so_cred, open_mode);
 944                if (ret != 0)
 945                        goto out;
 946                ret = -EAGAIN;
 947
 948                /* Try to update the stateid using the delegation */
 949                if (update_open_stateid(state, NULL, &stateid, fmode))
 950                        goto out_return_state;
 951        }
 952out:
 953        return ERR_PTR(ret);
 954out_return_state:
 955        atomic_inc(&state->count);
 956        return state;
 957}
 958
 959static struct nfs4_state *nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data)
 960{
 961        struct inode *inode;
 962        struct nfs4_state *state = NULL;
 963        struct nfs_delegation *delegation;
 964        int ret;
 965
 966        if (!data->rpc_done) {
 967                state = nfs4_try_open_cached(data);
 968                goto out;
 969        }
 970
 971        ret = -EAGAIN;
 972        if (!(data->f_attr.valid & NFS_ATTR_FATTR))
 973                goto err;
 974        inode = nfs_fhget(data->dir->d_sb, &data->o_res.fh, &data->f_attr);
 975        ret = PTR_ERR(inode);
 976        if (IS_ERR(inode))
 977                goto err;
 978        ret = -ENOMEM;
 979        state = nfs4_get_open_state(inode, data->owner);
 980        if (state == NULL)
 981                goto err_put_inode;
 982        if (data->o_res.delegation_type != 0) {
 983                int delegation_flags = 0;
 984
 985                rcu_read_lock();
 986                delegation = rcu_dereference(NFS_I(inode)->delegation);
 987                if (delegation)
 988                        delegation_flags = delegation->flags;
 989                rcu_read_unlock();
 990                if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0)
 991                        nfs_inode_set_delegation(state->inode,
 992                                        data->owner->so_cred,
 993                                        &data->o_res);
 994                else
 995                        nfs_inode_reclaim_delegation(state->inode,
 996                                        data->owner->so_cred,
 997                                        &data->o_res);
 998        }
 999
1000        update_open_stateid(state, &data->o_res.stateid, NULL,
1001                        data->o_arg.fmode);
1002        iput(inode);
1003out:
1004        return state;
1005err_put_inode:
1006        iput(inode);
1007err:
1008        return ERR_PTR(ret);
1009}
1010
1011static struct nfs_open_context *nfs4_state_find_open_context(struct nfs4_state *state)
1012{
1013        struct nfs_inode *nfsi = NFS_I(state->inode);
1014        struct nfs_open_context *ctx;
1015
1016        spin_lock(&state->inode->i_lock);
1017        list_for_each_entry(ctx, &nfsi->open_files, list) {
1018                if (ctx->state != state)
1019                        continue;
1020                get_nfs_open_context(ctx);
1021                spin_unlock(&state->inode->i_lock);
1022                return ctx;
1023        }
1024        spin_unlock(&state->inode->i_lock);
1025        return ERR_PTR(-ENOENT);
1026}
1027
1028static struct nfs4_opendata *nfs4_open_recoverdata_alloc(struct nfs_open_context *ctx, struct nfs4_state *state)
1029{
1030        struct nfs4_opendata *opendata;
1031
1032        opendata = nfs4_opendata_alloc(&ctx->path, state->owner, 0, 0, NULL);
1033        if (opendata == NULL)
1034                return ERR_PTR(-ENOMEM);
1035        opendata->state = state;
1036        atomic_inc(&state->count);
1037        return opendata;
1038}
1039
1040static int nfs4_open_recover_helper(struct nfs4_opendata *opendata, fmode_t fmode, struct nfs4_state **res)
1041{
1042        struct nfs4_state *newstate;
1043        int ret;
1044
1045        opendata->o_arg.open_flags = 0;
1046        opendata->o_arg.fmode = fmode;
1047        memset(&opendata->o_res, 0, sizeof(opendata->o_res));
1048        memset(&opendata->c_res, 0, sizeof(opendata->c_res));
1049        nfs4_init_opendata_res(opendata);
1050        ret = _nfs4_proc_open(opendata);
1051        if (ret != 0)
1052                return ret; 
1053        newstate = nfs4_opendata_to_nfs4_state(opendata);
1054        if (IS_ERR(newstate))
1055                return PTR_ERR(newstate);
1056        nfs4_close_state(&opendata->path, newstate, fmode);
1057        *res = newstate;
1058        return 0;
1059}
1060
1061static int nfs4_open_recover(struct nfs4_opendata *opendata, struct nfs4_state *state)
1062{
1063        struct nfs4_state *newstate;
1064        int ret;
1065
1066        /* memory barrier prior to reading state->n_* */
1067        clear_bit(NFS_DELEGATED_STATE, &state->flags);
1068        smp_rmb();
1069        if (state->n_rdwr != 0) {
1070                ret = nfs4_open_recover_helper(opendata, FMODE_READ|FMODE_WRITE, &newstate);
1071                if (ret != 0)
1072                        return ret;
1073                if (newstate != state)
1074                        return -ESTALE;
1075        }
1076        if (state->n_wronly != 0) {
1077                ret = nfs4_open_recover_helper(opendata, FMODE_WRITE, &newstate);
1078                if (ret != 0)
1079                        return ret;
1080                if (newstate != state)
1081                        return -ESTALE;
1082        }
1083        if (state->n_rdonly != 0) {
1084                ret = nfs4_open_recover_helper(opendata, FMODE_READ, &newstate);
1085                if (ret != 0)
1086                        return ret;
1087                if (newstate != state)
1088                        return -ESTALE;
1089        }
1090        /*
1091         * We may have performed cached opens for all three recoveries.
1092         * Check if we need to update the current stateid.
1093         */
1094        if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0 &&
1095            memcmp(state->stateid.data, state->open_stateid.data, sizeof(state->stateid.data)) != 0) {
1096                write_seqlock(&state->seqlock);
1097                if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0)
1098                        memcpy(state->stateid.data, state->open_stateid.data, sizeof(state->stateid.data));
1099                write_sequnlock(&state->seqlock);
1100        }
1101        return 0;
1102}
1103
1104/*
1105 * OPEN_RECLAIM:
1106 *      reclaim state on the server after a reboot.
1107 */
1108static int _nfs4_do_open_reclaim(struct nfs_open_context *ctx, struct nfs4_state *state)
1109{
1110        struct nfs_delegation *delegation;
1111        struct nfs4_opendata *opendata;
1112        fmode_t delegation_type = 0;
1113        int status;
1114
1115        opendata = nfs4_open_recoverdata_alloc(ctx, state);
1116        if (IS_ERR(opendata))
1117                return PTR_ERR(opendata);
1118        opendata->o_arg.claim = NFS4_OPEN_CLAIM_PREVIOUS;
1119        opendata->o_arg.fh = NFS_FH(state->inode);
1120        rcu_read_lock();
1121        delegation = rcu_dereference(NFS_I(state->inode)->delegation);
1122        if (delegation != NULL && test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags) != 0)
1123                delegation_type = delegation->type;
1124        rcu_read_unlock();
1125        opendata->o_arg.u.delegation_type = delegation_type;
1126        status = nfs4_open_recover(opendata, state);
1127        nfs4_opendata_put(opendata);
1128        return status;
1129}
1130
1131static int nfs4_do_open_reclaim(struct nfs_open_context *ctx, struct nfs4_state *state)
1132{
1133        struct nfs_server *server = NFS_SERVER(state->inode);
1134        struct nfs4_exception exception = { };
1135        int err;
1136        do {
1137                err = _nfs4_do_open_reclaim(ctx, state);
1138                if (err != -NFS4ERR_DELAY)
1139                        break;
1140                nfs4_handle_exception(server, err, &exception);
1141        } while (exception.retry);
1142        return err;
1143}
1144
1145static int nfs4_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *state)
1146{
1147        struct nfs_open_context *ctx;
1148        int ret;
1149
1150        ctx = nfs4_state_find_open_context(state);
1151        if (IS_ERR(ctx))
1152                return PTR_ERR(ctx);
1153        ret = nfs4_do_open_reclaim(ctx, state);
1154        put_nfs_open_context(ctx);
1155        return ret;
1156}
1157
1158static int _nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid)
1159{
1160        struct nfs4_opendata *opendata;
1161        int ret;
1162
1163        opendata = nfs4_open_recoverdata_alloc(ctx, state);
1164        if (IS_ERR(opendata))
1165                return PTR_ERR(opendata);
1166        opendata->o_arg.claim = NFS4_OPEN_CLAIM_DELEGATE_CUR;
1167        memcpy(opendata->o_arg.u.delegation.data, stateid->data,
1168                        sizeof(opendata->o_arg.u.delegation.data));
1169        ret = nfs4_open_recover(opendata, state);
1170        nfs4_opendata_put(opendata);
1171        return ret;
1172}
1173
1174int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid)
1175{
1176        struct nfs4_exception exception = { };
1177        struct nfs_server *server = NFS_SERVER(state->inode);
1178        int err;
1179        do {
1180                err = _nfs4_open_delegation_recall(ctx, state, stateid);
1181                switch (err) {
1182                        case 0:
1183                        case -ENOENT:
1184                        case -ESTALE:
1185                                goto out;
1186                        case -NFS4ERR_STALE_CLIENTID:
1187                        case -NFS4ERR_STALE_STATEID:
1188                        case -NFS4ERR_EXPIRED:
1189                                /* Don't recall a delegation if it was lost */
1190                                nfs4_schedule_state_recovery(server->nfs_client);
1191                                goto out;
1192                        case -ERESTARTSYS:
1193                                /*
1194                                 * The show must go on: exit, but mark the
1195                                 * stateid as needing recovery.
1196                                 */
1197                        case -NFS4ERR_ADMIN_REVOKED:
1198                        case -NFS4ERR_BAD_STATEID:
1199                                nfs4_state_mark_reclaim_nograce(server->nfs_client, state);
1200                        case -ENOMEM:
1201                                err = 0;
1202                                goto out;
1203                }
1204                err = nfs4_handle_exception(server, err, &exception);
1205        } while (exception.retry);
1206out:
1207        return err;
1208}
1209
1210static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata)
1211{
1212        struct nfs4_opendata *data = calldata;
1213
1214        data->rpc_status = task->tk_status;
1215        if (RPC_ASSASSINATED(task))
1216                return;
1217        if (data->rpc_status == 0) {
1218                memcpy(data->o_res.stateid.data, data->c_res.stateid.data,
1219                                sizeof(data->o_res.stateid.data));
1220                nfs_confirm_seqid(&data->owner->so_seqid, 0);
1221                renew_lease(data->o_res.server, data->timestamp);
1222                data->rpc_done = 1;
1223        }
1224}
1225
1226static void nfs4_open_confirm_release(void *calldata)
1227{
1228        struct nfs4_opendata *data = calldata;
1229        struct nfs4_state *state = NULL;
1230
1231        /* If this request hasn't been cancelled, do nothing */
1232        if (data->cancelled == 0)
1233                goto out_free;
1234        /* In case of error, no cleanup! */
1235        if (!data->rpc_done)
1236                goto out_free;
1237        state = nfs4_opendata_to_nfs4_state(data);
1238        if (!IS_ERR(state))
1239                nfs4_close_state(&data->path, state, data->o_arg.fmode);
1240out_free:
1241        nfs4_opendata_put(data);
1242}
1243
1244static const struct rpc_call_ops nfs4_open_confirm_ops = {
1245        .rpc_call_done = nfs4_open_confirm_done,
1246        .rpc_release = nfs4_open_confirm_release,
1247};
1248
1249/*
1250 * Note: On error, nfs4_proc_open_confirm will free the struct nfs4_opendata
1251 */
1252static int _nfs4_proc_open_confirm(struct nfs4_opendata *data)
1253{
1254        struct nfs_server *server = NFS_SERVER(data->dir->d_inode);
1255        struct rpc_task *task;
1256        struct  rpc_message msg = {
1257                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_CONFIRM],
1258                .rpc_argp = &data->c_arg,
1259                .rpc_resp = &data->c_res,
1260                .rpc_cred = data->owner->so_cred,
1261        };
1262        struct rpc_task_setup task_setup_data = {
1263                .rpc_client = server->client,
1264                .rpc_message = &msg,
1265                .callback_ops = &nfs4_open_confirm_ops,
1266                .callback_data = data,
1267                .workqueue = nfsiod_workqueue,
1268                .flags = RPC_TASK_ASYNC,
1269        };
1270        int status;
1271
1272        kref_get(&data->kref);
1273        data->rpc_done = 0;
1274        data->rpc_status = 0;
1275        data->timestamp = jiffies;
1276        task = rpc_run_task(&task_setup_data);
1277        if (IS_ERR(task))
1278                return PTR_ERR(task);
1279        status = nfs4_wait_for_completion_rpc_task(task);
1280        if (status != 0) {
1281                data->cancelled = 1;
1282                smp_wmb();
1283        } else
1284                status = data->rpc_status;
1285        rpc_put_task(task);
1286        return status;
1287}
1288
1289static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
1290{
1291        struct nfs4_opendata *data = calldata;
1292        struct nfs4_state_owner *sp = data->owner;
1293
1294        if (nfs_wait_on_sequence(data->o_arg.seqid, task) != 0)
1295                return;
1296        /*
1297         * Check if we still need to send an OPEN call, or if we can use
1298         * a delegation instead.
1299         */
1300        if (data->state != NULL) {
1301                struct nfs_delegation *delegation;
1302
1303                if (can_open_cached(data->state, data->o_arg.fmode, data->o_arg.open_flags))
1304                        goto out_no_action;
1305                rcu_read_lock();
1306                delegation = rcu_dereference(NFS_I(data->state->inode)->delegation);
1307                if (delegation != NULL &&
1308                    test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags) == 0) {
1309                        rcu_read_unlock();
1310                        goto out_no_action;
1311                }
1312                rcu_read_unlock();
1313        }
1314        /* Update sequence id. */
1315        data->o_arg.id = sp->so_owner_id.id;
1316        data->o_arg.clientid = sp->so_client->cl_clientid;
1317        if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS) {
1318                task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR];
1319                nfs_copy_fh(&data->o_res.fh, data->o_arg.fh);
1320        }
1321        data->timestamp = jiffies;
1322        if (nfs4_setup_sequence(data->o_arg.server->nfs_client,
1323                                &data->o_arg.seq_args,
1324                                &data->o_res.seq_res, 1, task))
1325                return;
1326        rpc_call_start(task);
1327        return;
1328out_no_action:
1329        task->tk_action = NULL;
1330
1331}
1332
1333static void nfs4_open_done(struct rpc_task *task, void *calldata)
1334{
1335        struct nfs4_opendata *data = calldata;
1336
1337        data->rpc_status = task->tk_status;
1338
1339        nfs4_sequence_done_free_slot(data->o_arg.server, &data->o_res.seq_res,
1340                                     task->tk_status);
1341
1342        if (RPC_ASSASSINATED(task))
1343                return;
1344        if (task->tk_status == 0) {
1345                switch (data->o_res.f_attr->mode & S_IFMT) {
1346                        case S_IFREG:
1347                                break;
1348                        case S_IFLNK:
1349                                data->rpc_status = -ELOOP;
1350                                break;
1351                        case S_IFDIR:
1352                                data->rpc_status = -EISDIR;
1353                                break;
1354                        default:
1355                                data->rpc_status = -ENOTDIR;
1356                }
1357                renew_lease(data->o_res.server, data->timestamp);
1358                if (!(data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM))
1359                        nfs_confirm_seqid(&data->owner->so_seqid, 0);
1360        }
1361        data->rpc_done = 1;
1362}
1363
1364static void nfs4_open_release(void *calldata)
1365{
1366        struct nfs4_opendata *data = calldata;
1367        struct nfs4_state *state = NULL;
1368
1369        /* If this request hasn't been cancelled, do nothing */
1370        if (data->cancelled == 0)
1371                goto out_free;
1372        /* In case of error, no cleanup! */
1373        if (data->rpc_status != 0 || !data->rpc_done)
1374                goto out_free;
1375        /* In case we need an open_confirm, no cleanup! */
1376        if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM)
1377                goto out_free;
1378        state = nfs4_opendata_to_nfs4_state(data);
1379        if (!IS_ERR(state))
1380                nfs4_close_state(&data->path, state, data->o_arg.fmode);
1381out_free:
1382        nfs4_opendata_put(data);
1383}
1384
1385static const struct rpc_call_ops nfs4_open_ops = {
1386        .rpc_call_prepare = nfs4_open_prepare,
1387        .rpc_call_done = nfs4_open_done,
1388        .rpc_release = nfs4_open_release,
1389};
1390
1391/*
1392 * Note: On error, nfs4_proc_open will free the struct nfs4_opendata
1393 */
1394static int _nfs4_proc_open(struct nfs4_opendata *data)
1395{
1396        struct inode *dir = data->dir->d_inode;
1397        struct nfs_server *server = NFS_SERVER(dir);
1398        struct nfs_openargs *o_arg = &data->o_arg;
1399        struct nfs_openres *o_res = &data->o_res;
1400        struct rpc_task *task;
1401        struct rpc_message msg = {
1402                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN],
1403                .rpc_argp = o_arg,
1404                .rpc_resp = o_res,
1405                .rpc_cred = data->owner->so_cred,
1406        };
1407        struct rpc_task_setup task_setup_data = {
1408                .rpc_client = server->client,
1409                .rpc_message = &msg,
1410                .callback_ops = &nfs4_open_ops,
1411                .callback_data = data,
1412                .workqueue = nfsiod_workqueue,
1413                .flags = RPC_TASK_ASYNC,
1414        };
1415        int status;
1416
1417        kref_get(&data->kref);
1418        data->rpc_done = 0;
1419        data->rpc_status = 0;
1420        data->cancelled = 0;
1421        task = rpc_run_task(&task_setup_data);
1422        if (IS_ERR(task))
1423                return PTR_ERR(task);
1424        status = nfs4_wait_for_completion_rpc_task(task);
1425        if (status != 0) {
1426                data->cancelled = 1;
1427                smp_wmb();
1428        } else
1429                status = data->rpc_status;
1430        rpc_put_task(task);
1431        if (status != 0 || !data->rpc_done)
1432                return status;
1433
1434        if (o_res->fh.size == 0)
1435                _nfs4_proc_lookup(dir, o_arg->name, &o_res->fh, o_res->f_attr);
1436
1437        if (o_arg->open_flags & O_CREAT) {
1438                update_changeattr(dir, &o_res->cinfo);
1439                nfs_post_op_update_inode(dir, o_res->dir_attr);
1440        } else
1441                nfs_refresh_inode(dir, o_res->dir_attr);
1442        if(o_res->rflags & NFS4_OPEN_RESULT_CONFIRM) {
1443                status = _nfs4_proc_open_confirm(data);
1444                if (status != 0)
1445                        return status;
1446        }
1447        if (!(o_res->f_attr->valid & NFS_ATTR_FATTR))
1448                _nfs4_proc_getattr(server, &o_res->fh, o_res->f_attr);
1449        return 0;
1450}
1451
1452static int nfs4_recover_expired_lease(struct nfs_server *server)
1453{
1454        struct nfs_client *clp = server->nfs_client;
1455        unsigned int loop;
1456        int ret;
1457
1458        for (loop = NFS4_MAX_LOOP_ON_RECOVER; loop != 0; loop--) {
1459                ret = nfs4_wait_clnt_recover(clp);
1460                if (ret != 0)
1461                        break;
1462                if (!test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) &&
1463                    !test_bit(NFS4CLNT_CHECK_LEASE,&clp->cl_state))
1464                        break;
1465                nfs4_schedule_state_recovery(clp);
1466                ret = -EIO;
1467        }
1468        return ret;
1469}
1470
1471/*
1472 * OPEN_EXPIRED:
1473 *      reclaim state on the server after a network partition.
1474 *      Assumes caller holds the appropriate lock
1475 */
1476static int _nfs4_open_expired(struct nfs_open_context *ctx, struct nfs4_state *state)
1477{
1478        struct nfs4_opendata *opendata;
1479        int ret;
1480
1481        opendata = nfs4_open_recoverdata_alloc(ctx, state);
1482        if (IS_ERR(opendata))
1483                return PTR_ERR(opendata);
1484        ret = nfs4_open_recover(opendata, state);
1485        if (ret == -ESTALE)
1486                d_drop(ctx->path.dentry);
1487        nfs4_opendata_put(opendata);
1488        return ret;
1489}
1490
1491static inline int nfs4_do_open_expired(struct nfs_open_context *ctx, struct nfs4_state *state)
1492{
1493        struct nfs_server *server = NFS_SERVER(state->inode);
1494        struct nfs4_exception exception = { };
1495        int err;
1496
1497        do {
1498                err = _nfs4_open_expired(ctx, state);
1499                if (err != -NFS4ERR_DELAY)
1500                        break;
1501                nfs4_handle_exception(server, err, &exception);
1502        } while (exception.retry);
1503        return err;
1504}
1505
1506static int nfs4_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state)
1507{
1508        struct nfs_open_context *ctx;
1509        int ret;
1510
1511        ctx = nfs4_state_find_open_context(state);
1512        if (IS_ERR(ctx))
1513                return PTR_ERR(ctx);
1514        ret = nfs4_do_open_expired(ctx, state);
1515        put_nfs_open_context(ctx);
1516        return ret;
1517}
1518
1519/*
1520 * on an EXCLUSIVE create, the server should send back a bitmask with FATTR4-*
1521 * fields corresponding to attributes that were used to store the verifier.
1522 * Make sure we clobber those fields in the later setattr call
1523 */
1524static inline void nfs4_exclusive_attrset(struct nfs4_opendata *opendata, struct iattr *sattr)
1525{
1526        if ((opendata->o_res.attrset[1] & FATTR4_WORD1_TIME_ACCESS) &&
1527            !(sattr->ia_valid & ATTR_ATIME_SET))
1528                sattr->ia_valid |= ATTR_ATIME;
1529
1530        if ((opendata->o_res.attrset[1] & FATTR4_WORD1_TIME_MODIFY) &&
1531            !(sattr->ia_valid & ATTR_MTIME_SET))
1532                sattr->ia_valid |= ATTR_MTIME;
1533}
1534
1535/*
1536 * Returns a referenced nfs4_state
1537 */
1538static int _nfs4_do_open(struct inode *dir, struct path *path, fmode_t fmode, int flags, struct iattr *sattr, struct rpc_cred *cred, struct nfs4_state **res)
1539{
1540        struct nfs4_state_owner  *sp;
1541        struct nfs4_state     *state = NULL;
1542        struct nfs_server       *server = NFS_SERVER(dir);
1543        struct nfs4_opendata *opendata;
1544        int status;
1545
1546        /* Protect against reboot recovery conflicts */
1547        status = -ENOMEM;
1548        if (!(sp = nfs4_get_state_owner(server, cred))) {
1549                dprintk("nfs4_do_open: nfs4_get_state_owner failed!\n");
1550                goto out_err;
1551        }
1552        status = nfs4_recover_expired_lease(server);
1553        if (status != 0)
1554                goto err_put_state_owner;
1555        if (path->dentry->d_inode != NULL)
1556                nfs4_return_incompatible_delegation(path->dentry->d_inode, fmode);
1557        status = -ENOMEM;
1558        opendata = nfs4_opendata_alloc(path, sp, fmode, flags, sattr);
1559        if (opendata == NULL)
1560                goto err_put_state_owner;
1561
1562        if (path->dentry->d_inode != NULL)
1563                opendata->state = nfs4_get_open_state(path->dentry->d_inode, sp);
1564
1565        status = _nfs4_proc_open(opendata);
1566        if (status != 0)
1567                goto err_opendata_put;
1568
1569        if (opendata->o_arg.open_flags & O_EXCL)
1570                nfs4_exclusive_attrset(opendata, sattr);
1571
1572        state = nfs4_opendata_to_nfs4_state(opendata);
1573        status = PTR_ERR(state);
1574        if (IS_ERR(state))
1575                goto err_opendata_put;
1576        nfs4_opendata_put(opendata);
1577        nfs4_put_state_owner(sp);
1578        *res = state;
1579        return 0;
1580err_opendata_put:
1581        nfs4_opendata_put(opendata);
1582err_put_state_owner:
1583        nfs4_put_state_owner(sp);
1584out_err:
1585        *res = NULL;
1586        return status;
1587}
1588
1589
1590static struct nfs4_state *nfs4_do_open(struct inode *dir, struct path *path, fmode_t fmode, int flags, struct iattr *sattr, struct rpc_cred *cred)
1591{
1592        struct nfs4_exception exception = { };
1593        struct nfs4_state *res;
1594        int status;
1595
1596        do {
1597                status = _nfs4_do_open(dir, path, fmode, flags, sattr, cred, &res);
1598                if (status == 0)
1599                        break;
1600                /* NOTE: BAD_SEQID means the server and client disagree about the
1601                 * book-keeping w.r.t. state-changing operations
1602                 * (OPEN/CLOSE/LOCK/LOCKU...)
1603                 * It is actually a sign of a bug on the client or on the server.
1604                 *
1605                 * If we receive a BAD_SEQID error in the particular case of
1606                 * doing an OPEN, we assume that nfs_increment_open_seqid() will
1607                 * have unhashed the old state_owner for us, and that we can
1608                 * therefore safely retry using a new one. We should still warn
1609                 * the user though...
1610                 */
1611                if (status == -NFS4ERR_BAD_SEQID) {
1612                        printk(KERN_WARNING "NFS: v4 server %s "
1613                                        " returned a bad sequence-id error!\n",
1614                                        NFS_SERVER(dir)->nfs_client->cl_hostname);
1615                        exception.retry = 1;
1616                        continue;
1617                }
1618                /*
1619                 * BAD_STATEID on OPEN means that the server cancelled our
1620                 * state before it received the OPEN_CONFIRM.
1621                 * Recover by retrying the request as per the discussion
1622                 * on Page 181 of RFC3530.
1623                 */
1624                if (status == -NFS4ERR_BAD_STATEID) {
1625                        exception.retry = 1;
1626                        continue;
1627                }
1628                if (status == -EAGAIN) {
1629                        /* We must have found a delegation */
1630                        exception.retry = 1;
1631                        continue;
1632                }
1633                res = ERR_PTR(nfs4_handle_exception(NFS_SERVER(dir),
1634                                        status, &exception));
1635        } while (exception.retry);
1636        return res;
1637}
1638
1639static int _nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
1640                            struct nfs_fattr *fattr, struct iattr *sattr,
1641                            struct nfs4_state *state)
1642{
1643        struct nfs_server *server = NFS_SERVER(inode);
1644        struct nfs_setattrargs  arg = {
1645                .fh             = NFS_FH(inode),
1646                .iap            = sattr,
1647                .server         = server,
1648                .bitmask = server->attr_bitmask,
1649        };
1650        struct nfs_setattrres  res = {
1651                .fattr          = fattr,
1652                .server         = server,
1653        };
1654        struct rpc_message msg = {
1655                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_SETATTR],
1656                .rpc_argp       = &arg,
1657                .rpc_resp       = &res,
1658                .rpc_cred       = cred,
1659        };
1660        unsigned long timestamp = jiffies;
1661        int status;
1662
1663        nfs_fattr_init(fattr);
1664
1665        if (nfs4_copy_delegation_stateid(&arg.stateid, inode)) {
1666                /* Use that stateid */
1667        } else if (state != NULL) {
1668                nfs4_copy_stateid(&arg.stateid, state, current->files);
1669        } else
1670                memcpy(&arg.stateid, &zero_stateid, sizeof(arg.stateid));
1671
1672        status = nfs4_call_sync(server, &msg, &arg, &res, 1);
1673        if (status == 0 && state != NULL)
1674                renew_lease(server, timestamp);
1675        return status;
1676}
1677
1678static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
1679                           struct nfs_fattr *fattr, struct iattr *sattr,
1680                           struct nfs4_state *state)
1681{
1682        struct nfs_server *server = NFS_SERVER(inode);
1683        struct nfs4_exception exception = { };
1684        int err;
1685        do {
1686                err = nfs4_handle_exception(server,
1687                                _nfs4_do_setattr(inode, cred, fattr, sattr, state),
1688                                &exception);
1689        } while (exception.retry);
1690        return err;
1691}
1692
1693struct nfs4_closedata {
1694        struct path path;
1695        struct inode *inode;
1696        struct nfs4_state *state;
1697        struct nfs_closeargs arg;
1698        struct nfs_closeres res;
1699        struct nfs_fattr fattr;
1700        unsigned long timestamp;
1701};
1702
1703static void nfs4_free_closedata(void *data)
1704{
1705        struct nfs4_closedata *calldata = data;
1706        struct nfs4_state_owner *sp = calldata->state->owner;
1707
1708        nfs4_put_open_state(calldata->state);
1709        nfs_free_seqid(calldata->arg.seqid);
1710        nfs4_put_state_owner(sp);
1711        path_put(&calldata->path);
1712        kfree(calldata);
1713}
1714
1715static void nfs4_close_done(struct rpc_task *task, void *data)
1716{
1717        struct nfs4_closedata *calldata = data;
1718        struct nfs4_state *state = calldata->state;
1719        struct nfs_server *server = NFS_SERVER(calldata->inode);
1720
1721        nfs4_sequence_done(server, &calldata->res.seq_res, task->tk_status);
1722        if (RPC_ASSASSINATED(task))
1723                return;
1724        /* hmm. we are done with the inode, and in the process of freeing
1725         * the state_owner. we keep this around to process errors
1726         */
1727        switch (task->tk_status) {
1728                case 0:
1729                        nfs_set_open_stateid(state, &calldata->res.stateid, 0);
1730                        renew_lease(server, calldata->timestamp);
1731                        break;
1732                case -NFS4ERR_STALE_STATEID:
1733                case -NFS4ERR_OLD_STATEID:
1734                case -NFS4ERR_BAD_STATEID:
1735                case -NFS4ERR_EXPIRED:
1736                        if (calldata->arg.fmode == 0)
1737                                break;
1738                default:
1739                        if (nfs4_async_handle_error(task, server, state) == -EAGAIN) {
1740                                nfs4_restart_rpc(task, server->nfs_client);
1741                                return;
1742                        }
1743        }
1744        nfs4_sequence_free_slot(server->nfs_client, &calldata->res.seq_res);
1745        nfs_refresh_inode(calldata->inode, calldata->res.fattr);
1746}
1747
1748static void nfs4_close_prepare(struct rpc_task *task, void *data)
1749{
1750        struct nfs4_closedata *calldata = data;
1751        struct nfs4_state *state = calldata->state;
1752        int clear_rd, clear_wr, clear_rdwr;
1753
1754        if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
1755                return;
1756
1757        clear_rd = clear_wr = clear_rdwr = 0;
1758        spin_lock(&state->owner->so_lock);
1759        /* Calculate the change in open mode */
1760        if (state->n_rdwr == 0) {
1761                if (state->n_rdonly == 0) {
1762                        clear_rd |= test_and_clear_bit(NFS_O_RDONLY_STATE, &state->flags);
1763                        clear_rdwr |= test_and_clear_bit(NFS_O_RDWR_STATE, &state->flags);
1764                }
1765                if (state->n_wronly == 0) {
1766                        clear_wr |= test_and_clear_bit(NFS_O_WRONLY_STATE, &state->flags);
1767                        clear_rdwr |= test_and_clear_bit(NFS_O_RDWR_STATE, &state->flags);
1768                }
1769        }
1770        spin_unlock(&state->owner->so_lock);
1771        if (!clear_rd && !clear_wr && !clear_rdwr) {
1772                /* Note: exit _without_ calling nfs4_close_done */
1773                task->tk_action = NULL;
1774                return;
1775        }
1776        nfs_fattr_init(calldata->res.fattr);
1777        if (test_bit(NFS_O_RDONLY_STATE, &state->flags) != 0) {
1778                task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE];
1779                calldata->arg.fmode = FMODE_READ;
1780        } else if (test_bit(NFS_O_WRONLY_STATE, &state->flags) != 0) {
1781                task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE];
1782                calldata->arg.fmode = FMODE_WRITE;
1783        }
1784        calldata->timestamp = jiffies;
1785        if (nfs4_setup_sequence((NFS_SERVER(calldata->inode))->nfs_client,
1786                                &calldata->arg.seq_args, &calldata->res.seq_res,
1787                                1, task))
1788                return;
1789        rpc_call_start(task);
1790}
1791
1792static const struct rpc_call_ops nfs4_close_ops = {
1793        .rpc_call_prepare = nfs4_close_prepare,
1794        .rpc_call_done = nfs4_close_done,
1795        .rpc_release = nfs4_free_closedata,
1796};
1797
1798/* 
1799 * It is possible for data to be read/written from a mem-mapped file 
1800 * after the sys_close call (which hits the vfs layer as a flush).
1801 * This means that we can't safely call nfsv4 close on a file until 
1802 * the inode is cleared. This in turn means that we are not good
1803 * NFSv4 citizens - we do not indicate to the server to update the file's 
1804 * share state even when we are done with one of the three share 
1805 * stateid's in the inode.
1806 *
1807 * NOTE: Caller must be holding the sp->so_owner semaphore!
1808 */
1809int nfs4_do_close(struct path *path, struct nfs4_state *state, int wait)
1810{
1811        struct nfs_server *server = NFS_SERVER(state->inode);
1812        struct nfs4_closedata *calldata;
1813        struct nfs4_state_owner *sp = state->owner;
1814        struct rpc_task *task;
1815        struct rpc_message msg = {
1816                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE],
1817                .rpc_cred = state->owner->so_cred,
1818        };
1819        struct rpc_task_setup task_setup_data = {
1820                .rpc_client = server->client,
1821                .rpc_message = &msg,
1822                .callback_ops = &nfs4_close_ops,
1823                .workqueue = nfsiod_workqueue,
1824                .flags = RPC_TASK_ASYNC,
1825        };
1826        int status = -ENOMEM;
1827
1828        calldata = kzalloc(sizeof(*calldata), GFP_KERNEL);
1829        if (calldata == NULL)
1830                goto out;
1831        calldata->inode = state->inode;
1832        calldata->state = state;
1833        calldata->arg.fh = NFS_FH(state->inode);
1834        calldata->arg.stateid = &state->open_stateid;
1835        if (nfs4_has_session(server->nfs_client))
1836                memset(calldata->arg.stateid->data, 0, 4);    /* clear seqid */
1837        /* Serialization for the sequence id */
1838        calldata->arg.seqid = nfs_alloc_seqid(&state->owner->so_seqid);
1839        if (calldata->arg.seqid == NULL)
1840                goto out_free_calldata;
1841        calldata->arg.fmode = 0;
1842        calldata->arg.bitmask = server->cache_consistency_bitmask;
1843        calldata->res.fattr = &calldata->fattr;
1844        calldata->res.seqid = calldata->arg.seqid;
1845        calldata->res.server = server;
1846        calldata->res.seq_res.sr_slotid = NFS4_MAX_SLOT_TABLE;
1847        calldata->path.mnt = mntget(path->mnt);
1848        calldata->path.dentry = dget(path->dentry);
1849
1850        msg.rpc_argp = &calldata->arg,
1851        msg.rpc_resp = &calldata->res,
1852        task_setup_data.callback_data = calldata;
1853        task = rpc_run_task(&task_setup_data);
1854        if (IS_ERR(task))
1855                return PTR_ERR(task);
1856        status = 0;
1857        if (wait)
1858                status = rpc_wait_for_completion_task(task);
1859        rpc_put_task(task);
1860        return status;
1861out_free_calldata:
1862        kfree(calldata);
1863out:
1864        nfs4_put_open_state(state);
1865        nfs4_put_state_owner(sp);
1866        return status;
1867}
1868
1869static int nfs4_intent_set_file(struct nameidata *nd, struct path *path, struct nfs4_state *state, fmode_t fmode)
1870{
1871        struct file *filp;
1872        int ret;
1873
1874        /* If the open_intent is for execute, we have an extra check to make */
1875        if (fmode & FMODE_EXEC) {
1876                ret = nfs_may_open(state->inode,
1877                                state->owner->so_cred,
1878                                nd->intent.open.flags);
1879                if (ret < 0)
1880                        goto out_close;
1881        }
1882        filp = lookup_instantiate_filp(nd, path->dentry, NULL);
1883        if (!IS_ERR(filp)) {
1884                struct nfs_open_context *ctx;
1885                ctx = nfs_file_open_context(filp);
1886                ctx->state = state;
1887                return 0;
1888        }
1889        ret = PTR_ERR(filp);
1890out_close:
1891        nfs4_close_sync(path, state, fmode & (FMODE_READ|FMODE_WRITE));
1892        return ret;
1893}
1894
1895struct dentry *
1896nfs4_atomic_open(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
1897{
1898        struct path path = {
1899                .mnt = nd->path.mnt,
1900                .dentry = dentry,
1901        };
1902        struct dentry *parent;
1903        struct iattr attr;
1904        struct rpc_cred *cred;
1905        struct nfs4_state *state;
1906        struct dentry *res;
1907        fmode_t fmode = nd->intent.open.flags & (FMODE_READ | FMODE_WRITE | FMODE_EXEC);
1908
1909        if (nd->flags & LOOKUP_CREATE) {
1910                attr.ia_mode = nd->intent.open.create_mode;
1911                attr.ia_valid = ATTR_MODE;
1912                if (!IS_POSIXACL(dir))
1913                        attr.ia_mode &= ~current_umask();
1914        } else {
1915                attr.ia_valid = 0;
1916                BUG_ON(nd->intent.open.flags & O_CREAT);
1917        }
1918
1919        cred = rpc_lookup_cred();
1920        if (IS_ERR(cred))
1921                return (struct dentry *)cred;
1922        parent = dentry->d_parent;
1923        /* Protect against concurrent sillydeletes */
1924        nfs_block_sillyrename(parent);
1925        state = nfs4_do_open(dir, &path, fmode, nd->intent.open.flags, &attr, cred);
1926        put_rpccred(cred);
1927        if (IS_ERR(state)) {
1928                if (PTR_ERR(state) == -ENOENT) {
1929                        d_add(dentry, NULL);
1930                        nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
1931                }
1932                nfs_unblock_sillyrename(parent);
1933                return (struct dentry *)state;
1934        }
1935        res = d_add_unique(dentry, igrab(state->inode));
1936        if (res != NULL)
1937                path.dentry = res;
1938        nfs_set_verifier(path.dentry, nfs_save_change_attribute(dir));
1939        nfs_unblock_sillyrename(parent);
1940        nfs4_intent_set_file(nd, &path, state, fmode);
1941        return res;
1942}
1943
1944int
1945nfs4_open_revalidate(struct inode *dir, struct dentry *dentry, int openflags, struct nameidata *nd)
1946{
1947        struct path path = {
1948                .mnt = nd->path.mnt,
1949                .dentry = dentry,
1950        };
1951        struct rpc_cred *cred;
1952        struct nfs4_state *state;
1953        fmode_t fmode = openflags & (FMODE_READ | FMODE_WRITE);
1954
1955        cred = rpc_lookup_cred();
1956        if (IS_ERR(cred))
1957                return PTR_ERR(cred);
1958        state = nfs4_do_open(dir, &path, fmode, openflags, NULL, cred);
1959        put_rpccred(cred);
1960        if (IS_ERR(state)) {
1961                switch (PTR_ERR(state)) {
1962                        case -EPERM:
1963                        case -EACCES:
1964                        case -EDQUOT:
1965                        case -ENOSPC:
1966                        case -EROFS:
1967                                lookup_instantiate_filp(nd, (struct dentry *)state, NULL);
1968                                return 1;
1969                        default:
1970                                goto out_drop;
1971                }
1972        }
1973        if (state->inode == dentry->d_inode) {
1974                nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
1975                nfs4_intent_set_file(nd, &path, state, fmode);
1976                return 1;
1977        }
1978        nfs4_close_sync(&path, state, fmode);
1979out_drop:
1980        d_drop(dentry);
1981        return 0;
1982}
1983
1984void nfs4_close_context(struct nfs_open_context *ctx, int is_sync)
1985{
1986        if (ctx->state == NULL)
1987                return;
1988        if (is_sync)
1989                nfs4_close_sync(&ctx->path, ctx->state, ctx->mode);
1990        else
1991                nfs4_close_state(&ctx->path, ctx->state, ctx->mode);
1992}
1993
1994static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
1995{
1996        struct nfs4_server_caps_arg args = {
1997                .fhandle = fhandle,
1998        };
1999        struct nfs4_server_caps_res res = {};
2000        struct rpc_message msg = {
2001                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SERVER_CAPS],
2002                .rpc_argp = &args,
2003                .rpc_resp = &res,
2004        };
2005        int status;
2006
2007        status = nfs4_call_sync(server, &msg, &args, &res, 0);
2008        if (status == 0) {
2009                memcpy(server->attr_bitmask, res.attr_bitmask, sizeof(server->attr_bitmask));
2010                server->caps &= ~(NFS_CAP_ACLS|NFS_CAP_HARDLINKS|
2011                                NFS_CAP_SYMLINKS|NFS_CAP_FILEID|
2012                                NFS_CAP_MODE|NFS_CAP_NLINK|NFS_CAP_OWNER|
2013                                NFS_CAP_OWNER_GROUP|NFS_CAP_ATIME|
2014                                NFS_CAP_CTIME|NFS_CAP_MTIME);
2015                if (res.attr_bitmask[0] & FATTR4_WORD0_ACL)
2016                        server->caps |= NFS_CAP_ACLS;
2017                if (res.has_links != 0)
2018                        server->caps |= NFS_CAP_HARDLINKS;
2019                if (res.has_symlinks != 0)
2020                        server->caps |= NFS_CAP_SYMLINKS;
2021                if (res.attr_bitmask[0] & FATTR4_WORD0_FILEID)
2022                        server->caps |= NFS_CAP_FILEID;
2023                if (res.attr_bitmask[1] & FATTR4_WORD1_MODE)
2024                        server->caps |= NFS_CAP_MODE;
2025                if (res.attr_bitmask[1] & FATTR4_WORD1_NUMLINKS)
2026                        server->caps |= NFS_CAP_NLINK;
2027                if (res.attr_bitmask[1] & FATTR4_WORD1_OWNER)
2028                        server->caps |= NFS_CAP_OWNER;
2029                if (res.attr_bitmask[1] & FATTR4_WORD1_OWNER_GROUP)
2030                        server->caps |= NFS_CAP_OWNER_GROUP;
2031                if (res.attr_bitmask[1] & FATTR4_WORD1_TIME_ACCESS)
2032                        server->caps |= NFS_CAP_ATIME;
2033                if (res.attr_bitmask[1] & FATTR4_WORD1_TIME_METADATA)
2034                        server->caps |= NFS_CAP_CTIME;
2035                if (res.attr_bitmask[1] & FATTR4_WORD1_TIME_MODIFY)
2036                        server->caps |= NFS_CAP_MTIME;
2037
2038                memcpy(server->cache_consistency_bitmask, res.attr_bitmask, sizeof(server->cache_consistency_bitmask));
2039                server->cache_consistency_bitmask[0] &= FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE;
2040                server->cache_consistency_bitmask[1] &= FATTR4_WORD1_TIME_METADATA|FATTR4_WORD1_TIME_MODIFY;
2041                server->acl_bitmask = res.acl_bitmask;
2042        }
2043
2044        return status;
2045}
2046
2047int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
2048{
2049        struct nfs4_exception exception = { };
2050        int err;
2051        do {
2052                err = nfs4_handle_exception(server,
2053                                _nfs4_server_capabilities(server, fhandle),
2054                                &exception);
2055        } while (exception.retry);
2056        return err;
2057}
2058
2059static int _nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
2060                struct nfs_fsinfo *info)
2061{
2062        struct nfs4_lookup_root_arg args = {
2063                .bitmask = nfs4_fattr_bitmap,
2064        };
2065        struct nfs4_lookup_res res = {
2066                .server = server,
2067                .fattr = info->fattr,
2068                .fh = fhandle,
2069        };
2070        struct rpc_message msg = {
2071                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP_ROOT],
2072                .rpc_argp = &args,
2073                .rpc_resp = &res,
2074        };
2075
2076        nfs_fattr_init(info->fattr);
2077        return nfs4_call_sync(server, &msg, &args, &res, 0);
2078}
2079
2080static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
2081                struct nfs_fsinfo *info)
2082{
2083        struct nfs4_exception exception = { };
2084        int err;
2085        do {
2086                err = nfs4_handle_exception(server,
2087                                _nfs4_lookup_root(server, fhandle, info),
2088                                &exception);
2089        } while (exception.retry);
2090        return err;
2091}
2092
2093/*
2094 * get the file handle for the "/" directory on the server
2095 */
2096static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
2097                              struct nfs_fsinfo *info)
2098{
2099        int status;
2100
2101        status = nfs4_lookup_root(server, fhandle, info);
2102        if (status == 0)
2103                status = nfs4_server_capabilities(server, fhandle);
2104        if (status == 0)
2105                status = nfs4_do_fsinfo(server, fhandle, info);
2106        return nfs4_map_errors(status);
2107}
2108
2109/*
2110 * Get locations and (maybe) other attributes of a referral.
2111 * Note that we'll actually follow the referral later when
2112 * we detect fsid mismatch in inode revalidation
2113 */
2114static int nfs4_get_referral(struct inode *dir, const struct qstr *name, struct nfs_fattr *fattr, struct nfs_fh *fhandle)
2115{
2116        int status = -ENOMEM;
2117        struct page *page = NULL;
2118        struct nfs4_fs_locations *locations = NULL;
2119
2120        page = alloc_page(GFP_KERNEL);
2121        if (page == NULL)
2122                goto out;
2123        locations = kmalloc(sizeof(struct nfs4_fs_locations), GFP_KERNEL);
2124        if (locations == NULL)
2125                goto out;
2126
2127        status = nfs4_proc_fs_locations(dir, name, locations, page);
2128        if (status != 0)
2129                goto out;
2130        /* Make sure server returned a different fsid for the referral */
2131        if (nfs_fsid_equal(&NFS_SERVER(dir)->fsid, &locations->fattr.fsid)) {
2132                dprintk("%s: server did not return a different fsid for a referral at %s\n", __func__, name->name);
2133                status = -EIO;
2134                goto out;
2135        }
2136
2137        memcpy(fattr, &locations->fattr, sizeof(struct nfs_fattr));
2138        fattr->valid |= NFS_ATTR_FATTR_V4_REFERRAL;
2139        if (!fattr->mode)
2140                fattr->mode = S_IFDIR;
2141        memset(fhandle, 0, sizeof(struct nfs_fh));
2142out:
2143        if (page)
2144                __free_page(page);
2145        if (locations)
2146                kfree(locations);
2147        return status;
2148}
2149
2150static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr)
2151{
2152        struct nfs4_getattr_arg args = {
2153                .fh = fhandle,
2154                .bitmask = server->attr_bitmask,
2155        };
2156        struct nfs4_getattr_res res = {
2157                .fattr = fattr,
2158                .server = server,
2159        };
2160        struct rpc_message msg = {
2161                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETATTR],
2162                .rpc_argp = &args,
2163                .rpc_resp = &res,
2164        };
2165        
2166        nfs_fattr_init(fattr);
2167        return nfs4_call_sync(server, &msg, &args, &res, 0);
2168}
2169
2170static int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr)
2171{
2172        struct nfs4_exception exception = { };
2173        int err;
2174        do {
2175                err = nfs4_handle_exception(server,
2176                                _nfs4_proc_getattr(server, fhandle, fattr),
2177                                &exception);
2178        } while (exception.retry);
2179        return err;
2180}
2181
2182/* 
2183 * The file is not closed if it is opened due to the a request to change
2184 * the size of the file. The open call will not be needed once the
2185 * VFS layer lookup-intents are implemented.
2186 *
2187 * Close is called when the inode is destroyed.
2188 * If we haven't opened the file for O_WRONLY, we
2189 * need to in the size_change case to obtain a stateid.
2190 *
2191 * Got race?
2192 * Because OPEN is always done by name in nfsv4, it is
2193 * possible that we opened a different file by the same
2194 * name.  We can recognize this race condition, but we
2195 * can't do anything about it besides returning an error.
2196 *
2197 * This will be fixed with VFS changes (lookup-intent).
2198 */
2199static int
2200nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
2201                  struct iattr *sattr)
2202{
2203        struct inode *inode = dentry->d_inode;
2204        struct rpc_cred *cred = NULL;
2205        struct nfs4_state *state = NULL;
2206        int status;
2207
2208        nfs_fattr_init(fattr);
2209        
2210        /* Search for an existing open(O_WRITE) file */
2211        if (sattr->ia_valid & ATTR_FILE) {
2212                struct nfs_open_context *ctx;
2213
2214                ctx = nfs_file_open_context(sattr->ia_file);
2215                if (ctx) {
2216                        cred = ctx->cred;
2217                        state = ctx->state;
2218                }
2219        }
2220
2221        status = nfs4_do_setattr(inode, cred, fattr, sattr, state);
2222        if (status == 0)
2223                nfs_setattr_update_inode(inode, sattr);
2224        return status;
2225}
2226
2227static int _nfs4_proc_lookupfh(struct nfs_server *server, const struct nfs_fh *dirfh,
2228                const struct qstr *name, struct nfs_fh *fhandle,
2229                struct nfs_fattr *fattr)
2230{
2231        int                    status;
2232        struct nfs4_lookup_arg args = {
2233                .bitmask = server->attr_bitmask,
2234                .dir_fh = dirfh,
2235                .name = name,
2236        };
2237        struct nfs4_lookup_res res = {
2238                .server = server,
2239                .fattr = fattr,
2240                .fh = fhandle,
2241        };
2242        struct rpc_message msg = {
2243                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP],
2244                .rpc_argp = &args,
2245                .rpc_resp = &res,
2246        };
2247
2248        nfs_fattr_init(fattr);
2249
2250        dprintk("NFS call  lookupfh %s\n", name->name);
2251        status = nfs4_call_sync(server, &msg, &args, &res, 0);
2252        dprintk("NFS reply lookupfh: %d\n", status);
2253        return status;
2254}
2255
2256static int nfs4_proc_lookupfh(struct nfs_server *server, struct nfs_fh *dirfh,
2257                              struct qstr *name, struct nfs_fh *fhandle,
2258                              struct nfs_fattr *fattr)
2259{
2260        struct nfs4_exception exception = { };
2261        int err;
2262        do {
2263                err = _nfs4_proc_lookupfh(server, dirfh, name, fhandle, fattr);
2264                /* FIXME: !!!! */
2265                if (err == -NFS4ERR_MOVED) {
2266                        err = -EREMOTE;
2267                        break;
2268                }
2269                err = nfs4_handle_exception(server, err, &exception);
2270        } while (exception.retry);
2271        return err;
2272}
2273
2274static int _nfs4_proc_lookup(struct inode *dir, const struct qstr *name,
2275                struct nfs_fh *fhandle, struct nfs_fattr *fattr)
2276{
2277        int status;
2278        
2279        dprintk("NFS call  lookup %s\n", name->name);
2280        status = _nfs4_proc_lookupfh(NFS_SERVER(dir), NFS_FH(dir), name, fhandle, fattr);
2281        if (status == -NFS4ERR_MOVED)
2282                status = nfs4_get_referral(dir, name, fattr, fhandle);
2283        dprintk("NFS reply lookup: %d\n", status);
2284        return status;
2285}
2286
2287static int nfs4_proc_lookup(struct inode *dir, struct qstr *name, struct nfs_fh *fhandle, struct nfs_fattr *fattr)
2288{
2289        struct nfs4_exception exception = { };
2290        int err;
2291        do {
2292                err = nfs4_handle_exception(NFS_SERVER(dir),
2293                                _nfs4_proc_lookup(dir, name, fhandle, fattr),
2294                                &exception);
2295        } while (exception.retry);
2296        return err;
2297}
2298
2299static int _nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
2300{
2301        struct nfs_server *server = NFS_SERVER(inode);
2302        struct nfs_fattr fattr;
2303        struct nfs4_accessargs args = {
2304                .fh = NFS_FH(inode),
2305                .bitmask = server->attr_bitmask,
2306        };
2307        struct nfs4_accessres res = {
2308                .server = server,
2309                .fattr = &fattr,
2310        };
2311        struct rpc_message msg = {
2312                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_ACCESS],
2313                .rpc_argp = &args,
2314                .rpc_resp = &res,
2315                .rpc_cred = entry->cred,
2316        };
2317        int mode = entry->mask;
2318        int status;
2319
2320        /*
2321         * Determine which access bits we want to ask for...
2322         */
2323        if (mode & MAY_READ)
2324                args.access |= NFS4_ACCESS_READ;
2325        if (S_ISDIR(inode->i_mode)) {
2326                if (mode & MAY_WRITE)
2327                        args.access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND | NFS4_ACCESS_DELETE;
2328                if (mode & MAY_EXEC)
2329                        args.access |= NFS4_ACCESS_LOOKUP;
2330        } else {
2331                if (mode & MAY_WRITE)
2332                        args.access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND;
2333                if (mode & MAY_EXEC)
2334                        args.access |= NFS4_ACCESS_EXECUTE;
2335        }
2336        nfs_fattr_init(&fattr);
2337        status = nfs4_call_sync(server, &msg, &args, &res, 0);
2338        if (!status) {
2339                entry->mask = 0;
2340                if (res.access & NFS4_ACCESS_READ)
2341                        entry->mask |= MAY_READ;
2342                if (res.access & (NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND | NFS4_ACCESS_DELETE))
2343                        entry->mask |= MAY_WRITE;
2344                if (res.access & (NFS4_ACCESS_LOOKUP|NFS4_ACCESS_EXECUTE))
2345                        entry->mask |= MAY_EXEC;
2346                nfs_refresh_inode(inode, &fattr);
2347        }
2348        return status;
2349}
2350
2351static int nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
2352{
2353        struct nfs4_exception exception = { };
2354        int err;
2355        do {
2356                err = nfs4_handle_exception(NFS_SERVER(inode),
2357                                _nfs4_proc_access(inode, entry),
2358                                &exception);
2359        } while (exception.retry);
2360        return err;
2361}
2362
2363/*
2364 * TODO: For the time being, we don't try to get any attributes
2365 * along with any of the zero-copy operations READ, READDIR,
2366 * READLINK, WRITE.
2367 *
2368 * In the case of the first three, we want to put the GETATTR
2369 * after the read-type operation -- this is because it is hard
2370 * to predict the length of a GETATTR response in v4, and thus
2371 * align the READ data correctly.  This means that the GETATTR
2372 * may end up partially falling into the page cache, and we should
2373 * shift it into the 'tail' of the xdr_buf before processing.
2374 * To do this efficiently, we need to know the total length
2375 * of data received, which doesn't seem to be available outside
2376 * of the RPC layer.
2377 *
2378 * In the case of WRITE, we also want to put the GETATTR after
2379 * the operation -- in this case because we want to make sure
2380 * we get the post-operation mtime and size.  This means that
2381 * we can't use xdr_encode_pages() as written: we need a variant
2382 * of it which would leave room in the 'tail' iovec.
2383 *
2384 * Both of these changes to the XDR layer would in fact be quite
2385 * minor, but I decided to leave them for a subsequent patch.
2386 */
2387static int _nfs4_proc_readlink(struct inode *inode, struct page *page,
2388                unsigned int pgbase, unsigned int pglen)
2389{
2390        struct nfs4_readlink args = {
2391                .fh       = NFS_FH(inode),
2392                .pgbase   = pgbase,
2393                .pglen    = pglen,
2394                .pages    = &page,
2395        };
2396        struct nfs4_readlink_res res;
2397        struct rpc_message msg = {
2398                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READLINK],
2399                .rpc_argp = &args,
2400                .rpc_resp = &res,
2401        };
2402
2403        return nfs4_call_sync(NFS_SERVER(inode), &msg, &args, &res, 0);
2404}
2405
2406static int nfs4_proc_readlink(struct inode *inode, struct page *page,
2407                unsigned int pgbase, unsigned int pglen)
2408{
2409        struct nfs4_exception exception = { };
2410        int err;
2411        do {
2412                err = nfs4_handle_exception(NFS_SERVER(inode),
2413                                _nfs4_proc_readlink(inode, page, pgbase, pglen),
2414                                &exception);
2415        } while (exception.retry);
2416        return err;
2417}
2418
2419/*
2420 * Got race?
2421 * We will need to arrange for the VFS layer to provide an atomic open.
2422 * Until then, this create/open method is prone to inefficiency and race
2423 * conditions due to the lookup, create, and open VFS calls from sys_open()
2424 * placed on the wire.
2425 *
2426 * Given the above sorry state of affairs, I'm simply sending an OPEN.
2427 * The file will be opened again in the subsequent VFS open call
2428 * (nfs4_proc_file_open).
2429 *
2430 * The open for read will just hang around to be used by any process that
2431 * opens the file O_RDONLY. This will all be resolved with the VFS changes.
2432 */
2433
2434static int
2435nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
2436                 int flags, struct nameidata *nd)
2437{
2438        struct path path = {
2439                .mnt = nd->path.mnt,
2440                .dentry = dentry,
2441        };
2442        struct nfs4_state *state;
2443        struct rpc_cred *cred;
2444        fmode_t fmode = flags & (FMODE_READ | FMODE_WRITE);
2445        int status = 0;
2446
2447        cred = rpc_lookup_cred();
2448        if (IS_ERR(cred)) {
2449                status = PTR_ERR(cred);
2450                goto out;
2451        }
2452        state = nfs4_do_open(dir, &path, fmode, flags, sattr, cred);
2453        d_drop(dentry);
2454        if (IS_ERR(state)) {
2455                status = PTR_ERR(state);
2456                goto out_putcred;
2457        }
2458        d_add(dentry, igrab(state->inode));
2459        nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
2460        if (flags & O_EXCL) {
2461                struct nfs_fattr fattr;
2462                status = nfs4_do_setattr(state->inode, cred, &fattr, sattr, state);
2463                if (status == 0)
2464                        nfs_setattr_update_inode(state->inode, sattr);
2465                nfs_post_op_update_inode(state->inode, &fattr);
2466        }
2467        if (status == 0 && (nd->flags & LOOKUP_OPEN) != 0)
2468                status = nfs4_intent_set_file(nd, &path, state, fmode);
2469        else
2470                nfs4_close_sync(&path, state, fmode);
2471out_putcred:
2472        put_rpccred(cred);
2473out:
2474        return status;
2475}
2476
2477static int _nfs4_proc_remove(struct inode *dir, struct qstr *name)
2478{
2479        struct nfs_server *server = NFS_SERVER(dir);
2480        struct nfs_removeargs args = {
2481                .fh = NFS_FH(dir),
2482                .name.len = name->len,
2483                .name.name = name->name,
2484                .bitmask = server->attr_bitmask,
2485        };
2486        struct nfs_removeres res = {
2487                .server = server,
2488        };
2489        struct rpc_message msg = {
2490                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE],
2491                .rpc_argp = &args,
2492                .rpc_resp = &res,
2493        };
2494        int                     status;
2495
2496        nfs_fattr_init(&res.dir_attr);
2497        status = nfs4_call_sync(server, &msg, &args, &res, 1);
2498        if (status == 0) {
2499                update_changeattr(dir, &res.cinfo);
2500                nfs_post_op_update_inode(dir, &res.dir_attr);
2501        }
2502        return status;
2503}
2504
2505static int nfs4_proc_remove(struct inode *dir, struct qstr *name)
2506{
2507        struct nfs4_exception exception = { };
2508        int err;
2509        do {
2510                err = nfs4_handle_exception(NFS_SERVER(dir),
2511                                _nfs4_proc_remove(dir, name),
2512                                &exception);
2513        } while (exception.retry);
2514        return err;
2515}
2516
2517static void nfs4_proc_unlink_setup(struct rpc_message *msg, struct inode *dir)
2518{
2519        struct nfs_server *server = NFS_SERVER(dir);
2520        struct nfs_removeargs *args = msg->rpc_argp;
2521        struct nfs_removeres *res = msg->rpc_resp;
2522
2523        args->bitmask = server->cache_consistency_bitmask;
2524        res->server = server;
2525        msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE];
2526}
2527
2528static int nfs4_proc_unlink_done(struct rpc_task *task, struct inode *dir)
2529{
2530        struct nfs_removeres *res = task->tk_msg.rpc_resp;
2531
2532        nfs4_sequence_done(res->server, &res->seq_res, task->tk_status);
2533        if (nfs4_async_handle_error(task, res->server, NULL) == -EAGAIN)
2534                return 0;
2535        nfs4_sequence_free_slot(res->server->nfs_client, &res->seq_res);
2536        update_changeattr(dir, &res->cinfo);
2537        nfs_post_op_update_inode(dir, &res->dir_attr);
2538        return 1;
2539}
2540
2541static int _nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name,
2542                struct inode *new_dir, struct qstr *new_name)
2543{
2544        struct nfs_server *server = NFS_SERVER(old_dir);
2545        struct nfs4_rename_arg arg = {
2546                .old_dir = NFS_FH(old_dir),
2547                .new_dir = NFS_FH(new_dir),
2548                .old_name = old_name,
2549                .new_name = new_name,
2550                .bitmask = server->attr_bitmask,
2551        };
2552        struct nfs_fattr old_fattr, new_fattr;
2553        struct nfs4_rename_res res = {
2554                .server = server,
2555                .old_fattr = &old_fattr,
2556                .new_fattr = &new_fattr,
2557        };
2558        struct rpc_message msg = {
2559                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENAME],
2560                .rpc_argp = &arg,
2561                .rpc_resp = &res,
2562        };
2563        int                     status;
2564        
2565        nfs_fattr_init(res.old_fattr);
2566        nfs_fattr_init(res.new_fattr);
2567        status = nfs4_call_sync(server, &msg, &arg, &res, 1);
2568
2569        if (!status) {
2570                update_changeattr(old_dir, &res.old_cinfo);
2571                nfs_post_op_update_inode(old_dir, res.old_fattr);
2572                update_changeattr(new_dir, &res.new_cinfo);
2573                nfs_post_op_update_inode(new_dir, res.new_fattr);
2574        }
2575        return status;
2576}
2577
2578static int nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name,
2579                struct inode *new_dir, struct qstr *new_name)
2580{
2581        struct nfs4_exception exception = { };
2582        int err;
2583        do {
2584                err = nfs4_handle_exception(NFS_SERVER(old_dir),
2585                                _nfs4_proc_rename(old_dir, old_name,
2586                                        new_dir, new_name),
2587                                &exception);
2588        } while (exception.retry);
2589        return err;
2590}
2591
2592static int _nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name)
2593{
2594        struct nfs_server *server = NFS_SERVER(inode);
2595        struct nfs4_link_arg arg = {
2596                .fh     = NFS_FH(inode),
2597                .dir_fh = NFS_FH(dir),
2598                .name   = name,
2599                .bitmask = server->attr_bitmask,
2600        };
2601        struct nfs_fattr fattr, dir_attr;
2602        struct nfs4_link_res res = {
2603                .server = server,
2604                .fattr = &fattr,
2605                .dir_attr = &dir_attr,
2606        };
2607        struct rpc_message msg = {
2608                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LINK],
2609                .rpc_argp = &arg,
2610                .rpc_resp = &res,
2611        };
2612        int                     status;
2613
2614        nfs_fattr_init(res.fattr);
2615        nfs_fattr_init(res.dir_attr);
2616        status = nfs4_call_sync(server, &msg, &arg, &res, 1);
2617        if (!status) {
2618                update_changeattr(dir, &res.cinfo);
2619                nfs_post_op_update_inode(dir, res.dir_attr);
2620                nfs_post_op_update_inode(inode, res.fattr);
2621        }
2622
2623        return status;
2624}
2625
2626static int nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name)
2627{
2628        struct nfs4_exception exception = { };
2629        int err;
2630        do {
2631                err = nfs4_handle_exception(NFS_SERVER(inode),
2632                                _nfs4_proc_link(inode, dir, name),
2633                                &exception);
2634        } while (exception.retry);
2635        return err;
2636}
2637
2638struct nfs4_createdata {
2639        struct rpc_message msg;
2640        struct nfs4_create_arg arg;
2641        struct nfs4_create_res res;
2642        struct nfs_fh fh;
2643        struct nfs_fattr fattr;
2644        struct nfs_fattr dir_fattr;
2645};
2646
2647static struct nfs4_createdata *nfs4_alloc_createdata(struct inode *dir,
2648                struct qstr *name, struct iattr *sattr, u32 ftype)
2649{
2650        struct nfs4_createdata *data;
2651
2652        data = kzalloc(sizeof(*data), GFP_KERNEL);
2653        if (data != NULL) {
2654                struct nfs_server *server = NFS_SERVER(dir);
2655
2656                data->msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE];
2657                data->msg.rpc_argp = &data->arg;
2658                data->msg.rpc_resp = &data->res;
2659                data->arg.dir_fh = NFS_FH(dir);
2660                data->arg.server = server;
2661                data->arg.name = name;
2662                data->arg.attrs = sattr;
2663                data->arg.ftype = ftype;
2664                data->arg.bitmask = server->attr_bitmask;
2665                data->res.server = server;
2666                data->res.fh = &data->fh;
2667                data->res.fattr = &data->fattr;
2668                data->res.dir_fattr = &data->dir_fattr;
2669                nfs_fattr_init(data->res.fattr);
2670                nfs_fattr_init(data->res.dir_fattr);
2671        }
2672        return data;
2673}
2674
2675static int nfs4_do_create(struct inode *dir, struct dentry *dentry, struct nfs4_createdata *data)
2676{
2677        int status = nfs4_call_sync(NFS_SERVER(dir), &data->msg,
2678                                    &data->arg, &data->res, 1);
2679        if (status == 0) {
2680                update_changeattr(dir, &data->res.dir_cinfo);
2681                nfs_post_op_update_inode(dir, data->res.dir_fattr);
2682                status = nfs_instantiate(dentry, data->res.fh, data->res.fattr);
2683        }
2684        return status;
2685}
2686
2687static void nfs4_free_createdata(struct nfs4_createdata *data)
2688{
2689        kfree(data);
2690}
2691
2692static int _nfs4_proc_symlink(struct inode *dir, struct dentry *dentry,
2693                struct page *page, unsigned int len, struct iattr *sattr)
2694{
2695        struct nfs4_createdata *data;
2696        int status = -ENAMETOOLONG;
2697
2698        if (len > NFS4_MAXPATHLEN)
2699                goto out;
2700
2701        status = -ENOMEM;
2702        data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4LNK);
2703        if (data == NULL)
2704                goto out;
2705
2706        data->msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SYMLINK];
2707        data->arg.u.symlink.pages = &page;
2708        data->arg.u.symlink.len = len;
2709        
2710        status = nfs4_do_create(dir, dentry, data);
2711
2712        nfs4_free_createdata(data);
2713out:
2714        return status;
2715}
2716
2717static int nfs4_proc_symlink(struct inode *dir, struct dentry *dentry,
2718                struct page *page, unsigned int len, struct iattr *sattr)
2719{
2720        struct nfs4_exception exception = { };
2721        int err;
2722        do {
2723                err = nfs4_handle_exception(NFS_SERVER(dir),
2724                                _nfs4_proc_symlink(dir, dentry, page,
2725                                                        len, sattr),
2726                                &exception);
2727        } while (exception.retry);
2728        return err;
2729}
2730
2731static int _nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry,
2732                struct iattr *sattr)
2733{
2734        struct nfs4_createdata *data;
2735        int status = -ENOMEM;
2736
2737        data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4DIR);
2738        if (data == NULL)
2739                goto out;
2740
2741        status = nfs4_do_create(dir, dentry, data);
2742
2743        nfs4_free_createdata(data);
2744out:
2745        return status;
2746}
2747
2748static int nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry,
2749                struct iattr *sattr)
2750{
2751        struct nfs4_exception exception = { };
2752        int err;
2753        do {
2754                err = nfs4_handle_exception(NFS_SERVER(dir),
2755                                _nfs4_proc_mkdir(dir, dentry, sattr),
2756                                &exception);
2757        } while (exception.retry);
2758        return err;
2759}
2760
2761static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
2762                  u64 cookie, struct page *page, unsigned int count, int plus)
2763{
2764        struct inode            *dir = dentry->d_inode;
2765        struct nfs4_readdir_arg args = {
2766                .fh = NFS_FH(dir),
2767                .pages = &page,
2768                .pgbase = 0,
2769                .count = count,
2770                .bitmask = NFS_SERVER(dentry->d_inode)->attr_bitmask,
2771        };
2772        struct nfs4_readdir_res res;
2773        struct rpc_message msg = {
2774                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READDIR],
2775                .rpc_argp = &args,
2776                .rpc_resp = &res,
2777                .rpc_cred = cred,
2778        };
2779        int                     status;
2780
2781        dprintk("%s: dentry = %s/%s, cookie = %Lu\n", __func__,
2782                        dentry->d_parent->d_name.name,
2783                        dentry->d_name.name,
2784                        (unsigned long long)cookie);
2785        nfs4_setup_readdir(cookie, NFS_COOKIEVERF(dir), dentry, &args);
2786        res.pgbase = args.pgbase;
2787        status = nfs4_call_sync(NFS_SERVER(dir), &msg, &args, &res, 0);
2788        if (status == 0)
2789                memcpy(NFS_COOKIEVERF(dir), res.verifier.data, NFS4_VERIFIER_SIZE);
2790
2791        nfs_invalidate_atime(dir);
2792
2793        dprintk("%s: returns %d\n", __func__, status);
2794        return status;
2795}
2796
2797static int nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
2798                  u64 cookie, struct page *page, unsigned int count, int plus)
2799{
2800        struct nfs4_exception exception = { };
2801        int err;
2802        do {
2803                err = nfs4_handle_exception(NFS_SERVER(dentry->d_inode),
2804                                _nfs4_proc_readdir(dentry, cred, cookie,
2805                                        page, count, plus),
2806                                &exception);
2807        } while (exception.retry);
2808        return err;
2809}
2810
2811static int _nfs4_proc_mknod(struct inode *dir, struct dentry *dentry,
2812                struct iattr *sattr, dev_t rdev)
2813{
2814        struct nfs4_createdata *data;
2815        int mode = sattr->ia_mode;
2816        int status = -ENOMEM;
2817
2818        BUG_ON(!(sattr->ia_valid & ATTR_MODE));
2819        BUG_ON(!S_ISFIFO(mode) && !S_ISBLK(mode) && !S_ISCHR(mode) && !S_ISSOCK(mode));
2820
2821        data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4SOCK);
2822        if (data == NULL)
2823                goto out;
2824
2825        if (S_ISFIFO(mode))
2826                data->arg.ftype = NF4FIFO;
2827        else if (S_ISBLK(mode)) {
2828                data->arg.ftype = NF4BLK;
2829                data->arg.u.device.specdata1 = MAJOR(rdev);
2830                data->arg.u.device.specdata2 = MINOR(rdev);
2831        }
2832        else if (S_ISCHR(mode)) {
2833                data->arg.ftype = NF4CHR;
2834                data->arg.u.device.specdata1 = MAJOR(rdev);
2835                data->arg.u.device.specdata2 = MINOR(rdev);
2836        }
2837        
2838        status = nfs4_do_create(dir, dentry, data);
2839
2840        nfs4_free_createdata(data);
2841out:
2842        return status;
2843}
2844
2845static int nfs4_proc_mknod(struct inode *dir, struct dentry *dentry,
2846                struct iattr *sattr, dev_t rdev)
2847{
2848        struct nfs4_exception exception = { };
2849        int err;
2850        do {
2851                err = nfs4_handle_exception(NFS_SERVER(dir),
2852                                _nfs4_proc_mknod(dir, dentry, sattr, rdev),
2853                                &exception);
2854        } while (exception.retry);
2855        return err;
2856}
2857
2858static int _nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle,
2859                 struct nfs_fsstat *fsstat)
2860{
2861        struct nfs4_statfs_arg args = {
2862                .fh = fhandle,
2863                .bitmask = server->attr_bitmask,
2864        };
2865        struct nfs4_statfs_res res = {
2866                .fsstat = fsstat,
2867        };
2868        struct rpc_message msg = {
2869                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_STATFS],
2870                .rpc_argp = &args,
2871                .rpc_resp = &res,
2872        };
2873
2874        nfs_fattr_init(fsstat->fattr);
2875        return  nfs4_call_sync(server, &msg, &args, &res, 0);
2876}
2877
2878static int nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsstat *fsstat)
2879{
2880        struct nfs4_exception exception = { };
2881        int err;
2882        do {
2883                err = nfs4_handle_exception(server,
2884                                _nfs4_proc_statfs(server, fhandle, fsstat),
2885                                &exception);
2886        } while (exception.retry);
2887        return err;
2888}
2889
2890static int _nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle,
2891                struct nfs_fsinfo *fsinfo)
2892{
2893        struct nfs4_fsinfo_arg args = {
2894                .fh = fhandle,
2895                .bitmask = server->attr_bitmask,
2896        };
2897        struct nfs4_fsinfo_res res = {
2898                .fsinfo = fsinfo,
2899        };
2900        struct rpc_message msg = {
2901                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FSINFO],
2902                .rpc_argp = &args,
2903                .rpc_resp = &res,
2904        };
2905
2906        return nfs4_call_sync(server, &msg, &args, &res, 0);
2907}
2908
2909static int nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
2910{
2911        struct nfs4_exception exception = { };
2912        int err;
2913
2914        do {
2915                err = nfs4_handle_exception(server,
2916                                _nfs4_do_fsinfo(server, fhandle, fsinfo),
2917                                &exception);
2918        } while (exception.retry);
2919        return err;
2920}
2921
2922static int nfs4_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
2923{
2924        nfs_fattr_init(fsinfo->fattr);
2925        return nfs4_do_fsinfo(server, fhandle, fsinfo);
2926}
2927
2928static int _nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
2929                struct nfs_pathconf *pathconf)
2930{
2931        struct nfs4_pathconf_arg args = {
2932                .fh = fhandle,
2933                .bitmask = server->attr_bitmask,
2934        };
2935        struct nfs4_pathconf_res res = {
2936                .pathconf = pathconf,
2937        };
2938        struct rpc_message msg = {
2939                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_PATHCONF],
2940                .rpc_argp = &args,
2941                .rpc_resp = &res,
2942        };
2943
2944        /* None of the pathconf attributes are mandatory to implement */
2945        if ((args.bitmask[0] & nfs4_pathconf_bitmap[0]) == 0) {
2946                memset(pathconf, 0, sizeof(*pathconf));
2947                return 0;
2948        }
2949
2950        nfs_fattr_init(pathconf->fattr);
2951        return nfs4_call_sync(server, &msg, &args, &res, 0);
2952}
2953
2954static int nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
2955                struct nfs_pathconf *pathconf)
2956{
2957        struct nfs4_exception exception = { };
2958        int err;
2959
2960        do {
2961                err = nfs4_handle_exception(server,
2962                                _nfs4_proc_pathconf(server, fhandle, pathconf),
2963                                &exception);
2964        } while (exception.retry);
2965        return err;
2966}
2967
2968static int nfs4_read_done(struct rpc_task *task, struct nfs_read_data *data)
2969{
2970        struct nfs_server *server = NFS_SERVER(data->inode);
2971
2972        dprintk("--> %s\n", __func__);
2973
2974        /* nfs4_sequence_free_slot called in the read rpc_call_done */
2975        nfs4_sequence_done(server, &data->res.seq_res, task->tk_status);
2976
2977        if (nfs4_async_handle_error(task, server, data->args.context->state) == -EAGAIN) {
2978                nfs4_restart_rpc(task, server->nfs_client);
2979                return -EAGAIN;
2980        }
2981
2982        nfs_invalidate_atime(data->inode);
2983        if (task->tk_status > 0)
2984                renew_lease(server, data->timestamp);
2985        return 0;
2986}
2987
2988static void nfs4_proc_read_setup(struct nfs_read_data *data, struct rpc_message *msg)
2989{
2990        data->timestamp   = jiffies;
2991        msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ];
2992}
2993
2994static int nfs4_write_done(struct rpc_task *task, struct nfs_write_data *data)
2995{
2996        struct inode *inode = data->inode;
2997        
2998        /* slot is freed in nfs_writeback_done */
2999        nfs4_sequence_done(NFS_SERVER(inode), &data->res.seq_res,
3000                           task->tk_status);
3001
3002        if (nfs4_async_handle_error(task, NFS_SERVER(inode), data->args.context->state) == -EAGAIN) {
3003                nfs4_restart_rpc(task, NFS_SERVER(inode)->nfs_client);
3004                return -EAGAIN;
3005        }
3006        if (task->tk_status >= 0) {
3007                renew_lease(NFS_SERVER(inode), data->timestamp);
3008                nfs_post_op_update_inode_force_wcc(inode, data->res.fattr);
3009        }
3010        return 0;
3011}
3012
3013static void nfs4_proc_write_setup(struct nfs_write_data *data, struct rpc_message *msg)
3014{
3015        struct nfs_server *server = NFS_SERVER(data->inode);
3016
3017        data->args.bitmask = server->cache_consistency_bitmask;
3018        data->res.server = server;
3019        data->timestamp   = jiffies;
3020
3021        msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE];
3022}
3023
3024static int nfs4_commit_done(struct rpc_task *task, struct nfs_write_data *data)
3025{
3026        struct inode *inode = data->inode;
3027        
3028        nfs4_sequence_done(NFS_SERVER(inode), &data->res.seq_res,
3029                           task->tk_status);
3030        if (nfs4_async_handle_error(task, NFS_SERVER(inode), NULL) == -EAGAIN) {
3031                nfs4_restart_rpc(task, NFS_SERVER(inode)->nfs_client);
3032                return -EAGAIN;
3033        }
3034        nfs4_sequence_free_slot(NFS_SERVER(inode)->nfs_client,
3035                                &data->res.seq_res);
3036        nfs_refresh_inode(inode, data->res.fattr);
3037        return 0;
3038}
3039
3040static void nfs4_proc_commit_setup(struct nfs_write_data *data, struct rpc_message *msg)
3041{
3042        struct nfs_server *server = NFS_SERVER(data->inode);
3043        
3044        data->args.bitmask = server->cache_consistency_bitmask;
3045        data->res.server = server;
3046        msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMMIT];
3047}
3048
3049/*
3050 * nfs4_proc_async_renew(): This is not one of the nfs_rpc_ops; it is a special
3051 * standalone procedure for queueing an asynchronous RENEW.
3052 */
3053static void nfs4_renew_done(struct rpc_task *task, void *data)
3054{
3055        struct nfs_client *clp = (struct nfs_client *)task->tk_msg.rpc_argp;
3056        unsigned long timestamp = (unsigned long)data;
3057
3058        if (task->tk_status < 0) {
3059                /* Unless we're shutting down, schedule state recovery! */
3060                if (test_bit(NFS_CS_RENEWD, &clp->cl_res_state) != 0)
3061                        nfs4_schedule_state_recovery(clp);
3062                return;
3063        }
3064        spin_lock(&clp->cl_lock);
3065        if (time_before(clp->cl_last_renewal,timestamp))
3066                clp->cl_last_renewal = timestamp;
3067        spin_unlock(&clp->cl_lock);
3068}
3069
3070static const struct rpc_call_ops nfs4_renew_ops = {
3071        .rpc_call_done = nfs4_renew_done,
3072};
3073
3074int nfs4_proc_async_renew(struct nfs_client *clp, struct rpc_cred *cred)
3075{
3076        struct rpc_message msg = {
3077                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
3078                .rpc_argp       = clp,
3079                .rpc_cred       = cred,
3080        };
3081
3082        return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_SOFT,
3083                        &nfs4_renew_ops, (void *)jiffies);
3084}
3085
3086int nfs4_proc_renew(struct nfs_client *clp, struct rpc_cred *cred)
3087{
3088        struct rpc_message msg = {
3089                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
3090                .rpc_argp       = clp,
3091                .rpc_cred       = cred,
3092        };
3093        unsigned long now = jiffies;
3094        int status;
3095
3096        status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
3097        if (status < 0)
3098                return status;
3099        spin_lock(&clp->cl_lock);
3100        if (time_before(clp->cl_last_renewal,now))
3101                clp->cl_last_renewal = now;
3102        spin_unlock(&clp->cl_lock);
3103        return 0;
3104}
3105
3106static inline int nfs4_server_supports_acls(struct nfs_server *server)
3107{
3108        return (server->caps & NFS_CAP_ACLS)
3109                && (server->acl_bitmask & ACL4_SUPPORT_ALLOW_ACL)
3110                && (server->acl_bitmask & ACL4_SUPPORT_DENY_ACL);
3111}
3112
3113/* Assuming that XATTR_SIZE_MAX is a multiple of PAGE_CACHE_SIZE, and that
3114 * it's OK to put sizeof(void) * (XATTR_SIZE_MAX/PAGE_CACHE_SIZE) bytes on
3115 * the stack.
3116 */
3117#define NFS4ACL_MAXPAGES (XATTR_SIZE_MAX >> PAGE_CACHE_SHIFT)
3118
3119static void buf_to_pages(const void *buf, size_t buflen,
3120                struct page **pages, unsigned int *pgbase)
3121{
3122        const void *p = buf;
3123
3124        *pgbase = offset_in_page(buf);
3125        p -= *pgbase;
3126        while (p < buf + buflen) {
3127                *(pages++) = virt_to_page(p);
3128                p += PAGE_CACHE_SIZE;
3129        }
3130}
3131
3132struct nfs4_cached_acl {
3133        int cached;
3134        size_t len;
3135        char data[0];
3136};
3137
3138static void nfs4_set_cached_acl(struct inode *inode, struct nfs4_cached_acl *acl)
3139{
3140        struct nfs_inode *nfsi = NFS_I(inode);
3141
3142        spin_lock(&inode->i_lock);
3143        kfree(nfsi->nfs4_acl);
3144        nfsi->nfs4_acl = acl;
3145        spin_unlock(&inode->i_lock);
3146}
3147
3148static void nfs4_zap_acl_attr(struct inode *inode)
3149{
3150        nfs4_set_cached_acl(inode, NULL);
3151}
3152
3153static inline ssize_t nfs4_read_cached_acl(struct inode *inode, char *buf, size_t buflen)
3154{
3155        struct nfs_inode *nfsi = NFS_I(inode);
3156        struct nfs4_cached_acl *acl;
3157        int ret = -ENOENT;
3158
3159        spin_lock(&inode->i_lock);
3160        acl = nfsi->nfs4_acl;
3161        if (acl == NULL)
3162                goto out;
3163        if (buf == NULL) /* user is just asking for length */
3164                goto out_len;
3165        if (acl->cached == 0)
3166                goto out;
3167        ret = -ERANGE; /* see getxattr(2) man page */
3168        if (acl->len > buflen)
3169                goto out;
3170        memcpy(buf, acl->data, acl->len);
3171out_len:
3172        ret = acl->len;
3173out:
3174        spin_unlock(&inode->i_lock);
3175        return ret;
3176}
3177
3178static void nfs4_write_cached_acl(struct inode *inode, const char *buf, size_t acl_len)
3179{
3180        struct nfs4_cached_acl *acl;
3181
3182        if (buf && acl_len <= PAGE_SIZE) {
3183                acl = kmalloc(sizeof(*acl) + acl_len, GFP_KERNEL);
3184                if (acl == NULL)
3185                        goto out;
3186                acl->cached = 1;
3187                memcpy(acl->data, buf, acl_len);
3188        } else {
3189                acl = kmalloc(sizeof(*acl), GFP_KERNEL);
3190                if (acl == NULL)
3191                        goto out;
3192                acl->cached = 0;
3193        }
3194        acl->len = acl_len;
3195out:
3196        nfs4_set_cached_acl(inode, acl);
3197}
3198
3199static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
3200{
3201        struct page *pages[NFS4ACL_MAXPAGES];
3202        struct nfs_getaclargs args = {
3203                .fh = NFS_FH(inode),
3204                .acl_pages = pages,
3205                .acl_len = buflen,
3206        };
3207        struct nfs_getaclres res = {
3208                .acl_len = buflen,
3209        };
3210        void *resp_buf;
3211        struct rpc_message msg = {
3212                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETACL],
3213                .rpc_argp = &args,
3214                .rpc_resp = &res,
3215        };
3216        struct page *localpage = NULL;
3217        int ret;
3218
3219        if (buflen < PAGE_SIZE) {
3220                /* As long as we're doing a round trip to the server anyway,
3221                 * let's be prepared for a page of acl data. */
3222                localpage = alloc_page(GFP_KERNEL);
3223                resp_buf = page_address(localpage);
3224                if (localpage == NULL)
3225                        return -ENOMEM;
3226                args.acl_pages[0] = localpage;
3227                args.acl_pgbase = 0;
3228                args.acl_len = PAGE_SIZE;
3229        } else {
3230                resp_buf = buf;
3231                buf_to_pages(buf, buflen, args.acl_pages, &args.acl_pgbase);
3232        }
3233        ret = nfs4_call_sync(NFS_SERVER(inode), &msg, &args, &res, 0);
3234        if (ret)
3235                goto out_free;
3236        if (res.acl_len > args.acl_len)
3237                nfs4_write_cached_acl(inode, NULL, res.acl_len);
3238        else
3239                nfs4_write_cached_acl(inode, resp_buf, res.acl_len);
3240        if (buf) {
3241                ret = -ERANGE;
3242                if (res.acl_len > buflen)
3243                        goto out_free;
3244                if (localpage)
3245                        memcpy(buf, resp_buf, res.acl_len);
3246        }
3247        ret = res.acl_len;
3248out_free:
3249        if (localpage)
3250                __free_page(localpage);
3251        return ret;
3252}
3253
3254static ssize_t nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
3255{
3256        struct nfs4_exception exception = { };
3257        ssize_t ret;
3258        do {
3259                ret = __nfs4_get_acl_uncached(inode, buf, buflen);
3260                if (ret >= 0)
3261                        break;
3262                ret = nfs4_handle_exception(NFS_SERVER(inode), ret, &exception);
3263        } while (exception.retry);
3264        return ret;
3265}
3266
3267static ssize_t nfs4_proc_get_acl(struct inode *inode, void *buf, size_t buflen)
3268{
3269        struct nfs_server *server = NFS_SERVER(inode);
3270        int ret;
3271
3272        if (!nfs4_server_supports_acls(server))
3273                return -EOPNOTSUPP;
3274        ret = nfs_revalidate_inode(server, inode);
3275        if (ret < 0)
3276                return ret;
3277        ret = nfs4_read_cached_acl(inode, buf, buflen);
3278        if (ret != -ENOENT)
3279                return ret;
3280        return nfs4_get_acl_uncached(inode, buf, buflen);
3281}
3282
3283static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen)
3284{
3285        struct nfs_server *server = NFS_SERVER(inode);
3286        struct page *pages[NFS4ACL_MAXPAGES];
3287        struct nfs_setaclargs arg = {
3288                .fh             = NFS_FH(inode),
3289                .acl_pages      = pages,
3290                .acl_len        = buflen,
3291        };
3292        struct nfs_setaclres res;
3293        struct rpc_message msg = {
3294                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_SETACL],
3295                .rpc_argp       = &arg,
3296                .rpc_resp       = &res,
3297        };
3298        int ret;
3299
3300        if (!nfs4_server_supports_acls(server))
3301                return -EOPNOTSUPP;
3302        nfs_inode_return_delegation(inode);
3303        buf_to_pages(buf, buflen, arg.acl_pages, &arg.acl_pgbase);
3304        ret = nfs4_call_sync(server, &msg, &arg, &res, 1);
3305        nfs_access_zap_cache(inode);
3306        nfs_zap_acl_cache(inode);
3307        return ret;
3308}
3309
3310static int nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen)
3311{
3312        struct nfs4_exception exception = { };
3313        int err;
3314        do {
3315                err = nfs4_handle_exception(NFS_SERVER(inode),
3316                                __nfs4_proc_set_acl(inode, buf, buflen),
3317                                &exception);
3318        } while (exception.retry);
3319        return err;
3320}
3321
3322static int
3323_nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server, struct nfs_client *clp, struct nfs4_state *state)
3324{
3325        if (!clp || task->tk_status >= 0)
3326                return 0;
3327        switch(task->tk_status) {
3328                case -NFS4ERR_ADMIN_REVOKED:
3329                case -NFS4ERR_BAD_STATEID:
3330                case -NFS4ERR_OPENMODE:
3331                        if (state == NULL)
3332                                break;
3333                        nfs4_state_mark_reclaim_nograce(clp, state);
3334                case -NFS4ERR_STALE_CLIENTID:
3335                case -NFS4ERR_STALE_STATEID:
3336                case -NFS4ERR_EXPIRED:
3337                        rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL);
3338                        nfs4_schedule_state_recovery(clp);
3339                        if (test_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) == 0)
3340                                rpc_wake_up_queued_task(&clp->cl_rpcwaitq, task);
3341                        task->tk_status = 0;
3342                        return -EAGAIN;
3343#if defined(CONFIG_NFS_V4_1)
3344                case -NFS4ERR_BADSESSION:
3345                case -NFS4ERR_BADSLOT:
3346                case -NFS4ERR_BAD_HIGH_SLOT:
3347                case -NFS4ERR_DEADSESSION:
3348                case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
3349                case -NFS4ERR_SEQ_FALSE_RETRY:
3350                case -NFS4ERR_SEQ_MISORDERED:
3351                        dprintk("%s ERROR %d, Reset session\n", __func__,
3352                                task->tk_status);
3353                        set_bit(NFS4CLNT_SESSION_SETUP, &clp->cl_state);
3354                        task->tk_status = 0;
3355                        return -EAGAIN;
3356#endif /* CONFIG_NFS_V4_1 */
3357                case -NFS4ERR_DELAY:
3358                        if (server)
3359                                nfs_inc_server_stats(server, NFSIOS_DELAY);
3360                case -NFS4ERR_GRACE:
3361                        rpc_delay(task, NFS4_POLL_RETRY_MAX);
3362                        task->tk_status = 0;
3363                        return -EAGAIN;
3364                case -NFS4ERR_OLD_STATEID:
3365                        task->tk_status = 0;
3366                        return -EAGAIN;
3367        }
3368        task->tk_status = nfs4_map_errors(task->tk_status);
3369        return 0;
3370}
3371
3372static int
3373nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server, struct nfs4_state *state)
3374{
3375        return _nfs4_async_handle_error(task, server, server->nfs_client, state);
3376}
3377
3378int nfs4_proc_setclientid(struct nfs_client *clp, u32 program, unsigned short port, struct rpc_cred *cred)
3379{
3380        nfs4_verifier sc_verifier;
3381        struct nfs4_setclientid setclientid = {
3382                .sc_verifier = &sc_verifier,
3383                .sc_prog = program,
3384        };
3385        struct rpc_message msg = {
3386                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID],
3387                .rpc_argp = &setclientid,
3388                .rpc_resp = clp,
3389                .rpc_cred = cred,
3390        };
3391        __be32 *p;
3392        int loop = 0;
3393        int status;
3394
3395        p = (__be32*)sc_verifier.data;
3396        *p++ = htonl((u32)clp->cl_boot_time.tv_sec);
3397        *p = htonl((u32)clp->cl_boot_time.tv_nsec);
3398
3399        for(;;) {
3400                setclientid.sc_name_len = scnprintf(setclientid.sc_name,
3401                                sizeof(setclientid.sc_name), "%s/%s %s %s %u",
3402                                clp->cl_ipaddr,
3403                                rpc_peeraddr2str(clp->cl_rpcclient,
3404                                                        RPC_DISPLAY_ADDR),
3405                                rpc_peeraddr2str(clp->cl_rpcclient,
3406                                                        RPC_DISPLAY_PROTO),
3407                                clp->cl_rpcclient->cl_auth->au_ops->au_name,
3408                                clp->cl_id_uniquifier);
3409                setclientid.sc_netid_len = scnprintf(setclientid.sc_netid,
3410                                sizeof(setclientid.sc_netid),
3411                                rpc_peeraddr2str(clp->cl_rpcclient,
3412                                                        RPC_DISPLAY_NETID));
3413                setclientid.sc_uaddr_len = scnprintf(setclientid.sc_uaddr,
3414                                sizeof(setclientid.sc_uaddr), "%s.%u.%u",
3415                                clp->cl_ipaddr, port >> 8, port & 255);
3416
3417                status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
3418                if (status != -NFS4ERR_CLID_INUSE)
3419                        break;
3420                if (signalled())
3421                        break;
3422                if (loop++ & 1)
3423                        ssleep(clp->cl_lease_time + 1);
3424                else
3425                        if (++clp->cl_id_uniquifier == 0)
3426                                break;
3427        }
3428        return status;
3429}
3430
3431static int _nfs4_proc_setclientid_confirm(struct nfs_client *clp, struct rpc_cred *cred)
3432{
3433        struct nfs_fsinfo fsinfo;
3434        struct rpc_message msg = {
3435                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID_CONFIRM],
3436                .rpc_argp = clp,
3437                .rpc_resp = &fsinfo,
3438                .rpc_cred = cred,
3439        };
3440        unsigned long now;
3441        int status;
3442
3443        now = jiffies;
3444        status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
3445        if (status == 0) {
3446                spin_lock(&clp->cl_lock);
3447                clp->cl_lease_time = fsinfo.lease_time * HZ;
3448                clp->cl_last_renewal = now;
3449                spin_unlock(&clp->cl_lock);
3450        }
3451        return status;
3452}
3453
3454int nfs4_proc_setclientid_confirm(struct nfs_client *clp, struct rpc_cred *cred)
3455{
3456        long timeout = 0;
3457        int err;
3458        do {
3459                err = _nfs4_proc_setclientid_confirm(clp, cred);
3460                switch (err) {
3461                        case 0:
3462                                return err;
3463                        case -NFS4ERR_RESOURCE:
3464                                /* The IBM lawyers misread another document! */
3465                        case -NFS4ERR_DELAY:
3466                                err = nfs4_delay(clp->cl_rpcclient, &timeout);
3467                }
3468        } while (err == 0);
3469        return err;
3470}
3471
3472struct nfs4_delegreturndata {
3473        struct nfs4_delegreturnargs args;
3474        struct nfs4_delegreturnres res;
3475        struct nfs_fh fh;
3476        nfs4_stateid stateid;
3477        unsigned long timestamp;
3478        struct nfs_fattr fattr;
3479        int rpc_status;
3480};
3481
3482static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
3483{
3484        struct nfs4_delegreturndata *data = calldata;
3485
3486        nfs4_sequence_done_free_slot(data->res.server, &data->res.seq_res,
3487                                     task->tk_status);
3488
3489        data->rpc_status = task->tk_status;
3490        if (data->rpc_status == 0)
3491                renew_lease(data->res.server, data->timestamp);
3492}
3493
3494static void nfs4_delegreturn_release(void *calldata)
3495{
3496        kfree(calldata);
3497}
3498
3499#if defined(CONFIG_NFS_V4_1)
3500static void nfs4_delegreturn_prepare(struct rpc_task *task, void *data)
3501{
3502        struct nfs4_delegreturndata *d_data;
3503
3504        d_data = (struct nfs4_delegreturndata *)data;
3505
3506        if (nfs4_setup_sequence(d_data->res.server->nfs_client,
3507                                &d_data->args.seq_args,
3508                                &d_data->res.seq_res, 1, task))
3509                return;
3510        rpc_call_start(task);
3511}
3512#endif /* CONFIG_NFS_V4_1 */
3513
3514static const struct rpc_call_ops nfs4_delegreturn_ops = {
3515#if defined(CONFIG_NFS_V4_1)
3516        .rpc_call_prepare = nfs4_delegreturn_prepare,
3517#endif /* CONFIG_NFS_V4_1 */
3518        .rpc_call_done = nfs4_delegreturn_done,
3519        .rpc_release = nfs4_delegreturn_release,
3520};
3521
3522static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync)
3523{
3524        struct nfs4_delegreturndata *data;
3525        struct nfs_server *server = NFS_SERVER(inode);
3526        struct rpc_task *task;
3527        struct rpc_message msg = {
3528                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DELEGRETURN],
3529                .rpc_cred = cred,
3530        };
3531        struct rpc_task_setup task_setup_data = {
3532                .rpc_client = server->client,
3533                .rpc_message = &msg,
3534                .callback_ops = &nfs4_delegreturn_ops,
3535                .flags = RPC_TASK_ASYNC,
3536        };
3537        int status = 0;
3538
3539        data = kzalloc(sizeof(*data), GFP_KERNEL);
3540        if (data == NULL)
3541                return -ENOMEM;
3542        data->args.fhandle = &data->fh;
3543        data->args.stateid = &data->stateid;
3544        data->args.bitmask = server->attr_bitmask;
3545        nfs_copy_fh(&data->fh, NFS_FH(inode));
3546        memcpy(&data->stateid, stateid, sizeof(data->stateid));
3547        data->res.fattr = &data->fattr;
3548        data->res.server = server;
3549        data->res.seq_res.sr_slotid = NFS4_MAX_SLOT_TABLE;
3550        nfs_fattr_init(data->res.fattr);
3551        data->timestamp = jiffies;
3552        data->rpc_status = 0;
3553
3554        task_setup_data.callback_data = data;
3555        msg.rpc_argp = &data->args,
3556        msg.rpc_resp = &data->res,
3557        task = rpc_run_task(&task_setup_data);
3558        if (IS_ERR(task))
3559                return PTR_ERR(task);
3560        if (!issync)
3561                goto out;
3562        status = nfs4_wait_for_completion_rpc_task(task);
3563        if (status != 0)
3564                goto out;
3565        status = data->rpc_status;
3566        if (status != 0)
3567                goto out;
3568        nfs_refresh_inode(inode, &data->fattr);
3569out:
3570        rpc_put_task(task);
3571        return status;
3572}
3573
3574int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync)
3575{
3576        struct nfs_server *server = NFS_SERVER(inode);
3577        struct nfs4_exception exception = { };
3578        int err;
3579        do {
3580                err = _nfs4_proc_delegreturn(inode, cred, stateid, issync);
3581                switch (err) {
3582                        case -NFS4ERR_STALE_STATEID:
3583                        case -NFS4ERR_EXPIRED:
3584                        case 0:
3585                                return 0;
3586                }
3587                err = nfs4_handle_exception(server, err, &exception);
3588        } while (exception.retry);
3589        return err;
3590}
3591
3592#define NFS4_LOCK_MINTIMEOUT (1 * HZ)
3593#define NFS4_LOCK_MAXTIMEOUT (30 * HZ)
3594
3595/* 
3596 * sleep, with exponential backoff, and retry the LOCK operation. 
3597 */
3598static unsigned long
3599nfs4_set_lock_task_retry(unsigned long timeout)
3600{
3601        schedule_timeout_killable(timeout);
3602        timeout <<= 1;
3603        if (timeout > NFS4_LOCK_MAXTIMEOUT)
3604                return NFS4_LOCK_MAXTIMEOUT;
3605        return timeout;
3606}
3607
3608static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request)
3609{
3610        struct inode *inode = state->inode;
3611        struct nfs_server *server = NFS_SERVER(inode);
3612        struct nfs_client *clp = server->nfs_client;
3613        struct nfs_lockt_args arg = {
3614                .fh = NFS_FH(inode),
3615                .fl = request,
3616        };
3617        struct nfs_lockt_res res = {
3618                .denied = request,
3619        };
3620        struct rpc_message msg = {
3621                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_LOCKT],
3622                .rpc_argp       = &arg,
3623                .rpc_resp       = &res,
3624                .rpc_cred       = state->owner->so_cred,
3625        };
3626        struct nfs4_lock_state *lsp;
3627        int status;
3628
3629        arg.lock_owner.clientid = clp->cl_clientid;
3630        status = nfs4_set_lock_state(state, request);
3631        if (status != 0)
3632                goto out;
3633        lsp = request->fl_u.nfs4_fl.owner;
3634        arg.lock_owner.id = lsp->ls_id.id;
3635        status = nfs4_call_sync(server, &msg, &arg, &res, 1);
3636        switch (status) {
3637                case 0:
3638                        request->fl_type = F_UNLCK;
3639                        break;
3640                case -NFS4ERR_DENIED:
3641                        status = 0;
3642        }
3643        request->fl_ops->fl_release_private(request);
3644out:
3645        return status;
3646}
3647
3648static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request)
3649{
3650        struct nfs4_exception exception = { };
3651        int err;
3652
3653        do {
3654                err = nfs4_handle_exception(NFS_SERVER(state->inode),
3655                                _nfs4_proc_getlk(state, cmd, request),
3656                                &exception);
3657        } while (exception.retry);
3658        return err;
3659}
3660
3661static int do_vfs_lock(struct file *file, struct file_lock *fl)
3662{
3663        int res = 0;
3664        switch (fl->fl_flags & (FL_POSIX|FL_FLOCK)) {
3665                case FL_POSIX:
3666                        res = posix_lock_file_wait(file, fl);
3667                        break;
3668                case FL_FLOCK:
3669                        res = flock_lock_file_wait(file, fl);
3670                        break;
3671                default:
3672                        BUG();
3673        }
3674        return res;
3675}
3676
3677struct nfs4_unlockdata {
3678        struct nfs_locku_args arg;
3679        struct nfs_locku_res res;
3680        struct nfs4_lock_state *lsp;
3681        struct nfs_open_context *ctx;
3682        struct file_lock fl;
3683        const struct nfs_server *server;
3684        unsigned long timestamp;
3685};
3686
3687static struct nfs4_unlockdata *nfs4_alloc_unlockdata(struct file_lock *fl,
3688                struct nfs_open_context *ctx,
3689                struct nfs4_lock_state *lsp,
3690                struct nfs_seqid *seqid)
3691{
3692        struct nfs4_unlockdata *p;
3693        struct inode *inode = lsp->ls_state->inode;
3694
3695        p = kzalloc(sizeof(*p), GFP_KERNEL);
3696        if (p == NULL)
3697                return NULL;
3698        p->arg.fh = NFS_FH(inode);
3699        p->arg.fl = &p->fl;
3700        p->arg.seqid = seqid;
3701        p->res.seqid = seqid;
3702        p->res.seq_res.sr_slotid = NFS4_MAX_SLOT_TABLE;
3703        p->arg.stateid = &lsp->ls_stateid;
3704        p->lsp = lsp;
3705        atomic_inc(&lsp->ls_count);
3706        /* Ensure we don't close file until we're done freeing locks! */
3707        p->ctx = get_nfs_open_context(ctx);
3708        memcpy(&p->fl, fl, sizeof(p->fl));
3709        p->server = NFS_SERVER(inode);
3710        return p;
3711}
3712
3713static void nfs4_locku_release_calldata(void *data)
3714{
3715        struct nfs4_unlockdata *calldata = data;
3716        nfs_free_seqid(calldata->arg.seqid);
3717        nfs4_put_lock_state(calldata->lsp);
3718        put_nfs_open_context(calldata->ctx);
3719        kfree(calldata);
3720}
3721
3722static void nfs4_locku_done(struct rpc_task *task, void *data)
3723{
3724        struct nfs4_unlockdata *calldata = data;
3725
3726        nfs4_sequence_done(calldata->server, &calldata->res.seq_res,
3727                           task->tk_status);
3728        if (RPC_ASSASSINATED(task))
3729                return;
3730        switch (task->tk_status) {
3731                case 0:
3732                        memcpy(calldata->lsp->ls_stateid.data,
3733                                        calldata->res.stateid.data,
3734                                        sizeof(calldata->lsp->ls_stateid.data));
3735                        renew_lease(calldata->server, calldata->timestamp);
3736                        break;
3737                case -NFS4ERR_BAD_STATEID:
3738                case -NFS4ERR_OLD_STATEID:
3739                case -NFS4ERR_STALE_STATEID:
3740                case -NFS4ERR_EXPIRED:
3741                        break;
3742                default:
3743                        if (nfs4_async_handle_error(task, calldata->server, NULL) == -EAGAIN)
3744                                nfs4_restart_rpc(task,
3745                                                calldata->server->nfs_client);
3746        }
3747        nfs4_sequence_free_slot(calldata->server->nfs_client,
3748                                &calldata->res.seq_res);
3749}
3750
3751static void nfs4_locku_prepare(struct rpc_task *task, void *data)
3752{
3753        struct nfs4_unlockdata *calldata = data;
3754
3755        if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
3756                return;
3757        if ((calldata->lsp->ls_flags & NFS_LOCK_INITIALIZED) == 0) {
3758                /* Note: exit _without_ running nfs4_locku_done */
3759                task->tk_action = NULL;
3760                return;
3761        }
3762        calldata->timestamp = jiffies;
3763        if (nfs4_setup_sequence(calldata->server->nfs_client,
3764                                &calldata->arg.seq_args,
3765                                &calldata->res.seq_res, 1, task))
3766                return;
3767        rpc_call_start(task);
3768}
3769
3770static const struct rpc_call_ops nfs4_locku_ops = {
3771        .rpc_call_prepare = nfs4_locku_prepare,
3772        .rpc_call_done = nfs4_locku_done,
3773        .rpc_release = nfs4_locku_release_calldata,
3774};
3775
3776static struct rpc_task *nfs4_do_unlck(struct file_lock *fl,
3777                struct nfs_open_context *ctx,
3778                struct nfs4_lock_state *lsp,
3779                struct nfs_seqid *seqid)
3780{
3781        struct nfs4_unlockdata *data;
3782        struct rpc_message msg = {
3783                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKU],
3784                .rpc_cred = ctx->cred,
3785        };
3786        struct rpc_task_setup task_setup_data = {
3787                .rpc_client = NFS_CLIENT(lsp->ls_state->inode),
3788                .rpc_message = &msg,
3789                .callback_ops = &nfs4_locku_ops,
3790                .workqueue = nfsiod_workqueue,
3791                .flags = RPC_TASK_ASYNC,
3792        };
3793
3794        /* Ensure this is an unlock - when canceling a lock, the
3795         * canceled lock is passed in, and it won't be an unlock.
3796         */
3797        fl->fl_type = F_UNLCK;
3798
3799        data = nfs4_alloc_unlockdata(fl, ctx, lsp, seqid);
3800        if (data == NULL) {
3801                nfs_free_seqid(seqid);
3802                return ERR_PTR(-ENOMEM);
3803        }
3804
3805        msg.rpc_argp = &data->arg,
3806        msg.rpc_resp = &data->res,
3807        task_setup_data.callback_data = data;
3808        return rpc_run_task(&task_setup_data);
3809}
3810
3811static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock *request)
3812{
3813        struct nfs_inode *nfsi = NFS_I(state->inode);
3814        struct nfs_seqid *seqid;
3815        struct nfs4_lock_state *lsp;
3816        struct rpc_task *task;
3817        int status = 0;
3818        unsigned char fl_flags = request->fl_flags;
3819
3820        status = nfs4_set_lock_state(state, request);
3821        /* Unlock _before_ we do the RPC call */
3822        request->fl_flags |= FL_EXISTS;
3823        down_read(&nfsi->rwsem);
3824        if (do_vfs_lock(request->fl_file, request) == -ENOENT) {
3825                up_read(&nfsi->rwsem);
3826                goto out;
3827        }
3828        up_read(&nfsi->rwsem);
3829        if (status != 0)
3830                goto out;
3831        /* Is this a delegated lock? */
3832        if (test_bit(NFS_DELEGATED_STATE, &state->flags))
3833                goto out;
3834        lsp = request->fl_u.nfs4_fl.owner;
3835        seqid = nfs_alloc_seqid(&lsp->ls_seqid);
3836        status = -ENOMEM;
3837        if (seqid == NULL)
3838                goto out;
3839        task = nfs4_do_unlck(request, nfs_file_open_context(request->fl_file), lsp, seqid);
3840        status = PTR_ERR(task);
3841        if (IS_ERR(task))
3842                goto out;
3843        status = nfs4_wait_for_completion_rpc_task(task);
3844        rpc_put_task(task);
3845out:
3846        request->fl_flags = fl_flags;
3847        return status;
3848}
3849
3850struct nfs4_lockdata {
3851        struct nfs_lock_args arg;
3852        struct nfs_lock_res res;
3853        struct nfs4_lock_state *lsp;
3854        struct nfs_open_context *ctx;
3855        struct file_lock fl;
3856        unsigned long timestamp;
3857        int rpc_status;
3858        int cancelled;
3859        struct nfs_server *server;
3860};
3861
3862static struct nfs4_lockdata *nfs4_alloc_lockdata(struct file_lock *fl,
3863                struct nfs_open_context *ctx, struct nfs4_lock_state *lsp)
3864{
3865        struct nfs4_lockdata *p;
3866        struct inode *inode = lsp->ls_state->inode;
3867        struct nfs_server *server = NFS_SERVER(inode);
3868
3869        p = kzalloc(sizeof(*p), GFP_KERNEL);
3870        if (p == NULL)
3871                return NULL;
3872
3873        p->arg.fh = NFS_FH(inode);
3874        p->arg.fl = &p->fl;
3875        p->arg.open_seqid = nfs_alloc_seqid(&lsp->ls_state->owner->so_seqid);
3876        if (p->arg.open_seqid == NULL)
3877                goto out_free;
3878        p->arg.lock_seqid = nfs_alloc_seqid(&lsp->ls_seqid);
3879        if (p->arg.lock_seqid == NULL)
3880                goto out_free_seqid;
3881        p->arg.lock_stateid = &lsp->ls_stateid;
3882        p->arg.lock_owner.clientid = server->nfs_client->cl_clientid;
3883        p->arg.lock_owner.id = lsp->ls_id.id;
3884        p->res.lock_seqid = p->arg.lock_seqid;
3885        p->res.seq_res.sr_slotid = NFS4_MAX_SLOT_TABLE;
3886        p->lsp = lsp;
3887        p->server = server;
3888        atomic_inc(&lsp->ls_count);
3889        p->ctx = get_nfs_open_context(ctx);
3890        memcpy(&p->fl, fl, sizeof(p->fl));
3891        return p;
3892out_free_seqid:
3893        nfs_free_seqid(p->arg.open_seqid);
3894out_free:
3895        kfree(p);
3896        return NULL;
3897}
3898
3899static void nfs4_lock_prepare(struct rpc_task *task, void *calldata)
3900{
3901        struct nfs4_lockdata *data = calldata;
3902        struct nfs4_state *state = data->lsp->ls_state;
3903
3904        dprintk("%s: begin!\n", __func__);
3905        if (nfs_wait_on_sequence(data->arg.lock_seqid, task) != 0)
3906                return;
3907        /* Do we need to do an open_to_lock_owner? */
3908        if (!(data->arg.lock_seqid->sequence->flags & NFS_SEQID_CONFIRMED)) {
3909                if (nfs_wait_on_sequence(data->arg.open_seqid, task) != 0)
3910                        return;
3911                data->arg.open_stateid = &state->stateid;
3912                data->arg.new_lock_owner = 1;
3913                data->res.open_seqid = data->arg.open_seqid;
3914        } else
3915                data->arg.new_lock_owner = 0;
3916        data->timestamp = jiffies;
3917        if (nfs4_setup_sequence(data->server->nfs_client, &data->arg.seq_args,
3918                                &data->res.seq_res, 1, task))
3919                return;
3920        rpc_call_start(task);
3921        dprintk("%s: done!, ret = %d\n", __func__, data->rpc_status);
3922}
3923
3924static void nfs4_lock_done(struct rpc_task *task, void *calldata)
3925{
3926        struct nfs4_lockdata *data = calldata;
3927
3928        dprintk("%s: begin!\n", __func__);
3929
3930        nfs4_sequence_done_free_slot(data->server, &data->res.seq_res,
3931                                     task->tk_status);
3932
3933        data->rpc_status = task->tk_status;
3934        if (RPC_ASSASSINATED(task))
3935                goto out;
3936        if (data->arg.new_lock_owner != 0) {
3937                if (data->rpc_status == 0)
3938                        nfs_confirm_seqid(&data->lsp->ls_seqid, 0);
3939                else
3940                        goto out;
3941        }
3942        if (data->rpc_status == 0) {
3943                memcpy(data->lsp->ls_stateid.data, data->res.stateid.data,
3944                                        sizeof(data->lsp->ls_stateid.data));
3945                data->lsp->ls_flags |= NFS_LOCK_INITIALIZED;
3946                renew_lease(NFS_SERVER(data->ctx->path.dentry->d_inode), data->timestamp);
3947        }
3948out:
3949        dprintk("%s: done, ret = %d!\n", __func__, data->rpc_status);
3950}
3951
3952static void nfs4_lock_release(void *calldata)
3953{
3954        struct nfs4_lockdata *data = calldata;
3955
3956        dprintk("%s: begin!\n", __func__);
3957        nfs_free_seqid(data->arg.open_seqid);
3958        if (data->cancelled != 0) {
3959                struct rpc_task *task;
3960                task = nfs4_do_unlck(&data->fl, data->ctx, data->lsp,
3961                                data->arg.lock_seqid);
3962                if (!IS_ERR(task))
3963                        rpc_put_task(task);
3964                dprintk("%s: cancelling lock!\n", __func__);
3965        } else
3966                nfs_free_seqid(data->arg.lock_seqid);
3967        nfs4_put_lock_state(data->lsp);
3968        put_nfs_open_context(data->ctx);
3969        kfree(data);
3970        dprintk("%s: done!\n", __func__);
3971}
3972
3973static const struct rpc_call_ops nfs4_lock_ops = {
3974        .rpc_call_prepare = nfs4_lock_prepare,
3975        .rpc_call_done = nfs4_lock_done,
3976        .rpc_release = nfs4_lock_release,
3977};
3978
3979static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *fl, int reclaim)
3980{
3981        struct nfs4_lockdata *data;
3982        struct rpc_task *task;
3983        struct rpc_message msg = {
3984                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCK],
3985                .rpc_cred = state->owner->so_cred,
3986        };
3987        struct rpc_task_setup task_setup_data = {
3988                .rpc_client = NFS_CLIENT(state->inode),
3989                .rpc_message = &msg,
3990                .callback_ops = &nfs4_lock_ops,
3991                .workqueue = nfsiod_workqueue,
3992                .flags = RPC_TASK_ASYNC,
3993        };
3994        int ret;
3995
3996        dprintk("%s: begin!\n", __func__);
3997        data = nfs4_alloc_lockdata(fl, nfs_file_open_context(fl->fl_file),
3998                        fl->fl_u.nfs4_fl.owner);
3999        if (data == NULL)
4000                return -ENOMEM;
4001        if (IS_SETLKW(cmd))
4002                data->arg.block = 1;
4003        if (reclaim != 0)
4004                data->arg.reclaim = 1;
4005        msg.rpc_argp = &data->arg,
4006        msg.rpc_resp = &data->res,
4007        task_setup_data.callback_data = data;
4008        task = rpc_run_task(&task_setup_data);
4009        if (IS_ERR(task))
4010                return PTR_ERR(task);
4011        ret = nfs4_wait_for_completion_rpc_task(task);
4012        if (ret == 0) {
4013                ret = data->rpc_status;
4014        } else
4015                data->cancelled = 1;
4016        rpc_put_task(task);
4017        dprintk("%s: done, ret = %d!\n", __func__, ret);
4018        return ret;
4019}
4020
4021static int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request)
4022{
4023        struct nfs_server *server = NFS_SERVER(state->inode);
4024        struct nfs4_exception exception = { };
4025        int err;
4026
4027        do {
4028                /* Cache the lock if possible... */
4029                if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0)
4030                        return 0;
4031                err = _nfs4_do_setlk(state, F_SETLK, request, 1);
4032                if (err != -NFS4ERR_DELAY)
4033                        break;
4034                nfs4_handle_exception(server, err, &exception);
4035        } while (exception.retry);
4036        return err;
4037}
4038
4039static int nfs4_lock_expired(struct nfs4_state *state, struct file_lock *request)
4040{
4041        struct nfs_server *server = NFS_SERVER(state->inode);
4042        struct nfs4_exception exception = { };
4043        int err;
4044
4045        err = nfs4_set_lock_state(state, request);
4046        if (err != 0)
4047                return err;
4048        do {
4049                if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0)
4050                        return 0;
4051                err = _nfs4_do_setlk(state, F_SETLK, request, 0);
4052                if (err != -NFS4ERR_DELAY)
4053                        break;
4054                nfs4_handle_exception(server, err, &exception);
4055        } while (exception.retry);
4056        return err;
4057}
4058
4059static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
4060{
4061        struct nfs_inode *nfsi = NFS_I(state->inode);
4062        unsigned char fl_flags = request->fl_flags;
4063        int status;
4064
4065        /* Is this a delegated open? */
4066        status = nfs4_set_lock_state(state, request);
4067        if (status != 0)
4068                goto out;
4069        request->fl_flags |= FL_ACCESS;
4070        status = do_vfs_lock(request->fl_file, request);
4071        if (status < 0)
4072                goto out;
4073        down_read(&nfsi->rwsem);
4074        if (test_bit(NFS_DELEGATED_STATE, &state->flags)) {
4075                /* Yes: cache locks! */
4076                /* ...but avoid races with delegation recall... */
4077                request->fl_flags = fl_flags & ~FL_SLEEP;
4078                status = do_vfs_lock(request->fl_file, request);
4079                goto out_unlock;
4080        }
4081        status = _nfs4_do_setlk(state, cmd, request, 0);
4082        if (status != 0)
4083                goto out_unlock;
4084        /* Note: we always want to sleep here! */
4085        request->fl_flags = fl_flags | FL_SLEEP;
4086        if (do_vfs_lock(request->fl_file, request) < 0)
4087                printk(KERN_WARNING "%s: VFS is out of sync with lock manager!\n", __func__);
4088out_unlock:
4089        up_read(&nfsi->rwsem);
4090out:
4091        request->fl_flags = fl_flags;
4092        return status;
4093}
4094
4095static int nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
4096{
4097        struct nfs4_exception exception = { };
4098        int err;
4099
4100        do {
4101                err = _nfs4_proc_setlk(state, cmd, request);
4102                if (err == -NFS4ERR_DENIED)
4103                        err = -EAGAIN;
4104                err = nfs4_handle_exception(NFS_SERVER(state->inode),
4105                                err, &exception);
4106        } while (exception.retry);
4107        return err;
4108}
4109
4110static int
4111nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request)
4112{
4113        struct nfs_open_context *ctx;
4114        struct nfs4_state *state;
4115        unsigned long timeout = NFS4_LOCK_MINTIMEOUT;
4116        int status;
4117
4118        /* verify open state */
4119        ctx = nfs_file_open_context(filp);
4120        state = ctx->state;
4121
4122        if (request->fl_start < 0 || request->fl_end < 0)
4123                return -EINVAL;
4124
4125        if (IS_GETLK(cmd)) {
4126                if (state != NULL)
4127                        return nfs4_proc_getlk(state, F_GETLK, request);
4128                return 0;
4129        }
4130
4131        if (!(IS_SETLK(cmd) || IS_SETLKW(cmd)))
4132                return -EINVAL;
4133
4134        if (request->fl_type == F_UNLCK) {
4135                if (state != NULL)
4136                        return nfs4_proc_unlck(state, cmd, request);
4137                return 0;
4138        }
4139
4140        if (state == NULL)
4141                return -ENOLCK;
4142        do {
4143                status = nfs4_proc_setlk(state, cmd, request);
4144                if ((status != -EAGAIN) || IS_SETLK(cmd))
4145                        break;
4146                timeout = nfs4_set_lock_task_retry(timeout);
4147                status = -ERESTARTSYS;
4148                if (signalled())
4149                        break;
4150        } while(status < 0);
4151        return status;
4152}
4153
4154int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl)
4155{
4156        struct nfs_server *server = NFS_SERVER(state->inode);
4157        struct nfs4_exception exception = { };
4158        int err;
4159
4160        err = nfs4_set_lock_state(state, fl);
4161        if (err != 0)
4162                goto out;
4163        do {
4164                err = _nfs4_do_setlk(state, F_SETLK, fl, 0);
4165                switch (err) {
4166                        default:
4167                                printk(KERN_ERR "%s: unhandled error %d.\n",
4168                                                __func__, err);
4169                        case 0:
4170                        case -ESTALE:
4171                                goto out;
4172                        case -NFS4ERR_EXPIRED:
4173                        case -NFS4ERR_STALE_CLIENTID:
4174                        case -NFS4ERR_STALE_STATEID:
4175                                nfs4_schedule_state_recovery(server->nfs_client);
4176                                goto out;
4177                        case -ERESTARTSYS:
4178                                /*
4179                                 * The show must go on: exit, but mark the
4180                                 * stateid as needing recovery.
4181                                 */
4182                        case -NFS4ERR_ADMIN_REVOKED:
4183                        case -NFS4ERR_BAD_STATEID:
4184                        case -NFS4ERR_OPENMODE:
4185                                nfs4_state_mark_reclaim_nograce(server->nfs_client, state);
4186                                err = 0;
4187                                goto out;
4188                        case -ENOMEM:
4189                        case -NFS4ERR_DENIED:
4190                                /* kill_proc(fl->fl_pid, SIGLOST, 1); */
4191                                err = 0;
4192                                goto out;
4193                        case -NFS4ERR_DELAY:
4194                                break;
4195                }
4196                err = nfs4_handle_exception(server, err, &exception);
4197        } while (exception.retry);
4198out:
4199        return err;
4200}
4201
4202#define XATTR_NAME_NFSV4_ACL "system.nfs4_acl"
4203
4204int nfs4_setxattr(struct dentry *dentry, const char *key, const void *buf,
4205                size_t buflen, int flags)
4206{
4207        struct inode *inode = dentry->d_inode;
4208
4209        if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0)
4210                return -EOPNOTSUPP;
4211
4212        return nfs4_proc_set_acl(inode, buf, buflen);
4213}
4214
4215/* The getxattr man page suggests returning -ENODATA for unknown attributes,
4216 * and that's what we'll do for e.g. user attributes that haven't been set.
4217 * But we'll follow ext2/ext3's lead by returning -EOPNOTSUPP for unsupported
4218 * attributes in kernel-managed attribute namespaces. */
4219ssize_t nfs4_getxattr(struct dentry *dentry, const char *key, void *buf,
4220                size_t buflen)
4221{
4222        struct inode *inode = dentry->d_inode;
4223
4224        if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0)
4225                return -EOPNOTSUPP;
4226
4227        return nfs4_proc_get_acl(inode, buf, buflen);
4228}
4229
4230ssize_t nfs4_listxattr(struct dentry *dentry, char *buf, size_t buflen)
4231{
4232        size_t len = strlen(XATTR_NAME_NFSV4_ACL) + 1;
4233
4234        if (!nfs4_server_supports_acls(NFS_SERVER(dentry->d_inode)))
4235                return 0;
4236        if (buf && buflen < len)
4237                return -ERANGE;
4238        if (buf)
4239                memcpy(buf, XATTR_NAME_NFSV4_ACL, len);
4240        return len;
4241}
4242
4243static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr)
4244{
4245        if (!((fattr->valid & NFS_ATTR_FATTR_FILEID) &&
4246                (fattr->valid & NFS_ATTR_FATTR_FSID) &&
4247                (fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL)))
4248                return;
4249
4250        fattr->valid |= NFS_ATTR_FATTR_TYPE | NFS_ATTR_FATTR_MODE |
4251                NFS_ATTR_FATTR_NLINK;
4252        fattr->mode = S_IFDIR | S_IRUGO | S_IXUGO;
4253        fattr->nlink = 2;
4254}
4255
4256int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
4257                struct nfs4_fs_locations *fs_locations, struct page *page)
4258{
4259        struct nfs_server *server = NFS_SERVER(dir);
4260        u32 bitmask[2] = {
4261                [0] = FATTR4_WORD0_FSID | FATTR4_WORD0_FS_LOCATIONS,
4262                [1] = FATTR4_WORD1_MOUNTED_ON_FILEID,
4263        };
4264        struct nfs4_fs_locations_arg args = {
4265                .dir_fh = NFS_FH(dir),
4266                .name = name,
4267                .page = page,
4268                .bitmask = bitmask,
4269        };
4270        struct nfs4_fs_locations_res res = {
4271                .fs_locations = fs_locations,
4272        };
4273        struct rpc_message msg = {
4274                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FS_LOCATIONS],
4275                .rpc_argp = &args,
4276                .rpc_resp = &res,
4277        };
4278        int status;
4279
4280        dprintk("%s: start\n", __func__);
4281        nfs_fattr_init(&fs_locations->fattr);
4282        fs_locations->server = server;
4283        fs_locations->nlocations = 0;
4284        status = nfs4_call_sync(server, &msg, &args, &res, 0);
4285        nfs_fixup_referral_attributes(&fs_locations->fattr);
4286        dprintk("%s: returned status = %d\n", __func__, status);
4287        return status;
4288}
4289
4290#ifdef CONFIG_NFS_V4_1
4291/*
4292 * nfs4_proc_exchange_id()
4293 *
4294 * Since the clientid has expired, all compounds using sessions
4295 * associated with the stale clientid will be returning
4296 * NFS4ERR_BADSESSION in the sequence operation, and will therefore
4297 * be in some phase of session reset.
4298 */
4299static int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
4300{
4301        nfs4_verifier verifier;
4302        struct nfs41_exchange_id_args args = {
4303                .client = clp,
4304                .flags = clp->cl_exchange_flags,
4305        };
4306        struct nfs41_exchange_id_res res = {
4307                .client = clp,
4308        };
4309        int status;
4310        struct rpc_message msg = {
4311                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_EXCHANGE_ID],
4312                .rpc_argp = &args,
4313                .rpc_resp = &res,
4314                .rpc_cred = cred,
4315        };
4316        __be32 *p;
4317
4318        dprintk("--> %s\n", __func__);
4319        BUG_ON(clp == NULL);
4320
4321        p = (u32 *)verifier.data;
4322        *p++ = htonl((u32)clp->cl_boot_time.tv_sec);
4323        *p = htonl((u32)clp->cl_boot_time.tv_nsec);
4324        args.verifier = &verifier;
4325
4326        while (1) {
4327                args.id_len = scnprintf(args.id, sizeof(args.id),
4328                                        "%s/%s %u",
4329                                        clp->cl_ipaddr,
4330                                        rpc_peeraddr2str(clp->cl_rpcclient,
4331                                                         RPC_DISPLAY_ADDR),
4332                                        clp->cl_id_uniquifier);
4333
4334                status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
4335
4336                if (status != NFS4ERR_CLID_INUSE)
4337                        break;
4338
4339                if (signalled())
4340                        break;
4341
4342                if (++clp->cl_id_uniquifier == 0)
4343                        break;
4344        }
4345
4346        dprintk("<-- %s status= %d\n", __func__, status);
4347        return status;
4348}
4349
4350struct nfs4_get_lease_time_data {
4351        struct nfs4_get_lease_time_args *args;
4352        struct nfs4_get_lease_time_res *res;
4353        struct nfs_client *clp;
4354};
4355
4356static void nfs4_get_lease_time_prepare(struct rpc_task *task,
4357                                        void *calldata)
4358{
4359        int ret;
4360        struct nfs4_get_lease_time_data *data =
4361                        (struct nfs4_get_lease_time_data *)calldata;
4362
4363        dprintk("--> %s\n", __func__);
4364        /* just setup sequence, do not trigger session recovery
4365           since we're invoked within one */
4366        ret = nfs41_setup_sequence(data->clp->cl_session,
4367                                        &data->args->la_seq_args,
4368                                        &data->res->lr_seq_res, 0, task);
4369
4370        BUG_ON(ret == -EAGAIN);
4371        rpc_call_start(task);
4372        dprintk("<-- %s\n", __func__);
4373}
4374
4375/*
4376 * Called from nfs4_state_manager thread for session setup, so don't recover
4377 * from sequence operation or clientid errors.
4378 */
4379static void nfs4_get_lease_time_done(struct rpc_task *task, void *calldata)
4380{
4381        struct nfs4_get_lease_time_data *data =
4382                        (struct nfs4_get_lease_time_data *)calldata;
4383
4384        dprintk("--> %s\n", __func__);
4385        nfs41_sequence_done(data->clp, &data->res->lr_seq_res, task->tk_status);
4386        switch (task->tk_status) {
4387        case -NFS4ERR_DELAY:
4388        case -NFS4ERR_GRACE:
4389                dprintk("%s Retry: tk_status %d\n", __func__, task->tk_status);
4390                rpc_delay(task, NFS4_POLL_RETRY_MIN);
4391                task->tk_status = 0;
4392                nfs4_restart_rpc(task, data->clp);
4393                return;
4394        }
4395        nfs41_sequence_free_slot(data->clp, &data->res->lr_seq_res);
4396        dprintk("<-- %s\n", __func__);
4397}
4398
4399struct rpc_call_ops nfs4_get_lease_time_ops = {
4400        .rpc_call_prepare = nfs4_get_lease_time_prepare,
4401        .rpc_call_done = nfs4_get_lease_time_done,
4402};
4403
4404int nfs4_proc_get_lease_time(struct nfs_client *clp, struct nfs_fsinfo *fsinfo)
4405{
4406        struct rpc_task *task;
4407        struct nfs4_get_lease_time_args args;
4408        struct nfs4_get_lease_time_res res = {
4409                .lr_fsinfo = fsinfo,
4410        };
4411        struct nfs4_get_lease_time_data data = {
4412                .args = &args,
4413                .res = &res,
4414                .clp = clp,
4415        };
4416        struct rpc_message msg = {
4417                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GET_LEASE_TIME],
4418                .rpc_argp = &args,
4419                .rpc_resp = &res,
4420        };
4421        struct rpc_task_setup task_setup = {
4422                .rpc_client = clp->cl_rpcclient,
4423                .rpc_message = &msg,
4424                .callback_ops = &nfs4_get_lease_time_ops,
4425                .callback_data = &data
4426        };
4427        int status;
4428
4429        res.lr_seq_res.sr_slotid = NFS4_MAX_SLOT_TABLE;
4430        dprintk("--> %s\n", __func__);
4431        task = rpc_run_task(&task_setup);
4432
4433        if (IS_ERR(task))
4434                status = PTR_ERR(task);
4435        else {
4436                status = task->tk_status;
4437                rpc_put_task(task);
4438        }
4439        dprintk("<-- %s return %d\n", __func__, status);
4440
4441        return status;
4442}
4443
4444/*
4445 * Reset a slot table
4446 */
4447static int nfs4_reset_slot_table(struct nfs4_slot_table *tbl, int max_slots,
4448                int old_max_slots, int ivalue)
4449{
4450        int i;
4451        int ret = 0;
4452
4453        dprintk("--> %s: max_reqs=%u, tbl %p\n", __func__, max_slots, tbl);
4454
4455        /*
4456         * Until we have dynamic slot table adjustment, insist
4457         * upon the same slot table size
4458         */
4459        if (max_slots != old_max_slots) {
4460                dprintk("%s reset slot table does't match old\n",
4461                        __func__);
4462                ret = -EINVAL; /*XXX NFS4ERR_REQ_TOO_BIG ? */
4463                goto out;
4464        }
4465        spin_lock(&tbl->slot_tbl_lock);
4466        for (i = 0; i < max_slots; ++i)
4467                tbl->slots[i].seq_nr = ivalue;
4468        tbl->highest_used_slotid = -1;
4469        spin_unlock(&tbl->slot_tbl_lock);
4470        dprintk("%s: tbl=%p slots=%p max_slots=%d\n", __func__,
4471                tbl, tbl->slots, tbl->max_slots);
4472out:
4473        dprintk("<-- %s: return %d\n", __func__, ret);
4474        return ret;
4475}
4476
4477/*
4478 * Reset the forechannel and backchannel slot tables
4479 */
4480static int nfs4_reset_slot_tables(struct nfs4_session *session)
4481{
4482        int status;
4483
4484        status = nfs4_reset_slot_table(&session->fc_slot_table,
4485                        session->fc_attrs.max_reqs,
4486                        session->fc_slot_table.max_slots,
4487                        1);
4488        if (status)
4489                return status;
4490
4491        status = nfs4_reset_slot_table(&session->bc_slot_table,
4492                        session->bc_attrs.max_reqs,
4493                        session->bc_slot_table.max_slots,
4494                        0);
4495        return status;
4496}
4497
4498/* Destroy the slot table */
4499static void nfs4_destroy_slot_tables(struct nfs4_session *session)
4500{
4501        if (session->fc_slot_table.slots != NULL) {
4502                kfree(session->fc_slot_table.slots);
4503                session->fc_slot_table.slots = NULL;
4504        }
4505        if (session->bc_slot_table.slots != NULL) {
4506                kfree(session->bc_slot_table.slots);
4507                session->bc_slot_table.slots = NULL;
4508        }
4509        return;
4510}
4511
4512/*
4513 * Initialize slot table
4514 */
4515static int nfs4_init_slot_table(struct nfs4_slot_table *tbl,
4516                int max_slots, int ivalue)
4517{
4518        int i;
4519        struct nfs4_slot *slot;
4520        int ret = -ENOMEM;
4521
4522        BUG_ON(max_slots > NFS4_MAX_SLOT_TABLE);
4523
4524        dprintk("--> %s: max_reqs=%u\n", __func__, max_slots);
4525
4526        slot = kcalloc(max_slots, sizeof(struct nfs4_slot), GFP_KERNEL);
4527        if (!slot)
4528                goto out;
4529        for (i = 0; i < max_slots; ++i)
4530                slot[i].seq_nr = ivalue;
4531        ret = 0;
4532
4533        spin_lock(&tbl->slot_tbl_lock);
4534        if (tbl->slots != NULL) {
4535                spin_unlock(&tbl->slot_tbl_lock);
4536                dprintk("%s: slot table already initialized. tbl=%p slots=%p\n",
4537                        __func__, tbl, tbl->slots);
4538                WARN_ON(1);
4539                goto out_free;
4540        }
4541        tbl->max_slots = max_slots;
4542        tbl->slots = slot;
4543        tbl->highest_used_slotid = -1;  /* no slot is currently used */
4544        spin_unlock(&tbl->slot_tbl_lock);
4545        dprintk("%s: tbl=%p slots=%p max_slots=%d\n", __func__,
4546                tbl, tbl->slots, tbl->max_slots);
4547out:
4548        dprintk("<-- %s: return %d\n", __func__, ret);
4549        return ret;
4550
4551out_free:
4552        kfree(slot);
4553        goto out;
4554}
4555
4556/*
4557 * Initialize the forechannel and backchannel tables
4558 */
4559static int nfs4_init_slot_tables(struct nfs4_session *session)
4560{
4561        int status;
4562
4563        status = nfs4_init_slot_table(&session->fc_slot_table,
4564                        session->fc_attrs.max_reqs, 1);
4565        if (status)
4566                return status;
4567
4568        status = nfs4_init_slot_table(&session->bc_slot_table,
4569                        session->bc_attrs.max_reqs, 0);
4570        if (status)
4571                nfs4_destroy_slot_tables(session);
4572
4573        return status;
4574}
4575
4576struct nfs4_session *nfs4_alloc_session(struct nfs_client *clp)
4577{
4578        struct nfs4_session *session;
4579        struct nfs4_slot_table *tbl;
4580
4581        session = kzalloc(sizeof(struct nfs4_session), GFP_KERNEL);
4582        if (!session)
4583                return NULL;
4584
4585        set_bit(NFS4CLNT_SESSION_SETUP, &clp->cl_state);
4586        /*
4587         * The create session reply races with the server back
4588         * channel probe. Mark the client NFS_CS_SESSION_INITING
4589         * so that the client back channel can find the
4590         * nfs_client struct
4591         */
4592        clp->cl_cons_state = NFS_CS_SESSION_INITING;
4593
4594        tbl = &session->fc_slot_table;
4595        spin_lock_init(&tbl->slot_tbl_lock);
4596        rpc_init_wait_queue(&tbl->slot_tbl_waitq, "ForeChannel Slot table");
4597
4598        tbl = &session->bc_slot_table;
4599        spin_lock_init(&tbl->slot_tbl_lock);
4600        rpc_init_wait_queue(&tbl->slot_tbl_waitq, "BackChannel Slot table");
4601
4602        session->clp = clp;
4603        return session;
4604}
4605
4606void nfs4_destroy_session(struct nfs4_session *session)
4607{
4608        nfs4_proc_destroy_session(session);
4609        dprintk("%s Destroy backchannel for xprt %p\n",
4610                __func__, session->clp->cl_rpcclient->cl_xprt);
4611        xprt_destroy_backchannel(session->clp->cl_rpcclient->cl_xprt,
4612                                NFS41_BC_MIN_CALLBACKS);
4613        nfs4_destroy_slot_tables(session);
4614        kfree(session);
4615}
4616
4617/*
4618 * Initialize the values to be used by the client in CREATE_SESSION
4619 * If nfs4_init_session set the fore channel request and response sizes,
4620 * use them.
4621 *
4622 * Set the back channel max_resp_sz_cached to zero to force the client to
4623 * always set csa_cachethis to FALSE because the current implementation
4624 * of the back channel DRC only supports caching the CB_SEQUENCE operation.
4625 */
4626static void nfs4_init_channel_attrs(struct nfs41_create_session_args *args)
4627{
4628        struct nfs4_session *session = args->client->cl_session;
4629        unsigned int mxrqst_sz = session->fc_attrs.max_rqst_sz,
4630                     mxresp_sz = session->fc_attrs.max_resp_sz;
4631
4632        if (mxrqst_sz == 0)
4633                mxrqst_sz = NFS_MAX_FILE_IO_SIZE;
4634        if (mxresp_sz == 0)
4635                mxresp_sz = NFS_MAX_FILE_IO_SIZE;
4636        /* Fore channel attributes */
4637        args->fc_attrs.headerpadsz = 0;
4638        args->fc_attrs.max_rqst_sz = mxrqst_sz;
4639        args->fc_attrs.max_resp_sz = mxresp_sz;
4640        args->fc_attrs.max_resp_sz_cached = mxresp_sz;
4641        args->fc_attrs.max_ops = NFS4_MAX_OPS;
4642        args->fc_attrs.max_reqs = session->clp->cl_rpcclient->cl_xprt->max_reqs;
4643
4644        dprintk("%s: Fore Channel : max_rqst_sz=%u max_resp_sz=%u "
4645                "max_resp_sz_cached=%u max_ops=%u max_reqs=%u\n",
4646                __func__,
4647                args->fc_attrs.max_rqst_sz, args->fc_attrs.max_resp_sz,
4648                args->fc_attrs.max_resp_sz_cached, args->fc_attrs.max_ops,
4649                args->fc_attrs.max_reqs);
4650
4651        /* Back channel attributes */
4652        args->bc_attrs.headerpadsz = 0;
4653        args->bc_attrs.max_rqst_sz = PAGE_SIZE;
4654        args->bc_attrs.max_resp_sz = PAGE_SIZE;
4655        args->bc_attrs.max_resp_sz_cached = 0;
4656        args->bc_attrs.max_ops = NFS4_MAX_BACK_CHANNEL_OPS;
4657        args->bc_attrs.max_reqs = 1;
4658
4659        dprintk("%s: Back Channel : max_rqst_sz=%u max_resp_sz=%u "
4660                "max_resp_sz_cached=%u max_ops=%u max_reqs=%u\n",
4661                __func__,
4662                args->bc_attrs.max_rqst_sz, args->bc_attrs.max_resp_sz,
4663                args->bc_attrs.max_resp_sz_cached, args->bc_attrs.max_ops,
4664                args->bc_attrs.max_reqs);
4665}
4666
4667static int _verify_channel_attr(char *chan, char *attr_name, u32 sent, u32 rcvd)
4668{
4669        if (rcvd <= sent)
4670                return 0;
4671        printk(KERN_WARNING "%s: Session INVALID: %s channel %s increased. "
4672                "sent=%u rcvd=%u\n", __func__, chan, attr_name, sent, rcvd);
4673        return -EINVAL;
4674}
4675
4676#define _verify_fore_channel_attr(_name_) \
4677        _verify_channel_attr("fore", #_name_, \
4678                             args->fc_attrs._name_, \
4679                             session->fc_attrs._name_)
4680
4681#define _verify_back_channel_attr(_name_) \
4682        _verify_channel_attr("back", #_name_, \
4683                             args->bc_attrs._name_, \
4684                             session->bc_attrs._name_)
4685
4686/*
4687 * The server is not allowed to increase the fore channel header pad size,
4688 * maximum response size, or maximum number of operations.
4689 *
4690 * The back channel attributes are only negotiatied down: We send what the
4691 * (back channel) server insists upon.
4692 */
4693static int nfs4_verify_channel_attrs(struct nfs41_create_session_args *args,
4694                                     struct nfs4_session *session)
4695{
4696        int ret = 0;
4697
4698        ret |= _verify_fore_channel_attr(headerpadsz);
4699        ret |= _verify_fore_channel_attr(max_resp_sz);
4700        ret |= _verify_fore_channel_attr(max_ops);
4701
4702        ret |= _verify_back_channel_attr(headerpadsz);
4703        ret |= _verify_back_channel_attr(max_rqst_sz);
4704        ret |= _verify_back_channel_attr(max_resp_sz);
4705        ret |= _verify_back_channel_attr(max_resp_sz_cached);
4706        ret |= _verify_back_channel_attr(max_ops);
4707        ret |= _verify_back_channel_attr(max_reqs);
4708
4709        return ret;
4710}
4711
4712static int _nfs4_proc_create_session(struct nfs_client *clp)
4713{
4714        struct nfs4_session *session = clp->cl_session;
4715        struct nfs41_create_session_args args = {
4716                .client = clp,
4717                .cb_program = NFS4_CALLBACK,
4718        };
4719        struct nfs41_create_session_res res = {
4720                .client = clp,
4721        };
4722        struct rpc_message msg = {
4723                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE_SESSION],
4724                .rpc_argp = &args,
4725                .rpc_resp = &res,
4726        };
4727        int status;
4728
4729        nfs4_init_channel_attrs(&args);
4730        args.flags = (SESSION4_PERSIST | SESSION4_BACK_CHAN);
4731
4732        status = rpc_call_sync(session->clp->cl_rpcclient, &msg, 0);
4733
4734        if (!status)
4735                /* Verify the session's negotiated channel_attrs values */
4736                status = nfs4_verify_channel_attrs(&args, session);
4737        if (!status) {
4738                /* Increment the clientid slot sequence id */
4739                clp->cl_seqid++;
4740        }
4741
4742        return status;
4743}
4744
4745/*
4746 * Issues a CREATE_SESSION operation to the server.
4747 * It is the responsibility of the caller to verify the session is
4748 * expired before calling this routine.
4749 */
4750int nfs4_proc_create_session(struct nfs_client *clp, int reset)
4751{
4752        int status;
4753        unsigned *ptr;
4754        struct nfs_fsinfo fsinfo;
4755        struct nfs4_session *session = clp->cl_session;
4756
4757        dprintk("--> %s clp=%p session=%p\n", __func__, clp, session);
4758
4759        status = _nfs4_proc_create_session(clp);
4760        if (status)
4761                goto out;
4762
4763        /* Init or reset the fore channel */
4764        if (reset)
4765                status = nfs4_reset_slot_tables(session);
4766        else
4767                status = nfs4_init_slot_tables(session);
4768        dprintk("fore channel slot table initialization returned %d\n", status);
4769        if (status)
4770                goto out;
4771
4772        ptr = (unsigned *)&session->sess_id.data[0];
4773        dprintk("%s client>seqid %d sessionid %u:%u:%u:%u\n", __func__,
4774                clp->cl_seqid, ptr[0], ptr[1], ptr[2], ptr[3]);
4775
4776        if (reset)
4777                /* Lease time is aleady set */
4778                goto out;
4779
4780        /* Get the lease time */
4781        status = nfs4_proc_get_lease_time(clp, &fsinfo);
4782        if (status == 0) {
4783                /* Update lease time and schedule renewal */
4784                spin_lock(&clp->cl_lock);
4785                clp->cl_lease_time = fsinfo.lease_time * HZ;
4786                clp->cl_last_renewal = jiffies;
4787                clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
4788                spin_unlock(&clp->cl_lock);
4789
4790                nfs4_schedule_state_renewal(clp);
4791        }
4792out:
4793        dprintk("<-- %s\n", __func__);
4794        return status;
4795}
4796
4797/*
4798 * Issue the over-the-wire RPC DESTROY_SESSION.
4799 * The caller must serialize access to this routine.
4800 */
4801int nfs4_proc_destroy_session(struct nfs4_session *session)
4802{
4803        int status = 0;
4804        struct rpc_message msg;
4805
4806        dprintk("--> nfs4_proc_destroy_session\n");
4807
4808        /* session is still being setup */
4809        if (session->clp->cl_cons_state != NFS_CS_READY)
4810                return status;
4811
4812        msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DESTROY_SESSION];
4813        msg.rpc_argp = session;
4814        msg.rpc_resp = NULL;
4815        msg.rpc_cred = NULL;
4816        status = rpc_call_sync(session->clp->cl_rpcclient, &msg, 0);
4817
4818        if (status)
4819                printk(KERN_WARNING
4820                        "Got error %d from the server on DESTROY_SESSION. "
4821                        "Session has been destroyed regardless...\n", status);
4822
4823        dprintk("<-- nfs4_proc_destroy_session\n");
4824        return status;
4825}
4826
4827int nfs4_init_session(struct nfs_server *server)
4828{
4829        struct nfs_client *clp = server->nfs_client;
4830        int ret;
4831
4832        if (!nfs4_has_session(clp))
4833                return 0;
4834
4835        clp->cl_session->fc_attrs.max_rqst_sz = server->wsize;
4836        clp->cl_session->fc_attrs.max_resp_sz = server->rsize;
4837        ret = nfs4_recover_expired_lease(server);
4838        if (!ret)
4839                ret = nfs4_check_client_ready(clp);
4840        return ret;
4841}
4842
4843/*
4844 * Renew the cl_session lease.
4845 */
4846static int nfs4_proc_sequence(struct nfs_client *clp, struct rpc_cred *cred)
4847{
4848        struct nfs4_sequence_args args;
4849        struct nfs4_sequence_res res;
4850
4851        struct rpc_message msg = {
4852                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SEQUENCE],
4853                .rpc_argp = &args,
4854                .rpc_resp = &res,
4855                .rpc_cred = cred,
4856        };
4857
4858        args.sa_cache_this = 0;
4859
4860        return nfs4_call_sync_sequence(clp, clp->cl_rpcclient, &msg, &args,
4861                                       &res, 0);
4862}
4863
4864void nfs41_sequence_call_done(struct rpc_task *task, void *data)
4865{
4866        struct nfs_client *clp = (struct nfs_client *)data;
4867
4868        nfs41_sequence_done(clp, task->tk_msg.rpc_resp, task->tk_status);
4869
4870        if (task->tk_status < 0) {
4871                dprintk("%s ERROR %d\n", __func__, task->tk_status);
4872
4873                if (_nfs4_async_handle_error(task, NULL, clp, NULL)
4874                                                                == -EAGAIN) {
4875                        nfs4_restart_rpc(task, clp);
4876                        return;
4877                }
4878        }
4879        nfs41_sequence_free_slot(clp, task->tk_msg.rpc_resp);
4880        dprintk("%s rpc_cred %p\n", __func__, task->tk_msg.rpc_cred);
4881
4882        kfree(task->tk_msg.rpc_argp);
4883        kfree(task->tk_msg.rpc_resp);
4884
4885        dprintk("<-- %s\n", __func__);
4886}
4887
4888static void nfs41_sequence_prepare(struct rpc_task *task, void *data)
4889{
4890        struct nfs_client *clp;
4891        struct nfs4_sequence_args *args;
4892        struct nfs4_sequence_res *res;
4893
4894        clp = (struct nfs_client *)data;
4895        args = task->tk_msg.rpc_argp;
4896        res = task->tk_msg.rpc_resp;
4897
4898        if (nfs4_setup_sequence(clp, args, res, 0, task))
4899                return;
4900        rpc_call_start(task);
4901}
4902
4903static const struct rpc_call_ops nfs41_sequence_ops = {
4904        .rpc_call_done = nfs41_sequence_call_done,
4905        .rpc_call_prepare = nfs41_sequence_prepare,
4906};
4907
4908static int nfs41_proc_async_sequence(struct nfs_client *clp,
4909                                     struct rpc_cred *cred)
4910{
4911        struct nfs4_sequence_args *args;
4912        struct nfs4_sequence_res *res;
4913        struct rpc_message msg = {
4914                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SEQUENCE],
4915                .rpc_cred = cred,
4916        };
4917
4918        args = kzalloc(sizeof(*args), GFP_KERNEL);
4919        if (!args)
4920                return -ENOMEM;
4921        res = kzalloc(sizeof(*res), GFP_KERNEL);
4922        if (!res) {
4923                kfree(args);
4924                return -ENOMEM;
4925        }
4926        res->sr_slotid = NFS4_MAX_SLOT_TABLE;
4927        msg.rpc_argp = args;
4928        msg.rpc_resp = res;
4929
4930        return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_SOFT,
4931                              &nfs41_sequence_ops, (void *)clp);
4932}
4933
4934#endif /* CONFIG_NFS_V4_1 */
4935
4936struct nfs4_state_recovery_ops nfs40_reboot_recovery_ops = {
4937        .owner_flag_bit = NFS_OWNER_RECLAIM_REBOOT,
4938        .state_flag_bit = NFS_STATE_RECLAIM_REBOOT,
4939        .recover_open   = nfs4_open_reclaim,
4940        .recover_lock   = nfs4_lock_reclaim,
4941        .establish_clid = nfs4_init_clientid,
4942        .get_clid_cred  = nfs4_get_setclientid_cred,
4943};
4944
4945#if defined(CONFIG_NFS_V4_1)
4946struct nfs4_state_recovery_ops nfs41_reboot_recovery_ops = {
4947        .owner_flag_bit = NFS_OWNER_RECLAIM_REBOOT,
4948        .state_flag_bit = NFS_STATE_RECLAIM_REBOOT,
4949        .recover_open   = nfs4_open_reclaim,
4950        .recover_lock   = nfs4_lock_reclaim,
4951        .establish_clid = nfs4_proc_exchange_id,
4952        .get_clid_cred  = nfs4_get_exchange_id_cred,
4953};
4954#endif /* CONFIG_NFS_V4_1 */
4955
4956struct nfs4_state_recovery_ops nfs40_nograce_recovery_ops = {
4957        .owner_flag_bit = NFS_OWNER_RECLAIM_NOGRACE,
4958        .state_flag_bit = NFS_STATE_RECLAIM_NOGRACE,
4959        .recover_open   = nfs4_open_expired,
4960        .recover_lock   = nfs4_lock_expired,
4961        .establish_clid = nfs4_init_clientid,
4962        .get_clid_cred  = nfs4_get_setclientid_cred,
4963};
4964
4965#if defined(CONFIG_NFS_V4_1)
4966struct nfs4_state_recovery_ops nfs41_nograce_recovery_ops = {
4967        .owner_flag_bit = NFS_OWNER_RECLAIM_NOGRACE,
4968        .state_flag_bit = NFS_STATE_RECLAIM_NOGRACE,
4969        .recover_open   = nfs4_open_expired,
4970        .recover_lock   = nfs4_lock_expired,
4971        .establish_clid = nfs4_proc_exchange_id,
4972        .get_clid_cred  = nfs4_get_exchange_id_cred,
4973};
4974#endif /* CONFIG_NFS_V4_1 */
4975
4976struct nfs4_state_maintenance_ops nfs40_state_renewal_ops = {
4977        .sched_state_renewal = nfs4_proc_async_renew,
4978        .get_state_renewal_cred_locked = nfs4_get_renew_cred_locked,
4979        .renew_lease = nfs4_proc_renew,
4980};
4981
4982#if defined(CONFIG_NFS_V4_1)
4983struct nfs4_state_maintenance_ops nfs41_state_renewal_ops = {
4984        .sched_state_renewal = nfs41_proc_async_sequence,
4985        .get_state_renewal_cred_locked = nfs4_get_machine_cred_locked,
4986        .renew_lease = nfs4_proc_sequence,
4987};
4988#endif
4989
4990/*
4991 * Per minor version reboot and network partition recovery ops
4992 */
4993
4994struct nfs4_state_recovery_ops *nfs4_reboot_recovery_ops[] = {
4995        &nfs40_reboot_recovery_ops,
4996#if defined(CONFIG_NFS_V4_1)
4997        &nfs41_reboot_recovery_ops,
4998#endif
4999};
5000
5001struct nfs4_state_recovery_ops *nfs4_nograce_recovery_ops[] = {
5002        &nfs40_nograce_recovery_ops,
5003#if defined(CONFIG_NFS_V4_1)
5004        &nfs41_nograce_recovery_ops,
5005#endif
5006};
5007
5008struct nfs4_state_maintenance_ops *nfs4_state_renewal_ops[] = {
5009        &nfs40_state_renewal_ops,
5010#if defined(CONFIG_NFS_V4_1)
5011        &nfs41_state_renewal_ops,
5012#endif
5013};
5014
5015static const struct inode_operations nfs4_file_inode_operations = {
5016        .permission     = nfs_permission,
5017        .getattr        = nfs_getattr,
5018        .setattr        = nfs_setattr,
5019        .getxattr       = nfs4_getxattr,
5020        .setxattr       = nfs4_setxattr,
5021        .listxattr      = nfs4_listxattr,
5022};
5023
5024const struct nfs_rpc_ops nfs_v4_clientops = {
5025        .version        = 4,                    /* protocol version */
5026        .dentry_ops     = &nfs4_dentry_operations,
5027        .dir_inode_ops  = &nfs4_dir_inode_operations,
5028        .file_inode_ops = &nfs4_file_inode_operations,
5029        .getroot        = nfs4_proc_get_root,
5030        .getattr        = nfs4_proc_getattr,
5031        .setattr        = nfs4_proc_setattr,
5032        .lookupfh       = nfs4_proc_lookupfh,
5033        .lookup         = nfs4_proc_lookup,
5034        .access         = nfs4_proc_access,
5035        .readlink       = nfs4_proc_readlink,
5036        .create         = nfs4_proc_create,
5037        .remove         = nfs4_proc_remove,
5038        .unlink_setup   = nfs4_proc_unlink_setup,
5039        .unlink_done    = nfs4_proc_unlink_done,
5040        .rename         = nfs4_proc_rename,
5041        .link           = nfs4_proc_link,
5042        .symlink        = nfs4_proc_symlink,
5043        .mkdir          = nfs4_proc_mkdir,
5044        .rmdir          = nfs4_proc_remove,
5045        .readdir        = nfs4_proc_readdir,
5046        .mknod          = nfs4_proc_mknod,
5047        .statfs         = nfs4_proc_statfs,
5048        .fsinfo         = nfs4_proc_fsinfo,
5049        .pathconf       = nfs4_proc_pathconf,
5050        .set_capabilities = nfs4_server_capabilities,
5051        .decode_dirent  = nfs4_decode_dirent,
5052        .read_setup     = nfs4_proc_read_setup,
5053        .read_done      = nfs4_read_done,
5054        .write_setup    = nfs4_proc_write_setup,
5055        .write_done     = nfs4_write_done,
5056        .commit_setup   = nfs4_proc_commit_setup,
5057        .commit_done    = nfs4_commit_done,
5058        .lock           = nfs4_proc_lock,
5059        .clear_acl_cache = nfs4_zap_acl_attr,
5060        .close_context  = nfs4_close_context,
5061};
5062
5063/*
5064 * Local variables:
5065 *  c-basic-offset: 8
5066 * End:
5067 */
5068