linux/fs/nfs/nfs4xdr.c
<<
>>
Prefs
   1/*
   2 *  fs/nfs/nfs4xdr.c
   3 *
   4 *  Client-side XDR for NFSv4.
   5 *
   6 *  Copyright (c) 2002 The Regents of the University of Michigan.
   7 *  All rights reserved.
   8 *
   9 *  Kendrick Smith <kmsmith@umich.edu>
  10 *  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/param.h>
  39#include <linux/time.h>
  40#include <linux/mm.h>
  41#include <linux/errno.h>
  42#include <linux/string.h>
  43#include <linux/in.h>
  44#include <linux/pagemap.h>
  45#include <linux/proc_fs.h>
  46#include <linux/kdev_t.h>
  47#include <linux/module.h>
  48#include <linux/utsname.h>
  49#include <linux/sunrpc/clnt.h>
  50#include <linux/sunrpc/msg_prot.h>
  51#include <linux/sunrpc/gss_api.h>
  52#include <linux/nfs.h>
  53#include <linux/nfs4.h>
  54#include <linux/nfs_fs.h>
  55
  56#include "nfs4_fs.h"
  57#include "internal.h"
  58#include "nfs4idmap.h"
  59#include "nfs4session.h"
  60#include "pnfs.h"
  61#include "netns.h"
  62
  63#define NFSDBG_FACILITY         NFSDBG_XDR
  64
  65/* Mapping from NFS error code to "errno" error code. */
  66#define errno_NFSERR_IO         EIO
  67
  68struct compound_hdr;
  69static int nfs4_stat_to_errno(int);
  70static void encode_layoutget(struct xdr_stream *xdr,
  71                             const struct nfs4_layoutget_args *args,
  72                             struct compound_hdr *hdr);
  73static int decode_layoutget(struct xdr_stream *xdr, struct rpc_rqst *req,
  74                             struct nfs4_layoutget_res *res);
  75
  76/* NFSv4 COMPOUND tags are only wanted for debugging purposes */
  77#ifdef DEBUG
  78#define NFS4_MAXTAGLEN          20
  79#else
  80#define NFS4_MAXTAGLEN          0
  81#endif
  82
  83/* lock,open owner id:
  84 * we currently use size 2 (u64) out of (NFS4_OPAQUE_LIMIT  >> 2)
  85 */
  86#define open_owner_id_maxsz     (1 + 2 + 1 + 1 + 2)
  87#define lock_owner_id_maxsz     (1 + 1 + 4)
  88#define decode_lockowner_maxsz  (1 + XDR_QUADLEN(IDMAP_NAMESZ))
  89#define compound_encode_hdr_maxsz       (3 + (NFS4_MAXTAGLEN >> 2))
  90#define compound_decode_hdr_maxsz       (3 + (NFS4_MAXTAGLEN >> 2))
  91#define op_encode_hdr_maxsz     (1)
  92#define op_decode_hdr_maxsz     (2)
  93#define encode_stateid_maxsz    (XDR_QUADLEN(NFS4_STATEID_SIZE))
  94#define decode_stateid_maxsz    (XDR_QUADLEN(NFS4_STATEID_SIZE))
  95#define encode_verifier_maxsz   (XDR_QUADLEN(NFS4_VERIFIER_SIZE))
  96#define decode_verifier_maxsz   (XDR_QUADLEN(NFS4_VERIFIER_SIZE))
  97#define encode_putfh_maxsz      (op_encode_hdr_maxsz + 1 + \
  98                                (NFS4_FHSIZE >> 2))
  99#define decode_putfh_maxsz      (op_decode_hdr_maxsz)
 100#define encode_putrootfh_maxsz  (op_encode_hdr_maxsz)
 101#define decode_putrootfh_maxsz  (op_decode_hdr_maxsz)
 102#define encode_getfh_maxsz      (op_encode_hdr_maxsz)
 103#define decode_getfh_maxsz      (op_decode_hdr_maxsz + 1 + \
 104                                ((3+NFS4_FHSIZE) >> 2))
 105#define nfs4_fattr_bitmap_maxsz 4
 106#define encode_getattr_maxsz    (op_encode_hdr_maxsz + nfs4_fattr_bitmap_maxsz)
 107#define nfstime4_maxsz          (3)
 108#define nfs4_name_maxsz         (1 + ((3 + NFS4_MAXNAMLEN) >> 2))
 109#define nfs4_path_maxsz         (1 + ((3 + NFS4_MAXPATHLEN) >> 2))
 110#define nfs4_owner_maxsz        (1 + XDR_QUADLEN(IDMAP_NAMESZ))
 111#define nfs4_group_maxsz        (1 + XDR_QUADLEN(IDMAP_NAMESZ))
 112#ifdef CONFIG_NFS_V4_SECURITY_LABEL
 113/* PI(4 bytes) + LFS(4 bytes) + 1(for null terminator?) + MAXLABELLEN */
 114#define nfs4_label_maxsz        (4 + 4 + 1 + XDR_QUADLEN(NFS4_MAXLABELLEN))
 115#else
 116#define nfs4_label_maxsz        0
 117#endif
 118/* We support only one layout type per file system */
 119#define decode_mdsthreshold_maxsz (1 + 1 + nfs4_fattr_bitmap_maxsz + 1 + 8)
 120/* This is based on getfattr, which uses the most attributes: */
 121#define nfs4_fattr_value_maxsz  (1 + (1 + 2 + 2 + 4 + 2 + 1 + 1 + 2 + 2 + \
 122                                3*nfstime4_maxsz + \
 123                                nfs4_owner_maxsz + \
 124                                nfs4_group_maxsz + nfs4_label_maxsz + \
 125                                 decode_mdsthreshold_maxsz))
 126#define nfs4_fattr_maxsz        (nfs4_fattr_bitmap_maxsz + \
 127                                nfs4_fattr_value_maxsz)
 128#define decode_getattr_maxsz    (op_decode_hdr_maxsz + nfs4_fattr_maxsz)
 129#define encode_attrs_maxsz      (nfs4_fattr_bitmap_maxsz + \
 130                                 1 + 2 + 1 + \
 131                                nfs4_owner_maxsz + \
 132                                nfs4_group_maxsz + \
 133                                nfs4_label_maxsz + \
 134                                1 + nfstime4_maxsz + \
 135                                1 + nfstime4_maxsz)
 136#define encode_savefh_maxsz     (op_encode_hdr_maxsz)
 137#define decode_savefh_maxsz     (op_decode_hdr_maxsz)
 138#define encode_restorefh_maxsz  (op_encode_hdr_maxsz)
 139#define decode_restorefh_maxsz  (op_decode_hdr_maxsz)
 140#define encode_fsinfo_maxsz     (encode_getattr_maxsz)
 141/* The 5 accounts for the PNFS attributes, and assumes that at most three
 142 * layout types will be returned.
 143 */
 144#define decode_fsinfo_maxsz     (op_decode_hdr_maxsz + \
 145                                 nfs4_fattr_bitmap_maxsz + 4 + 8 + 5)
 146#define encode_renew_maxsz      (op_encode_hdr_maxsz + 3)
 147#define decode_renew_maxsz      (op_decode_hdr_maxsz)
 148#define encode_setclientid_maxsz \
 149                                (op_encode_hdr_maxsz + \
 150                                XDR_QUADLEN(NFS4_VERIFIER_SIZE) + \
 151                                /* client name */ \
 152                                1 + XDR_QUADLEN(NFS4_OPAQUE_LIMIT) + \
 153                                1 /* sc_prog */ + \
 154                                1 + XDR_QUADLEN(RPCBIND_MAXNETIDLEN) + \
 155                                1 + XDR_QUADLEN(RPCBIND_MAXUADDRLEN) + \
 156                                1) /* sc_cb_ident */
 157#define decode_setclientid_maxsz \
 158                                (op_decode_hdr_maxsz + \
 159                                2 /* clientid */ + \
 160                                XDR_QUADLEN(NFS4_VERIFIER_SIZE) + \
 161                                1 + XDR_QUADLEN(RPCBIND_MAXNETIDLEN) + \
 162                                1 + XDR_QUADLEN(RPCBIND_MAXUADDRLEN))
 163#define encode_setclientid_confirm_maxsz \
 164                                (op_encode_hdr_maxsz + \
 165                                3 + (NFS4_VERIFIER_SIZE >> 2))
 166#define decode_setclientid_confirm_maxsz \
 167                                (op_decode_hdr_maxsz)
 168#define encode_lookup_maxsz     (op_encode_hdr_maxsz + nfs4_name_maxsz)
 169#define decode_lookup_maxsz     (op_decode_hdr_maxsz)
 170#define encode_lookupp_maxsz    (op_encode_hdr_maxsz)
 171#define decode_lookupp_maxsz    (op_decode_hdr_maxsz)
 172#define encode_share_access_maxsz \
 173                                (2)
 174#define encode_createmode_maxsz (1 + encode_attrs_maxsz + encode_verifier_maxsz)
 175#define encode_opentype_maxsz   (1 + encode_createmode_maxsz)
 176#define encode_claim_null_maxsz (1 + nfs4_name_maxsz)
 177#define encode_open_maxsz       (op_encode_hdr_maxsz + \
 178                                2 + encode_share_access_maxsz + 2 + \
 179                                open_owner_id_maxsz + \
 180                                encode_opentype_maxsz + \
 181                                encode_claim_null_maxsz)
 182#define decode_space_limit_maxsz        (3)
 183#define decode_ace_maxsz        (3 + nfs4_owner_maxsz)
 184#define decode_delegation_maxsz (1 + decode_stateid_maxsz + 1 + \
 185                                decode_space_limit_maxsz + \
 186                                decode_ace_maxsz)
 187#define decode_change_info_maxsz        (5)
 188#define decode_open_maxsz       (op_decode_hdr_maxsz + \
 189                                decode_stateid_maxsz + \
 190                                decode_change_info_maxsz + 1 + \
 191                                nfs4_fattr_bitmap_maxsz + \
 192                                decode_delegation_maxsz)
 193#define encode_open_confirm_maxsz \
 194                                (op_encode_hdr_maxsz + \
 195                                 encode_stateid_maxsz + 1)
 196#define decode_open_confirm_maxsz \
 197                                (op_decode_hdr_maxsz + \
 198                                 decode_stateid_maxsz)
 199#define encode_open_downgrade_maxsz \
 200                                (op_encode_hdr_maxsz + \
 201                                 encode_stateid_maxsz + 1 + \
 202                                 encode_share_access_maxsz)
 203#define decode_open_downgrade_maxsz \
 204                                (op_decode_hdr_maxsz + \
 205                                 decode_stateid_maxsz)
 206#define encode_close_maxsz      (op_encode_hdr_maxsz + \
 207                                 1 + encode_stateid_maxsz)
 208#define decode_close_maxsz      (op_decode_hdr_maxsz + \
 209                                 decode_stateid_maxsz)
 210#define encode_setattr_maxsz    (op_encode_hdr_maxsz + \
 211                                 encode_stateid_maxsz + \
 212                                 encode_attrs_maxsz)
 213#define decode_setattr_maxsz    (op_decode_hdr_maxsz + \
 214                                 nfs4_fattr_bitmap_maxsz)
 215#define encode_read_maxsz       (op_encode_hdr_maxsz + \
 216                                 encode_stateid_maxsz + 3)
 217#define decode_read_maxsz       (op_decode_hdr_maxsz + 2)
 218#define encode_readdir_maxsz    (op_encode_hdr_maxsz + \
 219                                 2 + encode_verifier_maxsz + 5 + \
 220                                nfs4_label_maxsz)
 221#define decode_readdir_maxsz    (op_decode_hdr_maxsz + \
 222                                 decode_verifier_maxsz)
 223#define encode_readlink_maxsz   (op_encode_hdr_maxsz)
 224#define decode_readlink_maxsz   (op_decode_hdr_maxsz + 1)
 225#define encode_write_maxsz      (op_encode_hdr_maxsz + \
 226                                 encode_stateid_maxsz + 4)
 227#define decode_write_maxsz      (op_decode_hdr_maxsz + \
 228                                 2 + decode_verifier_maxsz)
 229#define encode_commit_maxsz     (op_encode_hdr_maxsz + 3)
 230#define decode_commit_maxsz     (op_decode_hdr_maxsz + \
 231                                 decode_verifier_maxsz)
 232#define encode_remove_maxsz     (op_encode_hdr_maxsz + \
 233                                nfs4_name_maxsz)
 234#define decode_remove_maxsz     (op_decode_hdr_maxsz + \
 235                                 decode_change_info_maxsz)
 236#define encode_rename_maxsz     (op_encode_hdr_maxsz + \
 237                                2 * nfs4_name_maxsz)
 238#define decode_rename_maxsz     (op_decode_hdr_maxsz + \
 239                                 decode_change_info_maxsz + \
 240                                 decode_change_info_maxsz)
 241#define encode_link_maxsz       (op_encode_hdr_maxsz + \
 242                                nfs4_name_maxsz)
 243#define decode_link_maxsz       (op_decode_hdr_maxsz + decode_change_info_maxsz)
 244#define encode_lockowner_maxsz  (7)
 245#define encode_lock_maxsz       (op_encode_hdr_maxsz + \
 246                                 7 + \
 247                                 1 + encode_stateid_maxsz + 1 + \
 248                                 encode_lockowner_maxsz)
 249#define decode_lock_denied_maxsz \
 250                                (8 + decode_lockowner_maxsz)
 251#define decode_lock_maxsz       (op_decode_hdr_maxsz + \
 252                                 decode_lock_denied_maxsz)
 253#define encode_lockt_maxsz      (op_encode_hdr_maxsz + 5 + \
 254                                encode_lockowner_maxsz)
 255#define decode_lockt_maxsz      (op_decode_hdr_maxsz + \
 256                                 decode_lock_denied_maxsz)
 257#define encode_locku_maxsz      (op_encode_hdr_maxsz + 3 + \
 258                                 encode_stateid_maxsz + \
 259                                 4)
 260#define decode_locku_maxsz      (op_decode_hdr_maxsz + \
 261                                 decode_stateid_maxsz)
 262#define encode_release_lockowner_maxsz \
 263                                (op_encode_hdr_maxsz + \
 264                                 encode_lockowner_maxsz)
 265#define decode_release_lockowner_maxsz \
 266                                (op_decode_hdr_maxsz)
 267#define encode_access_maxsz     (op_encode_hdr_maxsz + 1)
 268#define decode_access_maxsz     (op_decode_hdr_maxsz + 2)
 269#define encode_symlink_maxsz    (op_encode_hdr_maxsz + \
 270                                1 + nfs4_name_maxsz + \
 271                                1 + \
 272                                nfs4_fattr_maxsz)
 273#define decode_symlink_maxsz    (op_decode_hdr_maxsz + 8)
 274#define encode_create_maxsz     (op_encode_hdr_maxsz + \
 275                                1 + 2 + nfs4_name_maxsz + \
 276                                encode_attrs_maxsz)
 277#define decode_create_maxsz     (op_decode_hdr_maxsz + \
 278                                decode_change_info_maxsz + \
 279                                nfs4_fattr_bitmap_maxsz)
 280#define encode_statfs_maxsz     (encode_getattr_maxsz)
 281#define decode_statfs_maxsz     (decode_getattr_maxsz)
 282#define encode_delegreturn_maxsz (op_encode_hdr_maxsz + 4)
 283#define decode_delegreturn_maxsz (op_decode_hdr_maxsz)
 284#define encode_getacl_maxsz     (encode_getattr_maxsz)
 285#define decode_getacl_maxsz     (op_decode_hdr_maxsz + \
 286                                 nfs4_fattr_bitmap_maxsz + 1)
 287#define encode_setacl_maxsz     (op_encode_hdr_maxsz + \
 288                                 encode_stateid_maxsz + 3)
 289#define decode_setacl_maxsz     (decode_setattr_maxsz)
 290#define encode_fs_locations_maxsz \
 291                                (encode_getattr_maxsz)
 292#define decode_fs_locations_maxsz \
 293                                (0)
 294#define encode_secinfo_maxsz    (op_encode_hdr_maxsz + nfs4_name_maxsz)
 295#define decode_secinfo_maxsz    (op_decode_hdr_maxsz + 1 + ((NFS_MAX_SECFLAVORS * (16 + GSS_OID_MAX_LEN)) / 4))
 296
 297#if defined(CONFIG_NFS_V4_1)
 298#define NFS4_MAX_MACHINE_NAME_LEN (64)
 299#define IMPL_NAME_LIMIT (sizeof(utsname()->sysname) + sizeof(utsname()->release) + \
 300                         sizeof(utsname()->version) + sizeof(utsname()->machine) + 8)
 301
 302#define encode_exchange_id_maxsz (op_encode_hdr_maxsz + \
 303                                encode_verifier_maxsz + \
 304                                1 /* co_ownerid.len */ + \
 305                                /* eia_clientowner */ \
 306                                1 + XDR_QUADLEN(NFS4_OPAQUE_LIMIT) + \
 307                                1 /* flags */ + \
 308                                1 /* spa_how */ + \
 309                                /* max is SP4_MACH_CRED (for now) */ + \
 310                                1 + NFS4_OP_MAP_NUM_WORDS + \
 311                                1 + NFS4_OP_MAP_NUM_WORDS + \
 312                                1 /* implementation id array of size 1 */ + \
 313                                1 /* nii_domain */ + \
 314                                XDR_QUADLEN(NFS4_OPAQUE_LIMIT) + \
 315                                1 /* nii_name */ + \
 316                                XDR_QUADLEN(IMPL_NAME_LIMIT) + \
 317                                3 /* nii_date */)
 318#define decode_exchange_id_maxsz (op_decode_hdr_maxsz + \
 319                                2 /* eir_clientid */ + \
 320                                1 /* eir_sequenceid */ + \
 321                                1 /* eir_flags */ + \
 322                                1 /* spr_how */ + \
 323                                  /* max is SP4_MACH_CRED (for now) */ + \
 324                                1 + NFS4_OP_MAP_NUM_WORDS + \
 325                                1 + NFS4_OP_MAP_NUM_WORDS + \
 326                                2 /* eir_server_owner.so_minor_id */ + \
 327                                /* eir_server_owner.so_major_id<> */ \
 328                                XDR_QUADLEN(NFS4_OPAQUE_LIMIT) + 1 + \
 329                                /* eir_server_scope<> */ \
 330                                XDR_QUADLEN(NFS4_OPAQUE_LIMIT) + 1 + \
 331                                1 /* eir_server_impl_id array length */ + \
 332                                1 /* nii_domain */ + \
 333                                XDR_QUADLEN(NFS4_OPAQUE_LIMIT) + \
 334                                1 /* nii_name */ + \
 335                                XDR_QUADLEN(NFS4_OPAQUE_LIMIT) + \
 336                                3 /* nii_date */)
 337#define encode_channel_attrs_maxsz  (6 + 1 /* ca_rdma_ird.len (0) */)
 338#define decode_channel_attrs_maxsz  (6 + \
 339                                     1 /* ca_rdma_ird.len */ + \
 340                                     1 /* ca_rdma_ird */)
 341#define encode_create_session_maxsz  (op_encode_hdr_maxsz + \
 342                                     2 /* csa_clientid */ + \
 343                                     1 /* csa_sequence */ + \
 344                                     1 /* csa_flags */ + \
 345                                     encode_channel_attrs_maxsz + \
 346                                     encode_channel_attrs_maxsz + \
 347                                     1 /* csa_cb_program */ + \
 348                                     1 /* csa_sec_parms.len (1) */ + \
 349                                     1 /* cb_secflavor (AUTH_SYS) */ + \
 350                                     1 /* stamp */ + \
 351                                     1 /* machinename.len */ + \
 352                                     XDR_QUADLEN(NFS4_MAX_MACHINE_NAME_LEN) + \
 353                                     1 /* uid */ + \
 354                                     1 /* gid */ + \
 355                                     1 /* gids.len (0) */)
 356#define decode_create_session_maxsz  (op_decode_hdr_maxsz +     \
 357                                     XDR_QUADLEN(NFS4_MAX_SESSIONID_LEN) + \
 358                                     1 /* csr_sequence */ + \
 359                                     1 /* csr_flags */ + \
 360                                     decode_channel_attrs_maxsz + \
 361                                     decode_channel_attrs_maxsz)
 362#define encode_bind_conn_to_session_maxsz  (op_encode_hdr_maxsz + \
 363                                     /* bctsa_sessid */ \
 364                                     XDR_QUADLEN(NFS4_MAX_SESSIONID_LEN) + \
 365                                     1 /* bctsa_dir */ + \
 366                                     1 /* bctsa_use_conn_in_rdma_mode */)
 367#define decode_bind_conn_to_session_maxsz  (op_decode_hdr_maxsz +       \
 368                                     /* bctsr_sessid */ \
 369                                     XDR_QUADLEN(NFS4_MAX_SESSIONID_LEN) + \
 370                                     1 /* bctsr_dir */ + \
 371                                     1 /* bctsr_use_conn_in_rdma_mode */)
 372#define encode_destroy_session_maxsz    (op_encode_hdr_maxsz + 4)
 373#define decode_destroy_session_maxsz    (op_decode_hdr_maxsz)
 374#define encode_destroy_clientid_maxsz   (op_encode_hdr_maxsz + 2)
 375#define decode_destroy_clientid_maxsz   (op_decode_hdr_maxsz)
 376#define encode_sequence_maxsz   (op_encode_hdr_maxsz + \
 377                                XDR_QUADLEN(NFS4_MAX_SESSIONID_LEN) + 4)
 378#define decode_sequence_maxsz   (op_decode_hdr_maxsz + \
 379                                XDR_QUADLEN(NFS4_MAX_SESSIONID_LEN) + 5)
 380#define encode_reclaim_complete_maxsz   (op_encode_hdr_maxsz + 4)
 381#define decode_reclaim_complete_maxsz   (op_decode_hdr_maxsz + 4)
 382#define encode_getdeviceinfo_maxsz (op_encode_hdr_maxsz + \
 383                                XDR_QUADLEN(NFS4_DEVICEID4_SIZE) + \
 384                                1 /* layout type */ + \
 385                                1 /* maxcount */ + \
 386                                1 /* bitmap size */ + \
 387                                1 /* notification bitmap length */ + \
 388                                1 /* notification bitmap, word 0 */)
 389#define decode_getdeviceinfo_maxsz (op_decode_hdr_maxsz + \
 390                                1 /* layout type */ + \
 391                                1 /* opaque devaddr4 length */ + \
 392                                  /* devaddr4 payload is read into page */ \
 393                                1 /* notification bitmap length */ + \
 394                                1 /* notification bitmap, word 0 */)
 395#define encode_layoutget_maxsz  (op_encode_hdr_maxsz + 10 + \
 396                                encode_stateid_maxsz)
 397#define decode_layoutget_maxsz  (op_decode_hdr_maxsz + 8 + \
 398                                decode_stateid_maxsz + \
 399                                XDR_QUADLEN(PNFS_LAYOUT_MAXSIZE))
 400#define encode_layoutcommit_maxsz (op_encode_hdr_maxsz +          \
 401                                2 /* offset */ + \
 402                                2 /* length */ + \
 403                                1 /* reclaim */ + \
 404                                encode_stateid_maxsz + \
 405                                1 /* new offset (true) */ + \
 406                                2 /* last byte written */ + \
 407                                1 /* nt_timechanged (false) */ + \
 408                                1 /* layoutupdate4 layout type */ + \
 409                                1 /* layoutupdate4 opaqueue len */)
 410                                  /* the actual content of layoutupdate4 should
 411                                     be allocated by drivers and spliced in
 412                                     using xdr_write_pages */
 413#define decode_layoutcommit_maxsz (op_decode_hdr_maxsz + 3)
 414#define encode_layoutreturn_maxsz (8 + op_encode_hdr_maxsz + \
 415                                encode_stateid_maxsz + \
 416                                1 + \
 417                                XDR_QUADLEN(NFS4_OPAQUE_LIMIT))
 418#define decode_layoutreturn_maxsz (op_decode_hdr_maxsz + \
 419                                1 + decode_stateid_maxsz)
 420#define encode_secinfo_no_name_maxsz (op_encode_hdr_maxsz + 1)
 421#define decode_secinfo_no_name_maxsz decode_secinfo_maxsz
 422#define encode_test_stateid_maxsz       (op_encode_hdr_maxsz + 2 + \
 423                                         XDR_QUADLEN(NFS4_STATEID_SIZE))
 424#define decode_test_stateid_maxsz       (op_decode_hdr_maxsz + 2 + 1)
 425#define encode_free_stateid_maxsz       (op_encode_hdr_maxsz + 1 + \
 426                                         XDR_QUADLEN(NFS4_STATEID_SIZE))
 427#define decode_free_stateid_maxsz       (op_decode_hdr_maxsz)
 428#else /* CONFIG_NFS_V4_1 */
 429#define encode_sequence_maxsz   0
 430#define decode_sequence_maxsz   0
 431#define encode_layoutreturn_maxsz 0
 432#define decode_layoutreturn_maxsz 0
 433#define encode_layoutget_maxsz  0
 434#define decode_layoutget_maxsz  0
 435#endif /* CONFIG_NFS_V4_1 */
 436
 437#define NFS4_enc_compound_sz    (1024)  /* XXX: large enough? */
 438#define NFS4_dec_compound_sz    (1024)  /* XXX: large enough? */
 439#define NFS4_enc_read_sz        (compound_encode_hdr_maxsz + \
 440                                encode_sequence_maxsz + \
 441                                encode_putfh_maxsz + \
 442                                encode_read_maxsz)
 443#define NFS4_dec_read_sz        (compound_decode_hdr_maxsz + \
 444                                decode_sequence_maxsz + \
 445                                decode_putfh_maxsz + \
 446                                decode_read_maxsz)
 447#define NFS4_enc_readlink_sz    (compound_encode_hdr_maxsz + \
 448                                encode_sequence_maxsz + \
 449                                encode_putfh_maxsz + \
 450                                encode_readlink_maxsz)
 451#define NFS4_dec_readlink_sz    (compound_decode_hdr_maxsz + \
 452                                decode_sequence_maxsz + \
 453                                decode_putfh_maxsz + \
 454                                decode_readlink_maxsz)
 455#define NFS4_enc_readdir_sz     (compound_encode_hdr_maxsz + \
 456                                encode_sequence_maxsz + \
 457                                encode_putfh_maxsz + \
 458                                encode_readdir_maxsz)
 459#define NFS4_dec_readdir_sz     (compound_decode_hdr_maxsz + \
 460                                decode_sequence_maxsz + \
 461                                decode_putfh_maxsz + \
 462                                decode_readdir_maxsz)
 463#define NFS4_enc_write_sz       (compound_encode_hdr_maxsz + \
 464                                encode_sequence_maxsz + \
 465                                encode_putfh_maxsz + \
 466                                encode_write_maxsz + \
 467                                encode_getattr_maxsz)
 468#define NFS4_dec_write_sz       (compound_decode_hdr_maxsz + \
 469                                decode_sequence_maxsz + \
 470                                decode_putfh_maxsz + \
 471                                decode_write_maxsz + \
 472                                decode_getattr_maxsz)
 473#define NFS4_enc_commit_sz      (compound_encode_hdr_maxsz + \
 474                                encode_sequence_maxsz + \
 475                                encode_putfh_maxsz + \
 476                                encode_commit_maxsz)
 477#define NFS4_dec_commit_sz      (compound_decode_hdr_maxsz + \
 478                                decode_sequence_maxsz + \
 479                                decode_putfh_maxsz + \
 480                                decode_commit_maxsz)
 481#define NFS4_enc_open_sz        (compound_encode_hdr_maxsz + \
 482                                encode_sequence_maxsz + \
 483                                encode_putfh_maxsz + \
 484                                encode_open_maxsz + \
 485                                encode_access_maxsz + \
 486                                encode_getfh_maxsz + \
 487                                encode_getattr_maxsz + \
 488                                encode_layoutget_maxsz)
 489#define NFS4_dec_open_sz        (compound_decode_hdr_maxsz + \
 490                                decode_sequence_maxsz + \
 491                                decode_putfh_maxsz + \
 492                                decode_open_maxsz + \
 493                                decode_access_maxsz + \
 494                                decode_getfh_maxsz + \
 495                                decode_getattr_maxsz + \
 496                                decode_layoutget_maxsz)
 497#define NFS4_enc_open_confirm_sz \
 498                                (compound_encode_hdr_maxsz + \
 499                                 encode_putfh_maxsz + \
 500                                 encode_open_confirm_maxsz)
 501#define NFS4_dec_open_confirm_sz \
 502                                (compound_decode_hdr_maxsz + \
 503                                 decode_putfh_maxsz + \
 504                                 decode_open_confirm_maxsz)
 505#define NFS4_enc_open_noattr_sz (compound_encode_hdr_maxsz + \
 506                                        encode_sequence_maxsz + \
 507                                        encode_putfh_maxsz + \
 508                                        encode_open_maxsz + \
 509                                        encode_access_maxsz + \
 510                                        encode_getattr_maxsz + \
 511                                        encode_layoutget_maxsz)
 512#define NFS4_dec_open_noattr_sz (compound_decode_hdr_maxsz + \
 513                                        decode_sequence_maxsz + \
 514                                        decode_putfh_maxsz + \
 515                                        decode_open_maxsz + \
 516                                        decode_access_maxsz + \
 517                                        decode_getattr_maxsz + \
 518                                        decode_layoutget_maxsz)
 519#define NFS4_enc_open_downgrade_sz \
 520                                (compound_encode_hdr_maxsz + \
 521                                 encode_sequence_maxsz + \
 522                                 encode_putfh_maxsz + \
 523                                 encode_layoutreturn_maxsz + \
 524                                 encode_open_downgrade_maxsz)
 525#define NFS4_dec_open_downgrade_sz \
 526                                (compound_decode_hdr_maxsz + \
 527                                 decode_sequence_maxsz + \
 528                                 decode_putfh_maxsz + \
 529                                 decode_layoutreturn_maxsz + \
 530                                 decode_open_downgrade_maxsz)
 531#define NFS4_enc_close_sz       (compound_encode_hdr_maxsz + \
 532                                 encode_sequence_maxsz + \
 533                                 encode_putfh_maxsz + \
 534                                 encode_layoutreturn_maxsz + \
 535                                 encode_close_maxsz + \
 536                                 encode_getattr_maxsz)
 537#define NFS4_dec_close_sz       (compound_decode_hdr_maxsz + \
 538                                 decode_sequence_maxsz + \
 539                                 decode_putfh_maxsz + \
 540                                 decode_layoutreturn_maxsz + \
 541                                 decode_close_maxsz + \
 542                                 decode_getattr_maxsz)
 543#define NFS4_enc_setattr_sz     (compound_encode_hdr_maxsz + \
 544                                 encode_sequence_maxsz + \
 545                                 encode_putfh_maxsz + \
 546                                 encode_setattr_maxsz + \
 547                                 encode_getattr_maxsz)
 548#define NFS4_dec_setattr_sz     (compound_decode_hdr_maxsz + \
 549                                 decode_sequence_maxsz + \
 550                                 decode_putfh_maxsz + \
 551                                 decode_setattr_maxsz + \
 552                                 decode_getattr_maxsz)
 553#define NFS4_enc_fsinfo_sz      (compound_encode_hdr_maxsz + \
 554                                encode_sequence_maxsz + \
 555                                encode_putfh_maxsz + \
 556                                encode_fsinfo_maxsz)
 557#define NFS4_dec_fsinfo_sz      (compound_decode_hdr_maxsz + \
 558                                decode_sequence_maxsz + \
 559                                decode_putfh_maxsz + \
 560                                decode_fsinfo_maxsz)
 561#define NFS4_enc_renew_sz       (compound_encode_hdr_maxsz + \
 562                                encode_renew_maxsz)
 563#define NFS4_dec_renew_sz       (compound_decode_hdr_maxsz + \
 564                                decode_renew_maxsz)
 565#define NFS4_enc_setclientid_sz (compound_encode_hdr_maxsz + \
 566                                encode_setclientid_maxsz)
 567#define NFS4_dec_setclientid_sz (compound_decode_hdr_maxsz + \
 568                                decode_setclientid_maxsz)
 569#define NFS4_enc_setclientid_confirm_sz \
 570                                (compound_encode_hdr_maxsz + \
 571                                encode_setclientid_confirm_maxsz)
 572#define NFS4_dec_setclientid_confirm_sz \
 573                                (compound_decode_hdr_maxsz + \
 574                                decode_setclientid_confirm_maxsz)
 575#define NFS4_enc_lock_sz        (compound_encode_hdr_maxsz + \
 576                                encode_sequence_maxsz + \
 577                                encode_putfh_maxsz + \
 578                                encode_lock_maxsz)
 579#define NFS4_dec_lock_sz        (compound_decode_hdr_maxsz + \
 580                                decode_sequence_maxsz + \
 581                                decode_putfh_maxsz + \
 582                                decode_lock_maxsz)
 583#define NFS4_enc_lockt_sz       (compound_encode_hdr_maxsz + \
 584                                encode_sequence_maxsz + \
 585                                encode_putfh_maxsz + \
 586                                encode_lockt_maxsz)
 587#define NFS4_dec_lockt_sz       (compound_decode_hdr_maxsz + \
 588                                 decode_sequence_maxsz + \
 589                                 decode_putfh_maxsz + \
 590                                 decode_lockt_maxsz)
 591#define NFS4_enc_locku_sz       (compound_encode_hdr_maxsz + \
 592                                encode_sequence_maxsz + \
 593                                encode_putfh_maxsz + \
 594                                encode_locku_maxsz)
 595#define NFS4_dec_locku_sz       (compound_decode_hdr_maxsz + \
 596                                decode_sequence_maxsz + \
 597                                decode_putfh_maxsz + \
 598                                decode_locku_maxsz)
 599#define NFS4_enc_release_lockowner_sz \
 600                                (compound_encode_hdr_maxsz + \
 601                                 encode_lockowner_maxsz)
 602#define NFS4_dec_release_lockowner_sz \
 603                                (compound_decode_hdr_maxsz + \
 604                                 decode_lockowner_maxsz)
 605#define NFS4_enc_access_sz      (compound_encode_hdr_maxsz + \
 606                                encode_sequence_maxsz + \
 607                                encode_putfh_maxsz + \
 608                                encode_access_maxsz + \
 609                                encode_getattr_maxsz)
 610#define NFS4_dec_access_sz      (compound_decode_hdr_maxsz + \
 611                                decode_sequence_maxsz + \
 612                                decode_putfh_maxsz + \
 613                                decode_access_maxsz + \
 614                                decode_getattr_maxsz)
 615#define NFS4_enc_getattr_sz     (compound_encode_hdr_maxsz + \
 616                                encode_sequence_maxsz + \
 617                                encode_putfh_maxsz + \
 618                                encode_getattr_maxsz + \
 619                                encode_renew_maxsz)
 620#define NFS4_dec_getattr_sz     (compound_decode_hdr_maxsz + \
 621                                decode_sequence_maxsz + \
 622                                decode_putfh_maxsz + \
 623                                decode_getattr_maxsz + \
 624                                decode_renew_maxsz)
 625#define NFS4_enc_lookup_sz      (compound_encode_hdr_maxsz + \
 626                                encode_sequence_maxsz + \
 627                                encode_putfh_maxsz + \
 628                                encode_lookup_maxsz + \
 629                                encode_getattr_maxsz + \
 630                                encode_getfh_maxsz)
 631#define NFS4_dec_lookup_sz      (compound_decode_hdr_maxsz + \
 632                                decode_sequence_maxsz + \
 633                                decode_putfh_maxsz + \
 634                                decode_lookup_maxsz + \
 635                                decode_getattr_maxsz + \
 636                                decode_getfh_maxsz)
 637#define NFS4_enc_lookupp_sz     (compound_encode_hdr_maxsz + \
 638                                encode_sequence_maxsz + \
 639                                encode_putfh_maxsz + \
 640                                encode_lookupp_maxsz + \
 641                                encode_getattr_maxsz + \
 642                                encode_getfh_maxsz)
 643#define NFS4_dec_lookupp_sz     (compound_decode_hdr_maxsz + \
 644                                decode_sequence_maxsz + \
 645                                decode_putfh_maxsz + \
 646                                decode_lookupp_maxsz + \
 647                                decode_getattr_maxsz + \
 648                                decode_getfh_maxsz)
 649#define NFS4_enc_lookup_root_sz (compound_encode_hdr_maxsz + \
 650                                encode_sequence_maxsz + \
 651                                encode_putrootfh_maxsz + \
 652                                encode_getattr_maxsz + \
 653                                encode_getfh_maxsz)
 654#define NFS4_dec_lookup_root_sz (compound_decode_hdr_maxsz + \
 655                                decode_sequence_maxsz + \
 656                                decode_putrootfh_maxsz + \
 657                                decode_getattr_maxsz + \
 658                                decode_getfh_maxsz)
 659#define NFS4_enc_remove_sz      (compound_encode_hdr_maxsz + \
 660                                encode_sequence_maxsz + \
 661                                encode_putfh_maxsz + \
 662                                encode_remove_maxsz)
 663#define NFS4_dec_remove_sz      (compound_decode_hdr_maxsz + \
 664                                decode_sequence_maxsz + \
 665                                decode_putfh_maxsz + \
 666                                decode_remove_maxsz)
 667#define NFS4_enc_rename_sz      (compound_encode_hdr_maxsz + \
 668                                encode_sequence_maxsz + \
 669                                encode_putfh_maxsz + \
 670                                encode_savefh_maxsz + \
 671                                encode_putfh_maxsz + \
 672                                encode_rename_maxsz)
 673#define NFS4_dec_rename_sz      (compound_decode_hdr_maxsz + \
 674                                decode_sequence_maxsz + \
 675                                decode_putfh_maxsz + \
 676                                decode_savefh_maxsz + \
 677                                decode_putfh_maxsz + \
 678                                decode_rename_maxsz)
 679#define NFS4_enc_link_sz        (compound_encode_hdr_maxsz + \
 680                                encode_sequence_maxsz + \
 681                                encode_putfh_maxsz + \
 682                                encode_savefh_maxsz + \
 683                                encode_putfh_maxsz + \
 684                                encode_link_maxsz + \
 685                                encode_restorefh_maxsz + \
 686                                encode_getattr_maxsz)
 687#define NFS4_dec_link_sz        (compound_decode_hdr_maxsz + \
 688                                decode_sequence_maxsz + \
 689                                decode_putfh_maxsz + \
 690                                decode_savefh_maxsz + \
 691                                decode_putfh_maxsz + \
 692                                decode_link_maxsz + \
 693                                decode_restorefh_maxsz + \
 694                                decode_getattr_maxsz)
 695#define NFS4_enc_symlink_sz     (compound_encode_hdr_maxsz + \
 696                                encode_sequence_maxsz + \
 697                                encode_putfh_maxsz + \
 698                                encode_symlink_maxsz + \
 699                                encode_getattr_maxsz + \
 700                                encode_getfh_maxsz)
 701#define NFS4_dec_symlink_sz     (compound_decode_hdr_maxsz + \
 702                                decode_sequence_maxsz + \
 703                                decode_putfh_maxsz + \
 704                                decode_symlink_maxsz + \
 705                                decode_getattr_maxsz + \
 706                                decode_getfh_maxsz)
 707#define NFS4_enc_create_sz      (compound_encode_hdr_maxsz + \
 708                                encode_sequence_maxsz + \
 709                                encode_putfh_maxsz + \
 710                                encode_create_maxsz + \
 711                                encode_getfh_maxsz + \
 712                                encode_getattr_maxsz)
 713#define NFS4_dec_create_sz      (compound_decode_hdr_maxsz + \
 714                                decode_sequence_maxsz + \
 715                                decode_putfh_maxsz + \
 716                                decode_create_maxsz + \
 717                                decode_getfh_maxsz + \
 718                                decode_getattr_maxsz)
 719#define NFS4_enc_pathconf_sz    (compound_encode_hdr_maxsz + \
 720                                encode_sequence_maxsz + \
 721                                encode_putfh_maxsz + \
 722                                encode_getattr_maxsz)
 723#define NFS4_dec_pathconf_sz    (compound_decode_hdr_maxsz + \
 724                                decode_sequence_maxsz + \
 725                                decode_putfh_maxsz + \
 726                                decode_getattr_maxsz)
 727#define NFS4_enc_statfs_sz      (compound_encode_hdr_maxsz + \
 728                                encode_sequence_maxsz + \
 729                                encode_putfh_maxsz + \
 730                                encode_statfs_maxsz)
 731#define NFS4_dec_statfs_sz      (compound_decode_hdr_maxsz + \
 732                                decode_sequence_maxsz + \
 733                                decode_putfh_maxsz + \
 734                                decode_statfs_maxsz)
 735#define NFS4_enc_server_caps_sz (compound_encode_hdr_maxsz + \
 736                                encode_sequence_maxsz + \
 737                                encode_putfh_maxsz + \
 738                                encode_getattr_maxsz)
 739#define NFS4_dec_server_caps_sz (compound_decode_hdr_maxsz + \
 740                                decode_sequence_maxsz + \
 741                                decode_putfh_maxsz + \
 742                                decode_getattr_maxsz)
 743#define NFS4_enc_delegreturn_sz (compound_encode_hdr_maxsz + \
 744                                encode_sequence_maxsz + \
 745                                encode_putfh_maxsz + \
 746                                encode_layoutreturn_maxsz + \
 747                                encode_delegreturn_maxsz + \
 748                                encode_getattr_maxsz)
 749#define NFS4_dec_delegreturn_sz (compound_decode_hdr_maxsz + \
 750                                decode_sequence_maxsz + \
 751                                decode_putfh_maxsz + \
 752                                decode_layoutreturn_maxsz + \
 753                                decode_delegreturn_maxsz + \
 754                                decode_getattr_maxsz)
 755#define NFS4_enc_getacl_sz      (compound_encode_hdr_maxsz + \
 756                                encode_sequence_maxsz + \
 757                                encode_putfh_maxsz + \
 758                                encode_getacl_maxsz)
 759#define NFS4_dec_getacl_sz      (compound_decode_hdr_maxsz + \
 760                                decode_sequence_maxsz + \
 761                                decode_putfh_maxsz + \
 762                                decode_getacl_maxsz)
 763#define NFS4_enc_setacl_sz      (compound_encode_hdr_maxsz + \
 764                                encode_sequence_maxsz + \
 765                                encode_putfh_maxsz + \
 766                                encode_setacl_maxsz)
 767#define NFS4_dec_setacl_sz      (compound_decode_hdr_maxsz + \
 768                                decode_sequence_maxsz + \
 769                                decode_putfh_maxsz + \
 770                                decode_setacl_maxsz)
 771#define NFS4_enc_fs_locations_sz \
 772                                (compound_encode_hdr_maxsz + \
 773                                 encode_sequence_maxsz + \
 774                                 encode_putfh_maxsz + \
 775                                 encode_lookup_maxsz + \
 776                                 encode_fs_locations_maxsz + \
 777                                 encode_renew_maxsz)
 778#define NFS4_dec_fs_locations_sz \
 779                                (compound_decode_hdr_maxsz + \
 780                                 decode_sequence_maxsz + \
 781                                 decode_putfh_maxsz + \
 782                                 decode_lookup_maxsz + \
 783                                 decode_fs_locations_maxsz + \
 784                                 decode_renew_maxsz)
 785#define NFS4_enc_secinfo_sz     (compound_encode_hdr_maxsz + \
 786                                encode_sequence_maxsz + \
 787                                encode_putfh_maxsz + \
 788                                encode_secinfo_maxsz)
 789#define NFS4_dec_secinfo_sz     (compound_decode_hdr_maxsz + \
 790                                decode_sequence_maxsz + \
 791                                decode_putfh_maxsz + \
 792                                decode_secinfo_maxsz)
 793#define NFS4_enc_fsid_present_sz \
 794                                (compound_encode_hdr_maxsz + \
 795                                 encode_sequence_maxsz + \
 796                                 encode_putfh_maxsz + \
 797                                 encode_getfh_maxsz + \
 798                                 encode_renew_maxsz)
 799#define NFS4_dec_fsid_present_sz \
 800                                (compound_decode_hdr_maxsz + \
 801                                 decode_sequence_maxsz + \
 802                                 decode_putfh_maxsz + \
 803                                 decode_getfh_maxsz + \
 804                                 decode_renew_maxsz)
 805#if defined(CONFIG_NFS_V4_1)
 806#define NFS4_enc_bind_conn_to_session_sz \
 807                                (compound_encode_hdr_maxsz + \
 808                                 encode_bind_conn_to_session_maxsz)
 809#define NFS4_dec_bind_conn_to_session_sz \
 810                                (compound_decode_hdr_maxsz + \
 811                                 decode_bind_conn_to_session_maxsz)
 812#define NFS4_enc_exchange_id_sz \
 813                                (compound_encode_hdr_maxsz + \
 814                                 encode_exchange_id_maxsz)
 815#define NFS4_dec_exchange_id_sz \
 816                                (compound_decode_hdr_maxsz + \
 817                                 decode_exchange_id_maxsz)
 818#define NFS4_enc_create_session_sz \
 819                                (compound_encode_hdr_maxsz + \
 820                                 encode_create_session_maxsz)
 821#define NFS4_dec_create_session_sz \
 822                                (compound_decode_hdr_maxsz + \
 823                                 decode_create_session_maxsz)
 824#define NFS4_enc_destroy_session_sz     (compound_encode_hdr_maxsz + \
 825                                         encode_destroy_session_maxsz)
 826#define NFS4_dec_destroy_session_sz     (compound_decode_hdr_maxsz + \
 827                                         decode_destroy_session_maxsz)
 828#define NFS4_enc_destroy_clientid_sz    (compound_encode_hdr_maxsz + \
 829                                         encode_destroy_clientid_maxsz)
 830#define NFS4_dec_destroy_clientid_sz    (compound_decode_hdr_maxsz + \
 831                                         decode_destroy_clientid_maxsz)
 832#define NFS4_enc_sequence_sz \
 833                                (compound_decode_hdr_maxsz + \
 834                                 encode_sequence_maxsz)
 835#define NFS4_dec_sequence_sz \
 836                                (compound_decode_hdr_maxsz + \
 837                                 decode_sequence_maxsz)
 838#define NFS4_enc_get_lease_time_sz      (compound_encode_hdr_maxsz + \
 839                                         encode_sequence_maxsz + \
 840                                         encode_putrootfh_maxsz + \
 841                                         encode_fsinfo_maxsz)
 842#define NFS4_dec_get_lease_time_sz      (compound_decode_hdr_maxsz + \
 843                                         decode_sequence_maxsz + \
 844                                         decode_putrootfh_maxsz + \
 845                                         decode_fsinfo_maxsz)
 846#define NFS4_enc_reclaim_complete_sz    (compound_encode_hdr_maxsz + \
 847                                         encode_sequence_maxsz + \
 848                                         encode_reclaim_complete_maxsz)
 849#define NFS4_dec_reclaim_complete_sz    (compound_decode_hdr_maxsz + \
 850                                         decode_sequence_maxsz + \
 851                                         decode_reclaim_complete_maxsz)
 852#define NFS4_enc_getdeviceinfo_sz (compound_encode_hdr_maxsz +    \
 853                                encode_sequence_maxsz +\
 854                                encode_getdeviceinfo_maxsz)
 855#define NFS4_dec_getdeviceinfo_sz (compound_decode_hdr_maxsz +    \
 856                                decode_sequence_maxsz + \
 857                                decode_getdeviceinfo_maxsz)
 858#define NFS4_enc_layoutget_sz   (compound_encode_hdr_maxsz + \
 859                                encode_sequence_maxsz + \
 860                                encode_putfh_maxsz +        \
 861                                encode_layoutget_maxsz)
 862#define NFS4_dec_layoutget_sz   (compound_decode_hdr_maxsz + \
 863                                decode_sequence_maxsz + \
 864                                decode_putfh_maxsz +        \
 865                                decode_layoutget_maxsz)
 866#define NFS4_enc_layoutcommit_sz (compound_encode_hdr_maxsz + \
 867                                encode_sequence_maxsz +\
 868                                encode_putfh_maxsz + \
 869                                encode_layoutcommit_maxsz + \
 870                                encode_getattr_maxsz)
 871#define NFS4_dec_layoutcommit_sz (compound_decode_hdr_maxsz + \
 872                                decode_sequence_maxsz + \
 873                                decode_putfh_maxsz + \
 874                                decode_layoutcommit_maxsz + \
 875                                decode_getattr_maxsz)
 876#define NFS4_enc_layoutreturn_sz (compound_encode_hdr_maxsz + \
 877                                encode_sequence_maxsz + \
 878                                encode_putfh_maxsz + \
 879                                encode_layoutreturn_maxsz)
 880#define NFS4_dec_layoutreturn_sz (compound_decode_hdr_maxsz + \
 881                                decode_sequence_maxsz + \
 882                                decode_putfh_maxsz + \
 883                                decode_layoutreturn_maxsz)
 884#define NFS4_enc_secinfo_no_name_sz     (compound_encode_hdr_maxsz + \
 885                                        encode_sequence_maxsz + \
 886                                        encode_putrootfh_maxsz +\
 887                                        encode_secinfo_no_name_maxsz)
 888#define NFS4_dec_secinfo_no_name_sz     (compound_decode_hdr_maxsz + \
 889                                        decode_sequence_maxsz + \
 890                                        decode_putrootfh_maxsz + \
 891                                        decode_secinfo_no_name_maxsz)
 892#define NFS4_enc_test_stateid_sz        (compound_encode_hdr_maxsz + \
 893                                         encode_sequence_maxsz + \
 894                                         encode_test_stateid_maxsz)
 895#define NFS4_dec_test_stateid_sz        (compound_decode_hdr_maxsz + \
 896                                         decode_sequence_maxsz + \
 897                                         decode_test_stateid_maxsz)
 898#define NFS4_enc_free_stateid_sz        (compound_encode_hdr_maxsz + \
 899                                         encode_sequence_maxsz + \
 900                                         encode_free_stateid_maxsz)
 901#define NFS4_dec_free_stateid_sz        (compound_decode_hdr_maxsz + \
 902                                         decode_sequence_maxsz + \
 903                                         decode_free_stateid_maxsz)
 904
 905const u32 nfs41_maxwrite_overhead = ((RPC_MAX_HEADER_WITH_AUTH +
 906                                      compound_encode_hdr_maxsz +
 907                                      encode_sequence_maxsz +
 908                                      encode_putfh_maxsz +
 909                                      encode_getattr_maxsz) *
 910                                     XDR_UNIT);
 911
 912const u32 nfs41_maxread_overhead = ((RPC_MAX_HEADER_WITH_AUTH +
 913                                     compound_decode_hdr_maxsz +
 914                                     decode_sequence_maxsz +
 915                                     decode_putfh_maxsz) *
 916                                    XDR_UNIT);
 917
 918const u32 nfs41_maxgetdevinfo_overhead = ((RPC_MAX_REPHEADER_WITH_AUTH +
 919                                           compound_decode_hdr_maxsz +
 920                                           decode_sequence_maxsz) *
 921                                          XDR_UNIT);
 922EXPORT_SYMBOL_GPL(nfs41_maxgetdevinfo_overhead);
 923#endif /* CONFIG_NFS_V4_1 */
 924
 925static const umode_t nfs_type2fmt[] = {
 926        [NF4BAD] = 0,
 927        [NF4REG] = S_IFREG,
 928        [NF4DIR] = S_IFDIR,
 929        [NF4BLK] = S_IFBLK,
 930        [NF4CHR] = S_IFCHR,
 931        [NF4LNK] = S_IFLNK,
 932        [NF4SOCK] = S_IFSOCK,
 933        [NF4FIFO] = S_IFIFO,
 934        [NF4ATTRDIR] = 0,
 935        [NF4NAMEDATTR] = 0,
 936};
 937
 938struct compound_hdr {
 939        int32_t         status;
 940        uint32_t        nops;
 941        __be32 *        nops_p;
 942        uint32_t        taglen;
 943        char *          tag;
 944        uint32_t        replen;         /* expected reply words */
 945        u32             minorversion;
 946};
 947
 948static __be32 *reserve_space(struct xdr_stream *xdr, size_t nbytes)
 949{
 950        __be32 *p = xdr_reserve_space(xdr, nbytes);
 951        BUG_ON(!p);
 952        return p;
 953}
 954
 955static void encode_opaque_fixed(struct xdr_stream *xdr, const void *buf, size_t len)
 956{
 957        WARN_ON_ONCE(xdr_stream_encode_opaque_fixed(xdr, buf, len) < 0);
 958}
 959
 960static void encode_string(struct xdr_stream *xdr, unsigned int len, const char *str)
 961{
 962        WARN_ON_ONCE(xdr_stream_encode_opaque(xdr, str, len) < 0);
 963}
 964
 965static void encode_uint32(struct xdr_stream *xdr, u32 n)
 966{
 967        WARN_ON_ONCE(xdr_stream_encode_u32(xdr, n) < 0);
 968}
 969
 970static void encode_uint64(struct xdr_stream *xdr, u64 n)
 971{
 972        WARN_ON_ONCE(xdr_stream_encode_u64(xdr, n) < 0);
 973}
 974
 975static ssize_t xdr_encode_bitmap4(struct xdr_stream *xdr,
 976                const __u32 *bitmap, size_t len)
 977{
 978        ssize_t ret;
 979
 980        /* Trim empty words */
 981        while (len > 0 && bitmap[len-1] == 0)
 982                len--;
 983        ret = xdr_stream_encode_uint32_array(xdr, bitmap, len);
 984        if (WARN_ON_ONCE(ret < 0))
 985                return ret;
 986        return len;
 987}
 988
 989static size_t mask_bitmap4(const __u32 *bitmap, const __u32 *mask,
 990                __u32 *res, size_t len)
 991{
 992        size_t i;
 993        __u32 tmp;
 994
 995        while (len > 0 && (bitmap[len-1] == 0 || mask[len-1] == 0))
 996                len--;
 997        for (i = len; i-- > 0;) {
 998                tmp = bitmap[i] & mask[i];
 999                res[i] = tmp;
1000        }
1001        return len;
1002}
1003
1004static void encode_nfs4_seqid(struct xdr_stream *xdr,
1005                const struct nfs_seqid *seqid)
1006{
1007        if (seqid != NULL)
1008                encode_uint32(xdr, seqid->sequence->counter);
1009        else
1010                encode_uint32(xdr, 0);
1011}
1012
1013static void encode_compound_hdr(struct xdr_stream *xdr,
1014                                struct rpc_rqst *req,
1015                                struct compound_hdr *hdr)
1016{
1017        __be32 *p;
1018        struct rpc_auth *auth = req->rq_cred->cr_auth;
1019
1020        /* initialize running count of expected bytes in reply.
1021         * NOTE: the replied tag SHOULD be the same is the one sent,
1022         * but this is not required as a MUST for the server to do so. */
1023        hdr->replen = RPC_REPHDRSIZE + auth->au_rslack + 3 + hdr->taglen;
1024
1025        WARN_ON_ONCE(hdr->taglen > NFS4_MAXTAGLEN);
1026        encode_string(xdr, hdr->taglen, hdr->tag);
1027        p = reserve_space(xdr, 8);
1028        *p++ = cpu_to_be32(hdr->minorversion);
1029        hdr->nops_p = p;
1030        *p = cpu_to_be32(hdr->nops);
1031}
1032
1033static void encode_op_hdr(struct xdr_stream *xdr, enum nfs_opnum4 op,
1034                uint32_t replen,
1035                struct compound_hdr *hdr)
1036{
1037        encode_uint32(xdr, op);
1038        hdr->nops++;
1039        hdr->replen += replen;
1040}
1041
1042static void encode_nops(struct compound_hdr *hdr)
1043{
1044        WARN_ON_ONCE(hdr->nops > NFS4_MAX_OPS);
1045        *hdr->nops_p = htonl(hdr->nops);
1046}
1047
1048static void encode_nfs4_stateid(struct xdr_stream *xdr, const nfs4_stateid *stateid)
1049{
1050        encode_opaque_fixed(xdr, stateid, NFS4_STATEID_SIZE);
1051}
1052
1053static void encode_nfs4_verifier(struct xdr_stream *xdr, const nfs4_verifier *verf)
1054{
1055        encode_opaque_fixed(xdr, verf->data, NFS4_VERIFIER_SIZE);
1056}
1057
1058static __be32 *
1059xdr_encode_nfstime4(__be32 *p, const struct timespec *t)
1060{
1061        p = xdr_encode_hyper(p, (__s64)t->tv_sec);
1062        *p++ = cpu_to_be32(t->tv_nsec);
1063        return p;
1064}
1065
1066static void encode_attrs(struct xdr_stream *xdr, const struct iattr *iap,
1067                                const struct nfs4_label *label,
1068                                const umode_t *umask,
1069                                const struct nfs_server *server,
1070                                const uint32_t attrmask[])
1071{
1072        struct timespec ts;
1073        char owner_name[IDMAP_NAMESZ];
1074        char owner_group[IDMAP_NAMESZ];
1075        int owner_namelen = 0;
1076        int owner_grouplen = 0;
1077        __be32 *p;
1078        uint32_t len = 0;
1079        uint32_t bmval[3] = { 0 };
1080
1081        /*
1082         * We reserve enough space to write the entire attribute buffer at once.
1083         */
1084        if ((iap->ia_valid & ATTR_SIZE) && (attrmask[0] & FATTR4_WORD0_SIZE)) {
1085                bmval[0] |= FATTR4_WORD0_SIZE;
1086                len += 8;
1087        }
1088        if (iap->ia_valid & ATTR_MODE) {
1089                if (umask && (attrmask[2] & FATTR4_WORD2_MODE_UMASK)) {
1090                        bmval[2] |= FATTR4_WORD2_MODE_UMASK;
1091                        len += 8;
1092                } else if (attrmask[1] & FATTR4_WORD1_MODE) {
1093                        bmval[1] |= FATTR4_WORD1_MODE;
1094                        len += 4;
1095                }
1096        }
1097        if ((iap->ia_valid & ATTR_UID) && (attrmask[1] & FATTR4_WORD1_OWNER)) {
1098                owner_namelen = nfs_map_uid_to_name(server, iap->ia_uid, owner_name, IDMAP_NAMESZ);
1099                if (owner_namelen < 0) {
1100                        dprintk("nfs: couldn't resolve uid %d to string\n",
1101                                        from_kuid(&init_user_ns, iap->ia_uid));
1102                        /* XXX */
1103                        strcpy(owner_name, "nobody");
1104                        owner_namelen = sizeof("nobody") - 1;
1105                        /* goto out; */
1106                }
1107                bmval[1] |= FATTR4_WORD1_OWNER;
1108                len += 4 + (XDR_QUADLEN(owner_namelen) << 2);
1109        }
1110        if ((iap->ia_valid & ATTR_GID) &&
1111           (attrmask[1] & FATTR4_WORD1_OWNER_GROUP)) {
1112                owner_grouplen = nfs_map_gid_to_group(server, iap->ia_gid, owner_group, IDMAP_NAMESZ);
1113                if (owner_grouplen < 0) {
1114                        dprintk("nfs: couldn't resolve gid %d to string\n",
1115                                        from_kgid(&init_user_ns, iap->ia_gid));
1116                        strcpy(owner_group, "nobody");
1117                        owner_grouplen = sizeof("nobody") - 1;
1118                        /* goto out; */
1119                }
1120                bmval[1] |= FATTR4_WORD1_OWNER_GROUP;
1121                len += 4 + (XDR_QUADLEN(owner_grouplen) << 2);
1122        }
1123        if (attrmask[1] & FATTR4_WORD1_TIME_ACCESS_SET) {
1124                if (iap->ia_valid & ATTR_ATIME_SET) {
1125                        bmval[1] |= FATTR4_WORD1_TIME_ACCESS_SET;
1126                        len += 4 + (nfstime4_maxsz << 2);
1127                } else if (iap->ia_valid & ATTR_ATIME) {
1128                        bmval[1] |= FATTR4_WORD1_TIME_ACCESS_SET;
1129                        len += 4;
1130                }
1131        }
1132        if (attrmask[1] & FATTR4_WORD1_TIME_MODIFY_SET) {
1133                if (iap->ia_valid & ATTR_MTIME_SET) {
1134                        bmval[1] |= FATTR4_WORD1_TIME_MODIFY_SET;
1135                        len += 4 + (nfstime4_maxsz << 2);
1136                } else if (iap->ia_valid & ATTR_MTIME) {
1137                        bmval[1] |= FATTR4_WORD1_TIME_MODIFY_SET;
1138                        len += 4;
1139                }
1140        }
1141
1142        if (label && (attrmask[2] & FATTR4_WORD2_SECURITY_LABEL)) {
1143                len += 4 + 4 + 4 + (XDR_QUADLEN(label->len) << 2);
1144                bmval[2] |= FATTR4_WORD2_SECURITY_LABEL;
1145        }
1146
1147        xdr_encode_bitmap4(xdr, bmval, ARRAY_SIZE(bmval));
1148        xdr_stream_encode_opaque_inline(xdr, (void **)&p, len);
1149
1150        if (bmval[0] & FATTR4_WORD0_SIZE)
1151                p = xdr_encode_hyper(p, iap->ia_size);
1152        if (bmval[1] & FATTR4_WORD1_MODE)
1153                *p++ = cpu_to_be32(iap->ia_mode & S_IALLUGO);
1154        if (bmval[1] & FATTR4_WORD1_OWNER)
1155                p = xdr_encode_opaque(p, owner_name, owner_namelen);
1156        if (bmval[1] & FATTR4_WORD1_OWNER_GROUP)
1157                p = xdr_encode_opaque(p, owner_group, owner_grouplen);
1158        if (bmval[1] & FATTR4_WORD1_TIME_ACCESS_SET) {
1159                if (iap->ia_valid & ATTR_ATIME_SET) {
1160                        *p++ = cpu_to_be32(NFS4_SET_TO_CLIENT_TIME);
1161                        ts = timespec64_to_timespec(iap->ia_atime);
1162                        p = xdr_encode_nfstime4(p, &ts);
1163                } else
1164                        *p++ = cpu_to_be32(NFS4_SET_TO_SERVER_TIME);
1165        }
1166        if (bmval[1] & FATTR4_WORD1_TIME_MODIFY_SET) {
1167                if (iap->ia_valid & ATTR_MTIME_SET) {
1168                        *p++ = cpu_to_be32(NFS4_SET_TO_CLIENT_TIME);
1169                        ts = timespec64_to_timespec(iap->ia_mtime);
1170                        p = xdr_encode_nfstime4(p, &ts);
1171                } else
1172                        *p++ = cpu_to_be32(NFS4_SET_TO_SERVER_TIME);
1173        }
1174        if (bmval[2] & FATTR4_WORD2_SECURITY_LABEL) {
1175                *p++ = cpu_to_be32(label->lfs);
1176                *p++ = cpu_to_be32(label->pi);
1177                *p++ = cpu_to_be32(label->len);
1178                p = xdr_encode_opaque_fixed(p, label->label, label->len);
1179        }
1180        if (bmval[2] & FATTR4_WORD2_MODE_UMASK) {
1181                *p++ = cpu_to_be32(iap->ia_mode & S_IALLUGO);
1182                *p++ = cpu_to_be32(*umask);
1183        }
1184
1185/* out: */
1186}
1187
1188static void encode_access(struct xdr_stream *xdr, u32 access, struct compound_hdr *hdr)
1189{
1190        encode_op_hdr(xdr, OP_ACCESS, decode_access_maxsz, hdr);
1191        encode_uint32(xdr, access);
1192}
1193
1194static void encode_close(struct xdr_stream *xdr, const struct nfs_closeargs *arg, struct compound_hdr *hdr)
1195{
1196        encode_op_hdr(xdr, OP_CLOSE, decode_close_maxsz, hdr);
1197        encode_nfs4_seqid(xdr, arg->seqid);
1198        encode_nfs4_stateid(xdr, &arg->stateid);
1199}
1200
1201static void encode_commit(struct xdr_stream *xdr, const struct nfs_commitargs *args, struct compound_hdr *hdr)
1202{
1203        __be32 *p;
1204
1205        encode_op_hdr(xdr, OP_COMMIT, decode_commit_maxsz, hdr);
1206        p = reserve_space(xdr, 12);
1207        p = xdr_encode_hyper(p, args->offset);
1208        *p = cpu_to_be32(args->count);
1209}
1210
1211static void encode_create(struct xdr_stream *xdr, const struct nfs4_create_arg *create, struct compound_hdr *hdr)
1212{
1213        __be32 *p;
1214
1215        encode_op_hdr(xdr, OP_CREATE, decode_create_maxsz, hdr);
1216        encode_uint32(xdr, create->ftype);
1217
1218        switch (create->ftype) {
1219        case NF4LNK:
1220                p = reserve_space(xdr, 4);
1221                *p = cpu_to_be32(create->u.symlink.len);
1222                xdr_write_pages(xdr, create->u.symlink.pages, 0,
1223                                create->u.symlink.len);
1224                xdr->buf->flags |= XDRBUF_WRITE;
1225                break;
1226
1227        case NF4BLK: case NF4CHR:
1228                p = reserve_space(xdr, 8);
1229                *p++ = cpu_to_be32(create->u.device.specdata1);
1230                *p = cpu_to_be32(create->u.device.specdata2);
1231                break;
1232
1233        default:
1234                break;
1235        }
1236
1237        encode_string(xdr, create->name->len, create->name->name);
1238        encode_attrs(xdr, create->attrs, create->label, &create->umask,
1239                        create->server, create->server->attr_bitmask);
1240}
1241
1242static void encode_getattr(struct xdr_stream *xdr,
1243                const __u32 *bitmap, const __u32 *mask, size_t len,
1244                struct compound_hdr *hdr)
1245{
1246        __u32 masked_bitmap[nfs4_fattr_bitmap_maxsz];
1247
1248        encode_op_hdr(xdr, OP_GETATTR, decode_getattr_maxsz, hdr);
1249        if (mask) {
1250                if (WARN_ON_ONCE(len > ARRAY_SIZE(masked_bitmap)))
1251                        len = ARRAY_SIZE(masked_bitmap);
1252                len = mask_bitmap4(bitmap, mask, masked_bitmap, len);
1253                bitmap = masked_bitmap;
1254        }
1255        xdr_encode_bitmap4(xdr, bitmap, len);
1256}
1257
1258static void encode_getfattr(struct xdr_stream *xdr, const u32* bitmask, struct compound_hdr *hdr)
1259{
1260        encode_getattr(xdr, nfs4_fattr_bitmap, bitmask,
1261                        ARRAY_SIZE(nfs4_fattr_bitmap), hdr);
1262}
1263
1264static void encode_getfattr_open(struct xdr_stream *xdr, const u32 *bitmask,
1265                                 const u32 *open_bitmap,
1266                                 struct compound_hdr *hdr)
1267{
1268        encode_getattr(xdr, open_bitmap, bitmask, 3, hdr);
1269}
1270
1271static void encode_fsinfo(struct xdr_stream *xdr, const u32* bitmask, struct compound_hdr *hdr)
1272{
1273        encode_getattr(xdr, nfs4_fsinfo_bitmap, bitmask,
1274                        ARRAY_SIZE(nfs4_fsinfo_bitmap), hdr);
1275}
1276
1277static void encode_fs_locations(struct xdr_stream *xdr, const u32* bitmask, struct compound_hdr *hdr)
1278{
1279        encode_getattr(xdr, nfs4_fs_locations_bitmap, bitmask,
1280                        ARRAY_SIZE(nfs4_fs_locations_bitmap), hdr);
1281}
1282
1283static void encode_getfh(struct xdr_stream *xdr, struct compound_hdr *hdr)
1284{
1285        encode_op_hdr(xdr, OP_GETFH, decode_getfh_maxsz, hdr);
1286}
1287
1288static void encode_link(struct xdr_stream *xdr, const struct qstr *name, struct compound_hdr *hdr)
1289{
1290        encode_op_hdr(xdr, OP_LINK, decode_link_maxsz, hdr);
1291        encode_string(xdr, name->len, name->name);
1292}
1293
1294static inline int nfs4_lock_type(struct file_lock *fl, int block)
1295{
1296        if (fl->fl_type == F_RDLCK)
1297                return block ? NFS4_READW_LT : NFS4_READ_LT;
1298        return block ? NFS4_WRITEW_LT : NFS4_WRITE_LT;
1299}
1300
1301static inline uint64_t nfs4_lock_length(struct file_lock *fl)
1302{
1303        if (fl->fl_end == OFFSET_MAX)
1304                return ~(uint64_t)0;
1305        return fl->fl_end - fl->fl_start + 1;
1306}
1307
1308static void encode_lockowner(struct xdr_stream *xdr, const struct nfs_lowner *lowner)
1309{
1310        __be32 *p;
1311
1312        p = reserve_space(xdr, 32);
1313        p = xdr_encode_hyper(p, lowner->clientid);
1314        *p++ = cpu_to_be32(20);
1315        p = xdr_encode_opaque_fixed(p, "lock id:", 8);
1316        *p++ = cpu_to_be32(lowner->s_dev);
1317        xdr_encode_hyper(p, lowner->id);
1318}
1319
1320/*
1321 * opcode,type,reclaim,offset,length,new_lock_owner = 32
1322 * open_seqid,open_stateid,lock_seqid,lock_owner.clientid, lock_owner.id = 40
1323 */
1324static void encode_lock(struct xdr_stream *xdr, const struct nfs_lock_args *args, struct compound_hdr *hdr)
1325{
1326        __be32 *p;
1327
1328        encode_op_hdr(xdr, OP_LOCK, decode_lock_maxsz, hdr);
1329        p = reserve_space(xdr, 28);
1330        *p++ = cpu_to_be32(nfs4_lock_type(args->fl, args->block));
1331        *p++ = cpu_to_be32(args->reclaim);
1332        p = xdr_encode_hyper(p, args->fl->fl_start);
1333        p = xdr_encode_hyper(p, nfs4_lock_length(args->fl));
1334        *p = cpu_to_be32(args->new_lock_owner);
1335        if (args->new_lock_owner){
1336                encode_nfs4_seqid(xdr, args->open_seqid);
1337                encode_nfs4_stateid(xdr, &args->open_stateid);
1338                encode_nfs4_seqid(xdr, args->lock_seqid);
1339                encode_lockowner(xdr, &args->lock_owner);
1340        }
1341        else {
1342                encode_nfs4_stateid(xdr, &args->lock_stateid);
1343                encode_nfs4_seqid(xdr, args->lock_seqid);
1344        }
1345}
1346
1347static void encode_lockt(struct xdr_stream *xdr, const struct nfs_lockt_args *args, struct compound_hdr *hdr)
1348{
1349        __be32 *p;
1350
1351        encode_op_hdr(xdr, OP_LOCKT, decode_lockt_maxsz, hdr);
1352        p = reserve_space(xdr, 20);
1353        *p++ = cpu_to_be32(nfs4_lock_type(args->fl, 0));
1354        p = xdr_encode_hyper(p, args->fl->fl_start);
1355        p = xdr_encode_hyper(p, nfs4_lock_length(args->fl));
1356        encode_lockowner(xdr, &args->lock_owner);
1357}
1358
1359static void encode_locku(struct xdr_stream *xdr, const struct nfs_locku_args *args, struct compound_hdr *hdr)
1360{
1361        __be32 *p;
1362
1363        encode_op_hdr(xdr, OP_LOCKU, decode_locku_maxsz, hdr);
1364        encode_uint32(xdr, nfs4_lock_type(args->fl, 0));
1365        encode_nfs4_seqid(xdr, args->seqid);
1366        encode_nfs4_stateid(xdr, &args->stateid);
1367        p = reserve_space(xdr, 16);
1368        p = xdr_encode_hyper(p, args->fl->fl_start);
1369        xdr_encode_hyper(p, nfs4_lock_length(args->fl));
1370}
1371
1372static void encode_release_lockowner(struct xdr_stream *xdr, const struct nfs_lowner *lowner, struct compound_hdr *hdr)
1373{
1374        encode_op_hdr(xdr, OP_RELEASE_LOCKOWNER, decode_release_lockowner_maxsz, hdr);
1375        encode_lockowner(xdr, lowner);
1376}
1377
1378static void encode_lookup(struct xdr_stream *xdr, const struct qstr *name, struct compound_hdr *hdr)
1379{
1380        encode_op_hdr(xdr, OP_LOOKUP, decode_lookup_maxsz, hdr);
1381        encode_string(xdr, name->len, name->name);
1382}
1383
1384static void encode_lookupp(struct xdr_stream *xdr, struct compound_hdr *hdr)
1385{
1386        encode_op_hdr(xdr, OP_LOOKUPP, decode_lookupp_maxsz, hdr);
1387}
1388
1389static void encode_share_access(struct xdr_stream *xdr, u32 share_access)
1390{
1391        __be32 *p;
1392
1393        p = reserve_space(xdr, 8);
1394        *p++ = cpu_to_be32(share_access);
1395        *p = cpu_to_be32(0);            /* for linux, share_deny = 0 always */
1396}
1397
1398static inline void encode_openhdr(struct xdr_stream *xdr, const struct nfs_openargs *arg)
1399{
1400        __be32 *p;
1401 /*
1402 * opcode 4, seqid 4, share_access 4, share_deny 4, clientid 8, ownerlen 4,
1403 * owner 4 = 32
1404 */
1405        encode_nfs4_seqid(xdr, arg->seqid);
1406        encode_share_access(xdr, arg->share_access);
1407        p = reserve_space(xdr, 36);
1408        p = xdr_encode_hyper(p, arg->clientid);
1409        *p++ = cpu_to_be32(24);
1410        p = xdr_encode_opaque_fixed(p, "open id:", 8);
1411        *p++ = cpu_to_be32(arg->server->s_dev);
1412        *p++ = cpu_to_be32(arg->id.uniquifier);
1413        xdr_encode_hyper(p, arg->id.create_time);
1414}
1415
1416static inline void encode_createmode(struct xdr_stream *xdr, const struct nfs_openargs *arg)
1417{
1418        __be32 *p;
1419
1420        p = reserve_space(xdr, 4);
1421        switch(arg->createmode) {
1422        case NFS4_CREATE_UNCHECKED:
1423                *p = cpu_to_be32(NFS4_CREATE_UNCHECKED);
1424                encode_attrs(xdr, arg->u.attrs, arg->label, &arg->umask,
1425                                arg->server, arg->server->attr_bitmask);
1426                break;
1427        case NFS4_CREATE_GUARDED:
1428                *p = cpu_to_be32(NFS4_CREATE_GUARDED);
1429                encode_attrs(xdr, arg->u.attrs, arg->label, &arg->umask,
1430                                arg->server, arg->server->attr_bitmask);
1431                break;
1432        case NFS4_CREATE_EXCLUSIVE:
1433                *p = cpu_to_be32(NFS4_CREATE_EXCLUSIVE);
1434                encode_nfs4_verifier(xdr, &arg->u.verifier);
1435                break;
1436        case NFS4_CREATE_EXCLUSIVE4_1:
1437                *p = cpu_to_be32(NFS4_CREATE_EXCLUSIVE4_1);
1438                encode_nfs4_verifier(xdr, &arg->u.verifier);
1439                encode_attrs(xdr, arg->u.attrs, arg->label, &arg->umask,
1440                                arg->server, arg->server->exclcreat_bitmask);
1441        }
1442}
1443
1444static void encode_opentype(struct xdr_stream *xdr, const struct nfs_openargs *arg)
1445{
1446        __be32 *p;
1447
1448        p = reserve_space(xdr, 4);
1449        switch (arg->open_flags & O_CREAT) {
1450        case 0:
1451                *p = cpu_to_be32(NFS4_OPEN_NOCREATE);
1452                break;
1453        default:
1454                *p = cpu_to_be32(NFS4_OPEN_CREATE);
1455                encode_createmode(xdr, arg);
1456        }
1457}
1458
1459static inline void encode_delegation_type(struct xdr_stream *xdr, fmode_t delegation_type)
1460{
1461        __be32 *p;
1462
1463        p = reserve_space(xdr, 4);
1464        switch (delegation_type) {
1465        case 0:
1466                *p = cpu_to_be32(NFS4_OPEN_DELEGATE_NONE);
1467                break;
1468        case FMODE_READ:
1469                *p = cpu_to_be32(NFS4_OPEN_DELEGATE_READ);
1470                break;
1471        case FMODE_WRITE|FMODE_READ:
1472                *p = cpu_to_be32(NFS4_OPEN_DELEGATE_WRITE);
1473                break;
1474        default:
1475                BUG();
1476        }
1477}
1478
1479static inline void encode_claim_null(struct xdr_stream *xdr, const struct qstr *name)
1480{
1481        __be32 *p;
1482
1483        p = reserve_space(xdr, 4);
1484        *p = cpu_to_be32(NFS4_OPEN_CLAIM_NULL);
1485        encode_string(xdr, name->len, name->name);
1486}
1487
1488static inline void encode_claim_previous(struct xdr_stream *xdr, fmode_t type)
1489{
1490        __be32 *p;
1491
1492        p = reserve_space(xdr, 4);
1493        *p = cpu_to_be32(NFS4_OPEN_CLAIM_PREVIOUS);
1494        encode_delegation_type(xdr, type);
1495}
1496
1497static inline void encode_claim_delegate_cur(struct xdr_stream *xdr, const struct qstr *name, const nfs4_stateid *stateid)
1498{
1499        __be32 *p;
1500
1501        p = reserve_space(xdr, 4);
1502        *p = cpu_to_be32(NFS4_OPEN_CLAIM_DELEGATE_CUR);
1503        encode_nfs4_stateid(xdr, stateid);
1504        encode_string(xdr, name->len, name->name);
1505}
1506
1507static inline void encode_claim_fh(struct xdr_stream *xdr)
1508{
1509        __be32 *p;
1510
1511        p = reserve_space(xdr, 4);
1512        *p = cpu_to_be32(NFS4_OPEN_CLAIM_FH);
1513}
1514
1515static inline void encode_claim_delegate_cur_fh(struct xdr_stream *xdr, const nfs4_stateid *stateid)
1516{
1517        __be32 *p;
1518
1519        p = reserve_space(xdr, 4);
1520        *p = cpu_to_be32(NFS4_OPEN_CLAIM_DELEG_CUR_FH);
1521        encode_nfs4_stateid(xdr, stateid);
1522}
1523
1524static void encode_open(struct xdr_stream *xdr, const struct nfs_openargs *arg, struct compound_hdr *hdr)
1525{
1526        encode_op_hdr(xdr, OP_OPEN, decode_open_maxsz, hdr);
1527        encode_openhdr(xdr, arg);
1528        encode_opentype(xdr, arg);
1529        switch (arg->claim) {
1530        case NFS4_OPEN_CLAIM_NULL:
1531                encode_claim_null(xdr, arg->name);
1532                break;
1533        case NFS4_OPEN_CLAIM_PREVIOUS:
1534                encode_claim_previous(xdr, arg->u.delegation_type);
1535                break;
1536        case NFS4_OPEN_CLAIM_DELEGATE_CUR:
1537                encode_claim_delegate_cur(xdr, arg->name, &arg->u.delegation);
1538                break;
1539        case NFS4_OPEN_CLAIM_FH:
1540                encode_claim_fh(xdr);
1541                break;
1542        case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
1543                encode_claim_delegate_cur_fh(xdr, &arg->u.delegation);
1544                break;
1545        default:
1546                BUG();
1547        }
1548}
1549
1550static void encode_open_confirm(struct xdr_stream *xdr, const struct nfs_open_confirmargs *arg, struct compound_hdr *hdr)
1551{
1552        encode_op_hdr(xdr, OP_OPEN_CONFIRM, decode_open_confirm_maxsz, hdr);
1553        encode_nfs4_stateid(xdr, arg->stateid);
1554        encode_nfs4_seqid(xdr, arg->seqid);
1555}
1556
1557static void encode_open_downgrade(struct xdr_stream *xdr, const struct nfs_closeargs *arg, struct compound_hdr *hdr)
1558{
1559        encode_op_hdr(xdr, OP_OPEN_DOWNGRADE, decode_open_downgrade_maxsz, hdr);
1560        encode_nfs4_stateid(xdr, &arg->stateid);
1561        encode_nfs4_seqid(xdr, arg->seqid);
1562        encode_share_access(xdr, arg->share_access);
1563}
1564
1565static void
1566encode_putfh(struct xdr_stream *xdr, const struct nfs_fh *fh, struct compound_hdr *hdr)
1567{
1568        encode_op_hdr(xdr, OP_PUTFH, decode_putfh_maxsz, hdr);
1569        encode_string(xdr, fh->size, fh->data);
1570}
1571
1572static void encode_putrootfh(struct xdr_stream *xdr, struct compound_hdr *hdr)
1573{
1574        encode_op_hdr(xdr, OP_PUTROOTFH, decode_putrootfh_maxsz, hdr);
1575}
1576
1577static void encode_read(struct xdr_stream *xdr, const struct nfs_pgio_args *args,
1578                        struct compound_hdr *hdr)
1579{
1580        __be32 *p;
1581
1582        encode_op_hdr(xdr, OP_READ, decode_read_maxsz, hdr);
1583        encode_nfs4_stateid(xdr, &args->stateid);
1584
1585        p = reserve_space(xdr, 12);
1586        p = xdr_encode_hyper(p, args->offset);
1587        *p = cpu_to_be32(args->count);
1588}
1589
1590static void encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_arg *readdir, struct rpc_rqst *req, struct compound_hdr *hdr)
1591{
1592        uint32_t attrs[3] = {
1593                FATTR4_WORD0_RDATTR_ERROR,
1594                FATTR4_WORD1_MOUNTED_ON_FILEID,
1595        };
1596        uint32_t dircount = readdir->count >> 1;
1597        __be32 *p, verf[2];
1598        uint32_t attrlen = 0;
1599        unsigned int i;
1600
1601        if (readdir->plus) {
1602                attrs[0] |= FATTR4_WORD0_TYPE|FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE|
1603                        FATTR4_WORD0_FSID|FATTR4_WORD0_FILEHANDLE|FATTR4_WORD0_FILEID;
1604                attrs[1] |= FATTR4_WORD1_MODE|FATTR4_WORD1_NUMLINKS|FATTR4_WORD1_OWNER|
1605                        FATTR4_WORD1_OWNER_GROUP|FATTR4_WORD1_RAWDEV|
1606                        FATTR4_WORD1_SPACE_USED|FATTR4_WORD1_TIME_ACCESS|
1607                        FATTR4_WORD1_TIME_METADATA|FATTR4_WORD1_TIME_MODIFY;
1608                attrs[2] |= FATTR4_WORD2_SECURITY_LABEL;
1609                dircount >>= 1;
1610        }
1611        /* Use mounted_on_fileid only if the server supports it */
1612        if (!(readdir->bitmask[1] & FATTR4_WORD1_MOUNTED_ON_FILEID))
1613                attrs[0] |= FATTR4_WORD0_FILEID;
1614        for (i = 0; i < ARRAY_SIZE(attrs); i++) {
1615                attrs[i] &= readdir->bitmask[i];
1616                if (attrs[i] != 0)
1617                        attrlen = i+1;
1618        }
1619
1620        encode_op_hdr(xdr, OP_READDIR, decode_readdir_maxsz, hdr);
1621        encode_uint64(xdr, readdir->cookie);
1622        encode_nfs4_verifier(xdr, &readdir->verifier);
1623        p = reserve_space(xdr, 12 + (attrlen << 2));
1624        *p++ = cpu_to_be32(dircount);
1625        *p++ = cpu_to_be32(readdir->count);
1626        *p++ = cpu_to_be32(attrlen);
1627        for (i = 0; i < attrlen; i++)
1628                *p++ = cpu_to_be32(attrs[i]);
1629        memcpy(verf, readdir->verifier.data, sizeof(verf));
1630
1631        dprintk("%s: cookie = %llu, verifier = %08x:%08x, bitmap = %08x:%08x:%08x\n",
1632                        __func__,
1633                        (unsigned long long)readdir->cookie,
1634                        verf[0], verf[1],
1635                        attrs[0] & readdir->bitmask[0],
1636                        attrs[1] & readdir->bitmask[1],
1637                        attrs[2] & readdir->bitmask[2]);
1638}
1639
1640static void encode_readlink(struct xdr_stream *xdr, const struct nfs4_readlink *readlink, struct rpc_rqst *req, struct compound_hdr *hdr)
1641{
1642        encode_op_hdr(xdr, OP_READLINK, decode_readlink_maxsz, hdr);
1643}
1644
1645static void encode_remove(struct xdr_stream *xdr, const struct qstr *name, struct compound_hdr *hdr)
1646{
1647        encode_op_hdr(xdr, OP_REMOVE, decode_remove_maxsz, hdr);
1648        encode_string(xdr, name->len, name->name);
1649}
1650
1651static void encode_rename(struct xdr_stream *xdr, const struct qstr *oldname, const struct qstr *newname, struct compound_hdr *hdr)
1652{
1653        encode_op_hdr(xdr, OP_RENAME, decode_rename_maxsz, hdr);
1654        encode_string(xdr, oldname->len, oldname->name);
1655        encode_string(xdr, newname->len, newname->name);
1656}
1657
1658static void encode_renew(struct xdr_stream *xdr, clientid4 clid,
1659                         struct compound_hdr *hdr)
1660{
1661        encode_op_hdr(xdr, OP_RENEW, decode_renew_maxsz, hdr);
1662        encode_uint64(xdr, clid);
1663}
1664
1665static void
1666encode_restorefh(struct xdr_stream *xdr, struct compound_hdr *hdr)
1667{
1668        encode_op_hdr(xdr, OP_RESTOREFH, decode_restorefh_maxsz, hdr);
1669}
1670
1671static void
1672encode_setacl(struct xdr_stream *xdr, const struct nfs_setaclargs *arg,
1673                struct compound_hdr *hdr)
1674{
1675        __be32 *p;
1676
1677        encode_op_hdr(xdr, OP_SETATTR, decode_setacl_maxsz, hdr);
1678        encode_nfs4_stateid(xdr, &zero_stateid);
1679        p = reserve_space(xdr, 2*4);
1680        *p++ = cpu_to_be32(1);
1681        *p = cpu_to_be32(FATTR4_WORD0_ACL);
1682        p = reserve_space(xdr, 4);
1683        *p = cpu_to_be32(arg->acl_len);
1684        xdr_write_pages(xdr, arg->acl_pages, 0, arg->acl_len);
1685}
1686
1687static void
1688encode_savefh(struct xdr_stream *xdr, struct compound_hdr *hdr)
1689{
1690        encode_op_hdr(xdr, OP_SAVEFH, decode_savefh_maxsz, hdr);
1691}
1692
1693static void encode_setattr(struct xdr_stream *xdr, const struct nfs_setattrargs *arg, const struct nfs_server *server, struct compound_hdr *hdr)
1694{
1695        encode_op_hdr(xdr, OP_SETATTR, decode_setattr_maxsz, hdr);
1696        encode_nfs4_stateid(xdr, &arg->stateid);
1697        encode_attrs(xdr, arg->iap, arg->label, NULL, server,
1698                        server->attr_bitmask);
1699}
1700
1701static void encode_setclientid(struct xdr_stream *xdr, const struct nfs4_setclientid *setclientid, struct compound_hdr *hdr)
1702{
1703        __be32 *p;
1704
1705        encode_op_hdr(xdr, OP_SETCLIENTID, decode_setclientid_maxsz, hdr);
1706        encode_nfs4_verifier(xdr, setclientid->sc_verifier);
1707
1708        encode_string(xdr, strlen(setclientid->sc_clnt->cl_owner_id),
1709                        setclientid->sc_clnt->cl_owner_id);
1710        p = reserve_space(xdr, 4);
1711        *p = cpu_to_be32(setclientid->sc_prog);
1712        encode_string(xdr, setclientid->sc_netid_len, setclientid->sc_netid);
1713        encode_string(xdr, setclientid->sc_uaddr_len, setclientid->sc_uaddr);
1714        p = reserve_space(xdr, 4);
1715        *p = cpu_to_be32(setclientid->sc_clnt->cl_cb_ident);
1716}
1717
1718static void encode_setclientid_confirm(struct xdr_stream *xdr, const struct nfs4_setclientid_res *arg, struct compound_hdr *hdr)
1719{
1720        encode_op_hdr(xdr, OP_SETCLIENTID_CONFIRM,
1721                        decode_setclientid_confirm_maxsz, hdr);
1722        encode_uint64(xdr, arg->clientid);
1723        encode_nfs4_verifier(xdr, &arg->confirm);
1724}
1725
1726static void encode_write(struct xdr_stream *xdr, const struct nfs_pgio_args *args,
1727                         struct compound_hdr *hdr)
1728{
1729        __be32 *p;
1730
1731        encode_op_hdr(xdr, OP_WRITE, decode_write_maxsz, hdr);
1732        encode_nfs4_stateid(xdr, &args->stateid);
1733
1734        p = reserve_space(xdr, 16);
1735        p = xdr_encode_hyper(p, args->offset);
1736        *p++ = cpu_to_be32(args->stable);
1737        *p = cpu_to_be32(args->count);
1738
1739        xdr_write_pages(xdr, args->pages, args->pgbase, args->count);
1740}
1741
1742static void encode_delegreturn(struct xdr_stream *xdr, const nfs4_stateid *stateid, struct compound_hdr *hdr)
1743{
1744        encode_op_hdr(xdr, OP_DELEGRETURN, decode_delegreturn_maxsz, hdr);
1745        encode_nfs4_stateid(xdr, stateid);
1746}
1747
1748static void encode_secinfo(struct xdr_stream *xdr, const struct qstr *name, struct compound_hdr *hdr)
1749{
1750        encode_op_hdr(xdr, OP_SECINFO, decode_secinfo_maxsz, hdr);
1751        encode_string(xdr, name->len, name->name);
1752}
1753
1754#if defined(CONFIG_NFS_V4_1)
1755/* NFSv4.1 operations */
1756static void encode_bind_conn_to_session(struct xdr_stream *xdr,
1757                                   const struct nfs41_bind_conn_to_session_args *args,
1758                                   struct compound_hdr *hdr)
1759{
1760        __be32 *p;
1761
1762        encode_op_hdr(xdr, OP_BIND_CONN_TO_SESSION,
1763                decode_bind_conn_to_session_maxsz, hdr);
1764        encode_opaque_fixed(xdr, args->sessionid.data, NFS4_MAX_SESSIONID_LEN);
1765        p = xdr_reserve_space(xdr, 8);
1766        *p++ = cpu_to_be32(args->dir);
1767        *p = (args->use_conn_in_rdma_mode) ? cpu_to_be32(1) : cpu_to_be32(0);
1768}
1769
1770static void encode_op_map(struct xdr_stream *xdr, const struct nfs4_op_map *op_map)
1771{
1772        unsigned int i;
1773        encode_uint32(xdr, NFS4_OP_MAP_NUM_WORDS);
1774        for (i = 0; i < NFS4_OP_MAP_NUM_WORDS; i++)
1775                encode_uint32(xdr, op_map->u.words[i]);
1776}
1777
1778static void encode_exchange_id(struct xdr_stream *xdr,
1779                               const struct nfs41_exchange_id_args *args,
1780                               struct compound_hdr *hdr)
1781{
1782        __be32 *p;
1783        char impl_name[IMPL_NAME_LIMIT];
1784        int len = 0;
1785
1786        encode_op_hdr(xdr, OP_EXCHANGE_ID, decode_exchange_id_maxsz, hdr);
1787        encode_nfs4_verifier(xdr, &args->verifier);
1788
1789        encode_string(xdr, strlen(args->client->cl_owner_id),
1790                        args->client->cl_owner_id);
1791
1792        encode_uint32(xdr, args->flags);
1793        encode_uint32(xdr, args->state_protect.how);
1794
1795        switch (args->state_protect.how) {
1796        case SP4_NONE:
1797                break;
1798        case SP4_MACH_CRED:
1799                encode_op_map(xdr, &args->state_protect.enforce);
1800                encode_op_map(xdr, &args->state_protect.allow);
1801                break;
1802        default:
1803                WARN_ON_ONCE(1);
1804                break;
1805        }
1806
1807        if (send_implementation_id &&
1808            sizeof(CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN) > 1 &&
1809            sizeof(CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN)
1810                <= sizeof(impl_name) + 1)
1811                len = snprintf(impl_name, sizeof(impl_name), "%s %s %s %s",
1812                               utsname()->sysname, utsname()->release,
1813                               utsname()->version, utsname()->machine);
1814
1815        if (len > 0) {
1816                encode_uint32(xdr, 1);  /* implementation id array length=1 */
1817
1818                encode_string(xdr,
1819                        sizeof(CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN) - 1,
1820                        CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN);
1821                encode_string(xdr, len, impl_name);
1822                /* just send zeros for nii_date - the date is in nii_name */
1823                p = reserve_space(xdr, 12);
1824                p = xdr_encode_hyper(p, 0);
1825                *p = cpu_to_be32(0);
1826        } else
1827                encode_uint32(xdr, 0);  /* implementation id array length=0 */
1828}
1829
1830static void encode_create_session(struct xdr_stream *xdr,
1831                                  const struct nfs41_create_session_args *args,
1832                                  struct compound_hdr *hdr)
1833{
1834        __be32 *p;
1835        struct nfs_client *clp = args->client;
1836        struct rpc_clnt *clnt = clp->cl_rpcclient;
1837        struct nfs_net *nn = net_generic(clp->cl_net, nfs_net_id);
1838        u32 max_resp_sz_cached;
1839
1840        /*
1841         * Assumes OPEN is the biggest non-idempotent compound.
1842         * 2 is the verifier.
1843         */
1844        max_resp_sz_cached = (NFS4_dec_open_sz + RPC_REPHDRSIZE + 2)
1845                                * XDR_UNIT + RPC_MAX_AUTH_SIZE;
1846
1847        encode_op_hdr(xdr, OP_CREATE_SESSION, decode_create_session_maxsz, hdr);
1848        p = reserve_space(xdr, 16 + 2*28 + 20 + clnt->cl_nodelen + 12);
1849        p = xdr_encode_hyper(p, args->clientid);
1850        *p++ = cpu_to_be32(args->seqid);                        /*Sequence id */
1851        *p++ = cpu_to_be32(args->flags);                        /*flags */
1852
1853        /* Fore Channel */
1854        *p++ = cpu_to_be32(0);                          /* header padding size */
1855        *p++ = cpu_to_be32(args->fc_attrs.max_rqst_sz); /* max req size */
1856        *p++ = cpu_to_be32(args->fc_attrs.max_resp_sz); /* max resp size */
1857        *p++ = cpu_to_be32(max_resp_sz_cached);         /* Max resp sz cached */
1858        *p++ = cpu_to_be32(args->fc_attrs.max_ops);     /* max operations */
1859        *p++ = cpu_to_be32(args->fc_attrs.max_reqs);    /* max requests */
1860        *p++ = cpu_to_be32(0);                          /* rdmachannel_attrs */
1861
1862        /* Back Channel */
1863        *p++ = cpu_to_be32(0);                          /* header padding size */
1864        *p++ = cpu_to_be32(args->bc_attrs.max_rqst_sz); /* max req size */
1865        *p++ = cpu_to_be32(args->bc_attrs.max_resp_sz); /* max resp size */
1866        *p++ = cpu_to_be32(args->bc_attrs.max_resp_sz_cached);  /* Max resp sz cached */
1867        *p++ = cpu_to_be32(args->bc_attrs.max_ops);     /* max operations */
1868        *p++ = cpu_to_be32(args->bc_attrs.max_reqs);    /* max requests */
1869        *p++ = cpu_to_be32(0);                          /* rdmachannel_attrs */
1870
1871        *p++ = cpu_to_be32(args->cb_program);           /* cb_program */
1872        *p++ = cpu_to_be32(1);
1873        *p++ = cpu_to_be32(RPC_AUTH_UNIX);                      /* auth_sys */
1874
1875        /* authsys_parms rfc1831 */
1876        *p++ = cpu_to_be32(ktime_to_ns(nn->boot_time)); /* stamp */
1877        p = xdr_encode_array(p, clnt->cl_nodename, clnt->cl_nodelen);
1878        *p++ = cpu_to_be32(0);                          /* UID */
1879        *p++ = cpu_to_be32(0);                          /* GID */
1880        *p = cpu_to_be32(0);                            /* No more gids */
1881}
1882
1883static void encode_destroy_session(struct xdr_stream *xdr,
1884                                   const struct nfs4_session *session,
1885                                   struct compound_hdr *hdr)
1886{
1887        encode_op_hdr(xdr, OP_DESTROY_SESSION, decode_destroy_session_maxsz, hdr);
1888        encode_opaque_fixed(xdr, session->sess_id.data, NFS4_MAX_SESSIONID_LEN);
1889}
1890
1891static void encode_destroy_clientid(struct xdr_stream *xdr,
1892                                   uint64_t clientid,
1893                                   struct compound_hdr *hdr)
1894{
1895        encode_op_hdr(xdr, OP_DESTROY_CLIENTID, decode_destroy_clientid_maxsz, hdr);
1896        encode_uint64(xdr, clientid);
1897}
1898
1899static void encode_reclaim_complete(struct xdr_stream *xdr,
1900                                    const struct nfs41_reclaim_complete_args *args,
1901                                    struct compound_hdr *hdr)
1902{
1903        encode_op_hdr(xdr, OP_RECLAIM_COMPLETE, decode_reclaim_complete_maxsz, hdr);
1904        encode_uint32(xdr, args->one_fs);
1905}
1906#endif /* CONFIG_NFS_V4_1 */
1907
1908static void encode_sequence(struct xdr_stream *xdr,
1909                            const struct nfs4_sequence_args *args,
1910                            struct compound_hdr *hdr)
1911{
1912#if defined(CONFIG_NFS_V4_1)
1913        struct nfs4_session *session;
1914        struct nfs4_slot_table *tp;
1915        struct nfs4_slot *slot = args->sa_slot;
1916        __be32 *p;
1917
1918        tp = slot->table;
1919        session = tp->session;
1920        if (!session)
1921                return;
1922
1923        encode_op_hdr(xdr, OP_SEQUENCE, decode_sequence_maxsz, hdr);
1924
1925        /*
1926         * Sessionid + seqid + slotid + max slotid + cache_this
1927         */
1928        dprintk("%s: sessionid=%u:%u:%u:%u seqid=%d slotid=%d "
1929                "max_slotid=%d cache_this=%d\n",
1930                __func__,
1931                ((u32 *)session->sess_id.data)[0],
1932                ((u32 *)session->sess_id.data)[1],
1933                ((u32 *)session->sess_id.data)[2],
1934                ((u32 *)session->sess_id.data)[3],
1935                slot->seq_nr, slot->slot_nr,
1936                tp->highest_used_slotid, args->sa_cache_this);
1937        p = reserve_space(xdr, NFS4_MAX_SESSIONID_LEN + 16);
1938        p = xdr_encode_opaque_fixed(p, session->sess_id.data, NFS4_MAX_SESSIONID_LEN);
1939        *p++ = cpu_to_be32(slot->seq_nr);
1940        *p++ = cpu_to_be32(slot->slot_nr);
1941        *p++ = cpu_to_be32(tp->highest_used_slotid);
1942        *p = cpu_to_be32(args->sa_cache_this);
1943#endif /* CONFIG_NFS_V4_1 */
1944}
1945
1946#ifdef CONFIG_NFS_V4_1
1947static void
1948encode_getdeviceinfo(struct xdr_stream *xdr,
1949                     const struct nfs4_getdeviceinfo_args *args,
1950                     struct compound_hdr *hdr)
1951{
1952        __be32 *p;
1953
1954        encode_op_hdr(xdr, OP_GETDEVICEINFO, decode_getdeviceinfo_maxsz, hdr);
1955        p = reserve_space(xdr, NFS4_DEVICEID4_SIZE + 4 + 4);
1956        p = xdr_encode_opaque_fixed(p, args->pdev->dev_id.data,
1957                                    NFS4_DEVICEID4_SIZE);
1958        *p++ = cpu_to_be32(args->pdev->layout_type);
1959        *p++ = cpu_to_be32(args->pdev->maxcount);       /* gdia_maxcount */
1960
1961        p = reserve_space(xdr, 4 + 4);
1962        *p++ = cpu_to_be32(1);                  /* bitmap length */
1963        *p++ = cpu_to_be32(args->notify_types);
1964}
1965
1966static void
1967encode_layoutget(struct xdr_stream *xdr,
1968                      const struct nfs4_layoutget_args *args,
1969                      struct compound_hdr *hdr)
1970{
1971        __be32 *p;
1972
1973        encode_op_hdr(xdr, OP_LAYOUTGET, decode_layoutget_maxsz, hdr);
1974        p = reserve_space(xdr, 36);
1975        *p++ = cpu_to_be32(0);     /* Signal layout available */
1976        *p++ = cpu_to_be32(args->type);
1977        *p++ = cpu_to_be32(args->range.iomode);
1978        p = xdr_encode_hyper(p, args->range.offset);
1979        p = xdr_encode_hyper(p, args->range.length);
1980        p = xdr_encode_hyper(p, args->minlength);
1981        encode_nfs4_stateid(xdr, &args->stateid);
1982        encode_uint32(xdr, args->maxcount);
1983
1984        dprintk("%s: 1st type:0x%x iomode:%d off:%lu len:%lu mc:%d\n",
1985                __func__,
1986                args->type,
1987                args->range.iomode,
1988                (unsigned long)args->range.offset,
1989                (unsigned long)args->range.length,
1990                args->maxcount);
1991}
1992
1993static int
1994encode_layoutcommit(struct xdr_stream *xdr,
1995                    struct inode *inode,
1996                    const struct nfs4_layoutcommit_args *args,
1997                    struct compound_hdr *hdr)
1998{
1999        __be32 *p;
2000
2001        dprintk("%s: lbw: %llu type: %d\n", __func__, args->lastbytewritten,
2002                NFS_SERVER(args->inode)->pnfs_curr_ld->id);
2003
2004        encode_op_hdr(xdr, OP_LAYOUTCOMMIT, decode_layoutcommit_maxsz, hdr);
2005        p = reserve_space(xdr, 20);
2006        /* Only whole file layouts */
2007        p = xdr_encode_hyper(p, 0); /* offset */
2008        p = xdr_encode_hyper(p, args->lastbytewritten + 1);     /* length */
2009        *p = cpu_to_be32(0); /* reclaim */
2010        encode_nfs4_stateid(xdr, &args->stateid);
2011        if (args->lastbytewritten != U64_MAX) {
2012                p = reserve_space(xdr, 20);
2013                *p++ = cpu_to_be32(1); /* newoffset = TRUE */
2014                p = xdr_encode_hyper(p, args->lastbytewritten);
2015        } else {
2016                p = reserve_space(xdr, 12);
2017                *p++ = cpu_to_be32(0); /* newoffset = FALSE */
2018        }
2019        *p++ = cpu_to_be32(0); /* Never send time_modify_changed */
2020        *p++ = cpu_to_be32(NFS_SERVER(args->inode)->pnfs_curr_ld->id);/* type */
2021
2022        encode_uint32(xdr, args->layoutupdate_len);
2023        if (args->layoutupdate_pages)
2024                xdr_write_pages(xdr, args->layoutupdate_pages, 0,
2025                                args->layoutupdate_len);
2026
2027        return 0;
2028}
2029
2030static void
2031encode_layoutreturn(struct xdr_stream *xdr,
2032                    const struct nfs4_layoutreturn_args *args,
2033                    struct compound_hdr *hdr)
2034{
2035        __be32 *p;
2036
2037        encode_op_hdr(xdr, OP_LAYOUTRETURN, decode_layoutreturn_maxsz, hdr);
2038        p = reserve_space(xdr, 16);
2039        *p++ = cpu_to_be32(0);          /* reclaim. always 0 for now */
2040        *p++ = cpu_to_be32(args->layout_type);
2041        *p++ = cpu_to_be32(args->range.iomode);
2042        *p = cpu_to_be32(RETURN_FILE);
2043        p = reserve_space(xdr, 16);
2044        p = xdr_encode_hyper(p, args->range.offset);
2045        p = xdr_encode_hyper(p, args->range.length);
2046        spin_lock(&args->inode->i_lock);
2047        encode_nfs4_stateid(xdr, &args->stateid);
2048        spin_unlock(&args->inode->i_lock);
2049        if (args->ld_private->ops && args->ld_private->ops->encode)
2050                args->ld_private->ops->encode(xdr, args, args->ld_private);
2051        else
2052                encode_uint32(xdr, 0);
2053}
2054
2055static int
2056encode_secinfo_no_name(struct xdr_stream *xdr,
2057                       const struct nfs41_secinfo_no_name_args *args,
2058                       struct compound_hdr *hdr)
2059{
2060        encode_op_hdr(xdr, OP_SECINFO_NO_NAME, decode_secinfo_no_name_maxsz, hdr);
2061        encode_uint32(xdr, args->style);
2062        return 0;
2063}
2064
2065static void encode_test_stateid(struct xdr_stream *xdr,
2066                                const struct nfs41_test_stateid_args *args,
2067                                struct compound_hdr *hdr)
2068{
2069        encode_op_hdr(xdr, OP_TEST_STATEID, decode_test_stateid_maxsz, hdr);
2070        encode_uint32(xdr, 1);
2071        encode_nfs4_stateid(xdr, args->stateid);
2072}
2073
2074static void encode_free_stateid(struct xdr_stream *xdr,
2075                                const struct nfs41_free_stateid_args *args,
2076                                struct compound_hdr *hdr)
2077{
2078        encode_op_hdr(xdr, OP_FREE_STATEID, decode_free_stateid_maxsz, hdr);
2079        encode_nfs4_stateid(xdr, &args->stateid);
2080}
2081#else
2082static inline void
2083encode_layoutreturn(struct xdr_stream *xdr,
2084                    const struct nfs4_layoutreturn_args *args,
2085                    struct compound_hdr *hdr)
2086{
2087}
2088
2089static void
2090encode_layoutget(struct xdr_stream *xdr,
2091                      const struct nfs4_layoutget_args *args,
2092                      struct compound_hdr *hdr)
2093{
2094}
2095#endif /* CONFIG_NFS_V4_1 */
2096
2097/*
2098 * END OF "GENERIC" ENCODE ROUTINES.
2099 */
2100
2101static u32 nfs4_xdr_minorversion(const struct nfs4_sequence_args *args)
2102{
2103#if defined(CONFIG_NFS_V4_1)
2104        struct nfs4_session *session = args->sa_slot->table->session;
2105        if (session)
2106                return session->clp->cl_mvops->minor_version;
2107#endif /* CONFIG_NFS_V4_1 */
2108        return 0;
2109}
2110
2111/*
2112 * Encode an ACCESS request
2113 */
2114static void nfs4_xdr_enc_access(struct rpc_rqst *req, struct xdr_stream *xdr,
2115                                const void *data)
2116{
2117        const struct nfs4_accessargs *args = data;
2118        struct compound_hdr hdr = {
2119                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2120        };
2121
2122        encode_compound_hdr(xdr, req, &hdr);
2123        encode_sequence(xdr, &args->seq_args, &hdr);
2124        encode_putfh(xdr, args->fh, &hdr);
2125        encode_access(xdr, args->access, &hdr);
2126        if (args->bitmask)
2127                encode_getfattr(xdr, args->bitmask, &hdr);
2128        encode_nops(&hdr);
2129}
2130
2131/*
2132 * Encode LOOKUP request
2133 */
2134static void nfs4_xdr_enc_lookup(struct rpc_rqst *req, struct xdr_stream *xdr,
2135                                const void *data)
2136{
2137        const struct nfs4_lookup_arg *args = data;
2138        struct compound_hdr hdr = {
2139                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2140        };
2141
2142        encode_compound_hdr(xdr, req, &hdr);
2143        encode_sequence(xdr, &args->seq_args, &hdr);
2144        encode_putfh(xdr, args->dir_fh, &hdr);
2145        encode_lookup(xdr, args->name, &hdr);
2146        encode_getfh(xdr, &hdr);
2147        encode_getfattr(xdr, args->bitmask, &hdr);
2148        encode_nops(&hdr);
2149}
2150
2151/*
2152 * Encode LOOKUPP request
2153 */
2154static void nfs4_xdr_enc_lookupp(struct rpc_rqst *req, struct xdr_stream *xdr,
2155                const void *data)
2156{
2157        const struct nfs4_lookupp_arg *args = data;
2158        struct compound_hdr hdr = {
2159                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2160        };
2161
2162        encode_compound_hdr(xdr, req, &hdr);
2163        encode_sequence(xdr, &args->seq_args, &hdr);
2164        encode_putfh(xdr, args->fh, &hdr);
2165        encode_lookupp(xdr, &hdr);
2166        encode_getfh(xdr, &hdr);
2167        encode_getfattr(xdr, args->bitmask, &hdr);
2168        encode_nops(&hdr);
2169}
2170
2171/*
2172 * Encode LOOKUP_ROOT request
2173 */
2174static void nfs4_xdr_enc_lookup_root(struct rpc_rqst *req,
2175                                     struct xdr_stream *xdr,
2176                                     const void *data)
2177{
2178        const struct nfs4_lookup_root_arg *args = data;
2179        struct compound_hdr hdr = {
2180                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2181        };
2182
2183        encode_compound_hdr(xdr, req, &hdr);
2184        encode_sequence(xdr, &args->seq_args, &hdr);
2185        encode_putrootfh(xdr, &hdr);
2186        encode_getfh(xdr, &hdr);
2187        encode_getfattr(xdr, args->bitmask, &hdr);
2188        encode_nops(&hdr);
2189}
2190
2191/*
2192 * Encode REMOVE request
2193 */
2194static void nfs4_xdr_enc_remove(struct rpc_rqst *req, struct xdr_stream *xdr,
2195                                const void *data)
2196{
2197        const struct nfs_removeargs *args = data;
2198        struct compound_hdr hdr = {
2199                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2200        };
2201
2202        encode_compound_hdr(xdr, req, &hdr);
2203        encode_sequence(xdr, &args->seq_args, &hdr);
2204        encode_putfh(xdr, args->fh, &hdr);
2205        encode_remove(xdr, &args->name, &hdr);
2206        encode_nops(&hdr);
2207}
2208
2209/*
2210 * Encode RENAME request
2211 */
2212static void nfs4_xdr_enc_rename(struct rpc_rqst *req, struct xdr_stream *xdr,
2213                                const void *data)
2214{
2215        const struct nfs_renameargs *args = data;
2216        struct compound_hdr hdr = {
2217                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2218        };
2219
2220        encode_compound_hdr(xdr, req, &hdr);
2221        encode_sequence(xdr, &args->seq_args, &hdr);
2222        encode_putfh(xdr, args->old_dir, &hdr);
2223        encode_savefh(xdr, &hdr);
2224        encode_putfh(xdr, args->new_dir, &hdr);
2225        encode_rename(xdr, args->old_name, args->new_name, &hdr);
2226        encode_nops(&hdr);
2227}
2228
2229/*
2230 * Encode LINK request
2231 */
2232static void nfs4_xdr_enc_link(struct rpc_rqst *req, struct xdr_stream *xdr,
2233                              const void *data)
2234{
2235        const struct nfs4_link_arg *args = data;
2236        struct compound_hdr hdr = {
2237                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2238        };
2239
2240        encode_compound_hdr(xdr, req, &hdr);
2241        encode_sequence(xdr, &args->seq_args, &hdr);
2242        encode_putfh(xdr, args->fh, &hdr);
2243        encode_savefh(xdr, &hdr);
2244        encode_putfh(xdr, args->dir_fh, &hdr);
2245        encode_link(xdr, args->name, &hdr);
2246        encode_restorefh(xdr, &hdr);
2247        encode_getfattr(xdr, args->bitmask, &hdr);
2248        encode_nops(&hdr);
2249}
2250
2251/*
2252 * Encode CREATE request
2253 */
2254static void nfs4_xdr_enc_create(struct rpc_rqst *req, struct xdr_stream *xdr,
2255                                const void *data)
2256{
2257        const struct nfs4_create_arg *args = data;
2258        struct compound_hdr hdr = {
2259                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2260        };
2261
2262        encode_compound_hdr(xdr, req, &hdr);
2263        encode_sequence(xdr, &args->seq_args, &hdr);
2264        encode_putfh(xdr, args->dir_fh, &hdr);
2265        encode_create(xdr, args, &hdr);
2266        encode_getfh(xdr, &hdr);
2267        encode_getfattr(xdr, args->bitmask, &hdr);
2268        encode_nops(&hdr);
2269}
2270
2271/*
2272 * Encode SYMLINK request
2273 */
2274static void nfs4_xdr_enc_symlink(struct rpc_rqst *req, struct xdr_stream *xdr,
2275                                 const void *data)
2276{
2277        const struct nfs4_create_arg *args = data;
2278
2279        nfs4_xdr_enc_create(req, xdr, args);
2280}
2281
2282/*
2283 * Encode GETATTR request
2284 */
2285static void nfs4_xdr_enc_getattr(struct rpc_rqst *req, struct xdr_stream *xdr,
2286                                 const void *data)
2287{
2288        const struct nfs4_getattr_arg *args = data;
2289        struct compound_hdr hdr = {
2290                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2291        };
2292
2293        encode_compound_hdr(xdr, req, &hdr);
2294        encode_sequence(xdr, &args->seq_args, &hdr);
2295        encode_putfh(xdr, args->fh, &hdr);
2296        encode_getfattr(xdr, args->bitmask, &hdr);
2297        encode_nops(&hdr);
2298}
2299
2300/*
2301 * Encode a CLOSE request
2302 */
2303static void nfs4_xdr_enc_close(struct rpc_rqst *req, struct xdr_stream *xdr,
2304                               const void *data)
2305{
2306        const struct nfs_closeargs *args = data;
2307        struct compound_hdr hdr = {
2308                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2309        };
2310
2311        encode_compound_hdr(xdr, req, &hdr);
2312        encode_sequence(xdr, &args->seq_args, &hdr);
2313        encode_putfh(xdr, args->fh, &hdr);
2314        if (args->lr_args)
2315                encode_layoutreturn(xdr, args->lr_args, &hdr);
2316        if (args->bitmask != NULL)
2317                encode_getfattr(xdr, args->bitmask, &hdr);
2318        encode_close(xdr, args, &hdr);
2319        encode_nops(&hdr);
2320}
2321
2322/*
2323 * Encode an OPEN request
2324 */
2325static void nfs4_xdr_enc_open(struct rpc_rqst *req, struct xdr_stream *xdr,
2326                              const void *data)
2327{
2328        const struct nfs_openargs *args = data;
2329        struct compound_hdr hdr = {
2330                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2331        };
2332
2333        encode_compound_hdr(xdr, req, &hdr);
2334        encode_sequence(xdr, &args->seq_args, &hdr);
2335        encode_putfh(xdr, args->fh, &hdr);
2336        encode_open(xdr, args, &hdr);
2337        encode_getfh(xdr, &hdr);
2338        if (args->access)
2339                encode_access(xdr, args->access, &hdr);
2340        encode_getfattr_open(xdr, args->bitmask, args->open_bitmap, &hdr);
2341        if (args->lg_args) {
2342                encode_layoutget(xdr, args->lg_args, &hdr);
2343                xdr_inline_pages(&req->rq_rcv_buf, hdr.replen << 2,
2344                                 args->lg_args->layout.pages,
2345                                 0, args->lg_args->layout.pglen);
2346        }
2347        encode_nops(&hdr);
2348}
2349
2350/*
2351 * Encode an OPEN_CONFIRM request
2352 */
2353static void nfs4_xdr_enc_open_confirm(struct rpc_rqst *req,
2354                                      struct xdr_stream *xdr,
2355                                      const void *data)
2356{
2357        const struct nfs_open_confirmargs *args = data;
2358        struct compound_hdr hdr = {
2359                .nops   = 0,
2360        };
2361
2362        encode_compound_hdr(xdr, req, &hdr);
2363        encode_putfh(xdr, args->fh, &hdr);
2364        encode_open_confirm(xdr, args, &hdr);
2365        encode_nops(&hdr);
2366}
2367
2368/*
2369 * Encode an OPEN request with no attributes.
2370 */
2371static void nfs4_xdr_enc_open_noattr(struct rpc_rqst *req,
2372                                     struct xdr_stream *xdr,
2373                                     const void *data)
2374{
2375        const struct nfs_openargs *args = data;
2376        struct compound_hdr hdr = {
2377                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2378        };
2379
2380        encode_compound_hdr(xdr, req, &hdr);
2381        encode_sequence(xdr, &args->seq_args, &hdr);
2382        encode_putfh(xdr, args->fh, &hdr);
2383        encode_open(xdr, args, &hdr);
2384        if (args->access)
2385                encode_access(xdr, args->access, &hdr);
2386        encode_getfattr_open(xdr, args->bitmask, args->open_bitmap, &hdr);
2387        if (args->lg_args) {
2388                encode_layoutget(xdr, args->lg_args, &hdr);
2389                xdr_inline_pages(&req->rq_rcv_buf, hdr.replen << 2,
2390                                 args->lg_args->layout.pages,
2391                                 0, args->lg_args->layout.pglen);
2392        }
2393        encode_nops(&hdr);
2394}
2395
2396/*
2397 * Encode an OPEN_DOWNGRADE request
2398 */
2399static void nfs4_xdr_enc_open_downgrade(struct rpc_rqst *req,
2400                                        struct xdr_stream *xdr,
2401                                        const void *data)
2402{
2403        const struct nfs_closeargs *args = data;
2404        struct compound_hdr hdr = {
2405                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2406        };
2407
2408        encode_compound_hdr(xdr, req, &hdr);
2409        encode_sequence(xdr, &args->seq_args, &hdr);
2410        encode_putfh(xdr, args->fh, &hdr);
2411        if (args->lr_args)
2412                encode_layoutreturn(xdr, args->lr_args, &hdr);
2413        encode_open_downgrade(xdr, args, &hdr);
2414        encode_nops(&hdr);
2415}
2416
2417/*
2418 * Encode a LOCK request
2419 */
2420static void nfs4_xdr_enc_lock(struct rpc_rqst *req, struct xdr_stream *xdr,
2421                              const void *data)
2422{
2423        const struct nfs_lock_args *args = data;
2424        struct compound_hdr hdr = {
2425                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2426        };
2427
2428        encode_compound_hdr(xdr, req, &hdr);
2429        encode_sequence(xdr, &args->seq_args, &hdr);
2430        encode_putfh(xdr, args->fh, &hdr);
2431        encode_lock(xdr, args, &hdr);
2432        encode_nops(&hdr);
2433}
2434
2435/*
2436 * Encode a LOCKT request
2437 */
2438static void nfs4_xdr_enc_lockt(struct rpc_rqst *req, struct xdr_stream *xdr,
2439                               const void *data)
2440{
2441        const struct nfs_lockt_args *args = data;
2442        struct compound_hdr hdr = {
2443                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2444        };
2445
2446        encode_compound_hdr(xdr, req, &hdr);
2447        encode_sequence(xdr, &args->seq_args, &hdr);
2448        encode_putfh(xdr, args->fh, &hdr);
2449        encode_lockt(xdr, args, &hdr);
2450        encode_nops(&hdr);
2451}
2452
2453/*
2454 * Encode a LOCKU request
2455 */
2456static void nfs4_xdr_enc_locku(struct rpc_rqst *req, struct xdr_stream *xdr,
2457                               const void *data)
2458{
2459        const struct nfs_locku_args *args = data;
2460        struct compound_hdr hdr = {
2461                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2462        };
2463
2464        encode_compound_hdr(xdr, req, &hdr);
2465        encode_sequence(xdr, &args->seq_args, &hdr);
2466        encode_putfh(xdr, args->fh, &hdr);
2467        encode_locku(xdr, args, &hdr);
2468        encode_nops(&hdr);
2469}
2470
2471static void nfs4_xdr_enc_release_lockowner(struct rpc_rqst *req,
2472                                           struct xdr_stream *xdr,
2473                                           const void *data)
2474{
2475        const struct nfs_release_lockowner_args *args = data;
2476        struct compound_hdr hdr = {
2477                .minorversion = 0,
2478        };
2479
2480        encode_compound_hdr(xdr, req, &hdr);
2481        encode_release_lockowner(xdr, &args->lock_owner, &hdr);
2482        encode_nops(&hdr);
2483}
2484
2485/*
2486 * Encode a READLINK request
2487 */
2488static void nfs4_xdr_enc_readlink(struct rpc_rqst *req, struct xdr_stream *xdr,
2489                                  const void *data)
2490{
2491        const struct nfs4_readlink *args = data;
2492        struct compound_hdr hdr = {
2493                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2494        };
2495
2496        encode_compound_hdr(xdr, req, &hdr);
2497        encode_sequence(xdr, &args->seq_args, &hdr);
2498        encode_putfh(xdr, args->fh, &hdr);
2499        encode_readlink(xdr, args, req, &hdr);
2500
2501        xdr_inline_pages(&req->rq_rcv_buf, hdr.replen << 2, args->pages,
2502                        args->pgbase, args->pglen);
2503        encode_nops(&hdr);
2504}
2505
2506/*
2507 * Encode a READDIR request
2508 */
2509static void nfs4_xdr_enc_readdir(struct rpc_rqst *req, struct xdr_stream *xdr,
2510                                 const void *data)
2511{
2512        const struct nfs4_readdir_arg *args = data;
2513        struct compound_hdr hdr = {
2514                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2515        };
2516
2517        encode_compound_hdr(xdr, req, &hdr);
2518        encode_sequence(xdr, &args->seq_args, &hdr);
2519        encode_putfh(xdr, args->fh, &hdr);
2520        encode_readdir(xdr, args, req, &hdr);
2521
2522        xdr_inline_pages(&req->rq_rcv_buf, hdr.replen << 2, args->pages,
2523                         args->pgbase, args->count);
2524        dprintk("%s: inlined page args = (%u, %p, %u, %u)\n",
2525                        __func__, hdr.replen << 2, args->pages,
2526                        args->pgbase, args->count);
2527        encode_nops(&hdr);
2528}
2529
2530/*
2531 * Encode a READ request
2532 */
2533static void nfs4_xdr_enc_read(struct rpc_rqst *req, struct xdr_stream *xdr,
2534                              const void *data)
2535{
2536        const struct nfs_pgio_args *args = data;
2537        struct compound_hdr hdr = {
2538                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2539        };
2540
2541        encode_compound_hdr(xdr, req, &hdr);
2542        encode_sequence(xdr, &args->seq_args, &hdr);
2543        encode_putfh(xdr, args->fh, &hdr);
2544        encode_read(xdr, args, &hdr);
2545
2546        xdr_inline_pages(&req->rq_rcv_buf, hdr.replen << 2,
2547                         args->pages, args->pgbase, args->count);
2548        req->rq_rcv_buf.flags |= XDRBUF_READ;
2549        encode_nops(&hdr);
2550}
2551
2552/*
2553 * Encode an SETATTR request
2554 */
2555static void nfs4_xdr_enc_setattr(struct rpc_rqst *req, struct xdr_stream *xdr,
2556                                 const void *data)
2557{
2558        const struct nfs_setattrargs *args = data;
2559        struct compound_hdr hdr = {
2560                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2561        };
2562
2563        encode_compound_hdr(xdr, req, &hdr);
2564        encode_sequence(xdr, &args->seq_args, &hdr);
2565        encode_putfh(xdr, args->fh, &hdr);
2566        encode_setattr(xdr, args, args->server, &hdr);
2567        encode_getfattr(xdr, args->bitmask, &hdr);
2568        encode_nops(&hdr);
2569}
2570
2571/*
2572 * Encode a GETACL request
2573 */
2574static void nfs4_xdr_enc_getacl(struct rpc_rqst *req, struct xdr_stream *xdr,
2575                                const void *data)
2576{
2577        const struct nfs_getaclargs *args = data;
2578        struct compound_hdr hdr = {
2579                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2580        };
2581        const __u32 nfs4_acl_bitmap[1] = {
2582                [0] = FATTR4_WORD0_ACL,
2583        };
2584        uint32_t replen;
2585
2586        encode_compound_hdr(xdr, req, &hdr);
2587        encode_sequence(xdr, &args->seq_args, &hdr);
2588        encode_putfh(xdr, args->fh, &hdr);
2589        replen = hdr.replen + op_decode_hdr_maxsz;
2590        encode_getattr(xdr, nfs4_acl_bitmap, NULL,
2591                        ARRAY_SIZE(nfs4_acl_bitmap), &hdr);
2592
2593        xdr_inline_pages(&req->rq_rcv_buf, replen << 2,
2594                args->acl_pages, 0, args->acl_len);
2595
2596        encode_nops(&hdr);
2597}
2598
2599/*
2600 * Encode a WRITE request
2601 */
2602static void nfs4_xdr_enc_write(struct rpc_rqst *req, struct xdr_stream *xdr,
2603                               const void *data)
2604{
2605        const struct nfs_pgio_args *args = data;
2606        struct compound_hdr hdr = {
2607                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2608        };
2609
2610        encode_compound_hdr(xdr, req, &hdr);
2611        encode_sequence(xdr, &args->seq_args, &hdr);
2612        encode_putfh(xdr, args->fh, &hdr);
2613        encode_write(xdr, args, &hdr);
2614        req->rq_snd_buf.flags |= XDRBUF_WRITE;
2615        if (args->bitmask)
2616                encode_getfattr(xdr, args->bitmask, &hdr);
2617        encode_nops(&hdr);
2618}
2619
2620/*
2621 *  a COMMIT request
2622 */
2623static void nfs4_xdr_enc_commit(struct rpc_rqst *req, struct xdr_stream *xdr,
2624                                const void *data)
2625{
2626        const struct nfs_commitargs *args = data;
2627        struct compound_hdr hdr = {
2628                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2629        };
2630
2631        encode_compound_hdr(xdr, req, &hdr);
2632        encode_sequence(xdr, &args->seq_args, &hdr);
2633        encode_putfh(xdr, args->fh, &hdr);
2634        encode_commit(xdr, args, &hdr);
2635        encode_nops(&hdr);
2636}
2637
2638/*
2639 * FSINFO request
2640 */
2641static void nfs4_xdr_enc_fsinfo(struct rpc_rqst *req, struct xdr_stream *xdr,
2642                                const void *data)
2643{
2644        const struct nfs4_fsinfo_arg *args = data;
2645        struct compound_hdr hdr = {
2646                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2647        };
2648
2649        encode_compound_hdr(xdr, req, &hdr);
2650        encode_sequence(xdr, &args->seq_args, &hdr);
2651        encode_putfh(xdr, args->fh, &hdr);
2652        encode_fsinfo(xdr, args->bitmask, &hdr);
2653        encode_nops(&hdr);
2654}
2655
2656/*
2657 * a PATHCONF request
2658 */
2659static void nfs4_xdr_enc_pathconf(struct rpc_rqst *req, struct xdr_stream *xdr,
2660                                  const void *data)
2661{
2662        const struct nfs4_pathconf_arg *args = data;
2663        struct compound_hdr hdr = {
2664                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2665        };
2666
2667        encode_compound_hdr(xdr, req, &hdr);
2668        encode_sequence(xdr, &args->seq_args, &hdr);
2669        encode_putfh(xdr, args->fh, &hdr);
2670        encode_getattr(xdr, nfs4_pathconf_bitmap, args->bitmask,
2671                        ARRAY_SIZE(nfs4_pathconf_bitmap), &hdr);
2672        encode_nops(&hdr);
2673}
2674
2675/*
2676 * a STATFS request
2677 */
2678static void nfs4_xdr_enc_statfs(struct rpc_rqst *req, struct xdr_stream *xdr,
2679                                const void *data)
2680{
2681        const struct nfs4_statfs_arg *args = data;
2682        struct compound_hdr hdr = {
2683                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2684        };
2685
2686        encode_compound_hdr(xdr, req, &hdr);
2687        encode_sequence(xdr, &args->seq_args, &hdr);
2688        encode_putfh(xdr, args->fh, &hdr);
2689        encode_getattr(xdr, nfs4_statfs_bitmap, args->bitmask,
2690                        ARRAY_SIZE(nfs4_statfs_bitmap), &hdr);
2691        encode_nops(&hdr);
2692}
2693
2694/*
2695 * GETATTR_BITMAP request
2696 */
2697static void nfs4_xdr_enc_server_caps(struct rpc_rqst *req,
2698                                     struct xdr_stream *xdr,
2699                                     const void *data)
2700{
2701        const struct nfs4_server_caps_arg *args = data;
2702        const u32 *bitmask = args->bitmask;
2703        struct compound_hdr hdr = {
2704                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2705        };
2706
2707        encode_compound_hdr(xdr, req, &hdr);
2708        encode_sequence(xdr, &args->seq_args, &hdr);
2709        encode_putfh(xdr, args->fhandle, &hdr);
2710        encode_getattr(xdr, bitmask, NULL, 3, &hdr);
2711        encode_nops(&hdr);
2712}
2713
2714/*
2715 * a RENEW request
2716 */
2717static void nfs4_xdr_enc_renew(struct rpc_rqst *req, struct xdr_stream *xdr,
2718                               const void *data)
2719
2720{
2721        const struct nfs_client *clp = data;
2722        struct compound_hdr hdr = {
2723                .nops   = 0,
2724        };
2725
2726        encode_compound_hdr(xdr, req, &hdr);
2727        encode_renew(xdr, clp->cl_clientid, &hdr);
2728        encode_nops(&hdr);
2729}
2730
2731/*
2732 * a SETCLIENTID request
2733 */
2734static void nfs4_xdr_enc_setclientid(struct rpc_rqst *req,
2735                                     struct xdr_stream *xdr,
2736                                     const void *data)
2737{
2738        const struct nfs4_setclientid *sc = data;
2739        struct compound_hdr hdr = {
2740                .nops   = 0,
2741        };
2742
2743        encode_compound_hdr(xdr, req, &hdr);
2744        encode_setclientid(xdr, sc, &hdr);
2745        encode_nops(&hdr);
2746}
2747
2748/*
2749 * a SETCLIENTID_CONFIRM request
2750 */
2751static void nfs4_xdr_enc_setclientid_confirm(struct rpc_rqst *req,
2752                                             struct xdr_stream *xdr,
2753                                             const void *data)
2754{
2755        const struct nfs4_setclientid_res *arg = data;
2756        struct compound_hdr hdr = {
2757                .nops   = 0,
2758        };
2759
2760        encode_compound_hdr(xdr, req, &hdr);
2761        encode_setclientid_confirm(xdr, arg, &hdr);
2762        encode_nops(&hdr);
2763}
2764
2765/*
2766 * DELEGRETURN request
2767 */
2768static void nfs4_xdr_enc_delegreturn(struct rpc_rqst *req,
2769                                     struct xdr_stream *xdr,
2770                                     const void *data)
2771{
2772        const struct nfs4_delegreturnargs *args = data;
2773        struct compound_hdr hdr = {
2774                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2775        };
2776
2777        encode_compound_hdr(xdr, req, &hdr);
2778        encode_sequence(xdr, &args->seq_args, &hdr);
2779        encode_putfh(xdr, args->fhandle, &hdr);
2780        if (args->lr_args)
2781                encode_layoutreturn(xdr, args->lr_args, &hdr);
2782        if (args->bitmask)
2783                encode_getfattr(xdr, args->bitmask, &hdr);
2784        encode_delegreturn(xdr, args->stateid, &hdr);
2785        encode_nops(&hdr);
2786}
2787
2788/*
2789 * Encode FS_LOCATIONS request
2790 */
2791static void nfs4_xdr_enc_fs_locations(struct rpc_rqst *req,
2792                                      struct xdr_stream *xdr,
2793                                      const void *data)
2794{
2795        const struct nfs4_fs_locations_arg *args = data;
2796        struct compound_hdr hdr = {
2797                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2798        };
2799        uint32_t replen;
2800
2801        encode_compound_hdr(xdr, req, &hdr);
2802        encode_sequence(xdr, &args->seq_args, &hdr);
2803        if (args->migration) {
2804                encode_putfh(xdr, args->fh, &hdr);
2805                replen = hdr.replen;
2806                encode_fs_locations(xdr, args->bitmask, &hdr);
2807                if (args->renew)
2808                        encode_renew(xdr, args->clientid, &hdr);
2809        } else {
2810                encode_putfh(xdr, args->dir_fh, &hdr);
2811                encode_lookup(xdr, args->name, &hdr);
2812                replen = hdr.replen;
2813                encode_fs_locations(xdr, args->bitmask, &hdr);
2814        }
2815
2816        /* Set up reply kvec to capture returned fs_locations array. */
2817        xdr_inline_pages(&req->rq_rcv_buf, replen << 2,
2818                         (struct page **)&args->page, 0, PAGE_SIZE);
2819        encode_nops(&hdr);
2820}
2821
2822/*
2823 * Encode SECINFO request
2824 */
2825static void nfs4_xdr_enc_secinfo(struct rpc_rqst *req,
2826                                struct xdr_stream *xdr,
2827                                const void *data)
2828{
2829        const struct nfs4_secinfo_arg *args = data;
2830        struct compound_hdr hdr = {
2831                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2832        };
2833
2834        encode_compound_hdr(xdr, req, &hdr);
2835        encode_sequence(xdr, &args->seq_args, &hdr);
2836        encode_putfh(xdr, args->dir_fh, &hdr);
2837        encode_secinfo(xdr, args->name, &hdr);
2838        encode_nops(&hdr);
2839}
2840
2841/*
2842 * Encode FSID_PRESENT request
2843 */
2844static void nfs4_xdr_enc_fsid_present(struct rpc_rqst *req,
2845                                      struct xdr_stream *xdr,
2846                                      const void *data)
2847{
2848        const struct nfs4_fsid_present_arg *args = data;
2849        struct compound_hdr hdr = {
2850                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
2851        };
2852
2853        encode_compound_hdr(xdr, req, &hdr);
2854        encode_sequence(xdr, &args->seq_args, &hdr);
2855        encode_putfh(xdr, args->fh, &hdr);
2856        encode_getfh(xdr, &hdr);
2857        if (args->renew)
2858                encode_renew(xdr, args->clientid, &hdr);
2859        encode_nops(&hdr);
2860}
2861
2862#if defined(CONFIG_NFS_V4_1)
2863/*
2864 * BIND_CONN_TO_SESSION request
2865 */
2866static void nfs4_xdr_enc_bind_conn_to_session(struct rpc_rqst *req,
2867                                struct xdr_stream *xdr,
2868                                const void *data)
2869{
2870        const struct nfs41_bind_conn_to_session_args *args = data;
2871        struct compound_hdr hdr = {
2872                .minorversion = args->client->cl_mvops->minor_version,
2873        };
2874
2875        encode_compound_hdr(xdr, req, &hdr);
2876        encode_bind_conn_to_session(xdr, args, &hdr);
2877        encode_nops(&hdr);
2878}
2879
2880/*
2881 * EXCHANGE_ID request
2882 */
2883static void nfs4_xdr_enc_exchange_id(struct rpc_rqst *req,
2884                                     struct xdr_stream *xdr,
2885                                     const void *data)
2886{
2887        const struct nfs41_exchange_id_args *args = data;
2888        struct compound_hdr hdr = {
2889                .minorversion = args->client->cl_mvops->minor_version,
2890        };
2891
2892        encode_compound_hdr(xdr, req, &hdr);
2893        encode_exchange_id(xdr, args, &hdr);
2894        encode_nops(&hdr);
2895}
2896
2897/*
2898 * a CREATE_SESSION request
2899 */
2900static void nfs4_xdr_enc_create_session(struct rpc_rqst *req,
2901                                        struct xdr_stream *xdr,
2902                                        const void *data)
2903{
2904        const struct nfs41_create_session_args *args = data;
2905        struct compound_hdr hdr = {
2906                .minorversion = args->client->cl_mvops->minor_version,
2907        };
2908
2909        encode_compound_hdr(xdr, req, &hdr);
2910        encode_create_session(xdr, args, &hdr);
2911        encode_nops(&hdr);
2912}
2913
2914/*
2915 * a DESTROY_SESSION request
2916 */
2917static void nfs4_xdr_enc_destroy_session(struct rpc_rqst *req,
2918                                         struct xdr_stream *xdr,
2919                                         const void *data)
2920{
2921        const struct nfs4_session *session = data;
2922        struct compound_hdr hdr = {
2923                .minorversion = session->clp->cl_mvops->minor_version,
2924        };
2925
2926        encode_compound_hdr(xdr, req, &hdr);
2927        encode_destroy_session(xdr, session, &hdr);
2928        encode_nops(&hdr);
2929}
2930
2931/*
2932 * a DESTROY_CLIENTID request
2933 */
2934static void nfs4_xdr_enc_destroy_clientid(struct rpc_rqst *req,
2935                                         struct xdr_stream *xdr,
2936                                         const void *data)
2937{
2938        const struct nfs_client *clp = data;
2939        struct compound_hdr hdr = {
2940                .minorversion = clp->cl_mvops->minor_version,
2941        };
2942
2943        encode_compound_hdr(xdr, req, &hdr);
2944        encode_destroy_clientid(xdr, clp->cl_clientid, &hdr);
2945        encode_nops(&hdr);
2946}
2947
2948/*
2949 * a SEQUENCE request
2950 */
2951static void nfs4_xdr_enc_sequence(struct rpc_rqst *req, struct xdr_stream *xdr,
2952                                  const void *data)
2953{
2954        const struct nfs4_sequence_args *args = data;
2955        struct compound_hdr hdr = {
2956                .minorversion = nfs4_xdr_minorversion(args),
2957        };
2958
2959        encode_compound_hdr(xdr, req, &hdr);
2960        encode_sequence(xdr, args, &hdr);
2961        encode_nops(&hdr);
2962}
2963
2964/*
2965 * a GET_LEASE_TIME request
2966 */
2967static void nfs4_xdr_enc_get_lease_time(struct rpc_rqst *req,
2968                                        struct xdr_stream *xdr,
2969                                        const void *data)
2970{
2971        const struct nfs4_get_lease_time_args *args = data;
2972        struct compound_hdr hdr = {
2973                .minorversion = nfs4_xdr_minorversion(&args->la_seq_args),
2974        };
2975        const u32 lease_bitmap[3] = { FATTR4_WORD0_LEASE_TIME };
2976
2977        encode_compound_hdr(xdr, req, &hdr);
2978        encode_sequence(xdr, &args->la_seq_args, &hdr);
2979        encode_putrootfh(xdr, &hdr);
2980        encode_fsinfo(xdr, lease_bitmap, &hdr);
2981        encode_nops(&hdr);
2982}
2983
2984/*
2985 * a RECLAIM_COMPLETE request
2986 */
2987static void nfs4_xdr_enc_reclaim_complete(struct rpc_rqst *req,
2988                                          struct xdr_stream *xdr,
2989                                          const void *data)
2990{
2991        const struct nfs41_reclaim_complete_args *args = data;
2992        struct compound_hdr hdr = {
2993                .minorversion = nfs4_xdr_minorversion(&args->seq_args)
2994        };
2995
2996        encode_compound_hdr(xdr, req, &hdr);
2997        encode_sequence(xdr, &args->seq_args, &hdr);
2998        encode_reclaim_complete(xdr, args, &hdr);
2999        encode_nops(&hdr);
3000}
3001
3002/*
3003 * Encode GETDEVICEINFO request
3004 */
3005static void nfs4_xdr_enc_getdeviceinfo(struct rpc_rqst *req,
3006                                       struct xdr_stream *xdr,
3007                                       const void *data)
3008{
3009        const struct nfs4_getdeviceinfo_args *args = data;
3010        struct compound_hdr hdr = {
3011                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
3012        };
3013
3014        encode_compound_hdr(xdr, req, &hdr);
3015        encode_sequence(xdr, &args->seq_args, &hdr);
3016        encode_getdeviceinfo(xdr, args, &hdr);
3017
3018        /* set up reply kvec. Subtract notification bitmap max size (2)
3019         * so that notification bitmap is put in xdr_buf tail */
3020        xdr_inline_pages(&req->rq_rcv_buf, (hdr.replen - 2) << 2,
3021                         args->pdev->pages, args->pdev->pgbase,
3022                         args->pdev->pglen);
3023
3024        encode_nops(&hdr);
3025}
3026
3027/*
3028 *  Encode LAYOUTGET request
3029 */
3030static void nfs4_xdr_enc_layoutget(struct rpc_rqst *req,
3031                                   struct xdr_stream *xdr,
3032                                   const void *data)
3033{
3034        const struct nfs4_layoutget_args *args = data;
3035        struct compound_hdr hdr = {
3036                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
3037        };
3038
3039        encode_compound_hdr(xdr, req, &hdr);
3040        encode_sequence(xdr, &args->seq_args, &hdr);
3041        encode_putfh(xdr, NFS_FH(args->inode), &hdr);
3042        encode_layoutget(xdr, args, &hdr);
3043
3044        xdr_inline_pages(&req->rq_rcv_buf, hdr.replen << 2,
3045            args->layout.pages, 0, args->layout.pglen);
3046
3047        encode_nops(&hdr);
3048}
3049
3050/*
3051 *  Encode LAYOUTCOMMIT request
3052 */
3053static void nfs4_xdr_enc_layoutcommit(struct rpc_rqst *req,
3054                                      struct xdr_stream *xdr,
3055                                      const void *priv)
3056{
3057        const struct nfs4_layoutcommit_args *args = priv;
3058        struct nfs4_layoutcommit_data *data =
3059                container_of(args, struct nfs4_layoutcommit_data, args);
3060        struct compound_hdr hdr = {
3061                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
3062        };
3063
3064        encode_compound_hdr(xdr, req, &hdr);
3065        encode_sequence(xdr, &args->seq_args, &hdr);
3066        encode_putfh(xdr, NFS_FH(args->inode), &hdr);
3067        encode_layoutcommit(xdr, data->args.inode, args, &hdr);
3068        encode_getfattr(xdr, args->bitmask, &hdr);
3069        encode_nops(&hdr);
3070}
3071
3072/*
3073 * Encode LAYOUTRETURN request
3074 */
3075static void nfs4_xdr_enc_layoutreturn(struct rpc_rqst *req,
3076                                      struct xdr_stream *xdr,
3077                                      const void *data)
3078{
3079        const struct nfs4_layoutreturn_args *args = data;
3080        struct compound_hdr hdr = {
3081                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
3082        };
3083
3084        encode_compound_hdr(xdr, req, &hdr);
3085        encode_sequence(xdr, &args->seq_args, &hdr);
3086        encode_putfh(xdr, NFS_FH(args->inode), &hdr);
3087        encode_layoutreturn(xdr, args, &hdr);
3088        encode_nops(&hdr);
3089}
3090
3091/*
3092 * Encode SECINFO_NO_NAME request
3093 */
3094static void nfs4_xdr_enc_secinfo_no_name(struct rpc_rqst *req,
3095                                        struct xdr_stream *xdr,
3096                                        const void *data)
3097{
3098        const struct nfs41_secinfo_no_name_args *args = data;
3099        struct compound_hdr hdr = {
3100                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
3101        };
3102
3103        encode_compound_hdr(xdr, req, &hdr);
3104        encode_sequence(xdr, &args->seq_args, &hdr);
3105        encode_putrootfh(xdr, &hdr);
3106        encode_secinfo_no_name(xdr, args, &hdr);
3107        encode_nops(&hdr);
3108}
3109
3110/*
3111 *  Encode TEST_STATEID request
3112 */
3113static void nfs4_xdr_enc_test_stateid(struct rpc_rqst *req,
3114                                      struct xdr_stream *xdr,
3115                                      const void *data)
3116{
3117        const struct nfs41_test_stateid_args *args = data;
3118        struct compound_hdr hdr = {
3119                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
3120        };
3121
3122        encode_compound_hdr(xdr, req, &hdr);
3123        encode_sequence(xdr, &args->seq_args, &hdr);
3124        encode_test_stateid(xdr, args, &hdr);
3125        encode_nops(&hdr);
3126}
3127
3128/*
3129 *  Encode FREE_STATEID request
3130 */
3131static void nfs4_xdr_enc_free_stateid(struct rpc_rqst *req,
3132                                     struct xdr_stream *xdr,
3133                                     const void *data)
3134{
3135        const struct nfs41_free_stateid_args *args = data;
3136        struct compound_hdr hdr = {
3137                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
3138        };
3139
3140        encode_compound_hdr(xdr, req, &hdr);
3141        encode_sequence(xdr, &args->seq_args, &hdr);
3142        encode_free_stateid(xdr, args, &hdr);
3143        encode_nops(&hdr);
3144}
3145#endif /* CONFIG_NFS_V4_1 */
3146
3147static void print_overflow_msg(const char *func, const struct xdr_stream *xdr)
3148{
3149        dprintk("nfs: %s: prematurely hit end of receive buffer. "
3150                "Remaining buffer length is %tu words.\n",
3151                func, xdr->end - xdr->p);
3152}
3153
3154static int decode_opaque_inline(struct xdr_stream *xdr, unsigned int *len, char **string)
3155{
3156        ssize_t ret = xdr_stream_decode_opaque_inline(xdr, (void **)string,
3157                        NFS4_OPAQUE_LIMIT);
3158        if (unlikely(ret < 0)) {
3159                if (ret == -EBADMSG)
3160                        print_overflow_msg(__func__, xdr);
3161                return -EIO;
3162        }
3163        *len = ret;
3164        return 0;
3165}
3166
3167static int decode_compound_hdr(struct xdr_stream *xdr, struct compound_hdr *hdr)
3168{
3169        __be32 *p;
3170
3171        p = xdr_inline_decode(xdr, 8);
3172        if (unlikely(!p))
3173                goto out_overflow;
3174        hdr->status = be32_to_cpup(p++);
3175        hdr->taglen = be32_to_cpup(p);
3176
3177        p = xdr_inline_decode(xdr, hdr->taglen + 4);
3178        if (unlikely(!p))
3179                goto out_overflow;
3180        hdr->tag = (char *)p;
3181        p += XDR_QUADLEN(hdr->taglen);
3182        hdr->nops = be32_to_cpup(p);
3183        if (unlikely(hdr->nops < 1))
3184                return nfs4_stat_to_errno(hdr->status);
3185        return 0;
3186out_overflow:
3187        print_overflow_msg(__func__, xdr);
3188        return -EIO;
3189}
3190
3191static bool __decode_op_hdr(struct xdr_stream *xdr, enum nfs_opnum4 expected,
3192                int *nfs_retval)
3193{
3194        __be32 *p;
3195        uint32_t opnum;
3196        int32_t nfserr;
3197
3198        p = xdr_inline_decode(xdr, 8);
3199        if (unlikely(!p))
3200                goto out_overflow;
3201        opnum = be32_to_cpup(p++);
3202        if (unlikely(opnum != expected))
3203                goto out_bad_operation;
3204        nfserr = be32_to_cpup(p);
3205        if (nfserr == NFS_OK)
3206                *nfs_retval = 0;
3207        else
3208                *nfs_retval = nfs4_stat_to_errno(nfserr);
3209        return true;
3210out_bad_operation:
3211        dprintk("nfs: Server returned operation"
3212                " %d but we issued a request for %d\n",
3213                        opnum, expected);
3214        *nfs_retval = -EREMOTEIO;
3215        return false;
3216out_overflow:
3217        print_overflow_msg(__func__, xdr);
3218        *nfs_retval = -EIO;
3219        return false;
3220}
3221
3222static int decode_op_hdr(struct xdr_stream *xdr, enum nfs_opnum4 expected)
3223{
3224        int retval;
3225
3226        __decode_op_hdr(xdr, expected, &retval);
3227        return retval;
3228}
3229
3230/* Dummy routine */
3231static int decode_ace(struct xdr_stream *xdr, void *ace)
3232{
3233        __be32 *p;
3234        unsigned int strlen;
3235        char *str;
3236
3237        p = xdr_inline_decode(xdr, 12);
3238        if (likely(p))
3239                return decode_opaque_inline(xdr, &strlen, &str);
3240        print_overflow_msg(__func__, xdr);
3241        return -EIO;
3242}
3243
3244static ssize_t
3245decode_bitmap4(struct xdr_stream *xdr, uint32_t *bitmap, size_t sz)
3246{
3247        ssize_t ret;
3248
3249        ret = xdr_stream_decode_uint32_array(xdr, bitmap, sz);
3250        if (likely(ret >= 0))
3251                return ret;
3252        if (ret == -EMSGSIZE)
3253                return sz;
3254        print_overflow_msg(__func__, xdr);
3255        return -EIO;
3256}
3257
3258static int decode_attr_bitmap(struct xdr_stream *xdr, uint32_t *bitmap)
3259{
3260        ssize_t ret;
3261        ret = decode_bitmap4(xdr, bitmap, 3);
3262        return ret < 0 ? ret : 0;
3263}
3264
3265static int decode_attr_length(struct xdr_stream *xdr, uint32_t *attrlen, unsigned int *savep)
3266{
3267        __be32 *p;
3268
3269        p = xdr_inline_decode(xdr, 4);
3270        if (unlikely(!p))
3271                goto out_overflow;
3272        *attrlen = be32_to_cpup(p);
3273        *savep = xdr_stream_pos(xdr);
3274        return 0;
3275out_overflow:
3276        print_overflow_msg(__func__, xdr);
3277        return -EIO;
3278}
3279
3280static int decode_attr_supported(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *bitmask)
3281{
3282        if (likely(bitmap[0] & FATTR4_WORD0_SUPPORTED_ATTRS)) {
3283                int ret;
3284                ret = decode_attr_bitmap(xdr, bitmask);
3285                if (unlikely(ret < 0))
3286                        return ret;
3287                bitmap[0] &= ~FATTR4_WORD0_SUPPORTED_ATTRS;
3288        } else
3289                bitmask[0] = bitmask[1] = bitmask[2] = 0;
3290        dprintk("%s: bitmask=%08x:%08x:%08x\n", __func__,
3291                bitmask[0], bitmask[1], bitmask[2]);
3292        return 0;
3293}
3294
3295static int decode_attr_type(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *type)
3296{
3297        __be32 *p;
3298        int ret = 0;
3299
3300        *type = 0;
3301        if (unlikely(bitmap[0] & (FATTR4_WORD0_TYPE - 1U)))
3302                return -EIO;
3303        if (likely(bitmap[0] & FATTR4_WORD0_TYPE)) {
3304                p = xdr_inline_decode(xdr, 4);
3305                if (unlikely(!p))
3306                        goto out_overflow;
3307                *type = be32_to_cpup(p);
3308                if (*type < NF4REG || *type > NF4NAMEDATTR) {
3309                        dprintk("%s: bad type %d\n", __func__, *type);
3310                        return -EIO;
3311                }
3312                bitmap[0] &= ~FATTR4_WORD0_TYPE;
3313                ret = NFS_ATTR_FATTR_TYPE;
3314        }
3315        dprintk("%s: type=0%o\n", __func__, nfs_type2fmt[*type]);
3316        return ret;
3317out_overflow:
3318        print_overflow_msg(__func__, xdr);
3319        return -EIO;
3320}
3321
3322static int decode_attr_fh_expire_type(struct xdr_stream *xdr,
3323                                      uint32_t *bitmap, uint32_t *type)
3324{
3325        __be32 *p;
3326
3327        *type = 0;
3328        if (unlikely(bitmap[0] & (FATTR4_WORD0_FH_EXPIRE_TYPE - 1U)))
3329                return -EIO;
3330        if (likely(bitmap[0] & FATTR4_WORD0_FH_EXPIRE_TYPE)) {
3331                p = xdr_inline_decode(xdr, 4);
3332                if (unlikely(!p))
3333                        goto out_overflow;
3334                *type = be32_to_cpup(p);
3335                bitmap[0] &= ~FATTR4_WORD0_FH_EXPIRE_TYPE;
3336        }
3337        dprintk("%s: expire type=0x%x\n", __func__, *type);
3338        return 0;
3339out_overflow:
3340        print_overflow_msg(__func__, xdr);
3341        return -EIO;
3342}
3343
3344static int decode_attr_change(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *change)
3345{
3346        __be32 *p;
3347        int ret = 0;
3348
3349        *change = 0;
3350        if (unlikely(bitmap[0] & (FATTR4_WORD0_CHANGE - 1U)))
3351                return -EIO;
3352        if (likely(bitmap[0] & FATTR4_WORD0_CHANGE)) {
3353                p = xdr_inline_decode(xdr, 8);
3354                if (unlikely(!p))
3355                        goto out_overflow;
3356                xdr_decode_hyper(p, change);
3357                bitmap[0] &= ~FATTR4_WORD0_CHANGE;
3358                ret = NFS_ATTR_FATTR_CHANGE;
3359        }
3360        dprintk("%s: change attribute=%Lu\n", __func__,
3361                        (unsigned long long)*change);
3362        return ret;
3363out_overflow:
3364        print_overflow_msg(__func__, xdr);
3365        return -EIO;
3366}
3367
3368static int decode_attr_size(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *size)
3369{
3370        __be32 *p;
3371        int ret = 0;
3372
3373        *size = 0;
3374        if (unlikely(bitmap[0] & (FATTR4_WORD0_SIZE - 1U)))
3375                return -EIO;
3376        if (likely(bitmap[0] & FATTR4_WORD0_SIZE)) {
3377                p = xdr_inline_decode(xdr, 8);
3378                if (unlikely(!p))
3379                        goto out_overflow;
3380                xdr_decode_hyper(p, size);
3381                bitmap[0] &= ~FATTR4_WORD0_SIZE;
3382                ret = NFS_ATTR_FATTR_SIZE;
3383        }
3384        dprintk("%s: file size=%Lu\n", __func__, (unsigned long long)*size);
3385        return ret;
3386out_overflow:
3387        print_overflow_msg(__func__, xdr);
3388        return -EIO;
3389}
3390
3391static int decode_attr_link_support(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res)
3392{
3393        __be32 *p;
3394
3395        *res = 0;
3396        if (unlikely(bitmap[0] & (FATTR4_WORD0_LINK_SUPPORT - 1U)))
3397                return -EIO;
3398        if (likely(bitmap[0] & FATTR4_WORD0_LINK_SUPPORT)) {
3399                p = xdr_inline_decode(xdr, 4);
3400                if (unlikely(!p))
3401                        goto out_overflow;
3402                *res = be32_to_cpup(p);
3403                bitmap[0] &= ~FATTR4_WORD0_LINK_SUPPORT;
3404        }
3405        dprintk("%s: link support=%s\n", __func__, *res == 0 ? "false" : "true");
3406        return 0;
3407out_overflow:
3408        print_overflow_msg(__func__, xdr);
3409        return -EIO;
3410}
3411
3412static int decode_attr_symlink_support(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res)
3413{
3414        __be32 *p;
3415
3416        *res = 0;
3417        if (unlikely(bitmap[0] & (FATTR4_WORD0_SYMLINK_SUPPORT - 1U)))
3418                return -EIO;
3419        if (likely(bitmap[0] & FATTR4_WORD0_SYMLINK_SUPPORT)) {
3420                p = xdr_inline_decode(xdr, 4);
3421                if (unlikely(!p))
3422                        goto out_overflow;
3423                *res = be32_to_cpup(p);
3424                bitmap[0] &= ~FATTR4_WORD0_SYMLINK_SUPPORT;
3425        }
3426        dprintk("%s: symlink support=%s\n", __func__, *res == 0 ? "false" : "true");
3427        return 0;
3428out_overflow:
3429        print_overflow_msg(__func__, xdr);
3430        return -EIO;
3431}
3432
3433static int decode_attr_fsid(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs_fsid *fsid)
3434{
3435        __be32 *p;
3436        int ret = 0;
3437
3438        fsid->major = 0;
3439        fsid->minor = 0;
3440        if (unlikely(bitmap[0] & (FATTR4_WORD0_FSID - 1U)))
3441                return -EIO;
3442        if (likely(bitmap[0] & FATTR4_WORD0_FSID)) {
3443                p = xdr_inline_decode(xdr, 16);
3444                if (unlikely(!p))
3445                        goto out_overflow;
3446                p = xdr_decode_hyper(p, &fsid->major);
3447                xdr_decode_hyper(p, &fsid->minor);
3448                bitmap[0] &= ~FATTR4_WORD0_FSID;
3449                ret = NFS_ATTR_FATTR_FSID;
3450        }
3451        dprintk("%s: fsid=(0x%Lx/0x%Lx)\n", __func__,
3452                        (unsigned long long)fsid->major,
3453                        (unsigned long long)fsid->minor);
3454        return ret;
3455out_overflow:
3456        print_overflow_msg(__func__, xdr);
3457        return -EIO;
3458}
3459
3460static int decode_attr_lease_time(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res)
3461{
3462        __be32 *p;
3463
3464        *res = 60;
3465        if (unlikely(bitmap[0] & (FATTR4_WORD0_LEASE_TIME - 1U)))
3466                return -EIO;
3467        if (likely(bitmap[0] & FATTR4_WORD0_LEASE_TIME)) {
3468                p = xdr_inline_decode(xdr, 4);
3469                if (unlikely(!p))
3470                        goto out_overflow;
3471                *res = be32_to_cpup(p);
3472                bitmap[0] &= ~FATTR4_WORD0_LEASE_TIME;
3473        }
3474        dprintk("%s: file size=%u\n", __func__, (unsigned int)*res);
3475        return 0;
3476out_overflow:
3477        print_overflow_msg(__func__, xdr);
3478        return -EIO;
3479}
3480
3481static int decode_attr_error(struct xdr_stream *xdr, uint32_t *bitmap, int32_t *res)
3482{
3483        __be32 *p;
3484
3485        if (unlikely(bitmap[0] & (FATTR4_WORD0_RDATTR_ERROR - 1U)))
3486                return -EIO;
3487        if (likely(bitmap[0] & FATTR4_WORD0_RDATTR_ERROR)) {
3488                p = xdr_inline_decode(xdr, 4);
3489                if (unlikely(!p))
3490                        goto out_overflow;
3491                bitmap[0] &= ~FATTR4_WORD0_RDATTR_ERROR;
3492                *res = -be32_to_cpup(p);
3493        }
3494        return 0;
3495out_overflow:
3496        print_overflow_msg(__func__, xdr);
3497        return -EIO;
3498}
3499
3500static int decode_attr_exclcreat_supported(struct xdr_stream *xdr,
3501                                 uint32_t *bitmap, uint32_t *bitmask)
3502{
3503        if (likely(bitmap[2] & FATTR4_WORD2_SUPPATTR_EXCLCREAT)) {
3504                int ret;
3505                ret = decode_attr_bitmap(xdr, bitmask);
3506                if (unlikely(ret < 0))
3507                        return ret;
3508                bitmap[2] &= ~FATTR4_WORD2_SUPPATTR_EXCLCREAT;
3509        } else
3510                bitmask[0] = bitmask[1] = bitmask[2] = 0;
3511        dprintk("%s: bitmask=%08x:%08x:%08x\n", __func__,
3512                bitmask[0], bitmask[1], bitmask[2]);
3513        return 0;
3514}
3515
3516static int decode_attr_filehandle(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs_fh *fh)
3517{
3518        __be32 *p;
3519        u32 len;
3520
3521        if (fh != NULL)
3522                memset(fh, 0, sizeof(*fh));
3523
3524        if (unlikely(bitmap[0] & (FATTR4_WORD0_FILEHANDLE - 1U)))
3525                return -EIO;
3526        if (likely(bitmap[0] & FATTR4_WORD0_FILEHANDLE)) {
3527                p = xdr_inline_decode(xdr, 4);
3528                if (unlikely(!p))
3529                        goto out_overflow;
3530                len = be32_to_cpup(p);
3531                if (len > NFS4_FHSIZE)
3532                        return -EIO;
3533                p = xdr_inline_decode(xdr, len);
3534                if (unlikely(!p))
3535                        goto out_overflow;
3536                if (fh != NULL) {
3537                        memcpy(fh->data, p, len);
3538                        fh->size = len;
3539                }
3540                bitmap[0] &= ~FATTR4_WORD0_FILEHANDLE;
3541        }
3542        return 0;
3543out_overflow:
3544        print_overflow_msg(__func__, xdr);
3545        return -EIO;
3546}
3547
3548static int decode_attr_aclsupport(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res)
3549{
3550        __be32 *p;
3551
3552        *res = 0;
3553        if (unlikely(bitmap[0] & (FATTR4_WORD0_ACLSUPPORT - 1U)))
3554                return -EIO;
3555        if (likely(bitmap[0] & FATTR4_WORD0_ACLSUPPORT)) {
3556                p = xdr_inline_decode(xdr, 4);
3557                if (unlikely(!p))
3558                        goto out_overflow;
3559                *res = be32_to_cpup(p);
3560                bitmap[0] &= ~FATTR4_WORD0_ACLSUPPORT;
3561        }
3562        dprintk("%s: ACLs supported=%u\n", __func__, (unsigned int)*res);
3563        return 0;
3564out_overflow:
3565        print_overflow_msg(__func__, xdr);
3566        return -EIO;
3567}
3568
3569static int decode_attr_fileid(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *fileid)
3570{
3571        __be32 *p;
3572        int ret = 0;
3573
3574        *fileid = 0;
3575        if (unlikely(bitmap[0] & (FATTR4_WORD0_FILEID - 1U)))
3576                return -EIO;
3577        if (likely(bitmap[0] & FATTR4_WORD0_FILEID)) {
3578                p = xdr_inline_decode(xdr, 8);
3579                if (unlikely(!p))
3580                        goto out_overflow;
3581                xdr_decode_hyper(p, fileid);
3582                bitmap[0] &= ~FATTR4_WORD0_FILEID;
3583                ret = NFS_ATTR_FATTR_FILEID;
3584        }
3585        dprintk("%s: fileid=%Lu\n", __func__, (unsigned long long)*fileid);
3586        return ret;
3587out_overflow:
3588        print_overflow_msg(__func__, xdr);
3589        return -EIO;
3590}
3591
3592static int decode_attr_mounted_on_fileid(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *fileid)
3593{
3594        __be32 *p;
3595        int ret = 0;
3596
3597        *fileid = 0;
3598        if (unlikely(bitmap[1] & (FATTR4_WORD1_MOUNTED_ON_FILEID - 1U)))
3599                return -EIO;
3600        if (likely(bitmap[1] & FATTR4_WORD1_MOUNTED_ON_FILEID)) {
3601                p = xdr_inline_decode(xdr, 8);
3602                if (unlikely(!p))
3603                        goto out_overflow;
3604                xdr_decode_hyper(p, fileid);
3605                bitmap[1] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID;
3606                ret = NFS_ATTR_FATTR_MOUNTED_ON_FILEID;
3607        }
3608        dprintk("%s: fileid=%Lu\n", __func__, (unsigned long long)*fileid);
3609        return ret;
3610out_overflow:
3611        print_overflow_msg(__func__, xdr);
3612        return -EIO;
3613}
3614
3615static int decode_attr_files_avail(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
3616{
3617        __be32 *p;
3618        int status = 0;
3619
3620        *res = 0;
3621        if (unlikely(bitmap[0] & (FATTR4_WORD0_FILES_AVAIL - 1U)))
3622                return -EIO;
3623        if (likely(bitmap[0] & FATTR4_WORD0_FILES_AVAIL)) {
3624                p = xdr_inline_decode(xdr, 8);
3625                if (unlikely(!p))
3626                        goto out_overflow;
3627                xdr_decode_hyper(p, res);
3628                bitmap[0] &= ~FATTR4_WORD0_FILES_AVAIL;
3629        }
3630        dprintk("%s: files avail=%Lu\n", __func__, (unsigned long long)*res);
3631        return status;
3632out_overflow:
3633        print_overflow_msg(__func__, xdr);
3634        return -EIO;
3635}
3636
3637static int decode_attr_files_free(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
3638{
3639        __be32 *p;
3640        int status = 0;
3641
3642        *res = 0;
3643        if (unlikely(bitmap[0] & (FATTR4_WORD0_FILES_FREE - 1U)))
3644                return -EIO;
3645        if (likely(bitmap[0] & FATTR4_WORD0_FILES_FREE)) {
3646                p = xdr_inline_decode(xdr, 8);
3647                if (unlikely(!p))
3648                        goto out_overflow;
3649                xdr_decode_hyper(p, res);
3650                bitmap[0] &= ~FATTR4_WORD0_FILES_FREE;
3651        }
3652        dprintk("%s: files free=%Lu\n", __func__, (unsigned long long)*res);
3653        return status;
3654out_overflow:
3655        print_overflow_msg(__func__, xdr);
3656        return -EIO;
3657}
3658
3659static int decode_attr_files_total(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
3660{
3661        __be32 *p;
3662        int status = 0;
3663
3664        *res = 0;
3665        if (unlikely(bitmap[0] & (FATTR4_WORD0_FILES_TOTAL - 1U)))
3666                return -EIO;
3667        if (likely(bitmap[0] & FATTR4_WORD0_FILES_TOTAL)) {
3668                p = xdr_inline_decode(xdr, 8);
3669                if (unlikely(!p))
3670                        goto out_overflow;
3671                xdr_decode_hyper(p, res);
3672                bitmap[0] &= ~FATTR4_WORD0_FILES_TOTAL;
3673        }
3674        dprintk("%s: files total=%Lu\n", __func__, (unsigned long long)*res);
3675        return status;
3676out_overflow:
3677        print_overflow_msg(__func__, xdr);
3678        return -EIO;
3679}
3680
3681static int decode_pathname(struct xdr_stream *xdr, struct nfs4_pathname *path)
3682{
3683        u32 n;
3684        __be32 *p;
3685        int status = 0;
3686
3687        p = xdr_inline_decode(xdr, 4);
3688        if (unlikely(!p))
3689                goto out_overflow;
3690        n = be32_to_cpup(p);
3691        if (n == 0)
3692                goto root_path;
3693        dprintk("pathname4: ");
3694        if (n > NFS4_PATHNAME_MAXCOMPONENTS) {
3695                dprintk("cannot parse %d components in path\n", n);
3696                goto out_eio;
3697        }
3698        for (path->ncomponents = 0; path->ncomponents < n; path->ncomponents++) {
3699                struct nfs4_string *component = &path->components[path->ncomponents];
3700                status = decode_opaque_inline(xdr, &component->len, &component->data);
3701                if (unlikely(status != 0))
3702                        goto out_eio;
3703                ifdebug (XDR)
3704                        pr_cont("%s%.*s ",
3705                                (path->ncomponents != n ? "/ " : ""),
3706                                component->len, component->data);
3707        }
3708out:
3709        return status;
3710root_path:
3711/* a root pathname is sent as a zero component4 */
3712        path->ncomponents = 1;
3713        path->components[0].len=0;
3714        path->components[0].data=NULL;
3715        dprintk("pathname4: /\n");
3716        goto out;
3717out_eio:
3718        dprintk(" status %d", status);
3719        status = -EIO;
3720        goto out;
3721out_overflow:
3722        print_overflow_msg(__func__, xdr);
3723        return -EIO;
3724}
3725
3726static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs4_fs_locations *res)
3727{
3728        int n;
3729        __be32 *p;
3730        int status = -EIO;
3731
3732        if (unlikely(bitmap[0] & (FATTR4_WORD0_FS_LOCATIONS -1U)))
3733                goto out;
3734        status = 0;
3735        if (unlikely(!(bitmap[0] & FATTR4_WORD0_FS_LOCATIONS)))
3736                goto out;
3737        bitmap[0] &= ~FATTR4_WORD0_FS_LOCATIONS;
3738        status = -EIO;
3739        /* Ignore borken servers that return unrequested attrs */
3740        if (unlikely(res == NULL))
3741                goto out;
3742        dprintk("%s: fsroot:\n", __func__);
3743        status = decode_pathname(xdr, &res->fs_path);
3744        if (unlikely(status != 0))
3745                goto out;
3746        p = xdr_inline_decode(xdr, 4);
3747        if (unlikely(!p))
3748                goto out_overflow;
3749        n = be32_to_cpup(p);
3750        if (n <= 0)
3751                goto out_eio;
3752        for (res->nlocations = 0; res->nlocations < n; res->nlocations++) {
3753                u32 m;
3754                struct nfs4_fs_location *loc;
3755
3756                if (res->nlocations == NFS4_FS_LOCATIONS_MAXENTRIES)
3757                        break;
3758                loc = &res->locations[res->nlocations];
3759                p = xdr_inline_decode(xdr, 4);
3760                if (unlikely(!p))
3761                        goto out_overflow;
3762                m = be32_to_cpup(p);
3763
3764                dprintk("%s: servers:\n", __func__);
3765                for (loc->nservers = 0; loc->nservers < m; loc->nservers++) {
3766                        struct nfs4_string *server;
3767
3768                        if (loc->nservers == NFS4_FS_LOCATION_MAXSERVERS) {
3769                                unsigned int i;
3770                                dprintk("%s: using first %u of %u servers "
3771                                        "returned for location %u\n",
3772                                                __func__,
3773                                                NFS4_FS_LOCATION_MAXSERVERS,
3774                                                m, res->nlocations);
3775                                for (i = loc->nservers; i < m; i++) {
3776                                        unsigned int len;
3777                                        char *data;
3778                                        status = decode_opaque_inline(xdr, &len, &data);
3779                                        if (unlikely(status != 0))
3780                                                goto out_eio;
3781                                }
3782                                break;
3783                        }
3784                        server = &loc->servers[loc->nservers];
3785                        status = decode_opaque_inline(xdr, &server->len, &server->data);
3786                        if (unlikely(status != 0))
3787                                goto out_eio;
3788                        dprintk("%s ", server->data);
3789                }
3790                status = decode_pathname(xdr, &loc->rootpath);
3791                if (unlikely(status != 0))
3792                        goto out_eio;
3793        }
3794        if (res->nlocations != 0)
3795                status = NFS_ATTR_FATTR_V4_LOCATIONS;
3796out:
3797        dprintk("%s: fs_locations done, error = %d\n", __func__, status);
3798        return status;
3799out_overflow:
3800        print_overflow_msg(__func__, xdr);
3801out_eio:
3802        status = -EIO;
3803        goto out;
3804}
3805
3806static int decode_attr_maxfilesize(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
3807{
3808        __be32 *p;
3809        int status = 0;
3810
3811        *res = 0;
3812        if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXFILESIZE - 1U)))
3813                return -EIO;
3814        if (likely(bitmap[0] & FATTR4_WORD0_MAXFILESIZE)) {
3815                p = xdr_inline_decode(xdr, 8);
3816                if (unlikely(!p))
3817                        goto out_overflow;
3818                xdr_decode_hyper(p, res);
3819                bitmap[0] &= ~FATTR4_WORD0_MAXFILESIZE;
3820        }
3821        dprintk("%s: maxfilesize=%Lu\n", __func__, (unsigned long long)*res);
3822        return status;
3823out_overflow:
3824        print_overflow_msg(__func__, xdr);
3825        return -EIO;
3826}
3827
3828static int decode_attr_maxlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *maxlink)
3829{
3830        __be32 *p;
3831        int status = 0;
3832
3833        *maxlink = 1;
3834        if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXLINK - 1U)))
3835                return -EIO;
3836        if (likely(bitmap[0] & FATTR4_WORD0_MAXLINK)) {
3837                p = xdr_inline_decode(xdr, 4);
3838                if (unlikely(!p))
3839                        goto out_overflow;
3840                *maxlink = be32_to_cpup(p);
3841                bitmap[0] &= ~FATTR4_WORD0_MAXLINK;
3842        }
3843        dprintk("%s: maxlink=%u\n", __func__, *maxlink);
3844        return status;
3845out_overflow:
3846        print_overflow_msg(__func__, xdr);
3847        return -EIO;
3848}
3849
3850static int decode_attr_maxname(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *maxname)
3851{
3852        __be32 *p;
3853        int status = 0;
3854
3855        *maxname = 1024;
3856        if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXNAME - 1U)))
3857                return -EIO;
3858        if (likely(bitmap[0] & FATTR4_WORD0_MAXNAME)) {
3859                p = xdr_inline_decode(xdr, 4);
3860                if (unlikely(!p))
3861                        goto out_overflow;
3862                *maxname = be32_to_cpup(p);
3863                bitmap[0] &= ~FATTR4_WORD0_MAXNAME;
3864        }
3865        dprintk("%s: maxname=%u\n", __func__, *maxname);
3866        return status;
3867out_overflow:
3868        print_overflow_msg(__func__, xdr);
3869        return -EIO;
3870}
3871
3872static int decode_attr_maxread(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res)
3873{
3874        __be32 *p;
3875        int status = 0;
3876
3877        *res = 1024;
3878        if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXREAD - 1U)))
3879                return -EIO;
3880        if (likely(bitmap[0] & FATTR4_WORD0_MAXREAD)) {
3881                uint64_t maxread;
3882                p = xdr_inline_decode(xdr, 8);
3883                if (unlikely(!p))
3884                        goto out_overflow;
3885                xdr_decode_hyper(p, &maxread);
3886                if (maxread > 0x7FFFFFFF)
3887                        maxread = 0x7FFFFFFF;
3888                *res = (uint32_t)maxread;
3889                bitmap[0] &= ~FATTR4_WORD0_MAXREAD;
3890        }
3891        dprintk("%s: maxread=%lu\n", __func__, (unsigned long)*res);
3892        return status;
3893out_overflow:
3894        print_overflow_msg(__func__, xdr);
3895        return -EIO;
3896}
3897
3898static int decode_attr_maxwrite(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res)
3899{
3900        __be32 *p;
3901        int status = 0;
3902
3903        *res = 1024;
3904        if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXWRITE - 1U)))
3905                return -EIO;
3906        if (likely(bitmap[0] & FATTR4_WORD0_MAXWRITE)) {
3907                uint64_t maxwrite;
3908                p = xdr_inline_decode(xdr, 8);
3909                if (unlikely(!p))
3910                        goto out_overflow;
3911                xdr_decode_hyper(p, &maxwrite);
3912                if (maxwrite > 0x7FFFFFFF)
3913                        maxwrite = 0x7FFFFFFF;
3914                *res = (uint32_t)maxwrite;
3915                bitmap[0] &= ~FATTR4_WORD0_MAXWRITE;
3916        }
3917        dprintk("%s: maxwrite=%lu\n", __func__, (unsigned long)*res);
3918        return status;
3919out_overflow:
3920        print_overflow_msg(__func__, xdr);
3921        return -EIO;
3922}
3923
3924static int decode_attr_mode(struct xdr_stream *xdr, uint32_t *bitmap, umode_t *mode)
3925{
3926        uint32_t tmp;
3927        __be32 *p;
3928        int ret = 0;
3929
3930        *mode = 0;
3931        if (unlikely(bitmap[1] & (FATTR4_WORD1_MODE - 1U)))
3932                return -EIO;
3933        if (likely(bitmap[1] & FATTR4_WORD1_MODE)) {
3934                p = xdr_inline_decode(xdr, 4);
3935                if (unlikely(!p))
3936                        goto out_overflow;
3937                tmp = be32_to_cpup(p);
3938                *mode = tmp & ~S_IFMT;
3939                bitmap[1] &= ~FATTR4_WORD1_MODE;
3940                ret = NFS_ATTR_FATTR_MODE;
3941        }
3942        dprintk("%s: file mode=0%o\n", __func__, (unsigned int)*mode);
3943        return ret;
3944out_overflow:
3945        print_overflow_msg(__func__, xdr);
3946        return -EIO;
3947}
3948
3949static int decode_attr_nlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *nlink)
3950{
3951        __be32 *p;
3952        int ret = 0;
3953
3954        *nlink = 1;
3955        if (unlikely(bitmap[1] & (FATTR4_WORD1_NUMLINKS - 1U)))
3956                return -EIO;
3957        if (likely(bitmap[1] & FATTR4_WORD1_NUMLINKS)) {
3958                p = xdr_inline_decode(xdr, 4);
3959                if (unlikely(!p))
3960                        goto out_overflow;
3961                *nlink = be32_to_cpup(p);
3962                bitmap[1] &= ~FATTR4_WORD1_NUMLINKS;
3963                ret = NFS_ATTR_FATTR_NLINK;
3964        }
3965        dprintk("%s: nlink=%u\n", __func__, (unsigned int)*nlink);
3966        return ret;
3967out_overflow:
3968        print_overflow_msg(__func__, xdr);
3969        return -EIO;
3970}
3971
3972static ssize_t decode_nfs4_string(struct xdr_stream *xdr,
3973                struct nfs4_string *name, gfp_t gfp_flags)
3974{
3975        ssize_t ret;
3976
3977        ret = xdr_stream_decode_string_dup(xdr, &name->data,
3978                        XDR_MAX_NETOBJ, gfp_flags);
3979        name->len = 0;
3980        if (ret > 0)
3981                name->len = ret;
3982        return ret;
3983}
3984
3985static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap,
3986                const struct nfs_server *server, kuid_t *uid,
3987                struct nfs4_string *owner_name)
3988{
3989        ssize_t len;
3990        char *p;
3991
3992        *uid = make_kuid(&init_user_ns, -2);
3993        if (unlikely(bitmap[1] & (FATTR4_WORD1_OWNER - 1U)))
3994                return -EIO;
3995        if (!(bitmap[1] & FATTR4_WORD1_OWNER))
3996                return 0;
3997        bitmap[1] &= ~FATTR4_WORD1_OWNER;
3998
3999        if (owner_name != NULL) {
4000                len = decode_nfs4_string(xdr, owner_name, GFP_NOIO);
4001                if (len <= 0)
4002                        goto out;
4003                dprintk("%s: name=%s\n", __func__, owner_name->data);
4004                return NFS_ATTR_FATTR_OWNER_NAME;
4005        } else {
4006                len = xdr_stream_decode_opaque_inline(xdr, (void **)&p,
4007                                XDR_MAX_NETOBJ);
4008                if (len <= 0 || nfs_map_name_to_uid(server, p, len, uid) != 0)
4009                        goto out;
4010                dprintk("%s: uid=%d\n", __func__, (int)from_kuid(&init_user_ns, *uid));
4011                return NFS_ATTR_FATTR_OWNER;
4012        }
4013out:
4014        if (len != -EBADMSG)
4015                return 0;
4016        print_overflow_msg(__func__, xdr);
4017        return -EIO;
4018}
4019
4020static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap,
4021                const struct nfs_server *server, kgid_t *gid,
4022                struct nfs4_string *group_name)
4023{
4024        ssize_t len;
4025        char *p;
4026
4027        *gid = make_kgid(&init_user_ns, -2);
4028        if (unlikely(bitmap[1] & (FATTR4_WORD1_OWNER_GROUP - 1U)))
4029                return -EIO;
4030        if (!(bitmap[1] & FATTR4_WORD1_OWNER_GROUP))
4031                return 0;
4032        bitmap[1] &= ~FATTR4_WORD1_OWNER_GROUP;
4033
4034        if (group_name != NULL) {
4035                len = decode_nfs4_string(xdr, group_name, GFP_NOIO);
4036                if (len <= 0)
4037                        goto out;
4038                dprintk("%s: name=%s\n", __func__, group_name->data);
4039                return NFS_ATTR_FATTR_GROUP_NAME;
4040        } else {
4041                len = xdr_stream_decode_opaque_inline(xdr, (void **)&p,
4042                                XDR_MAX_NETOBJ);
4043                if (len <= 0 || nfs_map_group_to_gid(server, p, len, gid) != 0)
4044                        goto out;
4045                dprintk("%s: gid=%d\n", __func__, (int)from_kgid(&init_user_ns, *gid));
4046                return NFS_ATTR_FATTR_GROUP;
4047        }
4048out:
4049        if (len != -EBADMSG)
4050                return 0;
4051        print_overflow_msg(__func__, xdr);
4052        return -EIO;
4053}
4054
4055static int decode_attr_rdev(struct xdr_stream *xdr, uint32_t *bitmap, dev_t *rdev)
4056{
4057        uint32_t major = 0, minor = 0;
4058        __be32 *p;
4059        int ret = 0;
4060
4061        *rdev = MKDEV(0,0);
4062        if (unlikely(bitmap[1] & (FATTR4_WORD1_RAWDEV - 1U)))
4063                return -EIO;
4064        if (likely(bitmap[1] & FATTR4_WORD1_RAWDEV)) {
4065                dev_t tmp;
4066
4067                p = xdr_inline_decode(xdr, 8);
4068                if (unlikely(!p))
4069                        goto out_overflow;
4070                major = be32_to_cpup(p++);
4071                minor = be32_to_cpup(p);
4072                tmp = MKDEV(major, minor);
4073                if (MAJOR(tmp) == major && MINOR(tmp) == minor)
4074                        *rdev = tmp;
4075                bitmap[1] &= ~ FATTR4_WORD1_RAWDEV;
4076                ret = NFS_ATTR_FATTR_RDEV;
4077        }
4078        dprintk("%s: rdev=(0x%x:0x%x)\n", __func__, major, minor);
4079        return ret;
4080out_overflow:
4081        print_overflow_msg(__func__, xdr);
4082        return -EIO;
4083}
4084
4085static int decode_attr_space_avail(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
4086{
4087        __be32 *p;
4088        int status = 0;
4089
4090        *res = 0;
4091        if (unlikely(bitmap[1] & (FATTR4_WORD1_SPACE_AVAIL - 1U)))
4092                return -EIO;
4093        if (likely(bitmap[1] & FATTR4_WORD1_SPACE_AVAIL)) {
4094                p = xdr_inline_decode(xdr, 8);
4095                if (unlikely(!p))
4096                        goto out_overflow;
4097                xdr_decode_hyper(p, res);
4098                bitmap[1] &= ~FATTR4_WORD1_SPACE_AVAIL;
4099        }
4100        dprintk("%s: space avail=%Lu\n", __func__, (unsigned long long)*res);
4101        return status;
4102out_overflow:
4103        print_overflow_msg(__func__, xdr);
4104        return -EIO;
4105}
4106
4107static int decode_attr_space_free(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
4108{
4109        __be32 *p;
4110        int status = 0;
4111
4112        *res = 0;
4113        if (unlikely(bitmap[1] & (FATTR4_WORD1_SPACE_FREE - 1U)))
4114                return -EIO;
4115        if (likely(bitmap[1] & FATTR4_WORD1_SPACE_FREE)) {
4116                p = xdr_inline_decode(xdr, 8);
4117                if (unlikely(!p))
4118                        goto out_overflow;
4119                xdr_decode_hyper(p, res);
4120                bitmap[1] &= ~FATTR4_WORD1_SPACE_FREE;
4121        }
4122        dprintk("%s: space free=%Lu\n", __func__, (unsigned long long)*res);
4123        return status;
4124out_overflow:
4125        print_overflow_msg(__func__, xdr);
4126        return -EIO;
4127}
4128
4129static int decode_attr_space_total(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
4130{
4131        __be32 *p;
4132        int status = 0;
4133
4134        *res = 0;
4135        if (unlikely(bitmap[1] & (FATTR4_WORD1_SPACE_TOTAL - 1U)))
4136                return -EIO;
4137        if (likely(bitmap[1] & FATTR4_WORD1_SPACE_TOTAL)) {
4138                p = xdr_inline_decode(xdr, 8);
4139                if (unlikely(!p))
4140                        goto out_overflow;
4141                xdr_decode_hyper(p, res);
4142                bitmap[1] &= ~FATTR4_WORD1_SPACE_TOTAL;
4143        }
4144        dprintk("%s: space total=%Lu\n", __func__, (unsigned long long)*res);
4145        return status;
4146out_overflow:
4147        print_overflow_msg(__func__, xdr);
4148        return -EIO;
4149}
4150
4151static int decode_attr_space_used(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *used)
4152{
4153        __be32 *p;
4154        int ret = 0;
4155
4156        *used = 0;
4157        if (unlikely(bitmap[1] & (FATTR4_WORD1_SPACE_USED - 1U)))
4158                return -EIO;
4159        if (likely(bitmap[1] & FATTR4_WORD1_SPACE_USED)) {
4160                p = xdr_inline_decode(xdr, 8);
4161                if (unlikely(!p))
4162                        goto out_overflow;
4163                xdr_decode_hyper(p, used);
4164                bitmap[1] &= ~FATTR4_WORD1_SPACE_USED;
4165                ret = NFS_ATTR_FATTR_SPACE_USED;
4166        }
4167        dprintk("%s: space used=%Lu\n", __func__,
4168                        (unsigned long long)*used);
4169        return ret;
4170out_overflow:
4171        print_overflow_msg(__func__, xdr);
4172        return -EIO;
4173}
4174
4175static __be32 *
4176xdr_decode_nfstime4(__be32 *p, struct timespec *t)
4177{
4178        __u64 sec;
4179
4180        p = xdr_decode_hyper(p, &sec);
4181        t-> tv_sec = (time_t)sec;
4182        t->tv_nsec = be32_to_cpup(p++);
4183        return p;
4184}
4185
4186static int decode_attr_time(struct xdr_stream *xdr, struct timespec *time)
4187{
4188        __be32 *p;
4189
4190        p = xdr_inline_decode(xdr, nfstime4_maxsz << 2);
4191        if (unlikely(!p))
4192                goto out_overflow;
4193        xdr_decode_nfstime4(p, time);
4194        return 0;
4195out_overflow:
4196        print_overflow_msg(__func__, xdr);
4197        return -EIO;
4198}
4199
4200static int decode_attr_time_access(struct xdr_stream *xdr, uint32_t *bitmap, struct timespec *time)
4201{
4202        int status = 0;
4203
4204        time->tv_sec = 0;
4205        time->tv_nsec = 0;
4206        if (unlikely(bitmap[1] & (FATTR4_WORD1_TIME_ACCESS - 1U)))
4207                return -EIO;
4208        if (likely(bitmap[1] & FATTR4_WORD1_TIME_ACCESS)) {
4209                status = decode_attr_time(xdr, time);
4210                if (status == 0)
4211                        status = NFS_ATTR_FATTR_ATIME;
4212                bitmap[1] &= ~FATTR4_WORD1_TIME_ACCESS;
4213        }
4214        dprintk("%s: atime=%ld\n", __func__, (long)time->tv_sec);
4215        return status;
4216}
4217
4218static int decode_attr_time_metadata(struct xdr_stream *xdr, uint32_t *bitmap, struct timespec *time)
4219{
4220        int status = 0;
4221
4222        time->tv_sec = 0;
4223        time->tv_nsec = 0;
4224        if (unlikely(bitmap[1] & (FATTR4_WORD1_TIME_METADATA - 1U)))
4225                return -EIO;
4226        if (likely(bitmap[1] & FATTR4_WORD1_TIME_METADATA)) {
4227                status = decode_attr_time(xdr, time);
4228                if (status == 0)
4229                        status = NFS_ATTR_FATTR_CTIME;
4230                bitmap[1] &= ~FATTR4_WORD1_TIME_METADATA;
4231        }
4232        dprintk("%s: ctime=%ld\n", __func__, (long)time->tv_sec);
4233        return status;
4234}
4235
4236static int decode_attr_time_delta(struct xdr_stream *xdr, uint32_t *bitmap,
4237                                  struct timespec *time)
4238{
4239        int status = 0;
4240
4241        time->tv_sec = 0;
4242        time->tv_nsec = 0;
4243        if (unlikely(bitmap[1] & (FATTR4_WORD1_TIME_DELTA - 1U)))
4244                return -EIO;
4245        if (likely(bitmap[1] & FATTR4_WORD1_TIME_DELTA)) {
4246                status = decode_attr_time(xdr, time);
4247                bitmap[1] &= ~FATTR4_WORD1_TIME_DELTA;
4248        }
4249        dprintk("%s: time_delta=%ld %ld\n", __func__, (long)time->tv_sec,
4250                (long)time->tv_nsec);
4251        return status;
4252}
4253
4254static int decode_attr_security_label(struct xdr_stream *xdr, uint32_t *bitmap,
4255                                        struct nfs4_label *label)
4256{
4257        uint32_t pi = 0;
4258        uint32_t lfs = 0;
4259        __u32 len;
4260        __be32 *p;
4261        int status = 0;
4262
4263        if (unlikely(bitmap[2] & (FATTR4_WORD2_SECURITY_LABEL - 1U)))
4264                return -EIO;
4265        if (likely(bitmap[2] & FATTR4_WORD2_SECURITY_LABEL)) {
4266                p = xdr_inline_decode(xdr, 4);
4267                if (unlikely(!p))
4268                        goto out_overflow;
4269                lfs = be32_to_cpup(p++);
4270                p = xdr_inline_decode(xdr, 4);
4271                if (unlikely(!p))
4272                        goto out_overflow;
4273                pi = be32_to_cpup(p++);
4274                p = xdr_inline_decode(xdr, 4);
4275                if (unlikely(!p))
4276                        goto out_overflow;
4277                len = be32_to_cpup(p++);
4278                p = xdr_inline_decode(xdr, len);
4279                if (unlikely(!p))
4280                        goto out_overflow;
4281                if (len < NFS4_MAXLABELLEN) {
4282                        if (label) {
4283                                memcpy(label->label, p, len);
4284                                label->len = len;
4285                                label->pi = pi;
4286                                label->lfs = lfs;
4287                                status = NFS_ATTR_FATTR_V4_SECURITY_LABEL;
4288                        }
4289                        bitmap[2] &= ~FATTR4_WORD2_SECURITY_LABEL;
4290                } else
4291                        printk(KERN_WARNING "%s: label too long (%u)!\n",
4292                                        __func__, len);
4293        }
4294        if (label && label->label)
4295                dprintk("%s: label=%s, len=%d, PI=%d, LFS=%d\n", __func__,
4296                        (char *)label->label, label->len, label->pi, label->lfs);
4297        return status;
4298
4299out_overflow:
4300        print_overflow_msg(__func__, xdr);
4301        return -EIO;
4302}
4303
4304static int decode_attr_time_modify(struct xdr_stream *xdr, uint32_t *bitmap, struct timespec *time)
4305{
4306        int status = 0;
4307
4308        time->tv_sec = 0;
4309        time->tv_nsec = 0;
4310        if (unlikely(bitmap[1] & (FATTR4_WORD1_TIME_MODIFY - 1U)))
4311                return -EIO;
4312        if (likely(bitmap[1] & FATTR4_WORD1_TIME_MODIFY)) {
4313                status = decode_attr_time(xdr, time);
4314                if (status == 0)
4315                        status = NFS_ATTR_FATTR_MTIME;
4316                bitmap[1] &= ~FATTR4_WORD1_TIME_MODIFY;
4317        }
4318        dprintk("%s: mtime=%ld\n", __func__, (long)time->tv_sec);
4319        return status;
4320}
4321
4322static int verify_attr_len(struct xdr_stream *xdr, unsigned int savep, uint32_t attrlen)
4323{
4324        unsigned int attrwords = XDR_QUADLEN(attrlen);
4325        unsigned int nwords = (xdr_stream_pos(xdr) - savep) >> 2;
4326
4327        if (unlikely(attrwords != nwords)) {
4328                dprintk("%s: server returned incorrect attribute length: "
4329                        "%u %c %u\n",
4330                                __func__,
4331                                attrwords << 2,
4332                                (attrwords < nwords) ? '<' : '>',
4333                                nwords << 2);
4334                return -EIO;
4335        }
4336        return 0;
4337}
4338
4339static int decode_change_info(struct xdr_stream *xdr, struct nfs4_change_info *cinfo)
4340{
4341        __be32 *p;
4342
4343        p = xdr_inline_decode(xdr, 20);
4344        if (unlikely(!p))
4345                goto out_overflow;
4346        cinfo->atomic = be32_to_cpup(p++);
4347        p = xdr_decode_hyper(p, &cinfo->before);
4348        xdr_decode_hyper(p, &cinfo->after);
4349        return 0;
4350out_overflow:
4351        print_overflow_msg(__func__, xdr);
4352        return -EIO;
4353}
4354
4355static int decode_access(struct xdr_stream *xdr, u32 *supported, u32 *access)
4356{
4357        __be32 *p;
4358        uint32_t supp, acc;
4359        int status;
4360
4361        status = decode_op_hdr(xdr, OP_ACCESS);
4362        if (status)
4363                return status;
4364        p = xdr_inline_decode(xdr, 8);
4365        if (unlikely(!p))
4366                goto out_overflow;
4367        supp = be32_to_cpup(p++);
4368        acc = be32_to_cpup(p);
4369        *supported = supp;
4370        *access = acc;
4371        return 0;
4372out_overflow:
4373        print_overflow_msg(__func__, xdr);
4374        return -EIO;
4375}
4376
4377static int decode_opaque_fixed(struct xdr_stream *xdr, void *buf, size_t len)
4378{
4379        ssize_t ret = xdr_stream_decode_opaque_fixed(xdr, buf, len);
4380        if (unlikely(ret < 0)) {
4381                print_overflow_msg(__func__, xdr);
4382                return -EIO;
4383        }
4384        return 0;
4385}
4386
4387static int decode_stateid(struct xdr_stream *xdr, nfs4_stateid *stateid)
4388{
4389        return decode_opaque_fixed(xdr, stateid, NFS4_STATEID_SIZE);
4390}
4391
4392static int decode_open_stateid(struct xdr_stream *xdr, nfs4_stateid *stateid)
4393{
4394        stateid->type = NFS4_OPEN_STATEID_TYPE;
4395        return decode_stateid(xdr, stateid);
4396}
4397
4398static int decode_lock_stateid(struct xdr_stream *xdr, nfs4_stateid *stateid)
4399{
4400        stateid->type = NFS4_LOCK_STATEID_TYPE;
4401        return decode_stateid(xdr, stateid);
4402}
4403
4404static int decode_delegation_stateid(struct xdr_stream *xdr, nfs4_stateid *stateid)
4405{
4406        stateid->type = NFS4_DELEGATION_STATEID_TYPE;
4407        return decode_stateid(xdr, stateid);
4408}
4409
4410static int decode_invalid_stateid(struct xdr_stream *xdr, nfs4_stateid *stateid)
4411{
4412        nfs4_stateid dummy;
4413
4414        nfs4_stateid_copy(stateid, &invalid_stateid);
4415        return decode_stateid(xdr, &dummy);
4416}
4417
4418static int decode_close(struct xdr_stream *xdr, struct nfs_closeres *res)
4419{
4420        int status;
4421
4422        status = decode_op_hdr(xdr, OP_CLOSE);
4423        if (status != -EIO)
4424                nfs_increment_open_seqid(status, res->seqid);
4425        if (!status)
4426                status = decode_invalid_stateid(xdr, &res->stateid);
4427        return status;
4428}
4429
4430static int decode_verifier(struct xdr_stream *xdr, void *verifier)
4431{
4432        return decode_opaque_fixed(xdr, verifier, NFS4_VERIFIER_SIZE);
4433}
4434
4435static int decode_write_verifier(struct xdr_stream *xdr, struct nfs_write_verifier *verifier)
4436{
4437        return decode_opaque_fixed(xdr, verifier->data, NFS4_VERIFIER_SIZE);
4438}
4439
4440static int decode_commit(struct xdr_stream *xdr, struct nfs_commitres *res)
4441{
4442        int status;
4443
4444        status = decode_op_hdr(xdr, OP_COMMIT);
4445        if (!status)
4446                status = decode_write_verifier(xdr, &res->verf->verifier);
4447        return status;
4448}
4449
4450static int decode_create(struct xdr_stream *xdr, struct nfs4_change_info *cinfo)
4451{
4452        __be32 *p;
4453        uint32_t bmlen;
4454        int status;
4455
4456        status = decode_op_hdr(xdr, OP_CREATE);
4457        if (status)
4458                return status;
4459        if ((status = decode_change_info(xdr, cinfo)))
4460                return status;
4461        p = xdr_inline_decode(xdr, 4);
4462        if (unlikely(!p))
4463                goto out_overflow;
4464        bmlen = be32_to_cpup(p);
4465        p = xdr_inline_decode(xdr, bmlen << 2);
4466        if (likely(p))
4467                return 0;
4468out_overflow:
4469        print_overflow_msg(__func__, xdr);
4470        return -EIO;
4471}
4472
4473static int decode_server_caps(struct xdr_stream *xdr, struct nfs4_server_caps_res *res)
4474{
4475        unsigned int savep;
4476        uint32_t attrlen, bitmap[3] = {0};
4477        int status;
4478
4479        if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0)
4480                goto xdr_error;
4481        if ((status = decode_attr_bitmap(xdr, bitmap)) != 0)
4482                goto xdr_error;
4483        if ((status = decode_attr_length(xdr, &attrlen, &savep)) != 0)
4484                goto xdr_error;
4485        if ((status = decode_attr_supported(xdr, bitmap, res->attr_bitmask)) != 0)
4486                goto xdr_error;
4487        if ((status = decode_attr_fh_expire_type(xdr, bitmap,
4488                                                 &res->fh_expire_type)) != 0)
4489                goto xdr_error;
4490        if ((status = decode_attr_link_support(xdr, bitmap, &res->has_links)) != 0)
4491                goto xdr_error;
4492        if ((status = decode_attr_symlink_support(xdr, bitmap, &res->has_symlinks)) != 0)
4493                goto xdr_error;
4494        if ((status = decode_attr_aclsupport(xdr, bitmap, &res->acl_bitmask)) != 0)
4495                goto xdr_error;
4496        if ((status = decode_attr_exclcreat_supported(xdr, bitmap,
4497                                res->exclcreat_bitmask)) != 0)
4498                goto xdr_error;
4499        status = verify_attr_len(xdr, savep, attrlen);
4500xdr_error:
4501        dprintk("%s: xdr returned %d!\n", __func__, -status);
4502        return status;
4503}
4504
4505static int decode_statfs(struct xdr_stream *xdr, struct nfs_fsstat *fsstat)
4506{
4507        unsigned int savep;
4508        uint32_t attrlen, bitmap[3] = {0};
4509        int status;
4510
4511        if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0)
4512                goto xdr_error;
4513        if ((status = decode_attr_bitmap(xdr, bitmap)) != 0)
4514                goto xdr_error;
4515        if ((status = decode_attr_length(xdr, &attrlen, &savep)) != 0)
4516                goto xdr_error;
4517
4518        if ((status = decode_attr_files_avail(xdr, bitmap, &fsstat->afiles)) != 0)
4519                goto xdr_error;
4520        if ((status = decode_attr_files_free(xdr, bitmap, &fsstat->ffiles)) != 0)
4521                goto xdr_error;
4522        if ((status = decode_attr_files_total(xdr, bitmap, &fsstat->tfiles)) != 0)
4523                goto xdr_error;
4524
4525        status = -EIO;
4526        if (unlikely(bitmap[0]))
4527                goto xdr_error;
4528
4529        if ((status = decode_attr_space_avail(xdr, bitmap, &fsstat->abytes)) != 0)
4530                goto xdr_error;
4531        if ((status = decode_attr_space_free(xdr, bitmap, &fsstat->fbytes)) != 0)
4532                goto xdr_error;
4533        if ((status = decode_attr_space_total(xdr, bitmap, &fsstat->tbytes)) != 0)
4534                goto xdr_error;
4535
4536        status = verify_attr_len(xdr, savep, attrlen);
4537xdr_error:
4538        dprintk("%s: xdr returned %d!\n", __func__, -status);
4539        return status;
4540}
4541
4542static int decode_pathconf(struct xdr_stream *xdr, struct nfs_pathconf *pathconf)
4543{
4544        unsigned int savep;
4545        uint32_t attrlen, bitmap[3] = {0};
4546        int status;
4547
4548        if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0)
4549                goto xdr_error;
4550        if ((status = decode_attr_bitmap(xdr, bitmap)) != 0)
4551                goto xdr_error;
4552        if ((status = decode_attr_length(xdr, &attrlen, &savep)) != 0)
4553                goto xdr_error;
4554
4555        if ((status = decode_attr_maxlink(xdr, bitmap, &pathconf->max_link)) != 0)
4556                goto xdr_error;
4557        if ((status = decode_attr_maxname(xdr, bitmap, &pathconf->max_namelen)) != 0)
4558                goto xdr_error;
4559
4560        status = verify_attr_len(xdr, savep, attrlen);
4561xdr_error:
4562        dprintk("%s: xdr returned %d!\n", __func__, -status);
4563        return status;
4564}
4565
4566static int decode_threshold_hint(struct xdr_stream *xdr,
4567                                  uint32_t *bitmap,
4568                                  uint64_t *res,
4569                                  uint32_t hint_bit)
4570{
4571        __be32 *p;
4572
4573        *res = 0;
4574        if (likely(bitmap[0] & hint_bit)) {
4575                p = xdr_inline_decode(xdr, 8);
4576                if (unlikely(!p))
4577                        goto out_overflow;
4578                xdr_decode_hyper(p, res);
4579        }
4580        return 0;
4581out_overflow:
4582        print_overflow_msg(__func__, xdr);
4583        return -EIO;
4584}
4585
4586static int decode_first_threshold_item4(struct xdr_stream *xdr,
4587                                        struct nfs4_threshold *res)
4588{
4589        __be32 *p;
4590        unsigned int savep;
4591        uint32_t bitmap[3] = {0,}, attrlen;
4592        int status;
4593
4594        /* layout type */
4595        p = xdr_inline_decode(xdr, 4);
4596        if (unlikely(!p)) {
4597                print_overflow_msg(__func__, xdr);
4598                return -EIO;
4599        }
4600        res->l_type = be32_to_cpup(p);
4601
4602        /* thi_hintset bitmap */
4603        status = decode_attr_bitmap(xdr, bitmap);
4604        if (status < 0)
4605                goto xdr_error;
4606
4607        /* thi_hintlist length */
4608        status = decode_attr_length(xdr, &attrlen, &savep);
4609        if (status < 0)
4610                goto xdr_error;
4611        /* thi_hintlist */
4612        status = decode_threshold_hint(xdr, bitmap, &res->rd_sz, THRESHOLD_RD);
4613        if (status < 0)
4614                goto xdr_error;
4615        status = decode_threshold_hint(xdr, bitmap, &res->wr_sz, THRESHOLD_WR);
4616        if (status < 0)
4617                goto xdr_error;
4618        status = decode_threshold_hint(xdr, bitmap, &res->rd_io_sz,
4619                                       THRESHOLD_RD_IO);
4620        if (status < 0)
4621                goto xdr_error;
4622        status = decode_threshold_hint(xdr, bitmap, &res->wr_io_sz,
4623                                       THRESHOLD_WR_IO);
4624        if (status < 0)
4625                goto xdr_error;
4626
4627        status = verify_attr_len(xdr, savep, attrlen);
4628        res->bm = bitmap[0];
4629
4630        dprintk("%s bm=0x%x rd_sz=%llu wr_sz=%llu rd_io=%llu wr_io=%llu\n",
4631                 __func__, res->bm, res->rd_sz, res->wr_sz, res->rd_io_sz,
4632                res->wr_io_sz);
4633xdr_error:
4634        dprintk("%s ret=%d!\n", __func__, status);
4635        return status;
4636}
4637
4638/*
4639 * Thresholds on pNFS direct I/O vrs MDS I/O
4640 */
4641static int decode_attr_mdsthreshold(struct xdr_stream *xdr,
4642                                    uint32_t *bitmap,
4643                                    struct nfs4_threshold *res)
4644{
4645        __be32 *p;
4646        int status = 0;
4647        uint32_t num;
4648
4649        if (unlikely(bitmap[2] & (FATTR4_WORD2_MDSTHRESHOLD - 1U)))
4650                return -EIO;
4651        if (bitmap[2] & FATTR4_WORD2_MDSTHRESHOLD) {
4652                /* Did the server return an unrequested attribute? */
4653                if (unlikely(res == NULL))
4654                        return -EREMOTEIO;
4655                p = xdr_inline_decode(xdr, 4);
4656                if (unlikely(!p))
4657                        goto out_overflow;
4658                num = be32_to_cpup(p);
4659                if (num == 0)
4660                        return 0;
4661                if (num > 1)
4662                        printk(KERN_INFO "%s: Warning: Multiple pNFS layout "
4663                                "drivers per filesystem not supported\n",
4664                                __func__);
4665
4666                status = decode_first_threshold_item4(xdr, res);
4667                bitmap[2] &= ~FATTR4_WORD2_MDSTHRESHOLD;
4668        }
4669        return status;
4670out_overflow:
4671        print_overflow_msg(__func__, xdr);
4672        return -EIO;
4673}
4674
4675static int decode_getfattr_attrs(struct xdr_stream *xdr, uint32_t *bitmap,
4676                struct nfs_fattr *fattr, struct nfs_fh *fh,
4677                struct nfs4_fs_locations *fs_loc, struct nfs4_label *label,
4678                const struct nfs_server *server)
4679{
4680        int status;
4681        umode_t fmode = 0;
4682        uint32_t type;
4683        int32_t err;
4684
4685        status = decode_attr_type(xdr, bitmap, &type);
4686        if (status < 0)
4687                goto xdr_error;
4688        fattr->mode = 0;
4689        if (status != 0) {
4690                fattr->mode |= nfs_type2fmt[type];
4691                fattr->valid |= status;
4692        }
4693
4694        status = decode_attr_change(xdr, bitmap, &fattr->change_attr);
4695        if (status < 0)
4696                goto xdr_error;
4697        fattr->valid |= status;
4698
4699        status = decode_attr_size(xdr, bitmap, &fattr->size);
4700        if (status < 0)
4701                goto xdr_error;
4702        fattr->valid |= status;
4703
4704        status = decode_attr_fsid(xdr, bitmap, &fattr->fsid);
4705        if (status < 0)
4706                goto xdr_error;
4707        fattr->valid |= status;
4708
4709        err = 0;
4710        status = decode_attr_error(xdr, bitmap, &err);
4711        if (status < 0)
4712                goto xdr_error;
4713
4714        status = decode_attr_filehandle(xdr, bitmap, fh);
4715        if (status < 0)
4716                goto xdr_error;
4717
4718        status = decode_attr_fileid(xdr, bitmap, &fattr->fileid);
4719        if (status < 0)
4720                goto xdr_error;
4721        fattr->valid |= status;
4722
4723        status = decode_attr_fs_locations(xdr, bitmap, fs_loc);
4724        if (status < 0)
4725                goto xdr_error;
4726        fattr->valid |= status;
4727
4728        status = -EIO;
4729        if (unlikely(bitmap[0]))
4730                goto xdr_error;
4731
4732        status = decode_attr_mode(xdr, bitmap, &fmode);
4733        if (status < 0)
4734                goto xdr_error;
4735        if (status != 0) {
4736                fattr->mode |= fmode;
4737                fattr->valid |= status;
4738        }
4739
4740        status = decode_attr_nlink(xdr, bitmap, &fattr->nlink);
4741        if (status < 0)
4742                goto xdr_error;
4743        fattr->valid |= status;
4744
4745        status = decode_attr_owner(xdr, bitmap, server, &fattr->uid, fattr->owner_name);
4746        if (status < 0)
4747                goto xdr_error;
4748        fattr->valid |= status;
4749
4750        status = decode_attr_group(xdr, bitmap, server, &fattr->gid, fattr->group_name);
4751        if (status < 0)
4752                goto xdr_error;
4753        fattr->valid |= status;
4754
4755        status = decode_attr_rdev(xdr, bitmap, &fattr->rdev);
4756        if (status < 0)
4757                goto xdr_error;
4758        fattr->valid |= status;
4759
4760        status = decode_attr_space_used(xdr, bitmap, &fattr->du.nfs3.used);
4761        if (status < 0)
4762                goto xdr_error;
4763        fattr->valid |= status;
4764
4765        status = decode_attr_time_access(xdr, bitmap, &fattr->atime);
4766        if (status < 0)
4767                goto xdr_error;
4768        fattr->valid |= status;
4769
4770        status = decode_attr_time_metadata(xdr, bitmap, &fattr->ctime);
4771        if (status < 0)
4772                goto xdr_error;
4773        fattr->valid |= status;
4774
4775        status = decode_attr_time_modify(xdr, bitmap, &fattr->mtime);
4776        if (status < 0)
4777                goto xdr_error;
4778        fattr->valid |= status;
4779
4780        status = decode_attr_mounted_on_fileid(xdr, bitmap, &fattr->mounted_on_fileid);
4781        if (status < 0)
4782                goto xdr_error;
4783        fattr->valid |= status;
4784
4785        status = -EIO;
4786        if (unlikely(bitmap[1]))
4787                goto xdr_error;
4788
4789        status = decode_attr_mdsthreshold(xdr, bitmap, fattr->mdsthreshold);
4790        if (status < 0)
4791                goto xdr_error;
4792
4793        if (label) {
4794                status = decode_attr_security_label(xdr, bitmap, label);
4795                if (status < 0)
4796                        goto xdr_error;
4797                fattr->valid |= status;
4798        }
4799
4800xdr_error:
4801        dprintk("%s: xdr returned %d\n", __func__, -status);
4802        return status;
4803}
4804
4805static int decode_getfattr_generic(struct xdr_stream *xdr, struct nfs_fattr *fattr,
4806                struct nfs_fh *fh, struct nfs4_fs_locations *fs_loc,
4807                struct nfs4_label *label, const struct nfs_server *server)
4808{
4809        unsigned int savep;
4810        uint32_t attrlen,
4811                 bitmap[3] = {0};
4812        int status;
4813
4814        status = decode_op_hdr(xdr, OP_GETATTR);
4815        if (status < 0)
4816                goto xdr_error;
4817
4818        status = decode_attr_bitmap(xdr, bitmap);
4819        if (status < 0)
4820                goto xdr_error;
4821
4822        status = decode_attr_length(xdr, &attrlen, &savep);
4823        if (status < 0)
4824                goto xdr_error;
4825
4826        status = decode_getfattr_attrs(xdr, bitmap, fattr, fh, fs_loc,
4827                                        label, server);
4828        if (status < 0)
4829                goto xdr_error;
4830
4831        status = verify_attr_len(xdr, savep, attrlen);
4832xdr_error:
4833        dprintk("%s: xdr returned %d\n", __func__, -status);
4834        return status;
4835}
4836
4837static int decode_getfattr_label(struct xdr_stream *xdr, struct nfs_fattr *fattr,
4838                struct nfs4_label *label, const struct nfs_server *server)
4839{
4840        return decode_getfattr_generic(xdr, fattr, NULL, NULL, label, server);
4841}
4842
4843static int decode_getfattr(struct xdr_stream *xdr, struct nfs_fattr *fattr,
4844                const struct nfs_server *server)
4845{
4846        return decode_getfattr_generic(xdr, fattr, NULL, NULL, NULL, server);
4847}
4848
4849/*
4850 * Decode potentially multiple layout types.
4851 */
4852static int decode_pnfs_layout_types(struct xdr_stream *xdr,
4853                                    struct nfs_fsinfo *fsinfo)
4854{
4855        __be32 *p;
4856        uint32_t i;
4857
4858        p = xdr_inline_decode(xdr, 4);
4859        if (unlikely(!p))
4860                goto out_overflow;
4861        fsinfo->nlayouttypes = be32_to_cpup(p);
4862
4863        /* pNFS is not supported by the underlying file system */
4864        if (fsinfo->nlayouttypes == 0)
4865                return 0;
4866
4867        /* Decode and set first layout type, move xdr->p past unused types */
4868        p = xdr_inline_decode(xdr, fsinfo->nlayouttypes * 4);
4869        if (unlikely(!p))
4870                goto out_overflow;
4871
4872        /* If we get too many, then just cap it at the max */
4873        if (fsinfo->nlayouttypes > NFS_MAX_LAYOUT_TYPES) {
4874                printk(KERN_INFO "NFS: %s: Warning: Too many (%u) pNFS layout types\n",
4875                        __func__, fsinfo->nlayouttypes);
4876                fsinfo->nlayouttypes = NFS_MAX_LAYOUT_TYPES;
4877        }
4878
4879        for(i = 0; i < fsinfo->nlayouttypes; ++i)
4880                fsinfo->layouttype[i] = be32_to_cpup(p++);
4881        return 0;
4882out_overflow:
4883        print_overflow_msg(__func__, xdr);
4884        return -EIO;
4885}
4886
4887/*
4888 * The type of file system exported.
4889 * Note we must ensure that layouttype is set in any non-error case.
4890 */
4891static int decode_attr_pnfstype(struct xdr_stream *xdr, uint32_t *bitmap,
4892                                struct nfs_fsinfo *fsinfo)
4893{
4894        int status = 0;
4895
4896        dprintk("%s: bitmap is %x\n", __func__, bitmap[1]);
4897        if (unlikely(bitmap[1] & (FATTR4_WORD1_FS_LAYOUT_TYPES - 1U)))
4898                return -EIO;
4899        if (bitmap[1] & FATTR4_WORD1_FS_LAYOUT_TYPES) {
4900                status = decode_pnfs_layout_types(xdr, fsinfo);
4901                bitmap[1] &= ~FATTR4_WORD1_FS_LAYOUT_TYPES;
4902        }
4903        return status;
4904}
4905
4906/*
4907 * The prefered block size for layout directed io
4908 */
4909static int decode_attr_layout_blksize(struct xdr_stream *xdr, uint32_t *bitmap,
4910                                      uint32_t *res)
4911{
4912        __be32 *p;
4913
4914        dprintk("%s: bitmap is %x\n", __func__, bitmap[2]);
4915        *res = 0;
4916        if (bitmap[2] & FATTR4_WORD2_LAYOUT_BLKSIZE) {
4917                p = xdr_inline_decode(xdr, 4);
4918                if (unlikely(!p)) {
4919                        print_overflow_msg(__func__, xdr);
4920                        return -EIO;
4921                }
4922                *res = be32_to_cpup(p);
4923                bitmap[2] &= ~FATTR4_WORD2_LAYOUT_BLKSIZE;
4924        }
4925        return 0;
4926}
4927
4928/*
4929 * The granularity of a CLONE operation.
4930 */
4931static int decode_attr_clone_blksize(struct xdr_stream *xdr, uint32_t *bitmap,
4932                                     uint32_t *res)
4933{
4934        __be32 *p;
4935
4936        dprintk("%s: bitmap is %x\n", __func__, bitmap[2]);
4937        *res = 0;
4938        if (bitmap[2] & FATTR4_WORD2_CLONE_BLKSIZE) {
4939                p = xdr_inline_decode(xdr, 4);
4940                if (unlikely(!p)) {
4941                        print_overflow_msg(__func__, xdr);
4942                        return -EIO;
4943                }
4944                *res = be32_to_cpup(p);
4945                bitmap[2] &= ~FATTR4_WORD2_CLONE_BLKSIZE;
4946        }
4947        return 0;
4948}
4949
4950static int decode_fsinfo(struct xdr_stream *xdr, struct nfs_fsinfo *fsinfo)
4951{
4952        unsigned int savep;
4953        uint32_t attrlen, bitmap[3];
4954        int status;
4955
4956        if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0)
4957                goto xdr_error;
4958        if ((status = decode_attr_bitmap(xdr, bitmap)) != 0)
4959                goto xdr_error;
4960        if ((status = decode_attr_length(xdr, &attrlen, &savep)) != 0)
4961                goto xdr_error;
4962
4963        fsinfo->rtmult = fsinfo->wtmult = 512;  /* ??? */
4964
4965        if ((status = decode_attr_lease_time(xdr, bitmap, &fsinfo->lease_time)) != 0)
4966                goto xdr_error;
4967        if ((status = decode_attr_maxfilesize(xdr, bitmap, &fsinfo->maxfilesize)) != 0)
4968                goto xdr_error;
4969        if ((status = decode_attr_maxread(xdr, bitmap, &fsinfo->rtmax)) != 0)
4970                goto xdr_error;
4971        fsinfo->rtpref = fsinfo->dtpref = fsinfo->rtmax;
4972        if ((status = decode_attr_maxwrite(xdr, bitmap, &fsinfo->wtmax)) != 0)
4973                goto xdr_error;
4974        fsinfo->wtpref = fsinfo->wtmax;
4975
4976        status = -EIO;
4977        if (unlikely(bitmap[0]))
4978                goto xdr_error;
4979
4980        status = decode_attr_time_delta(xdr, bitmap, &fsinfo->time_delta);
4981        if (status != 0)
4982                goto xdr_error;
4983        status = decode_attr_pnfstype(xdr, bitmap, fsinfo);
4984        if (status != 0)
4985                goto xdr_error;
4986
4987        status = -EIO;
4988        if (unlikely(bitmap[1]))
4989                goto xdr_error;
4990
4991        status = decode_attr_layout_blksize(xdr, bitmap, &fsinfo->blksize);
4992        if (status)
4993                goto xdr_error;
4994        status = decode_attr_clone_blksize(xdr, bitmap, &fsinfo->clone_blksize);
4995        if (status)
4996                goto xdr_error;
4997
4998        status = verify_attr_len(xdr, savep, attrlen);
4999xdr_error:
5000        dprintk("%s: xdr returned %d!\n", __func__, -status);
5001        return status;
5002}
5003
5004static int decode_getfh(struct xdr_stream *xdr, struct nfs_fh *fh)
5005{
5006        __be32 *p;
5007        uint32_t len;
5008        int status;
5009
5010        /* Zero handle first to allow comparisons */
5011        memset(fh, 0, sizeof(*fh));
5012
5013        status = decode_op_hdr(xdr, OP_GETFH);
5014        if (status)
5015                return status;
5016
5017        p = xdr_inline_decode(xdr, 4);
5018        if (unlikely(!p))
5019                goto out_overflow;
5020        len = be32_to_cpup(p);
5021        if (len > NFS4_FHSIZE)
5022                return -EIO;
5023        fh->size = len;
5024        p = xdr_inline_decode(xdr, len);
5025        if (unlikely(!p))
5026                goto out_overflow;
5027        memcpy(fh->data, p, len);
5028        return 0;
5029out_overflow:
5030        print_overflow_msg(__func__, xdr);
5031        return -EIO;
5032}
5033
5034static int decode_link(struct xdr_stream *xdr, struct nfs4_change_info *cinfo)
5035{
5036        int status;
5037
5038        status = decode_op_hdr(xdr, OP_LINK);
5039        if (status)
5040                return status;
5041        return decode_change_info(xdr, cinfo);
5042}
5043
5044/*
5045 * We create the owner, so we know a proper owner.id length is 4.
5046 */
5047static int decode_lock_denied (struct xdr_stream *xdr, struct file_lock *fl)
5048{
5049        uint64_t offset, length, clientid;
5050        __be32 *p;
5051        uint32_t namelen, type;
5052
5053        p = xdr_inline_decode(xdr, 32); /* read 32 bytes */
5054        if (unlikely(!p))
5055                goto out_overflow;
5056        p = xdr_decode_hyper(p, &offset); /* read 2 8-byte long words */
5057        p = xdr_decode_hyper(p, &length);
5058        type = be32_to_cpup(p++); /* 4 byte read */
5059        if (fl != NULL) { /* manipulate file lock */
5060                fl->fl_start = (loff_t)offset;
5061                fl->fl_end = fl->fl_start + (loff_t)length - 1;
5062                if (length == ~(uint64_t)0)
5063                        fl->fl_end = OFFSET_MAX;
5064                fl->fl_type = F_WRLCK;
5065                if (type & 1)
5066                        fl->fl_type = F_RDLCK;
5067                fl->fl_pid = 0;
5068        }
5069        p = xdr_decode_hyper(p, &clientid); /* read 8 bytes */
5070        namelen = be32_to_cpup(p); /* read 4 bytes */  /* have read all 32 bytes now */
5071        p = xdr_inline_decode(xdr, namelen); /* variable size field */
5072        if (likely(p))
5073                return -NFS4ERR_DENIED;
5074out_overflow:
5075        print_overflow_msg(__func__, xdr);
5076        return -EIO;
5077}
5078
5079static int decode_lock(struct xdr_stream *xdr, struct nfs_lock_res *res)
5080{
5081        int status;
5082
5083        status = decode_op_hdr(xdr, OP_LOCK);
5084        if (status == -EIO)
5085                goto out;
5086        if (status == 0) {
5087                status = decode_lock_stateid(xdr, &res->stateid);
5088                if (unlikely(status))
5089                        goto out;
5090        } else if (status == -NFS4ERR_DENIED)
5091                status = decode_lock_denied(xdr, NULL);
5092        if (res->open_seqid != NULL)
5093                nfs_increment_open_seqid(status, res->open_seqid);
5094        nfs_increment_lock_seqid(status, res->lock_seqid);
5095out:
5096        return status;
5097}
5098
5099static int decode_lockt(struct xdr_stream *xdr, struct nfs_lockt_res *res)
5100{
5101        int status;
5102        status = decode_op_hdr(xdr, OP_LOCKT);
5103        if (status == -NFS4ERR_DENIED)
5104                return decode_lock_denied(xdr, res->denied);
5105        return status;
5106}
5107
5108static int decode_locku(struct xdr_stream *xdr, struct nfs_locku_res *res)
5109{
5110        int status;
5111
5112        status = decode_op_hdr(xdr, OP_LOCKU);
5113        if (status != -EIO)
5114                nfs_increment_lock_seqid(status, res->seqid);
5115        if (status == 0)
5116                status = decode_lock_stateid(xdr, &res->stateid);
5117        return status;
5118}
5119
5120static int decode_release_lockowner(struct xdr_stream *xdr)
5121{
5122        return decode_op_hdr(xdr, OP_RELEASE_LOCKOWNER);
5123}
5124
5125static int decode_lookup(struct xdr_stream *xdr)
5126{
5127        return decode_op_hdr(xdr, OP_LOOKUP);
5128}
5129
5130static int decode_lookupp(struct xdr_stream *xdr)
5131{
5132        return decode_op_hdr(xdr, OP_LOOKUPP);
5133}
5134
5135/* This is too sick! */
5136static int decode_space_limit(struct xdr_stream *xdr,
5137                unsigned long *pagemod_limit)
5138{
5139        __be32 *p;
5140        uint32_t limit_type, nblocks, blocksize;
5141        u64 maxsize = 0;
5142
5143        p = xdr_inline_decode(xdr, 12);
5144        if (unlikely(!p))
5145                goto out_overflow;
5146        limit_type = be32_to_cpup(p++);
5147        switch (limit_type) {
5148        case NFS4_LIMIT_SIZE:
5149                xdr_decode_hyper(p, &maxsize);
5150                break;
5151        case NFS4_LIMIT_BLOCKS:
5152                nblocks = be32_to_cpup(p++);
5153                blocksize = be32_to_cpup(p);
5154                maxsize = (uint64_t)nblocks * (uint64_t)blocksize;
5155        }
5156        maxsize >>= PAGE_SHIFT;
5157        *pagemod_limit = min_t(u64, maxsize, ULONG_MAX);
5158        return 0;
5159out_overflow:
5160        print_overflow_msg(__func__, xdr);
5161        return -EIO;
5162}
5163
5164static int decode_rw_delegation(struct xdr_stream *xdr,
5165                uint32_t delegation_type,
5166                struct nfs_openres *res)
5167{
5168        __be32 *p;
5169        int status;
5170
5171        status = decode_delegation_stateid(xdr, &res->delegation);
5172        if (unlikely(status))
5173                return status;
5174        p = xdr_inline_decode(xdr, 4);
5175        if (unlikely(!p))
5176                goto out_overflow;
5177        res->do_recall = be32_to_cpup(p);
5178
5179        switch (delegation_type) {
5180        case NFS4_OPEN_DELEGATE_READ:
5181                res->delegation_type = FMODE_READ;
5182                break;
5183        case NFS4_OPEN_DELEGATE_WRITE:
5184                res->delegation_type = FMODE_WRITE|FMODE_READ;
5185                if (decode_space_limit(xdr, &res->pagemod_limit) < 0)
5186                                return -EIO;
5187        }
5188        return decode_ace(xdr, NULL);
5189out_overflow:
5190        print_overflow_msg(__func__, xdr);
5191        return -EIO;
5192}
5193
5194static int decode_no_delegation(struct xdr_stream *xdr, struct nfs_openres *res)
5195{
5196        __be32 *p;
5197        uint32_t why_no_delegation;
5198
5199        p = xdr_inline_decode(xdr, 4);
5200        if (unlikely(!p))
5201                goto out_overflow;
5202        why_no_delegation = be32_to_cpup(p);
5203        switch (why_no_delegation) {
5204                case WND4_CONTENTION:
5205                case WND4_RESOURCE:
5206                        xdr_inline_decode(xdr, 4);
5207                        /* Ignore for now */
5208        }
5209        return 0;
5210out_overflow:
5211        print_overflow_msg(__func__, xdr);
5212        return -EIO;
5213}
5214
5215static int decode_delegation(struct xdr_stream *xdr, struct nfs_openres *res)
5216{
5217        __be32 *p;
5218        uint32_t delegation_type;
5219
5220        p = xdr_inline_decode(xdr, 4);
5221        if (unlikely(!p))
5222                goto out_overflow;
5223        delegation_type = be32_to_cpup(p);
5224        res->delegation_type = 0;
5225        switch (delegation_type) {
5226        case NFS4_OPEN_DELEGATE_NONE:
5227                return 0;
5228        case NFS4_OPEN_DELEGATE_READ:
5229        case NFS4_OPEN_DELEGATE_WRITE:
5230                return decode_rw_delegation(xdr, delegation_type, res);
5231        case NFS4_OPEN_DELEGATE_NONE_EXT:
5232                return decode_no_delegation(xdr, res);
5233        }
5234        return -EIO;
5235out_overflow:
5236        print_overflow_msg(__func__, xdr);
5237        return -EIO;
5238}
5239
5240static int decode_open(struct xdr_stream *xdr, struct nfs_openres *res)
5241{
5242        __be32 *p;
5243        uint32_t savewords, bmlen, i;
5244        int status;
5245
5246        if (!__decode_op_hdr(xdr, OP_OPEN, &status))
5247                return status;
5248        nfs_increment_open_seqid(status, res->seqid);
5249        if (status)
5250                return status;
5251        status = decode_open_stateid(xdr, &res->stateid);
5252        if (unlikely(status))
5253                return status;
5254
5255        decode_change_info(xdr, &res->cinfo);
5256
5257        p = xdr_inline_decode(xdr, 8);
5258        if (unlikely(!p))
5259                goto out_overflow;
5260        res->rflags = be32_to_cpup(p++);
5261        bmlen = be32_to_cpup(p);
5262        if (bmlen > 10)
5263                goto xdr_error;
5264
5265        p = xdr_inline_decode(xdr, bmlen << 2);
5266        if (unlikely(!p))
5267                goto out_overflow;
5268        savewords = min_t(uint32_t, bmlen, NFS4_BITMAP_SIZE);
5269        for (i = 0; i < savewords; ++i)
5270                res->attrset[i] = be32_to_cpup(p++);
5271        for (; i < NFS4_BITMAP_SIZE; i++)
5272                res->attrset[i] = 0;
5273
5274        return decode_delegation(xdr, res);
5275xdr_error:
5276        dprintk("%s: Bitmap too large! Length = %u\n", __func__, bmlen);
5277        return -EIO;
5278out_overflow:
5279        print_overflow_msg(__func__, xdr);
5280        return -EIO;
5281}
5282
5283static int decode_open_confirm(struct xdr_stream *xdr, struct nfs_open_confirmres *res)
5284{
5285        int status;
5286
5287        status = decode_op_hdr(xdr, OP_OPEN_CONFIRM);
5288        if (status != -EIO)
5289                nfs_increment_open_seqid(status, res->seqid);
5290        if (!status)
5291                status = decode_open_stateid(xdr, &res->stateid);
5292        return status;
5293}
5294
5295static int decode_open_downgrade(struct xdr_stream *xdr, struct nfs_closeres *res)
5296{
5297        int status;
5298
5299        status = decode_op_hdr(xdr, OP_OPEN_DOWNGRADE);
5300        if (status != -EIO)
5301                nfs_increment_open_seqid(status, res->seqid);
5302        if (!status)
5303                status = decode_open_stateid(xdr, &res->stateid);
5304        return status;
5305}
5306
5307static int decode_putfh(struct xdr_stream *xdr)
5308{
5309        return decode_op_hdr(xdr, OP_PUTFH);
5310}
5311
5312static int decode_putrootfh(struct xdr_stream *xdr)
5313{
5314        return decode_op_hdr(xdr, OP_PUTROOTFH);
5315}
5316
5317static int decode_read(struct xdr_stream *xdr, struct rpc_rqst *req,
5318                       struct nfs_pgio_res *res)
5319{
5320        __be32 *p;
5321        uint32_t count, eof, recvd;
5322        int status;
5323
5324        status = decode_op_hdr(xdr, OP_READ);
5325        if (status)
5326                return status;
5327        p = xdr_inline_decode(xdr, 8);
5328        if (unlikely(!p))
5329                goto out_overflow;
5330        eof = be32_to_cpup(p++);
5331        count = be32_to_cpup(p);
5332        recvd = xdr_read_pages(xdr, count);
5333        if (count > recvd) {
5334                dprintk("NFS: server cheating in read reply: "
5335                                "count %u > recvd %u\n", count, recvd);
5336                count = recvd;
5337                eof = 0;
5338        }
5339        res->eof = eof;
5340        res->count = count;
5341        return 0;
5342out_overflow:
5343        print_overflow_msg(__func__, xdr);
5344        return -EIO;
5345}
5346
5347static int decode_readdir(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs4_readdir_res *readdir)
5348{
5349        int             status;
5350        __be32          verf[2];
5351
5352        status = decode_op_hdr(xdr, OP_READDIR);
5353        if (!status)
5354                status = decode_verifier(xdr, readdir->verifier.data);
5355        if (unlikely(status))
5356                return status;
5357        memcpy(verf, readdir->verifier.data, sizeof(verf));
5358        dprintk("%s: verifier = %08x:%08x\n",
5359                        __func__, verf[0], verf[1]);
5360        return xdr_read_pages(xdr, xdr->buf->page_len);
5361}
5362
5363static int decode_readlink(struct xdr_stream *xdr, struct rpc_rqst *req)
5364{
5365        struct xdr_buf *rcvbuf = &req->rq_rcv_buf;
5366        u32 len, recvd;
5367        __be32 *p;
5368        int status;
5369
5370        status = decode_op_hdr(xdr, OP_READLINK);
5371        if (status)
5372                return status;
5373
5374        /* Convert length of symlink */
5375        p = xdr_inline_decode(xdr, 4);
5376        if (unlikely(!p))
5377                goto out_overflow;
5378        len = be32_to_cpup(p);
5379        if (len >= rcvbuf->page_len || len <= 0) {
5380                dprintk("nfs: server returned giant symlink!\n");
5381                return -ENAMETOOLONG;
5382        }
5383        recvd = xdr_read_pages(xdr, len);
5384        if (recvd < len) {
5385                dprintk("NFS: server cheating in readlink reply: "
5386                                "count %u > recvd %u\n", len, recvd);
5387                return -EIO;
5388        }
5389        /*
5390         * The XDR encode routine has set things up so that
5391         * the link text will be copied directly into the
5392         * buffer.  We just have to do overflow-checking,
5393         * and and null-terminate the text (the VFS expects
5394         * null-termination).
5395         */
5396        xdr_terminate_string(rcvbuf, len);
5397        return 0;
5398out_overflow:
5399        print_overflow_msg(__func__, xdr);
5400        return -EIO;
5401}
5402
5403static int decode_remove(struct xdr_stream *xdr, struct nfs4_change_info *cinfo)
5404{
5405        int status;
5406
5407        status = decode_op_hdr(xdr, OP_REMOVE);
5408        if (status)
5409                goto out;
5410        status = decode_change_info(xdr, cinfo);
5411out:
5412        return status;
5413}
5414
5415static int decode_rename(struct xdr_stream *xdr, struct nfs4_change_info *old_cinfo,
5416              struct nfs4_change_info *new_cinfo)
5417{
5418        int status;
5419
5420        status = decode_op_hdr(xdr, OP_RENAME);
5421        if (status)
5422                goto out;
5423        if ((status = decode_change_info(xdr, old_cinfo)))
5424                goto out;
5425        status = decode_change_info(xdr, new_cinfo);
5426out:
5427        return status;
5428}
5429
5430static int decode_renew(struct xdr_stream *xdr)
5431{
5432        return decode_op_hdr(xdr, OP_RENEW);
5433}
5434
5435static int
5436decode_restorefh(struct xdr_stream *xdr)
5437{
5438        return decode_op_hdr(xdr, OP_RESTOREFH);
5439}
5440
5441static int decode_getacl(struct xdr_stream *xdr, struct rpc_rqst *req,
5442                         struct nfs_getaclres *res)
5443{
5444        unsigned int savep;
5445        uint32_t attrlen,
5446                 bitmap[3] = {0};
5447        int status;
5448        unsigned int pg_offset;
5449
5450        res->acl_len = 0;
5451        if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0)
5452                goto out;
5453
5454        xdr_enter_page(xdr, xdr->buf->page_len);
5455
5456        /* Calculate the offset of the page data */
5457        pg_offset = xdr->buf->head[0].iov_len;
5458
5459        if ((status = decode_attr_bitmap(xdr, bitmap)) != 0)
5460                goto out;
5461        if ((status = decode_attr_length(xdr, &attrlen, &savep)) != 0)
5462                goto out;
5463
5464        if (unlikely(bitmap[0] & (FATTR4_WORD0_ACL - 1U)))
5465                return -EIO;
5466        if (likely(bitmap[0] & FATTR4_WORD0_ACL)) {
5467
5468                /* The bitmap (xdr len + bitmaps) and the attr xdr len words
5469                 * are stored with the acl data to handle the problem of
5470                 * variable length bitmaps.*/
5471                res->acl_data_offset = xdr_stream_pos(xdr) - pg_offset;
5472                res->acl_len = attrlen;
5473
5474                /* Check for receive buffer overflow */
5475                if (res->acl_len > (xdr->nwords << 2) ||
5476                    res->acl_len + res->acl_data_offset > xdr->buf->page_len) {
5477                        res->acl_flags |= NFS4_ACL_TRUNC;
5478                        dprintk("NFS: acl reply: attrlen %u > page_len %u\n",
5479                                        attrlen, xdr->nwords << 2);
5480                }
5481        } else
5482                status = -EOPNOTSUPP;
5483
5484out:
5485        return status;
5486}
5487
5488static int
5489decode_savefh(struct xdr_stream *xdr)
5490{
5491        return decode_op_hdr(xdr, OP_SAVEFH);
5492}
5493
5494static int decode_setattr(struct xdr_stream *xdr)
5495{
5496        int status;
5497
5498        status = decode_op_hdr(xdr, OP_SETATTR);
5499        if (status)
5500                return status;
5501        if (decode_bitmap4(xdr, NULL, 0) >= 0)
5502                return 0;
5503        print_overflow_msg(__func__, xdr);
5504        return -EIO;
5505}
5506
5507static int decode_setclientid(struct xdr_stream *xdr, struct nfs4_setclientid_res *res)
5508{
5509        __be32 *p;
5510        uint32_t opnum;
5511        int32_t nfserr;
5512
5513        p = xdr_inline_decode(xdr, 8);
5514        if (unlikely(!p))
5515                goto out_overflow;
5516        opnum = be32_to_cpup(p++);
5517        if (opnum != OP_SETCLIENTID) {
5518                dprintk("nfs: decode_setclientid: Server returned operation"
5519                        " %d\n", opnum);
5520                return -EIO;
5521        }
5522        nfserr = be32_to_cpup(p);
5523        if (nfserr == NFS_OK) {
5524                p = xdr_inline_decode(xdr, 8 + NFS4_VERIFIER_SIZE);
5525                if (unlikely(!p))
5526                        goto out_overflow;
5527                p = xdr_decode_hyper(p, &res->clientid);
5528                memcpy(res->confirm.data, p, NFS4_VERIFIER_SIZE);
5529        } else if (nfserr == NFSERR_CLID_INUSE) {
5530                uint32_t len;
5531
5532                /* skip netid string */
5533                p = xdr_inline_decode(xdr, 4);
5534                if (unlikely(!p))
5535                        goto out_overflow;
5536                len = be32_to_cpup(p);
5537                p = xdr_inline_decode(xdr, len);
5538                if (unlikely(!p))
5539                        goto out_overflow;
5540
5541                /* skip uaddr string */
5542                p = xdr_inline_decode(xdr, 4);
5543                if (unlikely(!p))
5544                        goto out_overflow;
5545                len = be32_to_cpup(p);
5546                p = xdr_inline_decode(xdr, len);
5547                if (unlikely(!p))
5548                        goto out_overflow;
5549                return -NFSERR_CLID_INUSE;
5550        } else
5551                return nfs4_stat_to_errno(nfserr);
5552
5553        return 0;
5554out_overflow:
5555        print_overflow_msg(__func__, xdr);
5556        return -EIO;
5557}
5558
5559static int decode_setclientid_confirm(struct xdr_stream *xdr)
5560{
5561        return decode_op_hdr(xdr, OP_SETCLIENTID_CONFIRM);
5562}
5563
5564static int decode_write(struct xdr_stream *xdr, struct nfs_pgio_res *res)
5565{
5566        __be32 *p;
5567        int status;
5568
5569        status = decode_op_hdr(xdr, OP_WRITE);
5570        if (status)
5571                return status;
5572
5573        p = xdr_inline_decode(xdr, 8);
5574        if (unlikely(!p))
5575                goto out_overflow;
5576        res->count = be32_to_cpup(p++);
5577        res->verf->committed = be32_to_cpup(p++);
5578        return decode_write_verifier(xdr, &res->verf->verifier);
5579out_overflow:
5580        print_overflow_msg(__func__, xdr);
5581        return -EIO;
5582}
5583
5584static int decode_delegreturn(struct xdr_stream *xdr)
5585{
5586        return decode_op_hdr(xdr, OP_DELEGRETURN);
5587}
5588
5589static int decode_secinfo_gss(struct xdr_stream *xdr,
5590                              struct nfs4_secinfo4 *flavor)
5591{
5592        u32 oid_len;
5593        __be32 *p;
5594
5595        p = xdr_inline_decode(xdr, 4);
5596        if (unlikely(!p))
5597                goto out_overflow;
5598        oid_len = be32_to_cpup(p);
5599        if (oid_len > GSS_OID_MAX_LEN)
5600                goto out_err;
5601
5602        p = xdr_inline_decode(xdr, oid_len);
5603        if (unlikely(!p))
5604                goto out_overflow;
5605        memcpy(flavor->flavor_info.oid.data, p, oid_len);
5606        flavor->flavor_info.oid.len = oid_len;
5607
5608        p = xdr_inline_decode(xdr, 8);
5609        if (unlikely(!p))
5610                goto out_overflow;
5611        flavor->flavor_info.qop = be32_to_cpup(p++);
5612        flavor->flavor_info.service = be32_to_cpup(p);
5613
5614        return 0;
5615
5616out_overflow:
5617        print_overflow_msg(__func__, xdr);
5618        return -EIO;
5619out_err:
5620        return -EINVAL;
5621}
5622
5623static int decode_secinfo_common(struct xdr_stream *xdr, struct nfs4_secinfo_res *res)
5624{
5625        struct nfs4_secinfo4 *sec_flavor;
5626        unsigned int i, num_flavors;
5627        int status;
5628        __be32 *p;
5629
5630        p = xdr_inline_decode(xdr, 4);
5631        if (unlikely(!p))
5632                goto out_overflow;
5633
5634        res->flavors->num_flavors = 0;
5635        num_flavors = be32_to_cpup(p);
5636
5637        for (i = 0; i < num_flavors; i++) {
5638                sec_flavor = &res->flavors->flavors[i];
5639                if ((char *)&sec_flavor[1] - (char *)res->flavors > PAGE_SIZE)
5640                        break;
5641
5642                p = xdr_inline_decode(xdr, 4);
5643                if (unlikely(!p))
5644                        goto out_overflow;
5645                sec_flavor->flavor = be32_to_cpup(p);
5646
5647                if (sec_flavor->flavor == RPC_AUTH_GSS) {
5648                        status = decode_secinfo_gss(xdr, sec_flavor);
5649                        if (status)
5650                                goto out;
5651                }
5652                res->flavors->num_flavors++;
5653        }
5654
5655        status = 0;
5656out:
5657        return status;
5658out_overflow:
5659        print_overflow_msg(__func__, xdr);
5660        return -EIO;
5661}
5662
5663static int decode_secinfo(struct xdr_stream *xdr, struct nfs4_secinfo_res *res)
5664{
5665        int status = decode_op_hdr(xdr, OP_SECINFO);
5666        if (status)
5667                return status;
5668        return decode_secinfo_common(xdr, res);
5669}
5670
5671#if defined(CONFIG_NFS_V4_1)
5672static int decode_secinfo_no_name(struct xdr_stream *xdr, struct nfs4_secinfo_res *res)
5673{
5674        int status = decode_op_hdr(xdr, OP_SECINFO_NO_NAME);
5675        if (status)
5676                return status;
5677        return decode_secinfo_common(xdr, res);
5678}
5679
5680static int decode_op_map(struct xdr_stream *xdr, struct nfs4_op_map *op_map)
5681{
5682        __be32 *p;
5683        uint32_t bitmap_words;
5684        unsigned int i;
5685
5686        p = xdr_inline_decode(xdr, 4);
5687        if (!p)
5688                return -EIO;
5689        bitmap_words = be32_to_cpup(p++);
5690        if (bitmap_words > NFS4_OP_MAP_NUM_WORDS)
5691                return -EIO;
5692        p = xdr_inline_decode(xdr, 4 * bitmap_words);
5693        for (i = 0; i < bitmap_words; i++)
5694                op_map->u.words[i] = be32_to_cpup(p++);
5695
5696        return 0;
5697}
5698
5699static int decode_exchange_id(struct xdr_stream *xdr,
5700                              struct nfs41_exchange_id_res *res)
5701{
5702        __be32 *p;
5703        uint32_t dummy;
5704        char *dummy_str;
5705        int status;
5706        uint32_t impl_id_count;
5707
5708        status = decode_op_hdr(xdr, OP_EXCHANGE_ID);
5709        if (status)
5710                return status;
5711
5712        p = xdr_inline_decode(xdr, 8);
5713        if (unlikely(!p))
5714                goto out_overflow;
5715        xdr_decode_hyper(p, &res->clientid);
5716        p = xdr_inline_decode(xdr, 12);
5717        if (unlikely(!p))
5718                goto out_overflow;
5719        res->seqid = be32_to_cpup(p++);
5720        res->flags = be32_to_cpup(p++);
5721
5722        res->state_protect.how = be32_to_cpup(p);
5723        switch (res->state_protect.how) {
5724        case SP4_NONE:
5725                break;
5726        case SP4_MACH_CRED:
5727                status = decode_op_map(xdr, &res->state_protect.enforce);
5728                if (status)
5729                        return status;
5730                status = decode_op_map(xdr, &res->state_protect.allow);
5731                if (status)
5732                        return status;
5733                break;
5734        default:
5735                WARN_ON_ONCE(1);
5736                return -EIO;
5737        }
5738
5739        /* server_owner4.so_minor_id */
5740        p = xdr_inline_decode(xdr, 8);
5741        if (unlikely(!p))
5742                goto out_overflow;
5743        p = xdr_decode_hyper(p, &res->server_owner->minor_id);
5744
5745        /* server_owner4.so_major_id */
5746        status = decode_opaque_inline(xdr, &dummy, &dummy_str);
5747        if (unlikely(status))
5748                return status;
5749        memcpy(res->server_owner->major_id, dummy_str, dummy);
5750        res->server_owner->major_id_sz = dummy;
5751
5752        /* server_scope4 */
5753        status = decode_opaque_inline(xdr, &dummy, &dummy_str);
5754        if (unlikely(status))
5755                return status;
5756        memcpy(res->server_scope->server_scope, dummy_str, dummy);
5757        res->server_scope->server_scope_sz = dummy;
5758
5759        /* Implementation Id */
5760        p = xdr_inline_decode(xdr, 4);
5761        if (unlikely(!p))
5762                goto out_overflow;
5763        impl_id_count = be32_to_cpup(p++);
5764
5765        if (impl_id_count) {
5766                /* nii_domain */
5767                status = decode_opaque_inline(xdr, &dummy, &dummy_str);
5768                if (unlikely(status))
5769                        return status;
5770                memcpy(res->impl_id->domain, dummy_str, dummy);
5771
5772                /* nii_name */
5773                status = decode_opaque_inline(xdr, &dummy, &dummy_str);
5774                if (unlikely(status))
5775                        return status;
5776                memcpy(res->impl_id->name, dummy_str, dummy);
5777
5778                /* nii_date */
5779                p = xdr_inline_decode(xdr, 12);
5780                if (unlikely(!p))
5781                        goto out_overflow;
5782                p = xdr_decode_hyper(p, &res->impl_id->date.seconds);
5783                res->impl_id->date.nseconds = be32_to_cpup(p);
5784
5785                /* if there's more than one entry, ignore the rest */
5786        }
5787        return 0;
5788out_overflow:
5789        print_overflow_msg(__func__, xdr);
5790        return -EIO;
5791}
5792
5793static int decode_chan_attrs(struct xdr_stream *xdr,
5794                             struct nfs4_channel_attrs *attrs)
5795{
5796        __be32 *p;
5797        u32 nr_attrs, val;
5798
5799        p = xdr_inline_decode(xdr, 28);
5800        if (unlikely(!p))
5801                goto out_overflow;
5802        val = be32_to_cpup(p++);        /* headerpadsz */
5803        if (val)
5804                return -EINVAL;         /* no support for header padding yet */
5805        attrs->max_rqst_sz = be32_to_cpup(p++);
5806        attrs->max_resp_sz = be32_to_cpup(p++);
5807        attrs->max_resp_sz_cached = be32_to_cpup(p++);
5808        attrs->max_ops = be32_to_cpup(p++);
5809        attrs->max_reqs = be32_to_cpup(p++);
5810        nr_attrs = be32_to_cpup(p);
5811        if (unlikely(nr_attrs > 1)) {
5812                printk(KERN_WARNING "NFS: %s: Invalid rdma channel attrs "
5813                        "count %u\n", __func__, nr_attrs);
5814                return -EINVAL;
5815        }
5816        if (nr_attrs == 1) {
5817                p = xdr_inline_decode(xdr, 4); /* skip rdma_attrs */
5818                if (unlikely(!p))
5819                        goto out_overflow;
5820        }
5821        return 0;
5822out_overflow:
5823        print_overflow_msg(__func__, xdr);
5824        return -EIO;
5825}
5826
5827static int decode_sessionid(struct xdr_stream *xdr, struct nfs4_sessionid *sid)
5828{
5829        return decode_opaque_fixed(xdr, sid->data, NFS4_MAX_SESSIONID_LEN);
5830}
5831
5832static int decode_bind_conn_to_session(struct xdr_stream *xdr,
5833                                struct nfs41_bind_conn_to_session_res *res)
5834{
5835        __be32 *p;
5836        int status;
5837
5838        status = decode_op_hdr(xdr, OP_BIND_CONN_TO_SESSION);
5839        if (!status)
5840                status = decode_sessionid(xdr, &res->sessionid);
5841        if (unlikely(status))
5842                return status;
5843
5844        /* dir flags, rdma mode bool */
5845        p = xdr_inline_decode(xdr, 8);
5846        if (unlikely(!p))
5847                goto out_overflow;
5848
5849        res->dir = be32_to_cpup(p++);
5850        if (res->dir == 0 || res->dir > NFS4_CDFS4_BOTH)
5851                return -EIO;
5852        if (be32_to_cpup(p) == 0)
5853                res->use_conn_in_rdma_mode = false;
5854        else
5855                res->use_conn_in_rdma_mode = true;
5856
5857        return 0;
5858out_overflow:
5859        print_overflow_msg(__func__, xdr);
5860        return -EIO;
5861}
5862
5863static int decode_create_session(struct xdr_stream *xdr,
5864                                 struct nfs41_create_session_res *res)
5865{
5866        __be32 *p;
5867        int status;
5868
5869        status = decode_op_hdr(xdr, OP_CREATE_SESSION);
5870        if (!status)
5871                status = decode_sessionid(xdr, &res->sessionid);
5872        if (unlikely(status))
5873                return status;
5874
5875        /* seqid, flags */
5876        p = xdr_inline_decode(xdr, 8);
5877        if (unlikely(!p))
5878                goto out_overflow;
5879        res->seqid = be32_to_cpup(p++);
5880        res->flags = be32_to_cpup(p);
5881
5882        /* Channel attributes */
5883        status = decode_chan_attrs(xdr, &res->fc_attrs);
5884        if (!status)
5885                status = decode_chan_attrs(xdr, &res->bc_attrs);
5886        return status;
5887out_overflow:
5888        print_overflow_msg(__func__, xdr);
5889        return -EIO;
5890}
5891
5892static int decode_destroy_session(struct xdr_stream *xdr, void *dummy)
5893{
5894        return decode_op_hdr(xdr, OP_DESTROY_SESSION);
5895}
5896
5897static int decode_destroy_clientid(struct xdr_stream *xdr, void *dummy)
5898{
5899        return decode_op_hdr(xdr, OP_DESTROY_CLIENTID);
5900}
5901
5902static int decode_reclaim_complete(struct xdr_stream *xdr, void *dummy)
5903{
5904        return decode_op_hdr(xdr, OP_RECLAIM_COMPLETE);
5905}
5906#endif /* CONFIG_NFS_V4_1 */
5907
5908static int decode_sequence(struct xdr_stream *xdr,
5909                           struct nfs4_sequence_res *res,
5910                           struct rpc_rqst *rqstp)
5911{
5912#if defined(CONFIG_NFS_V4_1)
5913        struct nfs4_session *session;
5914        struct nfs4_sessionid id;
5915        u32 dummy;
5916        int status;
5917        __be32 *p;
5918
5919        if (res->sr_slot == NULL)
5920                return 0;
5921        if (!res->sr_slot->table->session)
5922                return 0;
5923
5924        status = decode_op_hdr(xdr, OP_SEQUENCE);
5925        if (!status)
5926                status = decode_sessionid(xdr, &id);
5927        if (unlikely(status))
5928                goto out_err;
5929
5930        /*
5931         * If the server returns different values for sessionID, slotID or
5932         * sequence number, the server is looney tunes.
5933         */
5934        status = -EREMOTEIO;
5935        session = res->sr_slot->table->session;
5936
5937        if (memcmp(id.data, session->sess_id.data,
5938                   NFS4_MAX_SESSIONID_LEN)) {
5939                dprintk("%s Invalid session id\n", __func__);
5940                goto out_err;
5941        }
5942
5943        p = xdr_inline_decode(xdr, 20);
5944        if (unlikely(!p))
5945                goto out_overflow;
5946
5947        /* seqid */
5948        dummy = be32_to_cpup(p++);
5949        if (dummy != res->sr_slot->seq_nr) {
5950                dprintk("%s Invalid sequence number\n", __func__);
5951                goto out_err;
5952        }
5953        /* slot id */
5954        dummy = be32_to_cpup(p++);
5955        if (dummy != res->sr_slot->slot_nr) {
5956                dprintk("%s Invalid slot id\n", __func__);
5957                goto out_err;
5958        }
5959        /* highest slot id */
5960        res->sr_highest_slotid = be32_to_cpup(p++);
5961        /* target highest slot id */
5962        res->sr_target_highest_slotid = be32_to_cpup(p++);
5963        /* result flags */
5964        res->sr_status_flags = be32_to_cpup(p);
5965        status = 0;
5966out_err:
5967        res->sr_status = status;
5968        return status;
5969out_overflow:
5970        print_overflow_msg(__func__, xdr);
5971        status = -EIO;
5972        goto out_err;
5973#else  /* CONFIG_NFS_V4_1 */
5974        return 0;
5975#endif /* CONFIG_NFS_V4_1 */
5976}
5977
5978#if defined(CONFIG_NFS_V4_1)
5979static int decode_layout_stateid(struct xdr_stream *xdr, nfs4_stateid *stateid)
5980{
5981        stateid->type = NFS4_LAYOUT_STATEID_TYPE;
5982        return decode_stateid(xdr, stateid);
5983}
5984
5985static int decode_getdeviceinfo(struct xdr_stream *xdr,
5986                                struct nfs4_getdeviceinfo_res *res)
5987{
5988        struct pnfs_device *pdev = res->pdev;
5989        __be32 *p;
5990        uint32_t len, type;
5991        int status;
5992
5993        status = decode_op_hdr(xdr, OP_GETDEVICEINFO);
5994        if (status) {
5995                if (status == -ETOOSMALL) {
5996                        p = xdr_inline_decode(xdr, 4);
5997                        if (unlikely(!p))
5998                                goto out_overflow;
5999                        pdev->mincount = be32_to_cpup(p);
6000                        dprintk("%s: Min count too small. mincnt = %u\n",
6001                                __func__, pdev->mincount);
6002                }
6003                return status;
6004        }
6005
6006        p = xdr_inline_decode(xdr, 8);
6007        if (unlikely(!p))
6008                goto out_overflow;
6009        type = be32_to_cpup(p++);
6010        if (type != pdev->layout_type) {
6011                dprintk("%s: layout mismatch req: %u pdev: %u\n",
6012                        __func__, pdev->layout_type, type);
6013                return -EINVAL;
6014        }
6015        /*
6016         * Get the length of the opaque device_addr4. xdr_read_pages places
6017         * the opaque device_addr4 in the xdr_buf->pages (pnfs_device->pages)
6018         * and places the remaining xdr data in xdr_buf->tail
6019         */
6020        pdev->mincount = be32_to_cpup(p);
6021        if (xdr_read_pages(xdr, pdev->mincount) != pdev->mincount)
6022                goto out_overflow;
6023
6024        /* Parse notification bitmap, verifying that it is zero. */
6025        p = xdr_inline_decode(xdr, 4);
6026        if (unlikely(!p))
6027                goto out_overflow;
6028        len = be32_to_cpup(p);
6029        if (len) {
6030                uint32_t i;
6031
6032                p = xdr_inline_decode(xdr, 4 * len);
6033                if (unlikely(!p))
6034                        goto out_overflow;
6035
6036                res->notification = be32_to_cpup(p++);
6037                for (i = 1; i < len; i++) {
6038                        if (be32_to_cpup(p++)) {
6039                                dprintk("%s: unsupported notification\n",
6040                                        __func__);
6041                                return -EIO;
6042                        }
6043                }
6044        }
6045        return 0;
6046out_overflow:
6047        print_overflow_msg(__func__, xdr);
6048        return -EIO;
6049}
6050
6051static int decode_layoutget(struct xdr_stream *xdr, struct rpc_rqst *req,
6052                            struct nfs4_layoutget_res *res)
6053{
6054        __be32 *p;
6055        int status;
6056        u32 layout_count;
6057        u32 recvd;
6058
6059        status = decode_op_hdr(xdr, OP_LAYOUTGET);
6060        if (status)
6061                goto out;
6062        p = xdr_inline_decode(xdr, 4);
6063        if (unlikely(!p))
6064                goto out_overflow;
6065        res->return_on_close = be32_to_cpup(p);
6066        decode_layout_stateid(xdr, &res->stateid);
6067        p = xdr_inline_decode(xdr, 4);
6068        if (unlikely(!p))
6069                goto out_overflow;
6070        layout_count = be32_to_cpup(p);
6071        if (!layout_count) {
6072                dprintk("%s: server responded with empty layout array\n",
6073                        __func__);
6074                status = -EINVAL;
6075                goto out;
6076        }
6077
6078        p = xdr_inline_decode(xdr, 28);
6079        if (unlikely(!p))
6080                goto out_overflow;
6081        p = xdr_decode_hyper(p, &res->range.offset);
6082        p = xdr_decode_hyper(p, &res->range.length);
6083        res->range.iomode = be32_to_cpup(p++);
6084        res->type = be32_to_cpup(p++);
6085        res->layoutp->len = be32_to_cpup(p);
6086
6087        dprintk("%s roff:%lu rlen:%lu riomode:%d, lo_type:0x%x, lo.len:%d\n",
6088                __func__,
6089                (unsigned long)res->range.offset,
6090                (unsigned long)res->range.length,
6091                res->range.iomode,
6092                res->type,
6093                res->layoutp->len);
6094
6095        recvd = xdr_read_pages(xdr, res->layoutp->len);
6096        if (res->layoutp->len > recvd) {
6097                dprintk("NFS: server cheating in layoutget reply: "
6098                                "layout len %u > recvd %u\n",
6099                                res->layoutp->len, recvd);
6100                status = -EINVAL;
6101                goto out;
6102        }
6103
6104        if (layout_count > 1) {
6105                /* We only handle a length one array at the moment.  Any
6106                 * further entries are just ignored.  Note that this means
6107                 * the client may see a response that is less than the
6108                 * minimum it requested.
6109                 */
6110                dprintk("%s: server responded with %d layouts, dropping tail\n",
6111                        __func__, layout_count);
6112        }
6113
6114out:
6115        res->status = status;
6116        return status;
6117out_overflow:
6118        print_overflow_msg(__func__, xdr);
6119        status = -EIO;
6120        goto out;
6121}
6122
6123static int decode_layoutreturn(struct xdr_stream *xdr,
6124                               struct nfs4_layoutreturn_res *res)
6125{
6126        __be32 *p;
6127        int status;
6128
6129        status = decode_op_hdr(xdr, OP_LAYOUTRETURN);
6130        if (status)
6131                return status;
6132        p = xdr_inline_decode(xdr, 4);
6133        if (unlikely(!p))
6134                goto out_overflow;
6135        res->lrs_present = be32_to_cpup(p);
6136        if (res->lrs_present)
6137                status = decode_layout_stateid(xdr, &res->stateid);
6138        else
6139                nfs4_stateid_copy(&res->stateid, &invalid_stateid);
6140        return status;
6141out_overflow:
6142        print_overflow_msg(__func__, xdr);
6143        return -EIO;
6144}
6145
6146static int decode_layoutcommit(struct xdr_stream *xdr,
6147                               struct rpc_rqst *req,
6148                               struct nfs4_layoutcommit_res *res)
6149{
6150        __be32 *p;
6151        __u32 sizechanged;
6152        int status;
6153
6154        status = decode_op_hdr(xdr, OP_LAYOUTCOMMIT);
6155        res->status = status;
6156        if (status)
6157                return status;
6158
6159        p = xdr_inline_decode(xdr, 4);
6160        if (unlikely(!p))
6161                goto out_overflow;
6162        sizechanged = be32_to_cpup(p);
6163
6164        if (sizechanged) {
6165                /* throw away new size */
6166                p = xdr_inline_decode(xdr, 8);
6167                if (unlikely(!p))
6168                        goto out_overflow;
6169        }
6170        return 0;
6171out_overflow:
6172        print_overflow_msg(__func__, xdr);
6173        return -EIO;
6174}
6175
6176static int decode_test_stateid(struct xdr_stream *xdr,
6177                               struct nfs41_test_stateid_res *res)
6178{
6179        __be32 *p;
6180        int status;
6181        int num_res;
6182
6183        status = decode_op_hdr(xdr, OP_TEST_STATEID);
6184        if (status)
6185                return status;
6186
6187        p = xdr_inline_decode(xdr, 4);
6188        if (unlikely(!p))
6189                goto out_overflow;
6190        num_res = be32_to_cpup(p++);
6191        if (num_res != 1)
6192                goto out;
6193
6194        p = xdr_inline_decode(xdr, 4);
6195        if (unlikely(!p))
6196                goto out_overflow;
6197        res->status = be32_to_cpup(p++);
6198
6199        return status;
6200out_overflow:
6201        print_overflow_msg(__func__, xdr);
6202out:
6203        return -EIO;
6204}
6205
6206static int decode_free_stateid(struct xdr_stream *xdr,
6207                               struct nfs41_free_stateid_res *res)
6208{
6209        res->status = decode_op_hdr(xdr, OP_FREE_STATEID);
6210        return res->status;
6211}
6212#else
6213static inline
6214int decode_layoutreturn(struct xdr_stream *xdr,
6215                               struct nfs4_layoutreturn_res *res)
6216{
6217        return 0;
6218}
6219
6220static int decode_layoutget(struct xdr_stream *xdr, struct rpc_rqst *req,
6221                            struct nfs4_layoutget_res *res)
6222{
6223        return 0;
6224}
6225
6226#endif /* CONFIG_NFS_V4_1 */
6227
6228/*
6229 * END OF "GENERIC" DECODE ROUTINES.
6230 */
6231
6232/*
6233 * Decode OPEN_DOWNGRADE response
6234 */
6235static int nfs4_xdr_dec_open_downgrade(struct rpc_rqst *rqstp,
6236                                       struct xdr_stream *xdr,
6237                                       void *data)
6238{
6239        struct nfs_closeres *res = data;
6240        struct compound_hdr hdr;
6241        int status;
6242
6243        status = decode_compound_hdr(xdr, &hdr);
6244        if (status)
6245                goto out;
6246        status = decode_sequence(xdr, &res->seq_res, rqstp);
6247        if (status)
6248                goto out;
6249        status = decode_putfh(xdr);
6250        if (status)
6251                goto out;
6252        if (res->lr_res) {
6253                status = decode_layoutreturn(xdr, res->lr_res);
6254                res->lr_ret = status;
6255                if (status)
6256                        goto out;
6257        }
6258        status = decode_open_downgrade(xdr, res);
6259out:
6260        return status;
6261}
6262
6263/*
6264 * Decode ACCESS response
6265 */
6266static int nfs4_xdr_dec_access(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6267                               void *data)
6268{
6269        struct nfs4_accessres *res = data;
6270        struct compound_hdr hdr;
6271        int status;
6272
6273        status = decode_compound_hdr(xdr, &hdr);
6274        if (status)
6275                goto out;
6276        status = decode_sequence(xdr, &res->seq_res, rqstp);
6277        if (status)
6278                goto out;
6279        status = decode_putfh(xdr);
6280        if (status != 0)
6281                goto out;
6282        status = decode_access(xdr, &res->supported, &res->access);
6283        if (status != 0)
6284                goto out;
6285        if (res->fattr)
6286                decode_getfattr(xdr, res->fattr, res->server);
6287out:
6288        return status;
6289}
6290
6291/*
6292 * Decode LOOKUP response
6293 */
6294static int nfs4_xdr_dec_lookup(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6295                               void *data)
6296{
6297        struct nfs4_lookup_res *res = data;
6298        struct compound_hdr hdr;
6299        int status;
6300
6301        status = decode_compound_hdr(xdr, &hdr);
6302        if (status)
6303                goto out;
6304        status = decode_sequence(xdr, &res->seq_res, rqstp);
6305        if (status)
6306                goto out;
6307        status = decode_putfh(xdr);
6308        if (status)
6309                goto out;
6310        status = decode_lookup(xdr);
6311        if (status)
6312                goto out;
6313        status = decode_getfh(xdr, res->fh);
6314        if (status)
6315                goto out;
6316        status = decode_getfattr_label(xdr, res->fattr, res->label, res->server);
6317out:
6318        return status;
6319}
6320
6321/*
6322 * Decode LOOKUPP response
6323 */
6324static int nfs4_xdr_dec_lookupp(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6325                void *data)
6326{
6327        struct nfs4_lookupp_res *res = data;
6328        struct compound_hdr hdr;
6329        int status;
6330
6331        status = decode_compound_hdr(xdr, &hdr);
6332        if (status)
6333                goto out;
6334        status = decode_sequence(xdr, &res->seq_res, rqstp);
6335        if (status)
6336                goto out;
6337        status = decode_putfh(xdr);
6338        if (status)
6339                goto out;
6340        status = decode_lookupp(xdr);
6341        if (status)
6342                goto out;
6343        status = decode_getfh(xdr, res->fh);
6344        if (status)
6345                goto out;
6346        status = decode_getfattr_label(xdr, res->fattr, res->label, res->server);
6347out:
6348        return status;
6349}
6350
6351/*
6352 * Decode LOOKUP_ROOT response
6353 */
6354static int nfs4_xdr_dec_lookup_root(struct rpc_rqst *rqstp,
6355                                    struct xdr_stream *xdr,
6356                                    void *data)
6357{
6358        struct nfs4_lookup_res *res = data;
6359        struct compound_hdr hdr;
6360        int status;
6361
6362        status = decode_compound_hdr(xdr, &hdr);
6363        if (status)
6364                goto out;
6365        status = decode_sequence(xdr, &res->seq_res, rqstp);
6366        if (status)
6367                goto out;
6368        status = decode_putrootfh(xdr);
6369        if (status)
6370                goto out;
6371        status = decode_getfh(xdr, res->fh);
6372        if (status == 0)
6373                status = decode_getfattr_label(xdr, res->fattr,
6374                                                res->label, res->server);
6375out:
6376        return status;
6377}
6378
6379/*
6380 * Decode REMOVE response
6381 */
6382static int nfs4_xdr_dec_remove(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6383                               void *data)
6384{
6385        struct nfs_removeres *res = data;
6386        struct compound_hdr hdr;
6387        int status;
6388
6389        status = decode_compound_hdr(xdr, &hdr);
6390        if (status)
6391                goto out;
6392        status = decode_sequence(xdr, &res->seq_res, rqstp);
6393        if (status)
6394                goto out;
6395        status = decode_putfh(xdr);
6396        if (status)
6397                goto out;
6398        status = decode_remove(xdr, &res->cinfo);
6399out:
6400        return status;
6401}
6402
6403/*
6404 * Decode RENAME response
6405 */
6406static int nfs4_xdr_dec_rename(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6407                               void *data)
6408{
6409        struct nfs_renameres *res = data;
6410        struct compound_hdr hdr;
6411        int status;
6412
6413        status = decode_compound_hdr(xdr, &hdr);
6414        if (status)
6415                goto out;
6416        status = decode_sequence(xdr, &res->seq_res, rqstp);
6417        if (status)
6418                goto out;
6419        status = decode_putfh(xdr);
6420        if (status)
6421                goto out;
6422        status = decode_savefh(xdr);
6423        if (status)
6424                goto out;
6425        status = decode_putfh(xdr);
6426        if (status)
6427                goto out;
6428        status = decode_rename(xdr, &res->old_cinfo, &res->new_cinfo);
6429out:
6430        return status;
6431}
6432
6433/*
6434 * Decode LINK response
6435 */
6436static int nfs4_xdr_dec_link(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6437                             void *data)
6438{
6439        struct nfs4_link_res *res = data;
6440        struct compound_hdr hdr;
6441        int status;
6442
6443        status = decode_compound_hdr(xdr, &hdr);
6444        if (status)
6445                goto out;
6446        status = decode_sequence(xdr, &res->seq_res, rqstp);
6447        if (status)
6448                goto out;
6449        status = decode_putfh(xdr);
6450        if (status)
6451                goto out;
6452        status = decode_savefh(xdr);
6453        if (status)
6454                goto out;
6455        status = decode_putfh(xdr);
6456        if (status)
6457                goto out;
6458        status = decode_link(xdr, &res->cinfo);
6459        if (status)
6460                goto out;
6461        /*
6462         * Note order: OP_LINK leaves the directory as the current
6463         *             filehandle.
6464         */
6465        status = decode_restorefh(xdr);
6466        if (status)
6467                goto out;
6468        decode_getfattr_label(xdr, res->fattr, res->label, res->server);
6469out:
6470        return status;
6471}
6472
6473/*
6474 * Decode CREATE response
6475 */
6476static int nfs4_xdr_dec_create(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6477                               void *data)
6478{
6479        struct nfs4_create_res *res = data;
6480        struct compound_hdr hdr;
6481        int status;
6482
6483        status = decode_compound_hdr(xdr, &hdr);
6484        if (status)
6485                goto out;
6486        status = decode_sequence(xdr, &res->seq_res, rqstp);
6487        if (status)
6488                goto out;
6489        status = decode_putfh(xdr);
6490        if (status)
6491                goto out;
6492        status = decode_create(xdr, &res->dir_cinfo);
6493        if (status)
6494                goto out;
6495        status = decode_getfh(xdr, res->fh);
6496        if (status)
6497                goto out;
6498        decode_getfattr_label(xdr, res->fattr, res->label, res->server);
6499out:
6500        return status;
6501}
6502
6503/*
6504 * Decode SYMLINK response
6505 */
6506static int nfs4_xdr_dec_symlink(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6507                                void *res)
6508{
6509        return nfs4_xdr_dec_create(rqstp, xdr, res);
6510}
6511
6512/*
6513 * Decode GETATTR response
6514 */
6515static int nfs4_xdr_dec_getattr(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6516                                void *data)
6517{
6518        struct nfs4_getattr_res *res = data;
6519        struct compound_hdr hdr;
6520        int status;
6521
6522        status = decode_compound_hdr(xdr, &hdr);
6523        if (status)
6524                goto out;
6525        status = decode_sequence(xdr, &res->seq_res, rqstp);
6526        if (status)
6527                goto out;
6528        status = decode_putfh(xdr);
6529        if (status)
6530                goto out;
6531        status = decode_getfattr_label(xdr, res->fattr, res->label, res->server);
6532out:
6533        return status;
6534}
6535
6536/*
6537 * Encode an SETACL request
6538 */
6539static void nfs4_xdr_enc_setacl(struct rpc_rqst *req, struct xdr_stream *xdr,
6540                                const void *data)
6541{
6542        const struct nfs_setaclargs *args = data;
6543        struct compound_hdr hdr = {
6544                .minorversion = nfs4_xdr_minorversion(&args->seq_args),
6545        };
6546
6547        encode_compound_hdr(xdr, req, &hdr);
6548        encode_sequence(xdr, &args->seq_args, &hdr);
6549        encode_putfh(xdr, args->fh, &hdr);
6550        encode_setacl(xdr, args, &hdr);
6551        encode_nops(&hdr);
6552}
6553
6554/*
6555 * Decode SETACL response
6556 */
6557static int
6558nfs4_xdr_dec_setacl(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6559                    void *data)
6560{
6561        struct nfs_setaclres *res = data;
6562        struct compound_hdr hdr;
6563        int status;
6564
6565        status = decode_compound_hdr(xdr, &hdr);
6566        if (status)
6567                goto out;
6568        status = decode_sequence(xdr, &res->seq_res, rqstp);
6569        if (status)
6570                goto out;
6571        status = decode_putfh(xdr);
6572        if (status)
6573                goto out;
6574        status = decode_setattr(xdr);
6575out:
6576        return status;
6577}
6578
6579/*
6580 * Decode GETACL response
6581 */
6582static int
6583nfs4_xdr_dec_getacl(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6584                    void *data)
6585{
6586        struct nfs_getaclres *res = data;
6587        struct compound_hdr hdr;
6588        int status;
6589
6590        if (res->acl_scratch != NULL) {
6591                void *p = page_address(res->acl_scratch);
6592                xdr_set_scratch_buffer(xdr, p, PAGE_SIZE);
6593        }
6594        status = decode_compound_hdr(xdr, &hdr);
6595        if (status)
6596                goto out;
6597        status = decode_sequence(xdr, &res->seq_res, rqstp);
6598        if (status)
6599                goto out;
6600        status = decode_putfh(xdr);
6601        if (status)
6602                goto out;
6603        status = decode_getacl(xdr, rqstp, res);
6604
6605out:
6606        return status;
6607}
6608
6609/*
6610 * Decode CLOSE response
6611 */
6612static int nfs4_xdr_dec_close(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6613                              void *data)
6614{
6615        struct nfs_closeres *res = data;
6616        struct compound_hdr hdr;
6617        int status;
6618
6619        status = decode_compound_hdr(xdr, &hdr);
6620        if (status)
6621                goto out;
6622        status = decode_sequence(xdr, &res->seq_res, rqstp);
6623        if (status)
6624                goto out;
6625        status = decode_putfh(xdr);
6626        if (status)
6627                goto out;
6628        if (res->lr_res) {
6629                status = decode_layoutreturn(xdr, res->lr_res);
6630                res->lr_ret = status;
6631                if (status)
6632                        goto out;
6633        }
6634        if (res->fattr != NULL) {
6635                status = decode_getfattr(xdr, res->fattr, res->server);
6636                if (status != 0)
6637                        goto out;
6638        }
6639        status = decode_close(xdr, res);
6640out:
6641        return status;
6642}
6643
6644/*
6645 * Decode OPEN response
6646 */
6647static int nfs4_xdr_dec_open(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6648                             void *data)
6649{
6650        struct nfs_openres *res = data;
6651        struct compound_hdr hdr;
6652        int status;
6653
6654        status = decode_compound_hdr(xdr, &hdr);
6655        if (status)
6656                goto out;
6657        status = decode_sequence(xdr, &res->seq_res, rqstp);
6658        if (status)
6659                goto out;
6660        status = decode_putfh(xdr);
6661        if (status)
6662                goto out;
6663        status = decode_open(xdr, res);
6664        if (status)
6665                goto out;
6666        status = decode_getfh(xdr, &res->fh);
6667        if (status)
6668                goto out;
6669        if (res->access_request)
6670                decode_access(xdr, &res->access_supported, &res->access_result);
6671        decode_getfattr_label(xdr, res->f_attr, res->f_label, res->server);
6672        if (res->lg_res)
6673                decode_layoutget(xdr, rqstp, res->lg_res);
6674out:
6675        return status;
6676}
6677
6678/*
6679 * Decode OPEN_CONFIRM response
6680 */
6681static int nfs4_xdr_dec_open_confirm(struct rpc_rqst *rqstp,
6682                                     struct xdr_stream *xdr,
6683                                     void *data)
6684{
6685        struct nfs_open_confirmres *res = data;
6686        struct compound_hdr hdr;
6687        int status;
6688
6689        status = decode_compound_hdr(xdr, &hdr);
6690        if (status)
6691                goto out;
6692        status = decode_putfh(xdr);
6693        if (status)
6694                goto out;
6695        status = decode_open_confirm(xdr, res);
6696out:
6697        return status;
6698}
6699
6700/*
6701 * Decode OPEN response
6702 */
6703static int nfs4_xdr_dec_open_noattr(struct rpc_rqst *rqstp,
6704                                    struct xdr_stream *xdr,
6705                                    void *data)
6706{
6707        struct nfs_openres *res = data;
6708        struct compound_hdr hdr;
6709        int status;
6710
6711        status = decode_compound_hdr(xdr, &hdr);
6712        if (status)
6713                goto out;
6714        status = decode_sequence(xdr, &res->seq_res, rqstp);
6715        if (status)
6716                goto out;
6717        status = decode_putfh(xdr);
6718        if (status)
6719                goto out;
6720        status = decode_open(xdr, res);
6721        if (status)
6722                goto out;
6723        if (res->access_request)
6724                decode_access(xdr, &res->access_supported, &res->access_result);
6725        decode_getfattr(xdr, res->f_attr, res->server);
6726        if (res->lg_res)
6727                decode_layoutget(xdr, rqstp, res->lg_res);
6728out:
6729        return status;
6730}
6731
6732/*
6733 * Decode SETATTR response
6734 */
6735static int nfs4_xdr_dec_setattr(struct rpc_rqst *rqstp,
6736                                struct xdr_stream *xdr,
6737                                void *data)
6738{
6739        struct nfs_setattrres *res = data;
6740        struct compound_hdr hdr;
6741        int status;
6742
6743        status = decode_compound_hdr(xdr, &hdr);
6744        if (status)
6745                goto out;
6746        status = decode_sequence(xdr, &res->seq_res, rqstp);
6747        if (status)
6748                goto out;
6749        status = decode_putfh(xdr);
6750        if (status)
6751                goto out;
6752        status = decode_setattr(xdr);
6753        if (status)
6754                goto out;
6755        decode_getfattr_label(xdr, res->fattr, res->label, res->server);
6756out:
6757        return status;
6758}
6759
6760/*
6761 * Decode LOCK response
6762 */
6763static int nfs4_xdr_dec_lock(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6764                             void *data)
6765{
6766        struct nfs_lock_res *res = data;
6767        struct compound_hdr hdr;
6768        int status;
6769
6770        status = decode_compound_hdr(xdr, &hdr);
6771        if (status)
6772                goto out;
6773        status = decode_sequence(xdr, &res->seq_res, rqstp);
6774        if (status)
6775                goto out;
6776        status = decode_putfh(xdr);
6777        if (status)
6778                goto out;
6779        status = decode_lock(xdr, res);
6780out:
6781        return status;
6782}
6783
6784/*
6785 * Decode LOCKT response
6786 */
6787static int nfs4_xdr_dec_lockt(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6788                              void *data)
6789{
6790        struct nfs_lockt_res *res = data;
6791        struct compound_hdr hdr;
6792        int status;
6793
6794        status = decode_compound_hdr(xdr, &hdr);
6795        if (status)
6796                goto out;
6797        status = decode_sequence(xdr, &res->seq_res, rqstp);
6798        if (status)
6799                goto out;
6800        status = decode_putfh(xdr);
6801        if (status)
6802                goto out;
6803        status = decode_lockt(xdr, res);
6804out:
6805        return status;
6806}
6807
6808/*
6809 * Decode LOCKU response
6810 */
6811static int nfs4_xdr_dec_locku(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6812                              void *data)
6813{
6814        struct nfs_locku_res *res = data;
6815        struct compound_hdr hdr;
6816        int status;
6817
6818        status = decode_compound_hdr(xdr, &hdr);
6819        if (status)
6820                goto out;
6821        status = decode_sequence(xdr, &res->seq_res, rqstp);
6822        if (status)
6823                goto out;
6824        status = decode_putfh(xdr);
6825        if (status)
6826                goto out;
6827        status = decode_locku(xdr, res);
6828out:
6829        return status;
6830}
6831
6832static int nfs4_xdr_dec_release_lockowner(struct rpc_rqst *rqstp,
6833                                          struct xdr_stream *xdr, void *dummy)
6834{
6835        struct compound_hdr hdr;
6836        int status;
6837
6838        status = decode_compound_hdr(xdr, &hdr);
6839        if (!status)
6840                status = decode_release_lockowner(xdr);
6841        return status;
6842}
6843
6844/*
6845 * Decode READLINK response
6846 */
6847static int nfs4_xdr_dec_readlink(struct rpc_rqst *rqstp,
6848                                 struct xdr_stream *xdr,
6849                                 void *data)
6850{
6851        struct nfs4_readlink_res *res = data;
6852        struct compound_hdr hdr;
6853        int status;
6854
6855        status = decode_compound_hdr(xdr, &hdr);
6856        if (status)
6857                goto out;
6858        status = decode_sequence(xdr, &res->seq_res, rqstp);
6859        if (status)
6860                goto out;
6861        status = decode_putfh(xdr);
6862        if (status)
6863                goto out;
6864        status = decode_readlink(xdr, rqstp);
6865out:
6866        return status;
6867}
6868
6869/*
6870 * Decode READDIR response
6871 */
6872static int nfs4_xdr_dec_readdir(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6873                                void *data)
6874{
6875        struct nfs4_readdir_res *res = data;
6876        struct compound_hdr hdr;
6877        int status;
6878
6879        status = decode_compound_hdr(xdr, &hdr);
6880        if (status)
6881                goto out;
6882        status = decode_sequence(xdr, &res->seq_res, rqstp);
6883        if (status)
6884                goto out;
6885        status = decode_putfh(xdr);
6886        if (status)
6887                goto out;
6888        status = decode_readdir(xdr, rqstp, res);
6889out:
6890        return status;
6891}
6892
6893/*
6894 * Decode Read response
6895 */
6896static int nfs4_xdr_dec_read(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6897                             void *data)
6898{
6899        struct nfs_pgio_res *res = data;
6900        struct compound_hdr hdr;
6901        int status;
6902
6903        status = decode_compound_hdr(xdr, &hdr);
6904        res->op_status = hdr.status;
6905        if (status)
6906                goto out;
6907        status = decode_sequence(xdr, &res->seq_res, rqstp);
6908        if (status)
6909                goto out;
6910        status = decode_putfh(xdr);
6911        if (status)
6912                goto out;
6913        status = decode_read(xdr, rqstp, res);
6914        if (!status)
6915                status = res->count;
6916out:
6917        return status;
6918}
6919
6920/*
6921 * Decode WRITE response
6922 */
6923static int nfs4_xdr_dec_write(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6924                              void *data)
6925{
6926        struct nfs_pgio_res *res = data;
6927        struct compound_hdr hdr;
6928        int status;
6929
6930        status = decode_compound_hdr(xdr, &hdr);
6931        res->op_status = hdr.status;
6932        if (status)
6933                goto out;
6934        status = decode_sequence(xdr, &res->seq_res, rqstp);
6935        if (status)
6936                goto out;
6937        status = decode_putfh(xdr);
6938        if (status)
6939                goto out;
6940        status = decode_write(xdr, res);
6941        if (status)
6942                goto out;
6943        if (res->fattr)
6944                decode_getfattr(xdr, res->fattr, res->server);
6945        if (!status)
6946                status = res->count;
6947out:
6948        return status;
6949}
6950
6951/*
6952 * Decode COMMIT response
6953 */
6954static int nfs4_xdr_dec_commit(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
6955                               void *data)
6956{
6957        struct nfs_commitres *res = data;
6958        struct compound_hdr hdr;
6959        int status;
6960
6961        status = decode_compound_hdr(xdr, &hdr);
6962        res->op_status = hdr.status;
6963        if (status)
6964                goto out;
6965        status = decode_sequence(xdr, &res->seq_res, rqstp);
6966        if (status)
6967                goto out;
6968        status = decode_putfh(xdr);
6969        if (status)
6970                goto out;
6971        status = decode_commit(xdr, res);
6972out:
6973        return status;
6974}
6975
6976/*
6977 * Decode FSINFO response
6978 */
6979static int nfs4_xdr_dec_fsinfo(struct rpc_rqst *req, struct xdr_stream *xdr,
6980                               void *data)
6981{
6982        struct nfs4_fsinfo_res *res = data;
6983        struct compound_hdr hdr;
6984        int status;
6985
6986        status = decode_compound_hdr(xdr, &hdr);
6987        if (!status)
6988                status = decode_sequence(xdr, &res->seq_res, req);
6989        if (!status)
6990                status = decode_putfh(xdr);
6991        if (!status)
6992                status = decode_fsinfo(xdr, res->fsinfo);
6993        return status;
6994}
6995
6996/*
6997 * Decode PATHCONF response
6998 */
6999static int nfs4_xdr_dec_pathconf(struct rpc_rqst *req, struct xdr_stream *xdr,
7000                                 void *data)
7001{
7002        struct nfs4_pathconf_res *res = data;
7003        struct compound_hdr hdr;
7004        int status;
7005
7006        status = decode_compound_hdr(xdr, &hdr);
7007        if (!status)
7008                status = decode_sequence(xdr, &res->seq_res, req);
7009        if (!status)
7010                status = decode_putfh(xdr);
7011        if (!status)
7012                status = decode_pathconf(xdr, res->pathconf);
7013        return status;
7014}
7015
7016/*
7017 * Decode STATFS response
7018 */
7019static int nfs4_xdr_dec_statfs(struct rpc_rqst *req, struct xdr_stream *xdr,
7020                               void *data)
7021{
7022        struct nfs4_statfs_res *res = data;
7023        struct compound_hdr hdr;
7024        int status;
7025
7026        status = decode_compound_hdr(xdr, &hdr);
7027        if (!status)
7028                status = decode_sequence(xdr, &res->seq_res, req);
7029        if (!status)
7030                status = decode_putfh(xdr);
7031        if (!status)
7032                status = decode_statfs(xdr, res->fsstat);
7033        return status;
7034}
7035
7036/*
7037 * Decode GETATTR_BITMAP response
7038 */
7039static int nfs4_xdr_dec_server_caps(struct rpc_rqst *req,
7040                                    struct xdr_stream *xdr,
7041                                    void *data)
7042{
7043        struct nfs4_server_caps_res *res = data;
7044        struct compound_hdr hdr;
7045        int status;
7046
7047        status = decode_compound_hdr(xdr, &hdr);
7048        if (status)
7049                goto out;
7050        status = decode_sequence(xdr, &res->seq_res, req);
7051        if (status)
7052                goto out;
7053        status = decode_putfh(xdr);
7054        if (status)
7055                goto out;
7056        status = decode_server_caps(xdr, res);
7057out:
7058        return status;
7059}
7060
7061/*
7062 * Decode RENEW response
7063 */
7064static int nfs4_xdr_dec_renew(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
7065                              void *__unused)
7066{
7067        struct compound_hdr hdr;
7068        int status;
7069
7070        status = decode_compound_hdr(xdr, &hdr);
7071        if (!status)
7072                status = decode_renew(xdr);
7073        return status;
7074}
7075
7076/*
7077 * Decode SETCLIENTID response
7078 */
7079static int nfs4_xdr_dec_setclientid(struct rpc_rqst *req,
7080                                    struct xdr_stream *xdr,
7081                                    void *data)
7082{
7083        struct nfs4_setclientid_res *res = data;
7084        struct compound_hdr hdr;
7085        int status;
7086
7087        status = decode_compound_hdr(xdr, &hdr);
7088        if (!status)
7089                status = decode_setclientid(xdr, res);
7090        return status;
7091}
7092
7093/*
7094 * Decode SETCLIENTID_CONFIRM response
7095 */
7096static int nfs4_xdr_dec_setclientid_confirm(struct rpc_rqst *req,
7097                                            struct xdr_stream *xdr,
7098                                            void *data)
7099{
7100        struct compound_hdr hdr;
7101        int status;
7102
7103        status = decode_compound_hdr(xdr, &hdr);
7104        if (!status)
7105                status = decode_setclientid_confirm(xdr);
7106        return status;
7107}
7108
7109/*
7110 * Decode DELEGRETURN response
7111 */
7112static int nfs4_xdr_dec_delegreturn(struct rpc_rqst *rqstp,
7113                                    struct xdr_stream *xdr,
7114                                    void *data)
7115{
7116        struct nfs4_delegreturnres *res = data;
7117        struct compound_hdr hdr;
7118        int status;
7119
7120        status = decode_compound_hdr(xdr, &hdr);
7121        if (status)
7122                goto out;
7123        status = decode_sequence(xdr, &res->seq_res, rqstp);
7124        if (status)
7125                goto out;
7126        status = decode_putfh(xdr);
7127        if (status != 0)
7128                goto out;
7129        if (res->lr_res) {
7130                status = decode_layoutreturn(xdr, res->lr_res);
7131                res->lr_ret = status;
7132                if (status)
7133                        goto out;
7134        }
7135        if (res->fattr) {
7136                status = decode_getfattr(xdr, res->fattr, res->server);
7137                if (status != 0)
7138                        goto out;
7139        }
7140        status = decode_delegreturn(xdr);
7141out:
7142        return status;
7143}
7144
7145/*
7146 * Decode FS_LOCATIONS response
7147 */
7148static int nfs4_xdr_dec_fs_locations(struct rpc_rqst *req,
7149                                     struct xdr_stream *xdr,
7150                                     void *data)
7151{
7152        struct nfs4_fs_locations_res *res = data;
7153        struct compound_hdr hdr;
7154        int status;
7155
7156        status = decode_compound_hdr(xdr, &hdr);
7157        if (status)
7158                goto out;
7159        status = decode_sequence(xdr, &res->seq_res, req);
7160        if (status)
7161                goto out;
7162        status = decode_putfh(xdr);
7163        if (status)
7164                goto out;
7165        if (res->migration) {
7166                xdr_enter_page(xdr, PAGE_SIZE);
7167                status = decode_getfattr_generic(xdr,
7168                                        &res->fs_locations->fattr,
7169                                         NULL, res->fs_locations,
7170                                         NULL, res->fs_locations->server);
7171                if (status)
7172                        goto out;
7173                if (res->renew)
7174                        status = decode_renew(xdr);
7175        } else {
7176                status = decode_lookup(xdr);
7177                if (status)
7178                        goto out;
7179                xdr_enter_page(xdr, PAGE_SIZE);
7180                status = decode_getfattr_generic(xdr,
7181                                        &res->fs_locations->fattr,
7182                                         NULL, res->fs_locations,
7183                                         NULL, res->fs_locations->server);
7184        }
7185out:
7186        return status;
7187}
7188
7189/*
7190 * Decode SECINFO response
7191 */
7192static int nfs4_xdr_dec_secinfo(struct rpc_rqst *rqstp,
7193                                struct xdr_stream *xdr,
7194                                void *data)
7195{
7196        struct nfs4_secinfo_res *res = data;
7197        struct compound_hdr hdr;
7198        int status;
7199
7200        status = decode_compound_hdr(xdr, &hdr);
7201        if (status)
7202                goto out;
7203        status = decode_sequence(xdr, &res->seq_res, rqstp);
7204        if (status)
7205                goto out;
7206        status = decode_putfh(xdr);
7207        if (status)
7208                goto out;
7209        status = decode_secinfo(xdr, res);
7210out:
7211        return status;
7212}
7213
7214/*
7215 * Decode FSID_PRESENT response
7216 */
7217static int nfs4_xdr_dec_fsid_present(struct rpc_rqst *rqstp,
7218                                     struct xdr_stream *xdr,
7219                                     void *data)
7220{
7221        struct nfs4_fsid_present_res *res = data;
7222        struct compound_hdr hdr;
7223        int status;
7224
7225        status = decode_compound_hdr(xdr, &hdr);
7226        if (status)
7227                goto out;
7228        status = decode_sequence(xdr, &res->seq_res, rqstp);
7229        if (status)
7230                goto out;
7231        status = decode_putfh(xdr);
7232        if (status)
7233                goto out;
7234        status = decode_getfh(xdr, res->fh);
7235        if (status)
7236                goto out;
7237        if (res->renew)
7238                status = decode_renew(xdr);
7239out:
7240        return status;
7241}
7242
7243#if defined(CONFIG_NFS_V4_1)
7244/*
7245 * Decode BIND_CONN_TO_SESSION response
7246 */
7247static int nfs4_xdr_dec_bind_conn_to_session(struct rpc_rqst *rqstp,
7248                                        struct xdr_stream *xdr,
7249                                        void *res)
7250{
7251        struct compound_hdr hdr;
7252        int status;
7253
7254        status = decode_compound_hdr(xdr, &hdr);
7255        if (!status)
7256                status = decode_bind_conn_to_session(xdr, res);
7257        return status;
7258}
7259
7260/*
7261 * Decode EXCHANGE_ID response
7262 */
7263static int nfs4_xdr_dec_exchange_id(struct rpc_rqst *rqstp,
7264                                    struct xdr_stream *xdr,
7265                                    void *res)
7266{
7267        struct compound_hdr hdr;
7268        int status;
7269
7270        status = decode_compound_hdr(xdr, &hdr);
7271        if (!status)
7272                status = decode_exchange_id(xdr, res);
7273        return status;
7274}
7275
7276/*
7277 * Decode CREATE_SESSION response
7278 */
7279static int nfs4_xdr_dec_create_session(struct rpc_rqst *rqstp,
7280                                       struct xdr_stream *xdr,
7281                                       void *res)
7282{
7283        struct compound_hdr hdr;
7284        int status;
7285
7286        status = decode_compound_hdr(xdr, &hdr);
7287        if (!status)
7288                status = decode_create_session(xdr, res);
7289        return status;
7290}
7291
7292/*
7293 * Decode DESTROY_SESSION response
7294 */
7295static int nfs4_xdr_dec_destroy_session(struct rpc_rqst *rqstp,
7296                                        struct xdr_stream *xdr,
7297                                        void *res)
7298{
7299        struct compound_hdr hdr;
7300        int status;
7301
7302        status = decode_compound_hdr(xdr, &hdr);
7303        if (!status)
7304                status = decode_destroy_session(xdr, res);
7305        return status;
7306}
7307
7308/*
7309 * Decode DESTROY_CLIENTID response
7310 */
7311static int nfs4_xdr_dec_destroy_clientid(struct rpc_rqst *rqstp,
7312                                        struct xdr_stream *xdr,
7313                                        void *res)
7314{
7315        struct compound_hdr hdr;
7316        int status;
7317
7318        status = decode_compound_hdr(xdr, &hdr);
7319        if (!status)
7320                status = decode_destroy_clientid(xdr, res);
7321        return status;
7322}
7323
7324/*
7325 * Decode SEQUENCE response
7326 */
7327static int nfs4_xdr_dec_sequence(struct rpc_rqst *rqstp,
7328                                 struct xdr_stream *xdr,
7329                                 void *res)
7330{
7331        struct compound_hdr hdr;
7332        int status;
7333
7334        status = decode_compound_hdr(xdr, &hdr);
7335        if (!status)
7336                status = decode_sequence(xdr, res, rqstp);
7337        return status;
7338}
7339
7340/*
7341 * Decode GET_LEASE_TIME response
7342 */
7343static int nfs4_xdr_dec_get_lease_time(struct rpc_rqst *rqstp,
7344                                       struct xdr_stream *xdr,
7345                                       void *data)
7346{
7347        struct nfs4_get_lease_time_res *res = data;
7348        struct compound_hdr hdr;
7349        int status;
7350
7351        status = decode_compound_hdr(xdr, &hdr);
7352        if (!status)
7353                status = decode_sequence(xdr, &res->lr_seq_res, rqstp);
7354        if (!status)
7355                status = decode_putrootfh(xdr);
7356        if (!status)
7357                status = decode_fsinfo(xdr, res->lr_fsinfo);
7358        return status;
7359}
7360
7361/*
7362 * Decode RECLAIM_COMPLETE response
7363 */
7364static int nfs4_xdr_dec_reclaim_complete(struct rpc_rqst *rqstp,
7365                                         struct xdr_stream *xdr,
7366                                         void *data)
7367{
7368        struct nfs41_reclaim_complete_res *res = data;
7369        struct compound_hdr hdr;
7370        int status;
7371
7372        status = decode_compound_hdr(xdr, &hdr);
7373        if (!status)
7374                status = decode_sequence(xdr, &res->seq_res, rqstp);
7375        if (!status)
7376                status = decode_reclaim_complete(xdr, NULL);
7377        return status;
7378}
7379
7380/*
7381 * Decode GETDEVINFO response
7382 */
7383static int nfs4_xdr_dec_getdeviceinfo(struct rpc_rqst *rqstp,
7384                                      struct xdr_stream *xdr,
7385                                      void *data)
7386{
7387        struct nfs4_getdeviceinfo_res *res = data;
7388        struct compound_hdr hdr;
7389        int status;
7390
7391        status = decode_compound_hdr(xdr, &hdr);
7392        if (status != 0)
7393                goto out;
7394        status = decode_sequence(xdr, &res->seq_res, rqstp);
7395        if (status != 0)
7396                goto out;
7397        status = decode_getdeviceinfo(xdr, res);
7398out:
7399        return status;
7400}
7401
7402/*
7403 * Decode LAYOUTGET response
7404 */
7405static int nfs4_xdr_dec_layoutget(struct rpc_rqst *rqstp,
7406                                  struct xdr_stream *xdr,
7407                                  void *data)
7408{
7409        struct nfs4_layoutget_res *res = data;
7410        struct compound_hdr hdr;
7411        int status;
7412
7413        status = decode_compound_hdr(xdr, &hdr);
7414        if (status)
7415                goto out;
7416        status = decode_sequence(xdr, &res->seq_res, rqstp);
7417        if (status)
7418                goto out;
7419        status = decode_putfh(xdr);
7420        if (status)
7421                goto out;
7422        status = decode_layoutget(xdr, rqstp, res);
7423out:
7424        return status;
7425}
7426
7427/*
7428 * Decode LAYOUTRETURN response
7429 */
7430static int nfs4_xdr_dec_layoutreturn(struct rpc_rqst *rqstp,
7431                                     struct xdr_stream *xdr,
7432                                     void *data)
7433{
7434        struct nfs4_layoutreturn_res *res = data;
7435        struct compound_hdr hdr;
7436        int status;
7437
7438        status = decode_compound_hdr(xdr, &hdr);
7439        if (status)
7440                goto out;
7441        status = decode_sequence(xdr, &res->seq_res, rqstp);
7442        if (status)
7443                goto out;
7444        status = decode_putfh(xdr);
7445        if (status)
7446                goto out;
7447        status = decode_layoutreturn(xdr, res);
7448out:
7449        return status;
7450}
7451
7452/*
7453 * Decode LAYOUTCOMMIT response
7454 */
7455static int nfs4_xdr_dec_layoutcommit(struct rpc_rqst *rqstp,
7456                                     struct xdr_stream *xdr,
7457                                     void *data)
7458{
7459        struct nfs4_layoutcommit_res *res = data;
7460        struct compound_hdr hdr;
7461        int status;
7462
7463        status = decode_compound_hdr(xdr, &hdr);
7464        if (status)
7465                goto out;
7466        status = decode_sequence(xdr, &res->seq_res, rqstp);
7467        if (status)
7468                goto out;
7469        status = decode_putfh(xdr);
7470        if (status)
7471                goto out;
7472        status = decode_layoutcommit(xdr, rqstp, res);
7473        if (status)
7474                goto out;
7475        decode_getfattr(xdr, res->fattr, res->server);
7476out:
7477        return status;
7478}
7479
7480/*
7481 * Decode SECINFO_NO_NAME response
7482 */
7483static int nfs4_xdr_dec_secinfo_no_name(struct rpc_rqst *rqstp,
7484                                        struct xdr_stream *xdr,
7485                                        void *data)
7486{
7487        struct nfs4_secinfo_res *res = data;
7488        struct compound_hdr hdr;
7489        int status;
7490
7491        status = decode_compound_hdr(xdr, &hdr);
7492        if (status)
7493                goto out;
7494        status = decode_sequence(xdr, &res->seq_res, rqstp);
7495        if (status)
7496                goto out;
7497        status = decode_putrootfh(xdr);
7498        if (status)
7499                goto out;
7500        status = decode_secinfo_no_name(xdr, res);
7501out:
7502        return status;
7503}
7504
7505/*
7506 * Decode TEST_STATEID response
7507 */
7508static int nfs4_xdr_dec_test_stateid(struct rpc_rqst *rqstp,
7509                                     struct xdr_stream *xdr,
7510                                     void *data)
7511{
7512        struct nfs41_test_stateid_res *res = data;
7513        struct compound_hdr hdr;
7514        int status;
7515
7516        status = decode_compound_hdr(xdr, &hdr);
7517        if (status)
7518                goto out;
7519        status = decode_sequence(xdr, &res->seq_res, rqstp);
7520        if (status)
7521                goto out;
7522        status = decode_test_stateid(xdr, res);
7523out:
7524        return status;
7525}
7526
7527/*
7528 * Decode FREE_STATEID response
7529 */
7530static int nfs4_xdr_dec_free_stateid(struct rpc_rqst *rqstp,
7531                                     struct xdr_stream *xdr,
7532                                     void *data)
7533{
7534        struct nfs41_free_stateid_res *res = data;
7535        struct compound_hdr hdr;
7536        int status;
7537
7538        status = decode_compound_hdr(xdr, &hdr);
7539        if (status)
7540                goto out;
7541        status = decode_sequence(xdr, &res->seq_res, rqstp);
7542        if (status)
7543                goto out;
7544        status = decode_free_stateid(xdr, res);
7545out:
7546        return status;
7547}
7548#endif /* CONFIG_NFS_V4_1 */
7549
7550/**
7551 * nfs4_decode_dirent - Decode a single NFSv4 directory entry stored in
7552 *                      the local page cache.
7553 * @xdr: XDR stream where entry resides
7554 * @entry: buffer to fill in with entry data
7555 * @plus: boolean indicating whether this should be a readdirplus entry
7556 *
7557 * Returns zero if successful, otherwise a negative errno value is
7558 * returned.
7559 *
7560 * This function is not invoked during READDIR reply decoding, but
7561 * rather whenever an application invokes the getdents(2) system call
7562 * on a directory already in our cache.
7563 */
7564int nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
7565                       bool plus)
7566{
7567        unsigned int savep;
7568        uint32_t bitmap[3] = {0};
7569        uint32_t len;
7570        uint64_t new_cookie;
7571        __be32 *p = xdr_inline_decode(xdr, 4);
7572        if (unlikely(!p))
7573                goto out_overflow;
7574        if (*p == xdr_zero) {
7575                p = xdr_inline_decode(xdr, 4);
7576                if (unlikely(!p))
7577                        goto out_overflow;
7578                if (*p == xdr_zero)
7579                        return -EAGAIN;
7580                entry->eof = 1;
7581                return -EBADCOOKIE;
7582        }
7583
7584        p = xdr_inline_decode(xdr, 12);
7585        if (unlikely(!p))
7586                goto out_overflow;
7587        p = xdr_decode_hyper(p, &new_cookie);
7588        entry->len = be32_to_cpup(p);
7589
7590        p = xdr_inline_decode(xdr, entry->len);
7591        if (unlikely(!p))
7592                goto out_overflow;
7593        entry->name = (const char *) p;
7594
7595        /*
7596         * In case the server doesn't return an inode number,
7597         * we fake one here.  (We don't use inode number 0,
7598         * since glibc seems to choke on it...)
7599         */
7600        entry->ino = 1;
7601        entry->fattr->valid = 0;
7602
7603        if (decode_attr_bitmap(xdr, bitmap) < 0)
7604                goto out_overflow;
7605
7606        if (decode_attr_length(xdr, &len, &savep) < 0)
7607                goto out_overflow;
7608
7609        if (decode_getfattr_attrs(xdr, bitmap, entry->fattr, entry->fh,
7610                        NULL, entry->label, entry->server) < 0)
7611                goto out_overflow;
7612        if (entry->fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID)
7613                entry->ino = entry->fattr->mounted_on_fileid;
7614        else if (entry->fattr->valid & NFS_ATTR_FATTR_FILEID)
7615                entry->ino = entry->fattr->fileid;
7616
7617        entry->d_type = DT_UNKNOWN;
7618        if (entry->fattr->valid & NFS_ATTR_FATTR_TYPE)
7619                entry->d_type = nfs_umode_to_dtype(entry->fattr->mode);
7620
7621        entry->prev_cookie = entry->cookie;
7622        entry->cookie = new_cookie;
7623
7624        return 0;
7625
7626out_overflow:
7627        print_overflow_msg(__func__, xdr);
7628        return -EAGAIN;
7629}
7630
7631/*
7632 * We need to translate between nfs status return values and
7633 * the local errno values which may not be the same.
7634 */
7635static struct {
7636        int stat;
7637        int errno;
7638} nfs_errtbl[] = {
7639        { NFS4_OK,              0               },
7640        { NFS4ERR_PERM,         -EPERM          },
7641        { NFS4ERR_NOENT,        -ENOENT         },
7642        { NFS4ERR_IO,           -errno_NFSERR_IO},
7643        { NFS4ERR_NXIO,         -ENXIO          },
7644        { NFS4ERR_ACCESS,       -EACCES         },
7645        { NFS4ERR_EXIST,        -EEXIST         },
7646        { NFS4ERR_XDEV,         -EXDEV          },
7647        { NFS4ERR_NOTDIR,       -ENOTDIR        },
7648        { NFS4ERR_ISDIR,        -EISDIR         },
7649        { NFS4ERR_INVAL,        -EINVAL         },
7650        { NFS4ERR_FBIG,         -EFBIG          },
7651        { NFS4ERR_NOSPC,        -ENOSPC         },
7652        { NFS4ERR_ROFS,         -EROFS          },
7653        { NFS4ERR_MLINK,        -EMLINK         },
7654        { NFS4ERR_NAMETOOLONG,  -ENAMETOOLONG   },
7655        { NFS4ERR_NOTEMPTY,     -ENOTEMPTY      },
7656        { NFS4ERR_DQUOT,        -EDQUOT         },
7657        { NFS4ERR_STALE,        -ESTALE         },
7658        { NFS4ERR_BADHANDLE,    -EBADHANDLE     },
7659        { NFS4ERR_BAD_COOKIE,   -EBADCOOKIE     },
7660        { NFS4ERR_NOTSUPP,      -ENOTSUPP       },
7661        { NFS4ERR_TOOSMALL,     -ETOOSMALL      },
7662        { NFS4ERR_SERVERFAULT,  -EREMOTEIO      },
7663        { NFS4ERR_BADTYPE,      -EBADTYPE       },
7664        { NFS4ERR_LOCKED,       -EAGAIN         },
7665        { NFS4ERR_SYMLINK,      -ELOOP          },
7666        { NFS4ERR_OP_ILLEGAL,   -EOPNOTSUPP     },
7667        { NFS4ERR_DEADLOCK,     -EDEADLK        },
7668        { -1,                   -EIO            }
7669};
7670
7671/*
7672 * Convert an NFS error code to a local one.
7673 * This one is used jointly by NFSv2 and NFSv3.
7674 */
7675static int
7676nfs4_stat_to_errno(int stat)
7677{
7678        int i;
7679        for (i = 0; nfs_errtbl[i].stat != -1; i++) {
7680                if (nfs_errtbl[i].stat == stat)
7681                        return nfs_errtbl[i].errno;
7682        }
7683        if (stat <= 10000 || stat > 10100) {
7684                /* The server is looney tunes. */
7685                return -EREMOTEIO;
7686        }
7687        /* If we cannot translate the error, the recovery routines should
7688         * handle it.
7689         * Note: remaining NFSv4 error codes have values > 10000, so should
7690         * not conflict with native Linux error codes.
7691         */
7692        return -stat;
7693}
7694
7695#ifdef CONFIG_NFS_V4_2
7696#include "nfs42xdr.c"
7697#endif /* CONFIG_NFS_V4_2 */
7698
7699#define PROC(proc, argtype, restype)                            \
7700[NFSPROC4_CLNT_##proc] = {                                      \
7701        .p_proc   = NFSPROC4_COMPOUND,                          \
7702        .p_encode = nfs4_xdr_##argtype,                         \
7703        .p_decode = nfs4_xdr_##restype,                         \
7704        .p_arglen = NFS4_##argtype##_sz,                        \
7705        .p_replen = NFS4_##restype##_sz,                        \
7706        .p_statidx = NFSPROC4_CLNT_##proc,                      \
7707        .p_name   = #proc,                                      \
7708}
7709
7710#define STUB(proc)              \
7711[NFSPROC4_CLNT_##proc] = {      \
7712        .p_name = #proc,        \
7713}
7714
7715#if defined(CONFIG_NFS_V4_1)
7716#define PROC41(proc, argtype, restype)                          \
7717        PROC(proc, argtype, restype)
7718#else
7719#define PROC41(proc, argtype, restype)                          \
7720        STUB(proc)
7721#endif
7722
7723#if defined(CONFIG_NFS_V4_2)
7724#define PROC42(proc, argtype, restype)                          \
7725        PROC(proc, argtype, restype)
7726#else
7727#define PROC42(proc, argtype, restype)                          \
7728        STUB(proc)
7729#endif
7730
7731const struct rpc_procinfo nfs4_procedures[] = {
7732        PROC(READ,              enc_read,               dec_read),
7733        PROC(WRITE,             enc_write,              dec_write),
7734        PROC(COMMIT,            enc_commit,             dec_commit),
7735        PROC(OPEN,              enc_open,               dec_open),
7736        PROC(OPEN_CONFIRM,      enc_open_confirm,       dec_open_confirm),
7737        PROC(OPEN_NOATTR,       enc_open_noattr,        dec_open_noattr),
7738        PROC(OPEN_DOWNGRADE,    enc_open_downgrade,     dec_open_downgrade),
7739        PROC(CLOSE,             enc_close,              dec_close),
7740        PROC(SETATTR,           enc_setattr,            dec_setattr),
7741        PROC(FSINFO,            enc_fsinfo,             dec_fsinfo),
7742        PROC(RENEW,             enc_renew,              dec_renew),
7743        PROC(SETCLIENTID,       enc_setclientid,        dec_setclientid),
7744        PROC(SETCLIENTID_CONFIRM, enc_setclientid_confirm, dec_setclientid_confirm),
7745        PROC(LOCK,              enc_lock,               dec_lock),
7746        PROC(LOCKT,             enc_lockt,              dec_lockt),
7747        PROC(LOCKU,             enc_locku,              dec_locku),
7748        PROC(ACCESS,            enc_access,             dec_access),
7749        PROC(GETATTR,           enc_getattr,            dec_getattr),
7750        PROC(LOOKUP,            enc_lookup,             dec_lookup),
7751        PROC(LOOKUP_ROOT,       enc_lookup_root,        dec_lookup_root),
7752        PROC(REMOVE,            enc_remove,             dec_remove),
7753        PROC(RENAME,            enc_rename,             dec_rename),
7754        PROC(LINK,              enc_link,               dec_link),
7755        PROC(SYMLINK,           enc_symlink,            dec_symlink),
7756        PROC(CREATE,            enc_create,             dec_create),
7757        PROC(PATHCONF,          enc_pathconf,           dec_pathconf),
7758        PROC(STATFS,            enc_statfs,             dec_statfs),
7759        PROC(READLINK,          enc_readlink,           dec_readlink),
7760        PROC(READDIR,           enc_readdir,            dec_readdir),
7761        PROC(SERVER_CAPS,       enc_server_caps,        dec_server_caps),
7762        PROC(DELEGRETURN,       enc_delegreturn,        dec_delegreturn),
7763        PROC(GETACL,            enc_getacl,             dec_getacl),
7764        PROC(SETACL,            enc_setacl,             dec_setacl),
7765        PROC(FS_LOCATIONS,      enc_fs_locations,       dec_fs_locations),
7766        PROC(RELEASE_LOCKOWNER, enc_release_lockowner,  dec_release_lockowner),
7767        PROC(SECINFO,           enc_secinfo,            dec_secinfo),
7768        PROC(FSID_PRESENT,      enc_fsid_present,       dec_fsid_present),
7769        PROC41(EXCHANGE_ID,     enc_exchange_id,        dec_exchange_id),
7770        PROC41(CREATE_SESSION,  enc_create_session,     dec_create_session),
7771        PROC41(DESTROY_SESSION, enc_destroy_session,    dec_destroy_session),
7772        PROC41(SEQUENCE,        enc_sequence,           dec_sequence),
7773        PROC41(GET_LEASE_TIME,  enc_get_lease_time,     dec_get_lease_time),
7774        PROC41(RECLAIM_COMPLETE,enc_reclaim_complete,   dec_reclaim_complete),
7775        PROC41(GETDEVICEINFO,   enc_getdeviceinfo,      dec_getdeviceinfo),
7776        PROC41(LAYOUTGET,       enc_layoutget,          dec_layoutget),
7777        PROC41(LAYOUTCOMMIT,    enc_layoutcommit,       dec_layoutcommit),
7778        PROC41(LAYOUTRETURN,    enc_layoutreturn,       dec_layoutreturn),
7779        PROC41(SECINFO_NO_NAME, enc_secinfo_no_name,    dec_secinfo_no_name),
7780        PROC41(TEST_STATEID,    enc_test_stateid,       dec_test_stateid),
7781        PROC41(FREE_STATEID,    enc_free_stateid,       dec_free_stateid),
7782        STUB(GETDEVICELIST),
7783        PROC41(BIND_CONN_TO_SESSION,
7784                        enc_bind_conn_to_session, dec_bind_conn_to_session),
7785        PROC41(DESTROY_CLIENTID,enc_destroy_clientid,   dec_destroy_clientid),
7786        PROC42(SEEK,            enc_seek,               dec_seek),
7787        PROC42(ALLOCATE,        enc_allocate,           dec_allocate),
7788        PROC42(DEALLOCATE,      enc_deallocate,         dec_deallocate),
7789        PROC42(LAYOUTSTATS,     enc_layoutstats,        dec_layoutstats),
7790        PROC42(CLONE,           enc_clone,              dec_clone),
7791        PROC42(COPY,            enc_copy,               dec_copy),
7792        PROC42(OFFLOAD_CANCEL,  enc_offload_cancel,     dec_offload_cancel),
7793        PROC(LOOKUPP,           enc_lookupp,            dec_lookupp),
7794};
7795
7796static unsigned int nfs_version4_counts[ARRAY_SIZE(nfs4_procedures)];
7797const struct rpc_version nfs_version4 = {
7798        .number                 = 4,
7799        .nrprocs                = ARRAY_SIZE(nfs4_procedures),
7800        .procs                  = nfs4_procedures,
7801        .counts                 = nfs_version4_counts,
7802};
7803
7804/*
7805 * Local variables:
7806 *  c-basic-offset: 8
7807 * End:
7808 */
7809