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