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