Linux Audio

Check our new training course

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