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