]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge branch 'writeback-for-2.6.34' into nfs-for-2.6.34
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 5 Mar 2010 20:46:18 +0000 (15:46 -0500)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 5 Mar 2010 20:46:18 +0000 (15:46 -0500)
1  2 
fs/nfs/inode.c
fs/nfs/nfs4proc.c
fs/nfs/nfs4xdr.c
include/linux/nfs_fs_sb.h

diff --combined fs/nfs/inode.c
index 87cca56846d6997de9e8644215f69d0081e90dba,dbaaf7d2a1885e9ecd24cf7b6c3576bd6be1dda9..657201acda84ba2232851971b098787eb1a0b2f4
@@@ -97,22 -97,6 +97,6 @@@ u64 nfs_compat_user_ino64(u64 fileid
        return ino;
  }
  
- int nfs_write_inode(struct inode *inode, int sync)
- {
-       int ret;
-       if (sync) {
-               ret = filemap_fdatawait(inode->i_mapping);
-               if (ret == 0)
-                       ret = nfs_commit_inode(inode, FLUSH_SYNC);
-       } else
-               ret = nfs_commit_inode(inode, 0);
-       if (ret >= 0)
-               return 0;
-       __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
-       return ret;
- }
  void nfs_clear_inode(struct inode *inode)
  {
        /*
   */
  int nfs_sync_mapping(struct address_space *mapping)
  {
-       int ret;
+       int ret = 0;
  
-       if (mapping->nrpages == 0)
-               return 0;
-       unmap_mapping_range(mapping, 0, 0, 0);
-       ret = filemap_write_and_wait(mapping);
-       if (ret != 0)
-               goto out;
-       ret = nfs_wb_all(mapping->host);
- out:
+       if (mapping->nrpages != 0) {
+               unmap_mapping_range(mapping, 0, 0, 0);
+               ret = nfs_wb_all(mapping->host);
+       }
        return ret;
  }
  
@@@ -511,17 -491,11 +491,11 @@@ int nfs_getattr(struct vfsmount *mnt, s
        int need_atime = NFS_I(inode)->cache_validity & NFS_INO_INVALID_ATIME;
        int err;
  
-       /*
-        * Flush out writes to the server in order to update c/mtime.
-        *
-        * Hold the i_mutex to suspend application writes temporarily;
-        * this prevents long-running writing applications from blocking
-        * nfs_wb_nocommit.
-        */
+       /* Flush out writes to the server in order to update c/mtime.  */
        if (S_ISREG(inode->i_mode)) {
-               mutex_lock(&inode->i_mutex);
-               nfs_wb_nocommit(inode);
-               mutex_unlock(&inode->i_mutex);
+               err = filemap_write_and_wait(inode->i_mapping);
+               if (err)
+                       goto out;
        }
  
        /*
                generic_fillattr(inode, stat);
                stat->ino = nfs_compat_user_ino64(NFS_FILEID(inode));
        }
+ out:
        return err;
  }
  
@@@ -574,14 -549,14 +549,14 @@@ void nfs_close_context(struct nfs_open_
        nfs_revalidate_inode(server, inode);
  }
  
- static struct nfs_open_context *alloc_nfs_open_context(struct vfsmount *mnt, struct dentry *dentry, struct rpc_cred *cred)
+ static struct nfs_open_context *alloc_nfs_open_context(struct path *path, struct rpc_cred *cred)
  {
        struct nfs_open_context *ctx;
  
        ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
        if (ctx != NULL) {
-               ctx->path.dentry = dget(dentry);
-               ctx->path.mnt = mntget(mnt);
+               ctx->path = *path;
+               path_get(&ctx->path);
                ctx->cred = get_rpccred(cred);
                ctx->state = NULL;
                ctx->lockowner = current->files;
@@@ -620,6 -595,11 +595,6 @@@ void put_nfs_open_context(struct nfs_op
        __put_nfs_open_context(ctx, 0);
  }
  
 -static void put_nfs_open_context_sync(struct nfs_open_context *ctx)
 -{
 -      __put_nfs_open_context(ctx, 1);
 -}
 -
  /*
   * Ensure that mmap has a recent RPC credential for use when writing out
   * shared pages
@@@ -666,7 -646,7 +641,7 @@@ static void nfs_file_clear_open_context
                spin_lock(&inode->i_lock);
                list_move_tail(&ctx->list, &NFS_I(inode)->open_files);
                spin_unlock(&inode->i_lock);
 -              put_nfs_open_context_sync(ctx);
 +              __put_nfs_open_context(ctx, filp->f_flags & O_DIRECT ? 0 : 1);
        }
  }
  
@@@ -681,7 -661,7 +656,7 @@@ int nfs_open(struct inode *inode, struc
        cred = rpc_lookup_cred();
        if (IS_ERR(cred))
                return PTR_ERR(cred);
-       ctx = alloc_nfs_open_context(filp->f_path.mnt, filp->f_path.dentry, cred);
+       ctx = alloc_nfs_open_context(&filp->f_path, cred);
        put_rpccred(cred);
        if (ctx == NULL)
                return -ENOMEM;
@@@ -774,7 -754,7 +749,7 @@@ int nfs_revalidate_inode(struct nfs_ser
        return __nfs_revalidate_inode(server, inode);
  }
  
- static int nfs_invalidate_mapping_nolock(struct inode *inode, struct address_space *mapping)
+ static int nfs_invalidate_mapping(struct inode *inode, struct address_space *mapping)
  {
        struct nfs_inode *nfsi = NFS_I(inode);
        
        return 0;
  }
  
- static int nfs_invalidate_mapping(struct inode *inode, struct address_space *mapping)
- {
-       int ret = 0;
-       mutex_lock(&inode->i_mutex);
-       if (NFS_I(inode)->cache_validity & NFS_INO_INVALID_DATA) {
-               ret = nfs_sync_mapping(mapping);
-               if (ret == 0)
-                       ret = nfs_invalidate_mapping_nolock(inode, mapping);
-       }
-       mutex_unlock(&inode->i_mutex);
-       return ret;
- }
- /**
-  * nfs_revalidate_mapping_nolock - Revalidate the pagecache
-  * @inode - pointer to host inode
-  * @mapping - pointer to mapping
-  */
- int nfs_revalidate_mapping_nolock(struct inode *inode, struct address_space *mapping)
- {
-       struct nfs_inode *nfsi = NFS_I(inode);
-       int ret = 0;
-       if ((nfsi->cache_validity & NFS_INO_REVAL_PAGECACHE)
-                       || nfs_attribute_timeout(inode) || NFS_STALE(inode)) {
-               ret = __nfs_revalidate_inode(NFS_SERVER(inode), inode);
-               if (ret < 0)
-                       goto out;
-       }
-       if (nfsi->cache_validity & NFS_INO_INVALID_DATA)
-               ret = nfs_invalidate_mapping_nolock(inode, mapping);
- out:
-       return ret;
- }
  /**
   * nfs_revalidate_mapping - Revalidate the pagecache
   * @inode - pointer to host inode
   * @mapping - pointer to mapping
-  *
-  * This version of the function will take the inode->i_mutex and attempt to
-  * flush out all dirty data if it needs to invalidate the page cache.
   */
  int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping)
  {
@@@ -1415,6 -1356,7 +1351,7 @@@ static void init_once(void *foo
        INIT_LIST_HEAD(&nfsi->access_cache_inode_lru);
        INIT_RADIX_TREE(&nfsi->nfs_page_tree, GFP_ATOMIC);
        nfsi->npages = 0;
+       nfsi->ncommit = 0;
        atomic_set(&nfsi->silly_count, 1);
        INIT_HLIST_HEAD(&nfsi->silly_list);
        init_waitqueue_head(&nfsi->waitqueue);
diff --combined fs/nfs/nfs4proc.c
index adc116c57e14c52210ca9884807b82e7a877b916,84d83be25a98b4d8456fdaeb321f086d313b0e3f..eda74c42d552a044b5ba3b8541b9034cc29afff8
@@@ -281,7 -281,6 +281,7 @@@ static int nfs4_handle_exception(const 
                        }
                case -NFS4ERR_GRACE:
                case -NFS4ERR_DELAY:
 +              case -EKEYEXPIRED:
                        ret = nfs4_delay(server->client, &exception->timeout);
                        if (ret != 0)
                                break;
@@@ -419,8 -418,7 +419,8 @@@ static void nfs41_sequence_done(struct 
                        clp->cl_last_renewal = timestamp;
                spin_unlock(&clp->cl_lock);
                /* Check sequence flags */
 -              nfs41_handle_sequence_flag_errors(clp, res->sr_status_flags);
 +              if (atomic_read(&clp->cl_count) > 1)
 +                      nfs41_handle_sequence_flag_errors(clp, res->sr_status_flags);
        }
  out:
        /* The session may be reset by one of the error handlers. */
@@@ -726,8 -724,8 +726,8 @@@ static struct nfs4_opendata *nfs4_opend
        p->o_arg.seqid = nfs_alloc_seqid(&sp->so_seqid);
        if (p->o_arg.seqid == NULL)
                goto err_free;
-       p->path.mnt = mntget(path->mnt);
-       p->path.dentry = dget(path->dentry);
+       path_get(path);
+       p->path = *path;
        p->dir = parent;
        p->owner = sp;
        atomic_inc(&sp->so_count);
@@@ -1165,7 -1163,7 +1165,7 @@@ static int nfs4_do_open_reclaim(struct 
        int err;
        do {
                err = _nfs4_do_open_reclaim(ctx, state);
 -              if (err != -NFS4ERR_DELAY)
 +              if (err != -NFS4ERR_DELAY && err != -EKEYEXPIRED)
                        break;
                nfs4_handle_exception(server, err, &exception);
        } while (exception.retry);
@@@ -1584,7 -1582,6 +1584,7 @@@ static int nfs4_do_open_expired(struct 
                        goto out;
                case -NFS4ERR_GRACE:
                case -NFS4ERR_DELAY:
 +              case -EKEYEXPIRED:
                        nfs4_handle_exception(server, err, &exception);
                        err = 0;
                }
@@@ -1947,8 -1944,8 +1947,8 @@@ int nfs4_do_close(struct path *path, st
        calldata->res.seqid = calldata->arg.seqid;
        calldata->res.server = server;
        calldata->res.seq_res.sr_slotid = NFS4_MAX_SLOT_TABLE;
-       calldata->path.mnt = mntget(path->mnt);
-       calldata->path.dentry = dget(path->dentry);
+       path_get(path);
+       calldata->path = *path;
  
        msg.rpc_argp = &calldata->arg,
        msg.rpc_resp = &calldata->res,
@@@ -3148,19 -3145,10 +3148,19 @@@ static void nfs4_proc_commit_setup(stru
   * nfs4_proc_async_renew(): This is not one of the nfs_rpc_ops; it is a special
   * standalone procedure for queueing an asynchronous RENEW.
   */
 +static void nfs4_renew_release(void *data)
 +{
 +      struct nfs_client *clp = data;
 +
 +      if (atomic_read(&clp->cl_count) > 1)
 +              nfs4_schedule_state_renewal(clp);
 +      nfs_put_client(clp);
 +}
 +
  static void nfs4_renew_done(struct rpc_task *task, void *data)
  {
 -      struct nfs_client *clp = (struct nfs_client *)task->tk_msg.rpc_argp;
 -      unsigned long timestamp = (unsigned long)data;
 +      struct nfs_client *clp = data;
 +      unsigned long timestamp = task->tk_start;
  
        if (task->tk_status < 0) {
                /* Unless we're shutting down, schedule state recovery! */
  
  static const struct rpc_call_ops nfs4_renew_ops = {
        .rpc_call_done = nfs4_renew_done,
 +      .rpc_release = nfs4_renew_release,
  };
  
  int nfs4_proc_async_renew(struct nfs_client *clp, struct rpc_cred *cred)
                .rpc_cred       = cred,
        };
  
 +      if (!atomic_inc_not_zero(&clp->cl_count))
 +              return -EIO;
        return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_SOFT,
 -                      &nfs4_renew_ops, (void *)jiffies);
 +                      &nfs4_renew_ops, clp);
  }
  
  int nfs4_proc_renew(struct nfs_client *clp, struct rpc_cred *cred)
@@@ -3467,7 -3452,6 +3467,7 @@@ _nfs4_async_handle_error(struct rpc_tas
                        if (server)
                                nfs_inc_server_stats(server, NFSIOS_DELAY);
                case -NFS4ERR_GRACE:
 +              case -EKEYEXPIRED:
                        rpc_delay(task, NFS4_POLL_RETRY_MAX);
                        task->tk_status = 0;
                        return -EAGAIN;
@@@ -3580,7 -3564,6 +3580,7 @@@ int nfs4_proc_setclientid_confirm(struc
                        case -NFS4ERR_RESOURCE:
                                /* The IBM lawyers misread another document! */
                        case -NFS4ERR_DELAY:
 +                      case -EKEYEXPIRED:
                                err = nfs4_delay(clp->cl_rpcclient, &timeout);
                }
        } while (err == 0);
@@@ -4196,7 -4179,7 +4196,7 @@@ static int nfs4_lock_reclaim(struct nfs
                if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0)
                        return 0;
                err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_RECLAIM);
 -              if (err != -NFS4ERR_DELAY)
 +              if (err != -NFS4ERR_DELAY && err != -EKEYEXPIRED)
                        break;
                nfs4_handle_exception(server, err, &exception);
        } while (exception.retry);
@@@ -4221,7 -4204,6 +4221,7 @@@ static int nfs4_lock_expired(struct nfs
                        goto out;
                case -NFS4ERR_GRACE:
                case -NFS4ERR_DELAY:
 +              case -EKEYEXPIRED:
                        nfs4_handle_exception(server, err, &exception);
                        err = 0;
                }
@@@ -4373,7 -4355,6 +4373,7 @@@ int nfs4_lock_delegation_recall(struct 
                                err = 0;
                                goto out;
                        case -NFS4ERR_DELAY:
 +                      case -EKEYEXPIRED:
                                break;
                }
                err = nfs4_handle_exception(server, err, &exception);
@@@ -4519,7 -4500,7 +4519,7 @@@ int nfs4_proc_exchange_id(struct nfs_cl
  
                status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
  
 -              if (status != NFS4ERR_CLID_INUSE)
 +              if (status != -NFS4ERR_CLID_INUSE)
                        break;
  
                if (signalled())
@@@ -4573,7 -4554,6 +4573,7 @@@ static void nfs4_get_lease_time_done(st
        switch (task->tk_status) {
        case -NFS4ERR_DELAY:
        case -NFS4ERR_GRACE:
 +      case -EKEYEXPIRED:
                dprintk("%s Retry: tk_status %d\n", __func__, task->tk_status);
                rpc_delay(task, NFS4_POLL_RETRY_MIN);
                task->tk_status = 0;
@@@ -4631,32 -4611,26 +4631,32 @@@ int nfs4_proc_get_lease_time(struct nfs
  /*
   * Reset a slot table
   */
 -static int nfs4_reset_slot_table(struct nfs4_slot_table *tbl, int max_slots,
 -              int old_max_slots, int ivalue)
 +static int nfs4_reset_slot_table(struct nfs4_slot_table *tbl, u32 max_reqs,
 +                               int ivalue)
  {
 +      struct nfs4_slot *new = NULL;
        int i;
        int ret = 0;
  
 -      dprintk("--> %s: max_reqs=%u, tbl %p\n", __func__, max_slots, tbl);
 +      dprintk("--> %s: max_reqs=%u, tbl->max_slots %d\n", __func__,
 +              max_reqs, tbl->max_slots);
  
 -      /*
 -       * Until we have dynamic slot table adjustment, insist
 -       * upon the same slot table size
 -       */
 -      if (max_slots != old_max_slots) {
 -              dprintk("%s reset slot table does't match old\n",
 -                      __func__);
 -              ret = -EINVAL; /*XXX NFS4ERR_REQ_TOO_BIG ? */
 -              goto out;
 +      /* Does the newly negotiated max_reqs match the existing slot table? */
 +      if (max_reqs != tbl->max_slots) {
 +              ret = -ENOMEM;
 +              new = kmalloc(max_reqs * sizeof(struct nfs4_slot),
 +                            GFP_KERNEL);
 +              if (!new)
 +                      goto out;
 +              ret = 0;
 +              kfree(tbl->slots);
        }
        spin_lock(&tbl->slot_tbl_lock);
 -      for (i = 0; i < max_slots; ++i)
 +      if (new) {
 +              tbl->slots = new;
 +              tbl->max_slots = max_reqs;
 +      }
 +      for (i = 0; i < tbl->max_slots; ++i)
                tbl->slots[i].seq_nr = ivalue;
        spin_unlock(&tbl->slot_tbl_lock);
        dprintk("%s: tbl=%p slots=%p max_slots=%d\n", __func__,
@@@ -4674,12 -4648,16 +4674,12 @@@ static int nfs4_reset_slot_tables(struc
        int status;
  
        status = nfs4_reset_slot_table(&session->fc_slot_table,
 -                      session->fc_attrs.max_reqs,
 -                      session->fc_slot_table.max_slots,
 -                      1);
 +                      session->fc_attrs.max_reqs, 1);
        if (status)
                return status;
  
        status = nfs4_reset_slot_table(&session->bc_slot_table,
 -                      session->bc_attrs.max_reqs,
 -                      session->bc_slot_table.max_slots,
 -                      0);
 +                      session->bc_attrs.max_reqs, 0);
        return status;
  }
  
@@@ -4820,14 -4798,16 +4820,14 @@@ static void nfs4_init_channel_attrs(str
        args->fc_attrs.headerpadsz = 0;
        args->fc_attrs.max_rqst_sz = mxrqst_sz;
        args->fc_attrs.max_resp_sz = mxresp_sz;
 -      args->fc_attrs.max_resp_sz_cached = mxresp_sz;
        args->fc_attrs.max_ops = NFS4_MAX_OPS;
        args->fc_attrs.max_reqs = session->clp->cl_rpcclient->cl_xprt->max_reqs;
  
        dprintk("%s: Fore Channel : max_rqst_sz=%u max_resp_sz=%u "
 -              "max_resp_sz_cached=%u max_ops=%u max_reqs=%u\n",
 +              "max_ops=%u max_reqs=%u\n",
                __func__,
                args->fc_attrs.max_rqst_sz, args->fc_attrs.max_resp_sz,
 -              args->fc_attrs.max_resp_sz_cached, args->fc_attrs.max_ops,
 -              args->fc_attrs.max_reqs);
 +              args->fc_attrs.max_ops, args->fc_attrs.max_reqs);
  
        /* Back channel attributes */
        args->bc_attrs.headerpadsz = 0;
@@@ -5036,16 -5016,7 +5036,16 @@@ static int nfs4_proc_sequence(struct nf
                                       &res, args.sa_cache_this, 1);
  }
  
 -void nfs41_sequence_call_done(struct rpc_task *task, void *data)
 +static void nfs41_sequence_release(void *data)
 +{
 +      struct nfs_client *clp = (struct nfs_client *)data;
 +
 +      if (atomic_read(&clp->cl_count) > 1)
 +              nfs4_schedule_state_renewal(clp);
 +      nfs_put_client(clp);
 +}
 +
 +static void nfs41_sequence_call_done(struct rpc_task *task, void *data)
  {
        struct nfs_client *clp = (struct nfs_client *)data;
  
  
        if (task->tk_status < 0) {
                dprintk("%s ERROR %d\n", __func__, task->tk_status);
 +              if (atomic_read(&clp->cl_count) == 1)
 +                      goto out;
  
                if (_nfs4_async_handle_error(task, NULL, clp, NULL)
                                                                == -EAGAIN) {
                }
        }
        dprintk("%s rpc_cred %p\n", __func__, task->tk_msg.rpc_cred);
 -
 +out:
        kfree(task->tk_msg.rpc_argp);
        kfree(task->tk_msg.rpc_resp);
  
@@@ -5088,7 -5057,6 +5088,7 @@@ static void nfs41_sequence_prepare(stru
  static const struct rpc_call_ops nfs41_sequence_ops = {
        .rpc_call_done = nfs41_sequence_call_done,
        .rpc_call_prepare = nfs41_sequence_prepare,
 +      .rpc_release = nfs41_sequence_release,
  };
  
  static int nfs41_proc_async_sequence(struct nfs_client *clp,
                .rpc_cred = cred,
        };
  
 +      if (!atomic_inc_not_zero(&clp->cl_count))
 +              return -EIO;
        args = kzalloc(sizeof(*args), GFP_KERNEL);
 -      if (!args)
 -              return -ENOMEM;
        res = kzalloc(sizeof(*res), GFP_KERNEL);
 -      if (!res) {
 +      if (!args || !res) {
                kfree(args);
 +              nfs_put_client(clp);
                return -ENOMEM;
        }
        res->sr_slotid = NFS4_MAX_SLOT_TABLE;
diff --combined fs/nfs/nfs4xdr.c
index 020ebf1511849adb5a8a89159883b5bcfbddb7e3,5cd5184b56dbad12a8e204ecd22adcb94c3dadf1..4d338be492cb28f6e91ae9eecfe30af64555154d
@@@ -1578,14 -1578,6 +1578,14 @@@ static void encode_create_session(struc
        char machine_name[NFS4_MAX_MACHINE_NAME_LEN];
        uint32_t len;
        struct nfs_client *clp = args->client;
 +      u32 max_resp_sz_cached;
 +
 +      /*
 +       * Assumes OPEN is the biggest non-idempotent compound.
 +       * 2 is the verifier.
 +       */
 +      max_resp_sz_cached = (NFS4_dec_open_sz + RPC_REPHDRSIZE +
 +                            RPC_MAX_AUTH_SIZE + 2) * XDR_UNIT;
  
        len = scnprintf(machine_name, sizeof(machine_name), "%s",
                        clp->cl_ipaddr);
        *p++ = cpu_to_be32(args->fc_attrs.headerpadsz); /* header padding size */
        *p++ = cpu_to_be32(args->fc_attrs.max_rqst_sz); /* max req size */
        *p++ = cpu_to_be32(args->fc_attrs.max_resp_sz); /* max resp size */
 -      *p++ = cpu_to_be32(args->fc_attrs.max_resp_sz_cached);  /* Max resp sz cached */
 +      *p++ = cpu_to_be32(max_resp_sz_cached);         /* Max resp sz cached */
        *p++ = cpu_to_be32(args->fc_attrs.max_ops);     /* max operations */
        *p++ = cpu_to_be32(args->fc_attrs.max_reqs);    /* max requests */
        *p++ = cpu_to_be32(0);                          /* rdmachannel_attrs */
@@@ -4639,7 -4631,7 +4639,7 @@@ static int decode_sequence(struct xdr_s
         * If the server returns different values for sessionID, slotID or
         * sequence number, the server is looney tunes.
         */
-       status = -ESERVERFAULT;
+       status = -EREMOTEIO;
  
        if (memcmp(id.data, res->sr_session->sess_id.data,
                   NFS4_MAX_SESSIONID_LEN)) {
@@@ -5782,7 -5774,7 +5782,7 @@@ static struct 
        { NFS4ERR_BAD_COOKIE,   -EBADCOOKIE     },
        { NFS4ERR_NOTSUPP,      -ENOTSUPP       },
        { NFS4ERR_TOOSMALL,     -ETOOSMALL      },
-       { NFS4ERR_SERVERFAULT,  -ESERVERFAULT   },
+       { NFS4ERR_SERVERFAULT,  -EREMOTEIO      },
        { NFS4ERR_BADTYPE,      -EBADTYPE       },
        { NFS4ERR_LOCKED,       -EAGAIN         },
        { NFS4ERR_SYMLINK,      -ELOOP          },
@@@ -5809,7 -5801,7 +5809,7 @@@ nfs4_stat_to_errno(int stat
        }
        if (stat <= 10000 || stat > 10100) {
                /* The server is looney tunes. */
-               return -ESERVERFAULT;
+               return -EREMOTEIO;
        }
        /* If we cannot translate the error, the recovery routines should
         * handle it.
index ecd9e6c74d06c3d46610cea4641b4fb5d296c97b,6a2e44fd75e23ed0b72be0498decb3de28a84183..717a5e54eb1dcf68cdda886b71601e003fec105a
@@@ -105,7 -105,7 +105,7 @@@ struct nfs_server 
        struct rpc_clnt *       client;         /* RPC client handle */
        struct rpc_clnt *       client_acl;     /* ACL RPC client handle */
        struct nlm_host         *nlm_host;      /* NLM client handle */
-       struct nfs_iostats *    io_stats;       /* I/O statistics */
+       struct nfs_iostats __percpu *io_stats;  /* I/O statistics */
        struct backing_dev_info backing_dev_info;
        atomic_long_t           writeback;      /* number of writeback pages */
        int                     flags;          /* various flags */
@@@ -193,8 -193,6 +193,8 @@@ struct nfs4_slot_table 
        int             max_slots;              /* # slots in table */
        int             highest_used_slotid;    /* sent to server on each SEQ.
                                                 * op for dynamic resizing */
 +      int             target_max_slots;       /* Set by CB_RECALL_SLOT as
 +                                               * the new max_slots */
  };
  
  static inline int slot_idx(struct nfs4_slot_table *tbl, struct nfs4_slot *sp)