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