xref: /openbmc/linux/fs/nfs/nfs4xdr.c (revision f30828a6)
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/slab.h>
42 #include <linux/utsname.h>
43 #include <linux/errno.h>
44 #include <linux/string.h>
45 #include <linux/in.h>
46 #include <linux/pagemap.h>
47 #include <linux/proc_fs.h>
48 #include <linux/kdev_t.h>
49 #include <linux/sunrpc/clnt.h>
50 #include <linux/nfs.h>
51 #include <linux/nfs4.h>
52 #include <linux/nfs_fs.h>
53 #include <linux/nfs_idmap.h>
54 #include "nfs4_fs.h"
55 
56 #define NFSDBG_FACILITY		NFSDBG_XDR
57 
58 /* Mapping from NFS error code to "errno" error code. */
59 #define errno_NFSERR_IO		EIO
60 
61 static int nfs4_stat_to_errno(int);
62 
63 /* NFSv4 COMPOUND tags are only wanted for debugging purposes */
64 #ifdef DEBUG
65 #define NFS4_MAXTAGLEN		20
66 #else
67 #define NFS4_MAXTAGLEN		0
68 #endif
69 
70 /* lock,open owner id:
71  * we currently use size 2 (u64) out of (NFS4_OPAQUE_LIMIT  >> 2)
72  */
73 #define open_owner_id_maxsz	(1 + 4)
74 #define lock_owner_id_maxsz	(1 + 4)
75 #define decode_lockowner_maxsz	(1 + XDR_QUADLEN(IDMAP_NAMESZ))
76 #define compound_encode_hdr_maxsz	(3 + (NFS4_MAXTAGLEN >> 2))
77 #define compound_decode_hdr_maxsz	(3 + (NFS4_MAXTAGLEN >> 2))
78 #define op_encode_hdr_maxsz	(1)
79 #define op_decode_hdr_maxsz	(2)
80 #define encode_stateid_maxsz	(XDR_QUADLEN(NFS4_STATEID_SIZE))
81 #define decode_stateid_maxsz	(XDR_QUADLEN(NFS4_STATEID_SIZE))
82 #define encode_verifier_maxsz	(XDR_QUADLEN(NFS4_VERIFIER_SIZE))
83 #define decode_verifier_maxsz	(XDR_QUADLEN(NFS4_VERIFIER_SIZE))
84 #define encode_putfh_maxsz	(op_encode_hdr_maxsz + 1 + \
85 				(NFS4_FHSIZE >> 2))
86 #define decode_putfh_maxsz	(op_decode_hdr_maxsz)
87 #define encode_putrootfh_maxsz	(op_encode_hdr_maxsz)
88 #define decode_putrootfh_maxsz	(op_decode_hdr_maxsz)
89 #define encode_getfh_maxsz      (op_encode_hdr_maxsz)
90 #define decode_getfh_maxsz      (op_decode_hdr_maxsz + 1 + \
91 				((3+NFS4_FHSIZE) >> 2))
92 #define nfs4_fattr_bitmap_maxsz 3
93 #define encode_getattr_maxsz    (op_encode_hdr_maxsz + nfs4_fattr_bitmap_maxsz)
94 #define nfs4_name_maxsz		(1 + ((3 + NFS4_MAXNAMLEN) >> 2))
95 #define nfs4_path_maxsz		(1 + ((3 + NFS4_MAXPATHLEN) >> 2))
96 #define nfs4_owner_maxsz	(1 + XDR_QUADLEN(IDMAP_NAMESZ))
97 #define nfs4_group_maxsz	(1 + XDR_QUADLEN(IDMAP_NAMESZ))
98 /* This is based on getfattr, which uses the most attributes: */
99 #define nfs4_fattr_value_maxsz	(1 + (1 + 2 + 2 + 4 + 2 + 1 + 1 + 2 + 2 + \
100 				3 + 3 + 3 + nfs4_owner_maxsz + nfs4_group_maxsz))
101 #define nfs4_fattr_maxsz	(nfs4_fattr_bitmap_maxsz + \
102 				nfs4_fattr_value_maxsz)
103 #define decode_getattr_maxsz    (op_decode_hdr_maxsz + nfs4_fattr_maxsz)
104 #define encode_attrs_maxsz	(nfs4_fattr_bitmap_maxsz + \
105 				 1 + 2 + 1 + \
106 				nfs4_owner_maxsz + \
107 				nfs4_group_maxsz + \
108 				4 + 4)
109 #define encode_savefh_maxsz     (op_encode_hdr_maxsz)
110 #define decode_savefh_maxsz     (op_decode_hdr_maxsz)
111 #define encode_restorefh_maxsz  (op_encode_hdr_maxsz)
112 #define decode_restorefh_maxsz  (op_decode_hdr_maxsz)
113 #define encode_fsinfo_maxsz	(encode_getattr_maxsz)
114 #define decode_fsinfo_maxsz	(op_decode_hdr_maxsz + 11)
115 #define encode_renew_maxsz	(op_encode_hdr_maxsz + 3)
116 #define decode_renew_maxsz	(op_decode_hdr_maxsz)
117 #define encode_setclientid_maxsz \
118 				(op_encode_hdr_maxsz + \
119 				XDR_QUADLEN(NFS4_VERIFIER_SIZE) + \
120 				XDR_QUADLEN(NFS4_SETCLIENTID_NAMELEN) + \
121 				1 /* sc_prog */ + \
122 				XDR_QUADLEN(RPCBIND_MAXNETIDLEN) + \
123 				XDR_QUADLEN(RPCBIND_MAXUADDRLEN) + \
124 				1) /* sc_cb_ident */
125 #define decode_setclientid_maxsz \
126 				(op_decode_hdr_maxsz + \
127 				2 + \
128 				1024) /* large value for CLID_INUSE */
129 #define encode_setclientid_confirm_maxsz \
130 				(op_encode_hdr_maxsz + \
131 				3 + (NFS4_VERIFIER_SIZE >> 2))
132 #define decode_setclientid_confirm_maxsz \
133 				(op_decode_hdr_maxsz)
134 #define encode_lookup_maxsz	(op_encode_hdr_maxsz + nfs4_name_maxsz)
135 #define decode_lookup_maxsz	(op_decode_hdr_maxsz)
136 #define encode_share_access_maxsz \
137 				(2)
138 #define encode_createmode_maxsz	(1 + encode_attrs_maxsz)
139 #define encode_opentype_maxsz	(1 + encode_createmode_maxsz)
140 #define encode_claim_null_maxsz	(1 + nfs4_name_maxsz)
141 #define encode_open_maxsz	(op_encode_hdr_maxsz + \
142 				2 + encode_share_access_maxsz + 2 + \
143 				open_owner_id_maxsz + \
144 				encode_opentype_maxsz + \
145 				encode_claim_null_maxsz)
146 #define decode_ace_maxsz	(3 + nfs4_owner_maxsz)
147 #define decode_delegation_maxsz	(1 + decode_stateid_maxsz + 1 + \
148 				decode_ace_maxsz)
149 #define decode_change_info_maxsz	(5)
150 #define decode_open_maxsz	(op_decode_hdr_maxsz + \
151 				decode_stateid_maxsz + \
152 				decode_change_info_maxsz + 1 + \
153 				nfs4_fattr_bitmap_maxsz + \
154 				decode_delegation_maxsz)
155 #define encode_open_confirm_maxsz \
156 				(op_encode_hdr_maxsz + \
157 				 encode_stateid_maxsz + 1)
158 #define decode_open_confirm_maxsz \
159 				(op_decode_hdr_maxsz + \
160 				 decode_stateid_maxsz)
161 #define encode_open_downgrade_maxsz \
162 				(op_encode_hdr_maxsz + \
163 				 encode_stateid_maxsz + 1 + \
164 				 encode_share_access_maxsz)
165 #define decode_open_downgrade_maxsz \
166 				(op_decode_hdr_maxsz + \
167 				 decode_stateid_maxsz)
168 #define encode_close_maxsz	(op_encode_hdr_maxsz + \
169 				 1 + encode_stateid_maxsz)
170 #define decode_close_maxsz	(op_decode_hdr_maxsz + \
171 				 decode_stateid_maxsz)
172 #define encode_setattr_maxsz	(op_encode_hdr_maxsz + \
173 				 encode_stateid_maxsz + \
174 				 encode_attrs_maxsz)
175 #define decode_setattr_maxsz	(op_decode_hdr_maxsz + \
176 				 nfs4_fattr_bitmap_maxsz)
177 #define encode_read_maxsz	(op_encode_hdr_maxsz + \
178 				 encode_stateid_maxsz + 3)
179 #define decode_read_maxsz	(op_decode_hdr_maxsz + 2)
180 #define encode_readdir_maxsz	(op_encode_hdr_maxsz + \
181 				 2 + encode_verifier_maxsz + 5)
182 #define decode_readdir_maxsz	(op_decode_hdr_maxsz + \
183 				 decode_verifier_maxsz)
184 #define encode_readlink_maxsz	(op_encode_hdr_maxsz)
185 #define decode_readlink_maxsz	(op_decode_hdr_maxsz + 1)
186 #define encode_write_maxsz	(op_encode_hdr_maxsz + \
187 				 encode_stateid_maxsz + 4)
188 #define decode_write_maxsz	(op_decode_hdr_maxsz + \
189 				 2 + decode_verifier_maxsz)
190 #define encode_commit_maxsz	(op_encode_hdr_maxsz + 3)
191 #define decode_commit_maxsz	(op_decode_hdr_maxsz + \
192 				 decode_verifier_maxsz)
193 #define encode_remove_maxsz	(op_encode_hdr_maxsz + \
194 				nfs4_name_maxsz)
195 #define encode_rename_maxsz	(op_encode_hdr_maxsz + \
196 				2 * nfs4_name_maxsz)
197 #define decode_rename_maxsz	(op_decode_hdr_maxsz + 5 + 5)
198 #define encode_link_maxsz	(op_encode_hdr_maxsz + \
199 				nfs4_name_maxsz)
200 #define decode_link_maxsz	(op_decode_hdr_maxsz + 5)
201 #define encode_lock_maxsz	(op_encode_hdr_maxsz + \
202 				 7 + \
203 				 1 + encode_stateid_maxsz + 8)
204 #define decode_lock_denied_maxsz \
205 				(8 + decode_lockowner_maxsz)
206 #define decode_lock_maxsz	(op_decode_hdr_maxsz + \
207 				 decode_lock_denied_maxsz)
208 #define encode_lockt_maxsz	(op_encode_hdr_maxsz + 12)
209 #define decode_lockt_maxsz	(op_decode_hdr_maxsz + \
210 				 decode_lock_denied_maxsz)
211 #define encode_locku_maxsz	(op_encode_hdr_maxsz + 3 + \
212 				 encode_stateid_maxsz + \
213 				 4)
214 #define decode_locku_maxsz	(op_decode_hdr_maxsz + \
215 				 decode_stateid_maxsz)
216 #define encode_access_maxsz	(op_encode_hdr_maxsz + 1)
217 #define decode_access_maxsz	(op_decode_hdr_maxsz + 2)
218 #define encode_symlink_maxsz	(op_encode_hdr_maxsz + \
219 				1 + nfs4_name_maxsz + \
220 				1 + \
221 				nfs4_fattr_maxsz)
222 #define decode_symlink_maxsz	(op_decode_hdr_maxsz + 8)
223 #define encode_create_maxsz	(op_encode_hdr_maxsz + \
224 				1 + 2 + nfs4_name_maxsz + \
225 				encode_attrs_maxsz)
226 #define decode_create_maxsz	(op_decode_hdr_maxsz + \
227 				decode_change_info_maxsz + \
228 				nfs4_fattr_bitmap_maxsz)
229 #define encode_statfs_maxsz	(encode_getattr_maxsz)
230 #define decode_statfs_maxsz	(decode_getattr_maxsz)
231 #define encode_delegreturn_maxsz (op_encode_hdr_maxsz + 4)
232 #define decode_delegreturn_maxsz (op_decode_hdr_maxsz)
233 #define encode_getacl_maxsz	(encode_getattr_maxsz)
234 #define decode_getacl_maxsz	(op_decode_hdr_maxsz + \
235 				 nfs4_fattr_bitmap_maxsz + 1)
236 #define encode_setacl_maxsz	(op_encode_hdr_maxsz + \
237 				 encode_stateid_maxsz + 3)
238 #define decode_setacl_maxsz	(decode_setattr_maxsz)
239 #define encode_fs_locations_maxsz \
240 				(encode_getattr_maxsz)
241 #define decode_fs_locations_maxsz \
242 				(0)
243 #define NFS4_enc_compound_sz	(1024)  /* XXX: large enough? */
244 #define NFS4_dec_compound_sz	(1024)  /* XXX: large enough? */
245 #define NFS4_enc_read_sz	(compound_encode_hdr_maxsz + \
246 				encode_putfh_maxsz + \
247 				encode_read_maxsz)
248 #define NFS4_dec_read_sz	(compound_decode_hdr_maxsz + \
249 				decode_putfh_maxsz + \
250 				decode_read_maxsz)
251 #define NFS4_enc_readlink_sz	(compound_encode_hdr_maxsz + \
252 				encode_putfh_maxsz + \
253 				encode_readlink_maxsz)
254 #define NFS4_dec_readlink_sz	(compound_decode_hdr_maxsz + \
255 				decode_putfh_maxsz + \
256 				decode_readlink_maxsz)
257 #define NFS4_enc_readdir_sz	(compound_encode_hdr_maxsz + \
258 				encode_putfh_maxsz + \
259 				encode_readdir_maxsz)
260 #define NFS4_dec_readdir_sz	(compound_decode_hdr_maxsz + \
261 				decode_putfh_maxsz + \
262 				decode_readdir_maxsz)
263 #define NFS4_enc_write_sz	(compound_encode_hdr_maxsz + \
264 				encode_putfh_maxsz + \
265 				encode_write_maxsz + \
266 				encode_getattr_maxsz)
267 #define NFS4_dec_write_sz	(compound_decode_hdr_maxsz + \
268 				decode_putfh_maxsz + \
269 				decode_write_maxsz + \
270 				decode_getattr_maxsz)
271 #define NFS4_enc_commit_sz	(compound_encode_hdr_maxsz + \
272 				encode_putfh_maxsz + \
273 				encode_commit_maxsz + \
274 				encode_getattr_maxsz)
275 #define NFS4_dec_commit_sz	(compound_decode_hdr_maxsz + \
276 				decode_putfh_maxsz + \
277 				decode_commit_maxsz + \
278 				decode_getattr_maxsz)
279 #define NFS4_enc_open_sz        (compound_encode_hdr_maxsz + \
280 				encode_putfh_maxsz + \
281 				encode_savefh_maxsz + \
282 				encode_open_maxsz + \
283 				encode_getfh_maxsz + \
284 				encode_getattr_maxsz + \
285 				encode_restorefh_maxsz + \
286 				encode_getattr_maxsz)
287 #define NFS4_dec_open_sz        (compound_decode_hdr_maxsz + \
288 				decode_putfh_maxsz + \
289 				decode_savefh_maxsz + \
290 				decode_open_maxsz + \
291 				decode_getfh_maxsz + \
292 				decode_getattr_maxsz + \
293 				decode_restorefh_maxsz + \
294 				decode_getattr_maxsz)
295 #define NFS4_enc_open_confirm_sz \
296 				(compound_encode_hdr_maxsz + \
297 				 encode_putfh_maxsz + \
298 				 encode_open_confirm_maxsz)
299 #define NFS4_dec_open_confirm_sz \
300 				(compound_decode_hdr_maxsz + \
301 				 decode_putfh_maxsz + \
302 				 decode_open_confirm_maxsz)
303 #define NFS4_enc_open_noattr_sz	(compound_encode_hdr_maxsz + \
304 					encode_putfh_maxsz + \
305 					encode_open_maxsz + \
306 					encode_getattr_maxsz)
307 #define NFS4_dec_open_noattr_sz	(compound_decode_hdr_maxsz + \
308 					decode_putfh_maxsz + \
309 					decode_open_maxsz + \
310 					decode_getattr_maxsz)
311 #define NFS4_enc_open_downgrade_sz \
312 				(compound_encode_hdr_maxsz + \
313 				 encode_putfh_maxsz + \
314 				 encode_open_downgrade_maxsz + \
315 				 encode_getattr_maxsz)
316 #define NFS4_dec_open_downgrade_sz \
317 				(compound_decode_hdr_maxsz + \
318 				 decode_putfh_maxsz + \
319 				 decode_open_downgrade_maxsz + \
320 				 decode_getattr_maxsz)
321 #define NFS4_enc_close_sz	(compound_encode_hdr_maxsz + \
322 				 encode_putfh_maxsz + \
323 				 encode_close_maxsz + \
324 				 encode_getattr_maxsz)
325 #define NFS4_dec_close_sz	(compound_decode_hdr_maxsz + \
326 				 decode_putfh_maxsz + \
327 				 decode_close_maxsz + \
328 				 decode_getattr_maxsz)
329 #define NFS4_enc_setattr_sz	(compound_encode_hdr_maxsz + \
330 				 encode_putfh_maxsz + \
331 				 encode_setattr_maxsz + \
332 				 encode_getattr_maxsz)
333 #define NFS4_dec_setattr_sz	(compound_decode_hdr_maxsz + \
334 				 decode_putfh_maxsz + \
335 				 decode_setattr_maxsz + \
336 				 decode_getattr_maxsz)
337 #define NFS4_enc_fsinfo_sz	(compound_encode_hdr_maxsz + \
338 				encode_putfh_maxsz + \
339 				encode_fsinfo_maxsz)
340 #define NFS4_dec_fsinfo_sz	(compound_decode_hdr_maxsz + \
341 				decode_putfh_maxsz + \
342 				decode_fsinfo_maxsz)
343 #define NFS4_enc_renew_sz	(compound_encode_hdr_maxsz + \
344 				encode_renew_maxsz)
345 #define NFS4_dec_renew_sz	(compound_decode_hdr_maxsz + \
346 				decode_renew_maxsz)
347 #define NFS4_enc_setclientid_sz	(compound_encode_hdr_maxsz + \
348 				encode_setclientid_maxsz)
349 #define NFS4_dec_setclientid_sz	(compound_decode_hdr_maxsz + \
350 				decode_setclientid_maxsz)
351 #define NFS4_enc_setclientid_confirm_sz \
352 				(compound_encode_hdr_maxsz + \
353 				encode_setclientid_confirm_maxsz + \
354 				encode_putrootfh_maxsz + \
355 				encode_fsinfo_maxsz)
356 #define NFS4_dec_setclientid_confirm_sz \
357 				(compound_decode_hdr_maxsz + \
358 				decode_setclientid_confirm_maxsz + \
359 				decode_putrootfh_maxsz + \
360 				decode_fsinfo_maxsz)
361 #define NFS4_enc_lock_sz        (compound_encode_hdr_maxsz + \
362 				encode_putfh_maxsz + \
363 				encode_lock_maxsz)
364 #define NFS4_dec_lock_sz        (compound_decode_hdr_maxsz + \
365 				decode_putfh_maxsz + \
366 				decode_lock_maxsz)
367 #define NFS4_enc_lockt_sz       (compound_encode_hdr_maxsz + \
368 				encode_putfh_maxsz + \
369 				encode_lockt_maxsz)
370 #define NFS4_dec_lockt_sz       (compound_decode_hdr_maxsz + \
371 				 decode_putfh_maxsz + \
372 				 decode_lockt_maxsz)
373 #define NFS4_enc_locku_sz       (compound_encode_hdr_maxsz + \
374 				encode_putfh_maxsz + \
375 				encode_locku_maxsz)
376 #define NFS4_dec_locku_sz       (compound_decode_hdr_maxsz + \
377 				decode_putfh_maxsz + \
378 				decode_locku_maxsz)
379 #define NFS4_enc_access_sz	(compound_encode_hdr_maxsz + \
380 				encode_putfh_maxsz + \
381 				encode_access_maxsz + \
382 				encode_getattr_maxsz)
383 #define NFS4_dec_access_sz	(compound_decode_hdr_maxsz + \
384 				decode_putfh_maxsz + \
385 				decode_access_maxsz + \
386 				decode_getattr_maxsz)
387 #define NFS4_enc_getattr_sz	(compound_encode_hdr_maxsz + \
388 				encode_putfh_maxsz + \
389 				encode_getattr_maxsz)
390 #define NFS4_dec_getattr_sz	(compound_decode_hdr_maxsz + \
391 				decode_putfh_maxsz + \
392 				decode_getattr_maxsz)
393 #define NFS4_enc_lookup_sz	(compound_encode_hdr_maxsz + \
394 				encode_putfh_maxsz + \
395 				encode_lookup_maxsz + \
396 				encode_getattr_maxsz + \
397 				encode_getfh_maxsz)
398 #define NFS4_dec_lookup_sz	(compound_decode_hdr_maxsz + \
399 				decode_putfh_maxsz + \
400 				decode_lookup_maxsz + \
401 				decode_getattr_maxsz + \
402 				decode_getfh_maxsz)
403 #define NFS4_enc_lookup_root_sz (compound_encode_hdr_maxsz + \
404 				encode_putrootfh_maxsz + \
405 				encode_getattr_maxsz + \
406 				encode_getfh_maxsz)
407 #define NFS4_dec_lookup_root_sz (compound_decode_hdr_maxsz + \
408 				decode_putrootfh_maxsz + \
409 				decode_getattr_maxsz + \
410 				decode_getfh_maxsz)
411 #define NFS4_enc_remove_sz	(compound_encode_hdr_maxsz + \
412 				encode_putfh_maxsz + \
413 				encode_remove_maxsz + \
414 				encode_getattr_maxsz)
415 #define NFS4_dec_remove_sz	(compound_decode_hdr_maxsz + \
416 				decode_putfh_maxsz + \
417 				op_decode_hdr_maxsz + 5 + \
418 				decode_getattr_maxsz)
419 #define NFS4_enc_rename_sz	(compound_encode_hdr_maxsz + \
420 				encode_putfh_maxsz + \
421 				encode_savefh_maxsz + \
422 				encode_putfh_maxsz + \
423 				encode_rename_maxsz + \
424 				encode_getattr_maxsz + \
425 				encode_restorefh_maxsz + \
426 				encode_getattr_maxsz)
427 #define NFS4_dec_rename_sz	(compound_decode_hdr_maxsz + \
428 				decode_putfh_maxsz + \
429 				decode_savefh_maxsz + \
430 				decode_putfh_maxsz + \
431 				decode_rename_maxsz + \
432 				decode_getattr_maxsz + \
433 				decode_restorefh_maxsz + \
434 				decode_getattr_maxsz)
435 #define NFS4_enc_link_sz	(compound_encode_hdr_maxsz + \
436 				encode_putfh_maxsz + \
437 				encode_savefh_maxsz + \
438 				encode_putfh_maxsz + \
439 				encode_link_maxsz + \
440 				decode_getattr_maxsz + \
441 				encode_restorefh_maxsz + \
442 				decode_getattr_maxsz)
443 #define NFS4_dec_link_sz	(compound_decode_hdr_maxsz + \
444 				decode_putfh_maxsz + \
445 				decode_savefh_maxsz + \
446 				decode_putfh_maxsz + \
447 				decode_link_maxsz + \
448 				decode_getattr_maxsz + \
449 				decode_restorefh_maxsz + \
450 				decode_getattr_maxsz)
451 #define NFS4_enc_symlink_sz	(compound_encode_hdr_maxsz + \
452 				encode_putfh_maxsz + \
453 				encode_symlink_maxsz + \
454 				encode_getattr_maxsz + \
455 				encode_getfh_maxsz)
456 #define NFS4_dec_symlink_sz	(compound_decode_hdr_maxsz + \
457 				decode_putfh_maxsz + \
458 				decode_symlink_maxsz + \
459 				decode_getattr_maxsz + \
460 				decode_getfh_maxsz)
461 #define NFS4_enc_create_sz	(compound_encode_hdr_maxsz + \
462 				encode_putfh_maxsz + \
463 				encode_savefh_maxsz + \
464 				encode_create_maxsz + \
465 				encode_getfh_maxsz + \
466 				encode_getattr_maxsz + \
467 				encode_restorefh_maxsz + \
468 				encode_getattr_maxsz)
469 #define NFS4_dec_create_sz	(compound_decode_hdr_maxsz + \
470 				decode_putfh_maxsz + \
471 				decode_savefh_maxsz + \
472 				decode_create_maxsz + \
473 				decode_getfh_maxsz + \
474 				decode_getattr_maxsz + \
475 				decode_restorefh_maxsz + \
476 				decode_getattr_maxsz)
477 #define NFS4_enc_pathconf_sz	(compound_encode_hdr_maxsz + \
478 				encode_putfh_maxsz + \
479 				encode_getattr_maxsz)
480 #define NFS4_dec_pathconf_sz	(compound_decode_hdr_maxsz + \
481 				decode_putfh_maxsz + \
482 				decode_getattr_maxsz)
483 #define NFS4_enc_statfs_sz	(compound_encode_hdr_maxsz + \
484 				encode_putfh_maxsz + \
485 				encode_statfs_maxsz)
486 #define NFS4_dec_statfs_sz	(compound_decode_hdr_maxsz + \
487 				decode_putfh_maxsz + \
488 				decode_statfs_maxsz)
489 #define NFS4_enc_server_caps_sz (compound_encode_hdr_maxsz + \
490 				encode_putfh_maxsz + \
491 				encode_getattr_maxsz)
492 #define NFS4_dec_server_caps_sz (compound_decode_hdr_maxsz + \
493 				decode_putfh_maxsz + \
494 				decode_getattr_maxsz)
495 #define NFS4_enc_delegreturn_sz	(compound_encode_hdr_maxsz + \
496 				encode_putfh_maxsz + \
497 				encode_delegreturn_maxsz + \
498 				encode_getattr_maxsz)
499 #define NFS4_dec_delegreturn_sz (compound_decode_hdr_maxsz + \
500 				decode_delegreturn_maxsz + \
501 				decode_getattr_maxsz)
502 #define NFS4_enc_getacl_sz	(compound_encode_hdr_maxsz + \
503 				encode_putfh_maxsz + \
504 				encode_getacl_maxsz)
505 #define NFS4_dec_getacl_sz	(compound_decode_hdr_maxsz + \
506 				decode_putfh_maxsz + \
507 				decode_getacl_maxsz)
508 #define NFS4_enc_setacl_sz	(compound_encode_hdr_maxsz + \
509 				encode_putfh_maxsz + \
510 				encode_setacl_maxsz)
511 #define NFS4_dec_setacl_sz	(compound_decode_hdr_maxsz + \
512 				decode_putfh_maxsz + \
513 				decode_setacl_maxsz)
514 #define NFS4_enc_fs_locations_sz \
515 				(compound_encode_hdr_maxsz + \
516 				 encode_putfh_maxsz + \
517 				 encode_lookup_maxsz + \
518 				 encode_fs_locations_maxsz)
519 #define NFS4_dec_fs_locations_sz \
520 				(compound_decode_hdr_maxsz + \
521 				 decode_putfh_maxsz + \
522 				 decode_lookup_maxsz + \
523 				 decode_fs_locations_maxsz)
524 
525 static struct {
526 	unsigned int	mode;
527 	unsigned int	nfs2type;
528 } nfs_type2fmt[] = {
529 	{ 0,		NFNON	     },
530 	{ S_IFREG,	NFREG	     },
531 	{ S_IFDIR,	NFDIR	     },
532 	{ S_IFBLK,	NFBLK	     },
533 	{ S_IFCHR,	NFCHR	     },
534 	{ S_IFLNK,	NFLNK	     },
535 	{ S_IFSOCK,	NFSOCK	     },
536 	{ S_IFIFO,	NFFIFO	     },
537 	{ 0,		NFNON	     },
538 	{ 0,		NFNON	     },
539 };
540 
541 struct compound_hdr {
542 	int32_t		status;
543 	uint32_t	nops;
544 	uint32_t	taglen;
545 	char *		tag;
546 };
547 
548 /*
549  * START OF "GENERIC" ENCODE ROUTINES.
550  *   These may look a little ugly since they are imported from a "generic"
551  * set of XDR encode/decode routines which are intended to be shared by
552  * all of our NFSv4 implementations (OpenBSD, MacOS X...).
553  *
554  * If the pain of reading these is too great, it should be a straightforward
555  * task to translate them into Linux-specific versions which are more
556  * consistent with the style used in NFSv2/v3...
557  */
558 #define WRITE32(n)               *p++ = htonl(n)
559 #define WRITE64(n)               do {				\
560 	*p++ = htonl((uint32_t)((n) >> 32));				\
561 	*p++ = htonl((uint32_t)(n));					\
562 } while (0)
563 #define WRITEMEM(ptr,nbytes)     do {				\
564 	p = xdr_encode_opaque_fixed(p, ptr, nbytes);		\
565 } while (0)
566 
567 #define RESERVE_SPACE(nbytes)	do {				\
568 	p = xdr_reserve_space(xdr, nbytes);			\
569 	BUG_ON(!p);						\
570 } while (0)
571 
572 static void encode_string(struct xdr_stream *xdr, unsigned int len, const char *str)
573 {
574 	__be32 *p;
575 
576 	p = xdr_reserve_space(xdr, 4 + len);
577 	BUG_ON(p == NULL);
578 	xdr_encode_opaque(p, str, len);
579 }
580 
581 static int encode_compound_hdr(struct xdr_stream *xdr, struct compound_hdr *hdr)
582 {
583 	__be32 *p;
584 
585 	dprintk("encode_compound: tag=%.*s\n", (int)hdr->taglen, hdr->tag);
586 	BUG_ON(hdr->taglen > NFS4_MAXTAGLEN);
587 	RESERVE_SPACE(12+(XDR_QUADLEN(hdr->taglen)<<2));
588 	WRITE32(hdr->taglen);
589 	WRITEMEM(hdr->tag, hdr->taglen);
590 	WRITE32(NFS4_MINOR_VERSION);
591 	WRITE32(hdr->nops);
592 	return 0;
593 }
594 
595 static void encode_nfs4_verifier(struct xdr_stream *xdr, const nfs4_verifier *verf)
596 {
597 	__be32 *p;
598 
599 	p = xdr_reserve_space(xdr, NFS4_VERIFIER_SIZE);
600 	BUG_ON(p == NULL);
601 	xdr_encode_opaque_fixed(p, verf->data, NFS4_VERIFIER_SIZE);
602 }
603 
604 static int encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const struct nfs_server *server)
605 {
606 	char owner_name[IDMAP_NAMESZ];
607 	char owner_group[IDMAP_NAMESZ];
608 	int owner_namelen = 0;
609 	int owner_grouplen = 0;
610 	__be32 *p;
611 	__be32 *q;
612 	int len;
613 	uint32_t bmval0 = 0;
614 	uint32_t bmval1 = 0;
615 	int status;
616 
617 	/*
618 	 * We reserve enough space to write the entire attribute buffer at once.
619 	 * In the worst-case, this would be
620 	 *   12(bitmap) + 4(attrlen) + 8(size) + 4(mode) + 4(atime) + 4(mtime)
621 	 *          = 36 bytes, plus any contribution from variable-length fields
622 	 *            such as owner/group.
623 	 */
624 	len = 16;
625 
626 	/* Sigh */
627 	if (iap->ia_valid & ATTR_SIZE)
628 		len += 8;
629 	if (iap->ia_valid & ATTR_MODE)
630 		len += 4;
631 	if (iap->ia_valid & ATTR_UID) {
632 		owner_namelen = nfs_map_uid_to_name(server->nfs_client, iap->ia_uid, owner_name);
633 		if (owner_namelen < 0) {
634 			dprintk("nfs: couldn't resolve uid %d to string\n",
635 					iap->ia_uid);
636 			/* XXX */
637 			strcpy(owner_name, "nobody");
638 			owner_namelen = sizeof("nobody") - 1;
639 			/* goto out; */
640 		}
641 		len += 4 + (XDR_QUADLEN(owner_namelen) << 2);
642 	}
643 	if (iap->ia_valid & ATTR_GID) {
644 		owner_grouplen = nfs_map_gid_to_group(server->nfs_client, iap->ia_gid, owner_group);
645 		if (owner_grouplen < 0) {
646 			dprintk("nfs: couldn't resolve gid %d to string\n",
647 					iap->ia_gid);
648 			strcpy(owner_group, "nobody");
649 			owner_grouplen = sizeof("nobody") - 1;
650 			/* goto out; */
651 		}
652 		len += 4 + (XDR_QUADLEN(owner_grouplen) << 2);
653 	}
654 	if (iap->ia_valid & ATTR_ATIME_SET)
655 		len += 16;
656 	else if (iap->ia_valid & ATTR_ATIME)
657 		len += 4;
658 	if (iap->ia_valid & ATTR_MTIME_SET)
659 		len += 16;
660 	else if (iap->ia_valid & ATTR_MTIME)
661 		len += 4;
662 	RESERVE_SPACE(len);
663 
664 	/*
665 	 * We write the bitmap length now, but leave the bitmap and the attribute
666 	 * buffer length to be backfilled at the end of this routine.
667 	 */
668 	WRITE32(2);
669 	q = p;
670 	p += 3;
671 
672 	if (iap->ia_valid & ATTR_SIZE) {
673 		bmval0 |= FATTR4_WORD0_SIZE;
674 		WRITE64(iap->ia_size);
675 	}
676 	if (iap->ia_valid & ATTR_MODE) {
677 		bmval1 |= FATTR4_WORD1_MODE;
678 		WRITE32(iap->ia_mode & S_IALLUGO);
679 	}
680 	if (iap->ia_valid & ATTR_UID) {
681 		bmval1 |= FATTR4_WORD1_OWNER;
682 		WRITE32(owner_namelen);
683 		WRITEMEM(owner_name, owner_namelen);
684 	}
685 	if (iap->ia_valid & ATTR_GID) {
686 		bmval1 |= FATTR4_WORD1_OWNER_GROUP;
687 		WRITE32(owner_grouplen);
688 		WRITEMEM(owner_group, owner_grouplen);
689 	}
690 	if (iap->ia_valid & ATTR_ATIME_SET) {
691 		bmval1 |= FATTR4_WORD1_TIME_ACCESS_SET;
692 		WRITE32(NFS4_SET_TO_CLIENT_TIME);
693 		WRITE32(0);
694 		WRITE32(iap->ia_mtime.tv_sec);
695 		WRITE32(iap->ia_mtime.tv_nsec);
696 	}
697 	else if (iap->ia_valid & ATTR_ATIME) {
698 		bmval1 |= FATTR4_WORD1_TIME_ACCESS_SET;
699 		WRITE32(NFS4_SET_TO_SERVER_TIME);
700 	}
701 	if (iap->ia_valid & ATTR_MTIME_SET) {
702 		bmval1 |= FATTR4_WORD1_TIME_MODIFY_SET;
703 		WRITE32(NFS4_SET_TO_CLIENT_TIME);
704 		WRITE32(0);
705 		WRITE32(iap->ia_mtime.tv_sec);
706 		WRITE32(iap->ia_mtime.tv_nsec);
707 	}
708 	else if (iap->ia_valid & ATTR_MTIME) {
709 		bmval1 |= FATTR4_WORD1_TIME_MODIFY_SET;
710 		WRITE32(NFS4_SET_TO_SERVER_TIME);
711 	}
712 
713 	/*
714 	 * Now we backfill the bitmap and the attribute buffer length.
715 	 */
716 	if (len != ((char *)p - (char *)q) + 4) {
717 		printk(KERN_ERR "nfs: Attr length error, %u != %Zu\n",
718 				len, ((char *)p - (char *)q) + 4);
719 		BUG();
720 	}
721 	len = (char *)p - (char *)q - 12;
722 	*q++ = htonl(bmval0);
723 	*q++ = htonl(bmval1);
724 	*q++ = htonl(len);
725 
726 	status = 0;
727 /* out: */
728 	return status;
729 }
730 
731 static int encode_access(struct xdr_stream *xdr, u32 access)
732 {
733 	__be32 *p;
734 
735 	RESERVE_SPACE(8);
736 	WRITE32(OP_ACCESS);
737 	WRITE32(access);
738 
739 	return 0;
740 }
741 
742 static int encode_close(struct xdr_stream *xdr, const struct nfs_closeargs *arg)
743 {
744 	__be32 *p;
745 
746 	RESERVE_SPACE(8+NFS4_STATEID_SIZE);
747 	WRITE32(OP_CLOSE);
748 	WRITE32(arg->seqid->sequence->counter);
749 	WRITEMEM(arg->stateid->data, NFS4_STATEID_SIZE);
750 
751 	return 0;
752 }
753 
754 static int encode_commit(struct xdr_stream *xdr, const struct nfs_writeargs *args)
755 {
756 	__be32 *p;
757 
758         RESERVE_SPACE(16);
759         WRITE32(OP_COMMIT);
760         WRITE64(args->offset);
761         WRITE32(args->count);
762 
763         return 0;
764 }
765 
766 static int encode_create(struct xdr_stream *xdr, const struct nfs4_create_arg *create)
767 {
768 	__be32 *p;
769 
770 	RESERVE_SPACE(8);
771 	WRITE32(OP_CREATE);
772 	WRITE32(create->ftype);
773 
774 	switch (create->ftype) {
775 	case NF4LNK:
776 		RESERVE_SPACE(4);
777 		WRITE32(create->u.symlink.len);
778 		xdr_write_pages(xdr, create->u.symlink.pages, 0, create->u.symlink.len);
779 		break;
780 
781 	case NF4BLK: case NF4CHR:
782 		RESERVE_SPACE(8);
783 		WRITE32(create->u.device.specdata1);
784 		WRITE32(create->u.device.specdata2);
785 		break;
786 
787 	default:
788 		break;
789 	}
790 
791 	RESERVE_SPACE(4 + create->name->len);
792 	WRITE32(create->name->len);
793 	WRITEMEM(create->name->name, create->name->len);
794 
795 	return encode_attrs(xdr, create->attrs, create->server);
796 }
797 
798 static int encode_getattr_one(struct xdr_stream *xdr, uint32_t bitmap)
799 {
800         __be32 *p;
801 
802         RESERVE_SPACE(12);
803         WRITE32(OP_GETATTR);
804         WRITE32(1);
805         WRITE32(bitmap);
806         return 0;
807 }
808 
809 static int encode_getattr_two(struct xdr_stream *xdr, uint32_t bm0, uint32_t bm1)
810 {
811         __be32 *p;
812 
813         RESERVE_SPACE(16);
814         WRITE32(OP_GETATTR);
815         WRITE32(2);
816         WRITE32(bm0);
817         WRITE32(bm1);
818         return 0;
819 }
820 
821 static int encode_getfattr(struct xdr_stream *xdr, const u32* bitmask)
822 {
823 	return encode_getattr_two(xdr,
824 			bitmask[0] & nfs4_fattr_bitmap[0],
825 			bitmask[1] & nfs4_fattr_bitmap[1]);
826 }
827 
828 static int encode_fsinfo(struct xdr_stream *xdr, const u32* bitmask)
829 {
830 	return encode_getattr_two(xdr, bitmask[0] & nfs4_fsinfo_bitmap[0],
831 			bitmask[1] & nfs4_fsinfo_bitmap[1]);
832 }
833 
834 static int encode_fs_locations(struct xdr_stream *xdr, const u32* bitmask)
835 {
836 	return encode_getattr_two(xdr,
837 				  bitmask[0] & nfs4_fs_locations_bitmap[0],
838 				  bitmask[1] & nfs4_fs_locations_bitmap[1]);
839 }
840 
841 static int encode_getfh(struct xdr_stream *xdr)
842 {
843 	__be32 *p;
844 
845 	RESERVE_SPACE(4);
846 	WRITE32(OP_GETFH);
847 
848 	return 0;
849 }
850 
851 static int encode_link(struct xdr_stream *xdr, const struct qstr *name)
852 {
853 	__be32 *p;
854 
855 	RESERVE_SPACE(8 + name->len);
856 	WRITE32(OP_LINK);
857 	WRITE32(name->len);
858 	WRITEMEM(name->name, name->len);
859 
860 	return 0;
861 }
862 
863 static inline int nfs4_lock_type(struct file_lock *fl, int block)
864 {
865 	if ((fl->fl_type & (F_RDLCK|F_WRLCK|F_UNLCK)) == F_RDLCK)
866 		return block ? NFS4_READW_LT : NFS4_READ_LT;
867 	return block ? NFS4_WRITEW_LT : NFS4_WRITE_LT;
868 }
869 
870 static inline uint64_t nfs4_lock_length(struct file_lock *fl)
871 {
872 	if (fl->fl_end == OFFSET_MAX)
873 		return ~(uint64_t)0;
874 	return fl->fl_end - fl->fl_start + 1;
875 }
876 
877 /*
878  * opcode,type,reclaim,offset,length,new_lock_owner = 32
879  * open_seqid,open_stateid,lock_seqid,lock_owner.clientid, lock_owner.id = 40
880  */
881 static int encode_lock(struct xdr_stream *xdr, const struct nfs_lock_args *args)
882 {
883 	__be32 *p;
884 
885 	RESERVE_SPACE(32);
886 	WRITE32(OP_LOCK);
887 	WRITE32(nfs4_lock_type(args->fl, args->block));
888 	WRITE32(args->reclaim);
889 	WRITE64(args->fl->fl_start);
890 	WRITE64(nfs4_lock_length(args->fl));
891 	WRITE32(args->new_lock_owner);
892 	if (args->new_lock_owner){
893 		RESERVE_SPACE(4+NFS4_STATEID_SIZE+32);
894 		WRITE32(args->open_seqid->sequence->counter);
895 		WRITEMEM(args->open_stateid->data, NFS4_STATEID_SIZE);
896 		WRITE32(args->lock_seqid->sequence->counter);
897 		WRITE64(args->lock_owner.clientid);
898 		WRITE32(16);
899 		WRITEMEM("lock id:", 8);
900 		WRITE64(args->lock_owner.id);
901 	}
902 	else {
903 		RESERVE_SPACE(NFS4_STATEID_SIZE+4);
904 		WRITEMEM(args->lock_stateid->data, NFS4_STATEID_SIZE);
905 		WRITE32(args->lock_seqid->sequence->counter);
906 	}
907 
908 	return 0;
909 }
910 
911 static int encode_lockt(struct xdr_stream *xdr, const struct nfs_lockt_args *args)
912 {
913 	__be32 *p;
914 
915 	RESERVE_SPACE(52);
916 	WRITE32(OP_LOCKT);
917 	WRITE32(nfs4_lock_type(args->fl, 0));
918 	WRITE64(args->fl->fl_start);
919 	WRITE64(nfs4_lock_length(args->fl));
920 	WRITE64(args->lock_owner.clientid);
921 	WRITE32(16);
922 	WRITEMEM("lock id:", 8);
923 	WRITE64(args->lock_owner.id);
924 
925 	return 0;
926 }
927 
928 static int encode_locku(struct xdr_stream *xdr, const struct nfs_locku_args *args)
929 {
930 	__be32 *p;
931 
932 	RESERVE_SPACE(12+NFS4_STATEID_SIZE+16);
933 	WRITE32(OP_LOCKU);
934 	WRITE32(nfs4_lock_type(args->fl, 0));
935 	WRITE32(args->seqid->sequence->counter);
936 	WRITEMEM(args->stateid->data, NFS4_STATEID_SIZE);
937 	WRITE64(args->fl->fl_start);
938 	WRITE64(nfs4_lock_length(args->fl));
939 
940 	return 0;
941 }
942 
943 static int encode_lookup(struct xdr_stream *xdr, const struct qstr *name)
944 {
945 	int len = name->len;
946 	__be32 *p;
947 
948 	RESERVE_SPACE(8 + len);
949 	WRITE32(OP_LOOKUP);
950 	WRITE32(len);
951 	WRITEMEM(name->name, len);
952 
953 	return 0;
954 }
955 
956 static void encode_share_access(struct xdr_stream *xdr, int open_flags)
957 {
958 	__be32 *p;
959 
960 	RESERVE_SPACE(8);
961 	switch (open_flags & (FMODE_READ|FMODE_WRITE)) {
962 		case FMODE_READ:
963 			WRITE32(NFS4_SHARE_ACCESS_READ);
964 			break;
965 		case FMODE_WRITE:
966 			WRITE32(NFS4_SHARE_ACCESS_WRITE);
967 			break;
968 		case FMODE_READ|FMODE_WRITE:
969 			WRITE32(NFS4_SHARE_ACCESS_BOTH);
970 			break;
971 		default:
972 			BUG();
973 	}
974 	WRITE32(0);		/* for linux, share_deny = 0 always */
975 }
976 
977 static inline void encode_openhdr(struct xdr_stream *xdr, const struct nfs_openargs *arg)
978 {
979 	__be32 *p;
980  /*
981  * opcode 4, seqid 4, share_access 4, share_deny 4, clientid 8, ownerlen 4,
982  * owner 4 = 32
983  */
984 	RESERVE_SPACE(8);
985 	WRITE32(OP_OPEN);
986 	WRITE32(arg->seqid->sequence->counter);
987 	encode_share_access(xdr, arg->open_flags);
988 	RESERVE_SPACE(28);
989 	WRITE64(arg->clientid);
990 	WRITE32(16);
991 	WRITEMEM("open id:", 8);
992 	WRITE64(arg->id);
993 }
994 
995 static inline void encode_createmode(struct xdr_stream *xdr, const struct nfs_openargs *arg)
996 {
997 	__be32 *p;
998 
999 	RESERVE_SPACE(4);
1000 	switch(arg->open_flags & O_EXCL) {
1001 		case 0:
1002 			WRITE32(NFS4_CREATE_UNCHECKED);
1003 			encode_attrs(xdr, arg->u.attrs, arg->server);
1004 			break;
1005 		default:
1006 			WRITE32(NFS4_CREATE_EXCLUSIVE);
1007 			encode_nfs4_verifier(xdr, &arg->u.verifier);
1008 	}
1009 }
1010 
1011 static void encode_opentype(struct xdr_stream *xdr, const struct nfs_openargs *arg)
1012 {
1013 	__be32 *p;
1014 
1015 	RESERVE_SPACE(4);
1016 	switch (arg->open_flags & O_CREAT) {
1017 		case 0:
1018 			WRITE32(NFS4_OPEN_NOCREATE);
1019 			break;
1020 		default:
1021 			BUG_ON(arg->claim != NFS4_OPEN_CLAIM_NULL);
1022 			WRITE32(NFS4_OPEN_CREATE);
1023 			encode_createmode(xdr, arg);
1024 	}
1025 }
1026 
1027 static inline void encode_delegation_type(struct xdr_stream *xdr, int delegation_type)
1028 {
1029 	__be32 *p;
1030 
1031 	RESERVE_SPACE(4);
1032 	switch (delegation_type) {
1033 		case 0:
1034 			WRITE32(NFS4_OPEN_DELEGATE_NONE);
1035 			break;
1036 		case FMODE_READ:
1037 			WRITE32(NFS4_OPEN_DELEGATE_READ);
1038 			break;
1039 		case FMODE_WRITE|FMODE_READ:
1040 			WRITE32(NFS4_OPEN_DELEGATE_WRITE);
1041 			break;
1042 		default:
1043 			BUG();
1044 	}
1045 }
1046 
1047 static inline void encode_claim_null(struct xdr_stream *xdr, const struct qstr *name)
1048 {
1049 	__be32 *p;
1050 
1051 	RESERVE_SPACE(4);
1052 	WRITE32(NFS4_OPEN_CLAIM_NULL);
1053 	encode_string(xdr, name->len, name->name);
1054 }
1055 
1056 static inline void encode_claim_previous(struct xdr_stream *xdr, int type)
1057 {
1058 	__be32 *p;
1059 
1060 	RESERVE_SPACE(4);
1061 	WRITE32(NFS4_OPEN_CLAIM_PREVIOUS);
1062 	encode_delegation_type(xdr, type);
1063 }
1064 
1065 static inline void encode_claim_delegate_cur(struct xdr_stream *xdr, const struct qstr *name, const nfs4_stateid *stateid)
1066 {
1067 	__be32 *p;
1068 
1069 	RESERVE_SPACE(4+NFS4_STATEID_SIZE);
1070 	WRITE32(NFS4_OPEN_CLAIM_DELEGATE_CUR);
1071 	WRITEMEM(stateid->data, NFS4_STATEID_SIZE);
1072 	encode_string(xdr, name->len, name->name);
1073 }
1074 
1075 static int encode_open(struct xdr_stream *xdr, const struct nfs_openargs *arg)
1076 {
1077 	encode_openhdr(xdr, arg);
1078 	encode_opentype(xdr, arg);
1079 	switch (arg->claim) {
1080 		case NFS4_OPEN_CLAIM_NULL:
1081 			encode_claim_null(xdr, arg->name);
1082 			break;
1083 		case NFS4_OPEN_CLAIM_PREVIOUS:
1084 			encode_claim_previous(xdr, arg->u.delegation_type);
1085 			break;
1086 		case NFS4_OPEN_CLAIM_DELEGATE_CUR:
1087 			encode_claim_delegate_cur(xdr, arg->name, &arg->u.delegation);
1088 			break;
1089 		default:
1090 			BUG();
1091 	}
1092 	return 0;
1093 }
1094 
1095 static int encode_open_confirm(struct xdr_stream *xdr, const struct nfs_open_confirmargs *arg)
1096 {
1097 	__be32 *p;
1098 
1099 	RESERVE_SPACE(4+NFS4_STATEID_SIZE+4);
1100 	WRITE32(OP_OPEN_CONFIRM);
1101 	WRITEMEM(arg->stateid->data, NFS4_STATEID_SIZE);
1102 	WRITE32(arg->seqid->sequence->counter);
1103 
1104 	return 0;
1105 }
1106 
1107 static int encode_open_downgrade(struct xdr_stream *xdr, const struct nfs_closeargs *arg)
1108 {
1109 	__be32 *p;
1110 
1111 	RESERVE_SPACE(4+NFS4_STATEID_SIZE+4);
1112 	WRITE32(OP_OPEN_DOWNGRADE);
1113 	WRITEMEM(arg->stateid->data, NFS4_STATEID_SIZE);
1114 	WRITE32(arg->seqid->sequence->counter);
1115 	encode_share_access(xdr, arg->open_flags);
1116 	return 0;
1117 }
1118 
1119 static int
1120 encode_putfh(struct xdr_stream *xdr, const struct nfs_fh *fh)
1121 {
1122 	int len = fh->size;
1123 	__be32 *p;
1124 
1125 	RESERVE_SPACE(8 + len);
1126 	WRITE32(OP_PUTFH);
1127 	WRITE32(len);
1128 	WRITEMEM(fh->data, len);
1129 
1130 	return 0;
1131 }
1132 
1133 static int encode_putrootfh(struct xdr_stream *xdr)
1134 {
1135         __be32 *p;
1136 
1137         RESERVE_SPACE(4);
1138         WRITE32(OP_PUTROOTFH);
1139 
1140         return 0;
1141 }
1142 
1143 static void encode_stateid(struct xdr_stream *xdr, const struct nfs_open_context *ctx)
1144 {
1145 	nfs4_stateid stateid;
1146 	__be32 *p;
1147 
1148 	RESERVE_SPACE(NFS4_STATEID_SIZE);
1149 	if (ctx->state != NULL) {
1150 		nfs4_copy_stateid(&stateid, ctx->state, ctx->lockowner);
1151 		WRITEMEM(stateid.data, NFS4_STATEID_SIZE);
1152 	} else
1153 		WRITEMEM(zero_stateid.data, NFS4_STATEID_SIZE);
1154 }
1155 
1156 static int encode_read(struct xdr_stream *xdr, const struct nfs_readargs *args)
1157 {
1158 	__be32 *p;
1159 
1160 	RESERVE_SPACE(4);
1161 	WRITE32(OP_READ);
1162 
1163 	encode_stateid(xdr, args->context);
1164 
1165 	RESERVE_SPACE(12);
1166 	WRITE64(args->offset);
1167 	WRITE32(args->count);
1168 
1169 	return 0;
1170 }
1171 
1172 static int encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_arg *readdir, struct rpc_rqst *req)
1173 {
1174 	uint32_t attrs[2] = {
1175 		FATTR4_WORD0_RDATTR_ERROR|FATTR4_WORD0_FILEID,
1176 		FATTR4_WORD1_MOUNTED_ON_FILEID,
1177 	};
1178 	__be32 *p;
1179 
1180 	RESERVE_SPACE(12+NFS4_VERIFIER_SIZE+20);
1181 	WRITE32(OP_READDIR);
1182 	WRITE64(readdir->cookie);
1183 	WRITEMEM(readdir->verifier.data, NFS4_VERIFIER_SIZE);
1184 	WRITE32(readdir->count >> 1);  /* We're not doing readdirplus */
1185 	WRITE32(readdir->count);
1186 	WRITE32(2);
1187 	/* Switch to mounted_on_fileid if the server supports it */
1188 	if (readdir->bitmask[1] & FATTR4_WORD1_MOUNTED_ON_FILEID)
1189 		attrs[0] &= ~FATTR4_WORD0_FILEID;
1190 	else
1191 		attrs[1] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID;
1192 	WRITE32(attrs[0] & readdir->bitmask[0]);
1193 	WRITE32(attrs[1] & readdir->bitmask[1]);
1194 	dprintk("%s: cookie = %Lu, verifier = %08x:%08x, bitmap = %08x:%08x\n",
1195 			__func__,
1196 			(unsigned long long)readdir->cookie,
1197 			((u32 *)readdir->verifier.data)[0],
1198 			((u32 *)readdir->verifier.data)[1],
1199 			attrs[0] & readdir->bitmask[0],
1200 			attrs[1] & readdir->bitmask[1]);
1201 
1202 	return 0;
1203 }
1204 
1205 static int encode_readlink(struct xdr_stream *xdr, const struct nfs4_readlink *readlink, struct rpc_rqst *req)
1206 {
1207 	__be32 *p;
1208 
1209 	RESERVE_SPACE(4);
1210 	WRITE32(OP_READLINK);
1211 
1212 	return 0;
1213 }
1214 
1215 static int encode_remove(struct xdr_stream *xdr, const struct qstr *name)
1216 {
1217 	__be32 *p;
1218 
1219 	RESERVE_SPACE(8 + name->len);
1220 	WRITE32(OP_REMOVE);
1221 	WRITE32(name->len);
1222 	WRITEMEM(name->name, name->len);
1223 
1224 	return 0;
1225 }
1226 
1227 static int encode_rename(struct xdr_stream *xdr, const struct qstr *oldname, const struct qstr *newname)
1228 {
1229 	__be32 *p;
1230 
1231 	RESERVE_SPACE(8 + oldname->len);
1232 	WRITE32(OP_RENAME);
1233 	WRITE32(oldname->len);
1234 	WRITEMEM(oldname->name, oldname->len);
1235 
1236 	RESERVE_SPACE(4 + newname->len);
1237 	WRITE32(newname->len);
1238 	WRITEMEM(newname->name, newname->len);
1239 
1240 	return 0;
1241 }
1242 
1243 static int encode_renew(struct xdr_stream *xdr, const struct nfs_client *client_stateid)
1244 {
1245 	__be32 *p;
1246 
1247 	RESERVE_SPACE(12);
1248 	WRITE32(OP_RENEW);
1249 	WRITE64(client_stateid->cl_clientid);
1250 
1251 	return 0;
1252 }
1253 
1254 static int
1255 encode_restorefh(struct xdr_stream *xdr)
1256 {
1257 	__be32 *p;
1258 
1259 	RESERVE_SPACE(4);
1260 	WRITE32(OP_RESTOREFH);
1261 
1262 	return 0;
1263 }
1264 
1265 static int
1266 encode_setacl(struct xdr_stream *xdr, struct nfs_setaclargs *arg)
1267 {
1268 	__be32 *p;
1269 
1270 	RESERVE_SPACE(4+NFS4_STATEID_SIZE);
1271 	WRITE32(OP_SETATTR);
1272 	WRITEMEM(zero_stateid.data, NFS4_STATEID_SIZE);
1273 	RESERVE_SPACE(2*4);
1274 	WRITE32(1);
1275 	WRITE32(FATTR4_WORD0_ACL);
1276 	if (arg->acl_len % 4)
1277 		return -EINVAL;
1278 	RESERVE_SPACE(4);
1279 	WRITE32(arg->acl_len);
1280 	xdr_write_pages(xdr, arg->acl_pages, arg->acl_pgbase, arg->acl_len);
1281 	return 0;
1282 }
1283 
1284 static int
1285 encode_savefh(struct xdr_stream *xdr)
1286 {
1287 	__be32 *p;
1288 
1289 	RESERVE_SPACE(4);
1290 	WRITE32(OP_SAVEFH);
1291 
1292 	return 0;
1293 }
1294 
1295 static int encode_setattr(struct xdr_stream *xdr, const struct nfs_setattrargs *arg, const struct nfs_server *server)
1296 {
1297 	int status;
1298 	__be32 *p;
1299 
1300         RESERVE_SPACE(4+NFS4_STATEID_SIZE);
1301         WRITE32(OP_SETATTR);
1302 	WRITEMEM(arg->stateid.data, NFS4_STATEID_SIZE);
1303 
1304         if ((status = encode_attrs(xdr, arg->iap, server)))
1305 		return status;
1306 
1307         return 0;
1308 }
1309 
1310 static int encode_setclientid(struct xdr_stream *xdr, const struct nfs4_setclientid *setclientid)
1311 {
1312 	__be32 *p;
1313 
1314 	RESERVE_SPACE(4 + NFS4_VERIFIER_SIZE);
1315 	WRITE32(OP_SETCLIENTID);
1316 	WRITEMEM(setclientid->sc_verifier->data, NFS4_VERIFIER_SIZE);
1317 
1318 	encode_string(xdr, setclientid->sc_name_len, setclientid->sc_name);
1319 	RESERVE_SPACE(4);
1320 	WRITE32(setclientid->sc_prog);
1321 	encode_string(xdr, setclientid->sc_netid_len, setclientid->sc_netid);
1322 	encode_string(xdr, setclientid->sc_uaddr_len, setclientid->sc_uaddr);
1323 	RESERVE_SPACE(4);
1324 	WRITE32(setclientid->sc_cb_ident);
1325 
1326 	return 0;
1327 }
1328 
1329 static int encode_setclientid_confirm(struct xdr_stream *xdr, const struct nfs_client *client_state)
1330 {
1331         __be32 *p;
1332 
1333         RESERVE_SPACE(12 + NFS4_VERIFIER_SIZE);
1334         WRITE32(OP_SETCLIENTID_CONFIRM);
1335         WRITE64(client_state->cl_clientid);
1336         WRITEMEM(client_state->cl_confirm.data, NFS4_VERIFIER_SIZE);
1337 
1338         return 0;
1339 }
1340 
1341 static int encode_write(struct xdr_stream *xdr, const struct nfs_writeargs *args)
1342 {
1343 	__be32 *p;
1344 
1345 	RESERVE_SPACE(4);
1346 	WRITE32(OP_WRITE);
1347 
1348 	encode_stateid(xdr, args->context);
1349 
1350 	RESERVE_SPACE(16);
1351 	WRITE64(args->offset);
1352 	WRITE32(args->stable);
1353 	WRITE32(args->count);
1354 
1355 	xdr_write_pages(xdr, args->pages, args->pgbase, args->count);
1356 
1357 	return 0;
1358 }
1359 
1360 static int encode_delegreturn(struct xdr_stream *xdr, const nfs4_stateid *stateid)
1361 {
1362 	__be32 *p;
1363 
1364 	RESERVE_SPACE(4+NFS4_STATEID_SIZE);
1365 
1366 	WRITE32(OP_DELEGRETURN);
1367 	WRITEMEM(stateid->data, NFS4_STATEID_SIZE);
1368 	return 0;
1369 
1370 }
1371 /*
1372  * END OF "GENERIC" ENCODE ROUTINES.
1373  */
1374 
1375 /*
1376  * Encode an ACCESS request
1377  */
1378 static int nfs4_xdr_enc_access(struct rpc_rqst *req, __be32 *p, const struct nfs4_accessargs *args)
1379 {
1380 	struct xdr_stream xdr;
1381 	struct compound_hdr hdr = {
1382 		.nops = 3,
1383 	};
1384 	int status;
1385 
1386 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1387 	encode_compound_hdr(&xdr, &hdr);
1388 	status = encode_putfh(&xdr, args->fh);
1389 	if (status != 0)
1390 		goto out;
1391 	status = encode_access(&xdr, args->access);
1392 	if (status != 0)
1393 		goto out;
1394 	status = encode_getfattr(&xdr, args->bitmask);
1395 out:
1396 	return status;
1397 }
1398 
1399 /*
1400  * Encode LOOKUP request
1401  */
1402 static int nfs4_xdr_enc_lookup(struct rpc_rqst *req, __be32 *p, const struct nfs4_lookup_arg *args)
1403 {
1404 	struct xdr_stream xdr;
1405 	struct compound_hdr hdr = {
1406 		.nops = 4,
1407 	};
1408 	int status;
1409 
1410 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1411 	encode_compound_hdr(&xdr, &hdr);
1412 	if ((status = encode_putfh(&xdr, args->dir_fh)) != 0)
1413 		goto out;
1414 	if ((status = encode_lookup(&xdr, args->name)) != 0)
1415 		goto out;
1416 	if ((status = encode_getfh(&xdr)) != 0)
1417 		goto out;
1418 	status = encode_getfattr(&xdr, args->bitmask);
1419 out:
1420 	return status;
1421 }
1422 
1423 /*
1424  * Encode LOOKUP_ROOT request
1425  */
1426 static int nfs4_xdr_enc_lookup_root(struct rpc_rqst *req, __be32 *p, const struct nfs4_lookup_root_arg *args)
1427 {
1428 	struct xdr_stream xdr;
1429 	struct compound_hdr hdr = {
1430 		.nops = 3,
1431 	};
1432 	int status;
1433 
1434 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1435 	encode_compound_hdr(&xdr, &hdr);
1436 	if ((status = encode_putrootfh(&xdr)) != 0)
1437 		goto out;
1438 	if ((status = encode_getfh(&xdr)) == 0)
1439 		status = encode_getfattr(&xdr, args->bitmask);
1440 out:
1441 	return status;
1442 }
1443 
1444 /*
1445  * Encode REMOVE request
1446  */
1447 static int nfs4_xdr_enc_remove(struct rpc_rqst *req, __be32 *p, const struct nfs_removeargs *args)
1448 {
1449 	struct xdr_stream xdr;
1450 	struct compound_hdr hdr = {
1451 		.nops = 3,
1452 	};
1453 	int status;
1454 
1455 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1456 	encode_compound_hdr(&xdr, &hdr);
1457 	if ((status = encode_putfh(&xdr, args->fh)) != 0)
1458 		goto out;
1459 	if ((status = encode_remove(&xdr, &args->name)) != 0)
1460 		goto out;
1461 	status = encode_getfattr(&xdr, args->bitmask);
1462 out:
1463 	return status;
1464 }
1465 
1466 /*
1467  * Encode RENAME request
1468  */
1469 static int nfs4_xdr_enc_rename(struct rpc_rqst *req, __be32 *p, const struct nfs4_rename_arg *args)
1470 {
1471 	struct xdr_stream xdr;
1472 	struct compound_hdr hdr = {
1473 		.nops = 7,
1474 	};
1475 	int status;
1476 
1477 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1478 	encode_compound_hdr(&xdr, &hdr);
1479 	if ((status = encode_putfh(&xdr, args->old_dir)) != 0)
1480 		goto out;
1481 	if ((status = encode_savefh(&xdr)) != 0)
1482 		goto out;
1483 	if ((status = encode_putfh(&xdr, args->new_dir)) != 0)
1484 		goto out;
1485 	if ((status = encode_rename(&xdr, args->old_name, args->new_name)) != 0)
1486 		goto out;
1487 	if ((status = encode_getfattr(&xdr, args->bitmask)) != 0)
1488 		goto out;
1489 	if ((status = encode_restorefh(&xdr)) != 0)
1490 		goto out;
1491 	status = encode_getfattr(&xdr, args->bitmask);
1492 out:
1493 	return status;
1494 }
1495 
1496 /*
1497  * Encode LINK request
1498  */
1499 static int nfs4_xdr_enc_link(struct rpc_rqst *req, __be32 *p, const struct nfs4_link_arg *args)
1500 {
1501 	struct xdr_stream xdr;
1502 	struct compound_hdr hdr = {
1503 		.nops = 7,
1504 	};
1505 	int status;
1506 
1507 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1508 	encode_compound_hdr(&xdr, &hdr);
1509 	if ((status = encode_putfh(&xdr, args->fh)) != 0)
1510 		goto out;
1511 	if ((status = encode_savefh(&xdr)) != 0)
1512 		goto out;
1513 	if ((status = encode_putfh(&xdr, args->dir_fh)) != 0)
1514 		goto out;
1515 	if ((status = encode_link(&xdr, args->name)) != 0)
1516 		goto out;
1517 	if ((status = encode_getfattr(&xdr, args->bitmask)) != 0)
1518 		goto out;
1519 	if ((status = encode_restorefh(&xdr)) != 0)
1520 		goto out;
1521 	status = encode_getfattr(&xdr, args->bitmask);
1522 out:
1523 	return status;
1524 }
1525 
1526 /*
1527  * Encode CREATE request
1528  */
1529 static int nfs4_xdr_enc_create(struct rpc_rqst *req, __be32 *p, const struct nfs4_create_arg *args)
1530 {
1531 	struct xdr_stream xdr;
1532 	struct compound_hdr hdr = {
1533 		.nops = 7,
1534 	};
1535 	int status;
1536 
1537 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1538 	encode_compound_hdr(&xdr, &hdr);
1539 	if ((status = encode_putfh(&xdr, args->dir_fh)) != 0)
1540 		goto out;
1541 	if ((status = encode_savefh(&xdr)) != 0)
1542 		goto out;
1543 	if ((status = encode_create(&xdr, args)) != 0)
1544 		goto out;
1545 	if ((status = encode_getfh(&xdr)) != 0)
1546 		goto out;
1547 	if ((status = encode_getfattr(&xdr, args->bitmask)) != 0)
1548 		goto out;
1549 	if ((status = encode_restorefh(&xdr)) != 0)
1550 		goto out;
1551 	status = encode_getfattr(&xdr, args->bitmask);
1552 out:
1553 	return status;
1554 }
1555 
1556 /*
1557  * Encode SYMLINK request
1558  */
1559 static int nfs4_xdr_enc_symlink(struct rpc_rqst *req, __be32 *p, const struct nfs4_create_arg *args)
1560 {
1561 	return nfs4_xdr_enc_create(req, p, args);
1562 }
1563 
1564 /*
1565  * Encode GETATTR request
1566  */
1567 static int nfs4_xdr_enc_getattr(struct rpc_rqst *req, __be32 *p, const struct nfs4_getattr_arg *args)
1568 {
1569 	struct xdr_stream xdr;
1570 	struct compound_hdr hdr = {
1571 		.nops = 2,
1572 	};
1573 	int status;
1574 
1575 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1576 	encode_compound_hdr(&xdr, &hdr);
1577 	if ((status = encode_putfh(&xdr, args->fh)) == 0)
1578 		status = encode_getfattr(&xdr, args->bitmask);
1579 	return status;
1580 }
1581 
1582 /*
1583  * Encode a CLOSE request
1584  */
1585 static int nfs4_xdr_enc_close(struct rpc_rqst *req, __be32 *p, struct nfs_closeargs *args)
1586 {
1587         struct xdr_stream xdr;
1588         struct compound_hdr hdr = {
1589                 .nops   = 3,
1590         };
1591         int status;
1592 
1593         xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1594         encode_compound_hdr(&xdr, &hdr);
1595         status = encode_putfh(&xdr, args->fh);
1596         if(status)
1597                 goto out;
1598         status = encode_close(&xdr, args);
1599 	if (status != 0)
1600 		goto out;
1601 	status = encode_getfattr(&xdr, args->bitmask);
1602 out:
1603         return status;
1604 }
1605 
1606 /*
1607  * Encode an OPEN request
1608  */
1609 static int nfs4_xdr_enc_open(struct rpc_rqst *req, __be32 *p, struct nfs_openargs *args)
1610 {
1611 	struct xdr_stream xdr;
1612 	struct compound_hdr hdr = {
1613 		.nops = 7,
1614 	};
1615 	int status;
1616 
1617 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1618 	encode_compound_hdr(&xdr, &hdr);
1619 	status = encode_putfh(&xdr, args->fh);
1620 	if (status)
1621 		goto out;
1622 	status = encode_savefh(&xdr);
1623 	if (status)
1624 		goto out;
1625 	status = encode_open(&xdr, args);
1626 	if (status)
1627 		goto out;
1628 	status = encode_getfh(&xdr);
1629 	if (status)
1630 		goto out;
1631 	status = encode_getfattr(&xdr, args->bitmask);
1632 	if (status)
1633 		goto out;
1634 	status = encode_restorefh(&xdr);
1635 	if (status)
1636 		goto out;
1637 	status = encode_getfattr(&xdr, args->bitmask);
1638 out:
1639 	return status;
1640 }
1641 
1642 /*
1643  * Encode an OPEN_CONFIRM request
1644  */
1645 static int nfs4_xdr_enc_open_confirm(struct rpc_rqst *req, __be32 *p, struct nfs_open_confirmargs *args)
1646 {
1647 	struct xdr_stream xdr;
1648 	struct compound_hdr hdr = {
1649 		.nops   = 2,
1650 	};
1651 	int status;
1652 
1653 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1654 	encode_compound_hdr(&xdr, &hdr);
1655 	status = encode_putfh(&xdr, args->fh);
1656 	if(status)
1657 		goto out;
1658 	status = encode_open_confirm(&xdr, args);
1659 out:
1660 	return status;
1661 }
1662 
1663 /*
1664  * Encode an OPEN request with no attributes.
1665  */
1666 static int nfs4_xdr_enc_open_noattr(struct rpc_rqst *req, __be32 *p, struct nfs_openargs *args)
1667 {
1668 	struct xdr_stream xdr;
1669 	struct compound_hdr hdr = {
1670 		.nops   = 3,
1671 	};
1672 	int status;
1673 
1674 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1675 	encode_compound_hdr(&xdr, &hdr);
1676 	status = encode_putfh(&xdr, args->fh);
1677 	if (status)
1678 		goto out;
1679 	status = encode_open(&xdr, args);
1680 	if (status)
1681 		goto out;
1682 	status = encode_getfattr(&xdr, args->bitmask);
1683 out:
1684 	return status;
1685 }
1686 
1687 /*
1688  * Encode an OPEN_DOWNGRADE request
1689  */
1690 static int nfs4_xdr_enc_open_downgrade(struct rpc_rqst *req, __be32 *p, struct nfs_closeargs *args)
1691 {
1692 	struct xdr_stream xdr;
1693 	struct compound_hdr hdr = {
1694 		.nops	= 3,
1695 	};
1696 	int status;
1697 
1698 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1699 	encode_compound_hdr(&xdr, &hdr);
1700 	status = encode_putfh(&xdr, args->fh);
1701 	if (status)
1702 		goto out;
1703 	status = encode_open_downgrade(&xdr, args);
1704 	if (status != 0)
1705 		goto out;
1706 	status = encode_getfattr(&xdr, args->bitmask);
1707 out:
1708 	return status;
1709 }
1710 
1711 /*
1712  * Encode a LOCK request
1713  */
1714 static int nfs4_xdr_enc_lock(struct rpc_rqst *req, __be32 *p, struct nfs_lock_args *args)
1715 {
1716 	struct xdr_stream xdr;
1717 	struct compound_hdr hdr = {
1718 		.nops   = 2,
1719 	};
1720 	int status;
1721 
1722 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1723 	encode_compound_hdr(&xdr, &hdr);
1724 	status = encode_putfh(&xdr, args->fh);
1725 	if(status)
1726 		goto out;
1727 	status = encode_lock(&xdr, args);
1728 out:
1729 	return status;
1730 }
1731 
1732 /*
1733  * Encode a LOCKT request
1734  */
1735 static int nfs4_xdr_enc_lockt(struct rpc_rqst *req, __be32 *p, struct nfs_lockt_args *args)
1736 {
1737 	struct xdr_stream xdr;
1738 	struct compound_hdr hdr = {
1739 		.nops   = 2,
1740 	};
1741 	int status;
1742 
1743 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1744 	encode_compound_hdr(&xdr, &hdr);
1745 	status = encode_putfh(&xdr, args->fh);
1746 	if(status)
1747 		goto out;
1748 	status = encode_lockt(&xdr, args);
1749 out:
1750 	return status;
1751 }
1752 
1753 /*
1754  * Encode a LOCKU request
1755  */
1756 static int nfs4_xdr_enc_locku(struct rpc_rqst *req, __be32 *p, struct nfs_locku_args *args)
1757 {
1758 	struct xdr_stream xdr;
1759 	struct compound_hdr hdr = {
1760 		.nops   = 2,
1761 	};
1762 	int status;
1763 
1764 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1765 	encode_compound_hdr(&xdr, &hdr);
1766 	status = encode_putfh(&xdr, args->fh);
1767 	if(status)
1768 		goto out;
1769 	status = encode_locku(&xdr, args);
1770 out:
1771 	return status;
1772 }
1773 
1774 /*
1775  * Encode a READLINK request
1776  */
1777 static int nfs4_xdr_enc_readlink(struct rpc_rqst *req, __be32 *p, const struct nfs4_readlink *args)
1778 {
1779 	struct xdr_stream xdr;
1780 	struct compound_hdr hdr = {
1781 		.nops = 2,
1782 	};
1783 	struct rpc_auth *auth = req->rq_task->tk_msg.rpc_cred->cr_auth;
1784 	unsigned int replen;
1785 	int status;
1786 
1787 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1788 	encode_compound_hdr(&xdr, &hdr);
1789 	status = encode_putfh(&xdr, args->fh);
1790 	if(status)
1791 		goto out;
1792 	status = encode_readlink(&xdr, args, req);
1793 
1794 	/* set up reply kvec
1795 	 *    toplevel_status + taglen + rescount + OP_PUTFH + status
1796 	 *      + OP_READLINK + status + string length = 8
1797 	 */
1798 	replen = (RPC_REPHDRSIZE + auth->au_rslack + NFS4_dec_readlink_sz) << 2;
1799 	xdr_inline_pages(&req->rq_rcv_buf, replen, args->pages,
1800 			args->pgbase, args->pglen);
1801 
1802 out:
1803 	return status;
1804 }
1805 
1806 /*
1807  * Encode a READDIR request
1808  */
1809 static int nfs4_xdr_enc_readdir(struct rpc_rqst *req, __be32 *p, const struct nfs4_readdir_arg *args)
1810 {
1811 	struct xdr_stream xdr;
1812 	struct compound_hdr hdr = {
1813 		.nops = 2,
1814 	};
1815 	struct rpc_auth *auth = req->rq_task->tk_msg.rpc_cred->cr_auth;
1816 	int replen;
1817 	int status;
1818 
1819 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1820 	encode_compound_hdr(&xdr, &hdr);
1821 	status = encode_putfh(&xdr, args->fh);
1822 	if(status)
1823 		goto out;
1824 	status = encode_readdir(&xdr, args, req);
1825 
1826 	/* set up reply kvec
1827 	 *    toplevel_status + taglen + rescount + OP_PUTFH + status
1828 	 *      + OP_READDIR + status + verifer(2)  = 9
1829 	 */
1830 	replen = (RPC_REPHDRSIZE + auth->au_rslack + NFS4_dec_readdir_sz) << 2;
1831 	xdr_inline_pages(&req->rq_rcv_buf, replen, args->pages,
1832 			 args->pgbase, args->count);
1833 	dprintk("%s: inlined page args = (%u, %p, %u, %u)\n",
1834 			__func__, replen, args->pages,
1835 			args->pgbase, args->count);
1836 
1837 out:
1838 	return status;
1839 }
1840 
1841 /*
1842  * Encode a READ request
1843  */
1844 static int nfs4_xdr_enc_read(struct rpc_rqst *req, __be32 *p, struct nfs_readargs *args)
1845 {
1846 	struct rpc_auth *auth = req->rq_task->tk_msg.rpc_cred->cr_auth;
1847 	struct xdr_stream xdr;
1848 	struct compound_hdr hdr = {
1849 		.nops = 2,
1850 	};
1851 	int replen, status;
1852 
1853 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1854 	encode_compound_hdr(&xdr, &hdr);
1855 	status = encode_putfh(&xdr, args->fh);
1856 	if (status)
1857 		goto out;
1858 	status = encode_read(&xdr, args);
1859 	if (status)
1860 		goto out;
1861 
1862 	/* set up reply kvec
1863 	 *    toplevel status + taglen=0 + rescount + OP_PUTFH + status
1864 	 *       + OP_READ + status + eof + datalen = 9
1865 	 */
1866 	replen = (RPC_REPHDRSIZE + auth->au_rslack + NFS4_dec_read_sz) << 2;
1867 	xdr_inline_pages(&req->rq_rcv_buf, replen,
1868 			 args->pages, args->pgbase, args->count);
1869 	req->rq_rcv_buf.flags |= XDRBUF_READ;
1870 out:
1871 	return status;
1872 }
1873 
1874 /*
1875  * Encode an SETATTR request
1876  */
1877 static int nfs4_xdr_enc_setattr(struct rpc_rqst *req, __be32 *p, struct nfs_setattrargs *args)
1878 
1879 {
1880         struct xdr_stream xdr;
1881         struct compound_hdr hdr = {
1882                 .nops   = 3,
1883         };
1884         int status;
1885 
1886         xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1887         encode_compound_hdr(&xdr, &hdr);
1888         status = encode_putfh(&xdr, args->fh);
1889         if(status)
1890                 goto out;
1891         status = encode_setattr(&xdr, args, args->server);
1892         if(status)
1893                 goto out;
1894 	status = encode_getfattr(&xdr, args->bitmask);
1895 out:
1896         return status;
1897 }
1898 
1899 /*
1900  * Encode a GETACL request
1901  */
1902 static int
1903 nfs4_xdr_enc_getacl(struct rpc_rqst *req, __be32 *p,
1904 		struct nfs_getaclargs *args)
1905 {
1906 	struct xdr_stream xdr;
1907 	struct rpc_auth *auth = req->rq_task->tk_msg.rpc_cred->cr_auth;
1908 	struct compound_hdr hdr = {
1909 		.nops   = 2,
1910 	};
1911 	int replen, status;
1912 
1913 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1914 	encode_compound_hdr(&xdr, &hdr);
1915 	status = encode_putfh(&xdr, args->fh);
1916 	if (status)
1917 		goto out;
1918 	status = encode_getattr_two(&xdr, FATTR4_WORD0_ACL, 0);
1919 	/* set up reply buffer: */
1920 	replen = (RPC_REPHDRSIZE + auth->au_rslack + NFS4_dec_getacl_sz) << 2;
1921 	xdr_inline_pages(&req->rq_rcv_buf, replen,
1922 		args->acl_pages, args->acl_pgbase, args->acl_len);
1923 out:
1924 	return status;
1925 }
1926 
1927 /*
1928  * Encode a WRITE request
1929  */
1930 static int nfs4_xdr_enc_write(struct rpc_rqst *req, __be32 *p, struct nfs_writeargs *args)
1931 {
1932 	struct xdr_stream xdr;
1933 	struct compound_hdr hdr = {
1934 		.nops = 3,
1935 	};
1936 	int status;
1937 
1938 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1939 	encode_compound_hdr(&xdr, &hdr);
1940 	status = encode_putfh(&xdr, args->fh);
1941 	if (status)
1942 		goto out;
1943 	status = encode_write(&xdr, args);
1944 	if (status)
1945 		goto out;
1946 	req->rq_snd_buf.flags |= XDRBUF_WRITE;
1947 	status = encode_getfattr(&xdr, args->bitmask);
1948 out:
1949 	return status;
1950 }
1951 
1952 /*
1953  *  a COMMIT request
1954  */
1955 static int nfs4_xdr_enc_commit(struct rpc_rqst *req, __be32 *p, struct nfs_writeargs *args)
1956 {
1957 	struct xdr_stream xdr;
1958 	struct compound_hdr hdr = {
1959 		.nops = 3,
1960 	};
1961 	int status;
1962 
1963 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1964 	encode_compound_hdr(&xdr, &hdr);
1965 	status = encode_putfh(&xdr, args->fh);
1966 	if (status)
1967 		goto out;
1968 	status = encode_commit(&xdr, args);
1969 	if (status)
1970 		goto out;
1971 	status = encode_getfattr(&xdr, args->bitmask);
1972 out:
1973 	return status;
1974 }
1975 
1976 /*
1977  * FSINFO request
1978  */
1979 static int nfs4_xdr_enc_fsinfo(struct rpc_rqst *req, __be32 *p, struct nfs4_fsinfo_arg *args)
1980 {
1981 	struct xdr_stream xdr;
1982 	struct compound_hdr hdr = {
1983 		.nops	= 2,
1984 	};
1985 	int status;
1986 
1987 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
1988 	encode_compound_hdr(&xdr, &hdr);
1989 	status = encode_putfh(&xdr, args->fh);
1990 	if (!status)
1991 		status = encode_fsinfo(&xdr, args->bitmask);
1992 	return status;
1993 }
1994 
1995 /*
1996  * a PATHCONF request
1997  */
1998 static int nfs4_xdr_enc_pathconf(struct rpc_rqst *req, __be32 *p, const struct nfs4_pathconf_arg *args)
1999 {
2000 	struct xdr_stream xdr;
2001 	struct compound_hdr hdr = {
2002 		.nops = 2,
2003 	};
2004 	int status;
2005 
2006 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
2007 	encode_compound_hdr(&xdr, &hdr);
2008 	status = encode_putfh(&xdr, args->fh);
2009 	if (!status)
2010 		status = encode_getattr_one(&xdr,
2011 				args->bitmask[0] & nfs4_pathconf_bitmap[0]);
2012 	return status;
2013 }
2014 
2015 /*
2016  * a STATFS request
2017  */
2018 static int nfs4_xdr_enc_statfs(struct rpc_rqst *req, __be32 *p, const struct nfs4_statfs_arg *args)
2019 {
2020 	struct xdr_stream xdr;
2021 	struct compound_hdr hdr = {
2022 		.nops = 2,
2023 	};
2024 	int status;
2025 
2026 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
2027 	encode_compound_hdr(&xdr, &hdr);
2028 	status = encode_putfh(&xdr, args->fh);
2029 	if (status == 0)
2030 		status = encode_getattr_two(&xdr,
2031 				args->bitmask[0] & nfs4_statfs_bitmap[0],
2032 				args->bitmask[1] & nfs4_statfs_bitmap[1]);
2033 	return status;
2034 }
2035 
2036 /*
2037  * GETATTR_BITMAP request
2038  */
2039 static int nfs4_xdr_enc_server_caps(struct rpc_rqst *req, __be32 *p, const struct nfs_fh *fhandle)
2040 {
2041 	struct xdr_stream xdr;
2042 	struct compound_hdr hdr = {
2043 		.nops = 2,
2044 	};
2045 	int status;
2046 
2047 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
2048 	encode_compound_hdr(&xdr, &hdr);
2049 	status = encode_putfh(&xdr, fhandle);
2050 	if (status == 0)
2051 		status = encode_getattr_one(&xdr, FATTR4_WORD0_SUPPORTED_ATTRS|
2052 				FATTR4_WORD0_LINK_SUPPORT|
2053 				FATTR4_WORD0_SYMLINK_SUPPORT|
2054 				FATTR4_WORD0_ACLSUPPORT);
2055 	return status;
2056 }
2057 
2058 /*
2059  * a RENEW request
2060  */
2061 static int nfs4_xdr_enc_renew(struct rpc_rqst *req, __be32 *p, struct nfs_client *clp)
2062 {
2063 	struct xdr_stream xdr;
2064 	struct compound_hdr hdr = {
2065 		.nops	= 1,
2066 	};
2067 
2068 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
2069 	encode_compound_hdr(&xdr, &hdr);
2070 	return encode_renew(&xdr, clp);
2071 }
2072 
2073 /*
2074  * a SETCLIENTID request
2075  */
2076 static int nfs4_xdr_enc_setclientid(struct rpc_rqst *req, __be32 *p, struct nfs4_setclientid *sc)
2077 {
2078 	struct xdr_stream xdr;
2079 	struct compound_hdr hdr = {
2080 		.nops	= 1,
2081 	};
2082 
2083 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
2084 	encode_compound_hdr(&xdr, &hdr);
2085 	return encode_setclientid(&xdr, sc);
2086 }
2087 
2088 /*
2089  * a SETCLIENTID_CONFIRM request
2090  */
2091 static int nfs4_xdr_enc_setclientid_confirm(struct rpc_rqst *req, __be32 *p, struct nfs_client *clp)
2092 {
2093 	struct xdr_stream xdr;
2094 	struct compound_hdr hdr = {
2095 		.nops	= 3,
2096 	};
2097 	const u32 lease_bitmap[2] = { FATTR4_WORD0_LEASE_TIME, 0 };
2098 	int status;
2099 
2100 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
2101 	encode_compound_hdr(&xdr, &hdr);
2102 	status = encode_setclientid_confirm(&xdr, clp);
2103 	if (!status)
2104 		status = encode_putrootfh(&xdr);
2105 	if (!status)
2106 		status = encode_fsinfo(&xdr, lease_bitmap);
2107 	return status;
2108 }
2109 
2110 /*
2111  * DELEGRETURN request
2112  */
2113 static int nfs4_xdr_enc_delegreturn(struct rpc_rqst *req, __be32 *p, const struct nfs4_delegreturnargs *args)
2114 {
2115 	struct xdr_stream xdr;
2116 	struct compound_hdr hdr = {
2117 		.nops = 3,
2118 	};
2119 	int status;
2120 
2121 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
2122 	encode_compound_hdr(&xdr, &hdr);
2123 	status = encode_putfh(&xdr, args->fhandle);
2124 	if (status != 0)
2125 		goto out;
2126 	status = encode_delegreturn(&xdr, args->stateid);
2127 	if (status != 0)
2128 		goto out;
2129 	status = encode_getfattr(&xdr, args->bitmask);
2130 out:
2131 	return status;
2132 }
2133 
2134 /*
2135  * Encode FS_LOCATIONS request
2136  */
2137 static int nfs4_xdr_enc_fs_locations(struct rpc_rqst *req, __be32 *p, struct nfs4_fs_locations_arg *args)
2138 {
2139 	struct xdr_stream xdr;
2140 	struct compound_hdr hdr = {
2141 		.nops = 3,
2142 	};
2143 	struct rpc_auth *auth = req->rq_task->tk_msg.rpc_cred->cr_auth;
2144 	int replen;
2145 	int status;
2146 
2147 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
2148 	encode_compound_hdr(&xdr, &hdr);
2149 	if ((status = encode_putfh(&xdr, args->dir_fh)) != 0)
2150 		goto out;
2151 	if ((status = encode_lookup(&xdr, args->name)) != 0)
2152 		goto out;
2153 	if ((status = encode_fs_locations(&xdr, args->bitmask)) != 0)
2154 		goto out;
2155 	/* set up reply
2156 	 *   toplevel_status + OP_PUTFH + status
2157 	 *   + OP_LOOKUP + status + OP_GETATTR + status = 7
2158 	 */
2159 	replen = (RPC_REPHDRSIZE + auth->au_rslack + 7) << 2;
2160 	xdr_inline_pages(&req->rq_rcv_buf, replen, &args->page,
2161 			0, PAGE_SIZE);
2162 out:
2163 	return status;
2164 }
2165 
2166 /*
2167  * START OF "GENERIC" DECODE ROUTINES.
2168  *   These may look a little ugly since they are imported from a "generic"
2169  * set of XDR encode/decode routines which are intended to be shared by
2170  * all of our NFSv4 implementations (OpenBSD, MacOS X...).
2171  *
2172  * If the pain of reading these is too great, it should be a straightforward
2173  * task to translate them into Linux-specific versions which are more
2174  * consistent with the style used in NFSv2/v3...
2175  */
2176 #define READ32(x)         (x) = ntohl(*p++)
2177 #define READ64(x)         do {			\
2178 	(x) = (u64)ntohl(*p++) << 32;		\
2179 	(x) |= ntohl(*p++);			\
2180 } while (0)
2181 #define READTIME(x)       do {			\
2182 	p++;					\
2183 	(x.tv_sec) = ntohl(*p++);		\
2184 	(x.tv_nsec) = ntohl(*p++);		\
2185 } while (0)
2186 #define COPYMEM(x,nbytes) do {			\
2187 	memcpy((x), p, nbytes);			\
2188 	p += XDR_QUADLEN(nbytes);		\
2189 } while (0)
2190 
2191 #define READ_BUF(nbytes)  do { \
2192 	p = xdr_inline_decode(xdr, nbytes); \
2193 	if (unlikely(!p)) { \
2194 		dprintk("nfs: %s: prematurely hit end of receive" \
2195 				" buffer\n", __func__); \
2196 		dprintk("nfs: %s: xdr->p=%p, bytes=%u, xdr->end=%p\n", \
2197 				__func__, xdr->p, nbytes, xdr->end); \
2198 		return -EIO; \
2199 	} \
2200 } while (0)
2201 
2202 static int decode_opaque_inline(struct xdr_stream *xdr, unsigned int *len, char **string)
2203 {
2204 	__be32 *p;
2205 
2206 	READ_BUF(4);
2207 	READ32(*len);
2208 	READ_BUF(*len);
2209 	*string = (char *)p;
2210 	return 0;
2211 }
2212 
2213 static int decode_compound_hdr(struct xdr_stream *xdr, struct compound_hdr *hdr)
2214 {
2215 	__be32 *p;
2216 
2217 	READ_BUF(8);
2218 	READ32(hdr->status);
2219 	READ32(hdr->taglen);
2220 
2221 	READ_BUF(hdr->taglen + 4);
2222 	hdr->tag = (char *)p;
2223 	p += XDR_QUADLEN(hdr->taglen);
2224 	READ32(hdr->nops);
2225 	return 0;
2226 }
2227 
2228 static int decode_op_hdr(struct xdr_stream *xdr, enum nfs_opnum4 expected)
2229 {
2230 	__be32 *p;
2231 	uint32_t opnum;
2232 	int32_t nfserr;
2233 
2234 	READ_BUF(8);
2235 	READ32(opnum);
2236 	if (opnum != expected) {
2237 		dprintk("nfs: Server returned operation"
2238 			" %d but we issued a request for %d\n",
2239 				opnum, expected);
2240 		return -EIO;
2241 	}
2242 	READ32(nfserr);
2243 	if (nfserr != NFS_OK)
2244 		return nfs4_stat_to_errno(nfserr);
2245 	return 0;
2246 }
2247 
2248 /* Dummy routine */
2249 static int decode_ace(struct xdr_stream *xdr, void *ace, struct nfs_client *clp)
2250 {
2251 	__be32 *p;
2252 	unsigned int strlen;
2253 	char *str;
2254 
2255 	READ_BUF(12);
2256 	return decode_opaque_inline(xdr, &strlen, &str);
2257 }
2258 
2259 static int decode_attr_bitmap(struct xdr_stream *xdr, uint32_t *bitmap)
2260 {
2261 	uint32_t bmlen;
2262 	__be32 *p;
2263 
2264 	READ_BUF(4);
2265 	READ32(bmlen);
2266 
2267 	bitmap[0] = bitmap[1] = 0;
2268 	READ_BUF((bmlen << 2));
2269 	if (bmlen > 0) {
2270 		READ32(bitmap[0]);
2271 		if (bmlen > 1)
2272 			READ32(bitmap[1]);
2273 	}
2274 	return 0;
2275 }
2276 
2277 static inline int decode_attr_length(struct xdr_stream *xdr, uint32_t *attrlen, __be32 **savep)
2278 {
2279 	__be32 *p;
2280 
2281 	READ_BUF(4);
2282 	READ32(*attrlen);
2283 	*savep = xdr->p;
2284 	return 0;
2285 }
2286 
2287 static int decode_attr_supported(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *bitmask)
2288 {
2289 	if (likely(bitmap[0] & FATTR4_WORD0_SUPPORTED_ATTRS)) {
2290 		decode_attr_bitmap(xdr, bitmask);
2291 		bitmap[0] &= ~FATTR4_WORD0_SUPPORTED_ATTRS;
2292 	} else
2293 		bitmask[0] = bitmask[1] = 0;
2294 	dprintk("%s: bitmask=%08x:%08x\n", __func__, bitmask[0], bitmask[1]);
2295 	return 0;
2296 }
2297 
2298 static int decode_attr_type(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *type)
2299 {
2300 	__be32 *p;
2301 
2302 	*type = 0;
2303 	if (unlikely(bitmap[0] & (FATTR4_WORD0_TYPE - 1U)))
2304 		return -EIO;
2305 	if (likely(bitmap[0] & FATTR4_WORD0_TYPE)) {
2306 		READ_BUF(4);
2307 		READ32(*type);
2308 		if (*type < NF4REG || *type > NF4NAMEDATTR) {
2309 			dprintk("%s: bad type %d\n", __func__, *type);
2310 			return -EIO;
2311 		}
2312 		bitmap[0] &= ~FATTR4_WORD0_TYPE;
2313 	}
2314 	dprintk("%s: type=0%o\n", __func__, nfs_type2fmt[*type].nfs2type);
2315 	return 0;
2316 }
2317 
2318 static int decode_attr_change(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *change)
2319 {
2320 	__be32 *p;
2321 
2322 	*change = 0;
2323 	if (unlikely(bitmap[0] & (FATTR4_WORD0_CHANGE - 1U)))
2324 		return -EIO;
2325 	if (likely(bitmap[0] & FATTR4_WORD0_CHANGE)) {
2326 		READ_BUF(8);
2327 		READ64(*change);
2328 		bitmap[0] &= ~FATTR4_WORD0_CHANGE;
2329 	}
2330 	dprintk("%s: change attribute=%Lu\n", __func__,
2331 			(unsigned long long)*change);
2332 	return 0;
2333 }
2334 
2335 static int decode_attr_size(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *size)
2336 {
2337 	__be32 *p;
2338 
2339 	*size = 0;
2340 	if (unlikely(bitmap[0] & (FATTR4_WORD0_SIZE - 1U)))
2341 		return -EIO;
2342 	if (likely(bitmap[0] & FATTR4_WORD0_SIZE)) {
2343 		READ_BUF(8);
2344 		READ64(*size);
2345 		bitmap[0] &= ~FATTR4_WORD0_SIZE;
2346 	}
2347 	dprintk("%s: file size=%Lu\n", __func__, (unsigned long long)*size);
2348 	return 0;
2349 }
2350 
2351 static int decode_attr_link_support(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res)
2352 {
2353 	__be32 *p;
2354 
2355 	*res = 0;
2356 	if (unlikely(bitmap[0] & (FATTR4_WORD0_LINK_SUPPORT - 1U)))
2357 		return -EIO;
2358 	if (likely(bitmap[0] & FATTR4_WORD0_LINK_SUPPORT)) {
2359 		READ_BUF(4);
2360 		READ32(*res);
2361 		bitmap[0] &= ~FATTR4_WORD0_LINK_SUPPORT;
2362 	}
2363 	dprintk("%s: link support=%s\n", __func__, *res == 0 ? "false" : "true");
2364 	return 0;
2365 }
2366 
2367 static int decode_attr_symlink_support(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res)
2368 {
2369 	__be32 *p;
2370 
2371 	*res = 0;
2372 	if (unlikely(bitmap[0] & (FATTR4_WORD0_SYMLINK_SUPPORT - 1U)))
2373 		return -EIO;
2374 	if (likely(bitmap[0] & FATTR4_WORD0_SYMLINK_SUPPORT)) {
2375 		READ_BUF(4);
2376 		READ32(*res);
2377 		bitmap[0] &= ~FATTR4_WORD0_SYMLINK_SUPPORT;
2378 	}
2379 	dprintk("%s: symlink support=%s\n", __func__, *res == 0 ? "false" : "true");
2380 	return 0;
2381 }
2382 
2383 static int decode_attr_fsid(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs_fsid *fsid)
2384 {
2385 	__be32 *p;
2386 
2387 	fsid->major = 0;
2388 	fsid->minor = 0;
2389 	if (unlikely(bitmap[0] & (FATTR4_WORD0_FSID - 1U)))
2390 		return -EIO;
2391 	if (likely(bitmap[0] & FATTR4_WORD0_FSID)) {
2392 		READ_BUF(16);
2393 		READ64(fsid->major);
2394 		READ64(fsid->minor);
2395 		bitmap[0] &= ~FATTR4_WORD0_FSID;
2396 	}
2397 	dprintk("%s: fsid=(0x%Lx/0x%Lx)\n", __func__,
2398 			(unsigned long long)fsid->major,
2399 			(unsigned long long)fsid->minor);
2400 	return 0;
2401 }
2402 
2403 static int decode_attr_lease_time(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res)
2404 {
2405 	__be32 *p;
2406 
2407 	*res = 60;
2408 	if (unlikely(bitmap[0] & (FATTR4_WORD0_LEASE_TIME - 1U)))
2409 		return -EIO;
2410 	if (likely(bitmap[0] & FATTR4_WORD0_LEASE_TIME)) {
2411 		READ_BUF(4);
2412 		READ32(*res);
2413 		bitmap[0] &= ~FATTR4_WORD0_LEASE_TIME;
2414 	}
2415 	dprintk("%s: file size=%u\n", __func__, (unsigned int)*res);
2416 	return 0;
2417 }
2418 
2419 static int decode_attr_aclsupport(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res)
2420 {
2421 	__be32 *p;
2422 
2423 	*res = ACL4_SUPPORT_ALLOW_ACL|ACL4_SUPPORT_DENY_ACL;
2424 	if (unlikely(bitmap[0] & (FATTR4_WORD0_ACLSUPPORT - 1U)))
2425 		return -EIO;
2426 	if (likely(bitmap[0] & FATTR4_WORD0_ACLSUPPORT)) {
2427 		READ_BUF(4);
2428 		READ32(*res);
2429 		bitmap[0] &= ~FATTR4_WORD0_ACLSUPPORT;
2430 	}
2431 	dprintk("%s: ACLs supported=%u\n", __func__, (unsigned int)*res);
2432 	return 0;
2433 }
2434 
2435 static int decode_attr_fileid(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *fileid)
2436 {
2437 	__be32 *p;
2438 
2439 	*fileid = 0;
2440 	if (unlikely(bitmap[0] & (FATTR4_WORD0_FILEID - 1U)))
2441 		return -EIO;
2442 	if (likely(bitmap[0] & FATTR4_WORD0_FILEID)) {
2443 		READ_BUF(8);
2444 		READ64(*fileid);
2445 		bitmap[0] &= ~FATTR4_WORD0_FILEID;
2446 	}
2447 	dprintk("%s: fileid=%Lu\n", __func__, (unsigned long long)*fileid);
2448 	return 0;
2449 }
2450 
2451 static int decode_attr_mounted_on_fileid(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *fileid)
2452 {
2453 	__be32 *p;
2454 
2455 	*fileid = 0;
2456 	if (unlikely(bitmap[1] & (FATTR4_WORD1_MOUNTED_ON_FILEID - 1U)))
2457 		return -EIO;
2458 	if (likely(bitmap[1] & FATTR4_WORD1_MOUNTED_ON_FILEID)) {
2459 		READ_BUF(8);
2460 		READ64(*fileid);
2461 		bitmap[1] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID;
2462 	}
2463 	dprintk("%s: fileid=%Lu\n", __func__, (unsigned long long)*fileid);
2464 	return 0;
2465 }
2466 
2467 static int decode_attr_files_avail(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
2468 {
2469 	__be32 *p;
2470 	int status = 0;
2471 
2472 	*res = 0;
2473 	if (unlikely(bitmap[0] & (FATTR4_WORD0_FILES_AVAIL - 1U)))
2474 		return -EIO;
2475 	if (likely(bitmap[0] & FATTR4_WORD0_FILES_AVAIL)) {
2476 		READ_BUF(8);
2477 		READ64(*res);
2478 		bitmap[0] &= ~FATTR4_WORD0_FILES_AVAIL;
2479 	}
2480 	dprintk("%s: files avail=%Lu\n", __func__, (unsigned long long)*res);
2481 	return status;
2482 }
2483 
2484 static int decode_attr_files_free(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
2485 {
2486 	__be32 *p;
2487 	int status = 0;
2488 
2489 	*res = 0;
2490 	if (unlikely(bitmap[0] & (FATTR4_WORD0_FILES_FREE - 1U)))
2491 		return -EIO;
2492 	if (likely(bitmap[0] & FATTR4_WORD0_FILES_FREE)) {
2493 		READ_BUF(8);
2494 		READ64(*res);
2495 		bitmap[0] &= ~FATTR4_WORD0_FILES_FREE;
2496 	}
2497 	dprintk("%s: files free=%Lu\n", __func__, (unsigned long long)*res);
2498 	return status;
2499 }
2500 
2501 static int decode_attr_files_total(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
2502 {
2503 	__be32 *p;
2504 	int status = 0;
2505 
2506 	*res = 0;
2507 	if (unlikely(bitmap[0] & (FATTR4_WORD0_FILES_TOTAL - 1U)))
2508 		return -EIO;
2509 	if (likely(bitmap[0] & FATTR4_WORD0_FILES_TOTAL)) {
2510 		READ_BUF(8);
2511 		READ64(*res);
2512 		bitmap[0] &= ~FATTR4_WORD0_FILES_TOTAL;
2513 	}
2514 	dprintk("%s: files total=%Lu\n", __func__, (unsigned long long)*res);
2515 	return status;
2516 }
2517 
2518 static int decode_pathname(struct xdr_stream *xdr, struct nfs4_pathname *path)
2519 {
2520 	u32 n;
2521 	__be32 *p;
2522 	int status = 0;
2523 
2524 	READ_BUF(4);
2525 	READ32(n);
2526 	if (n == 0)
2527 		goto root_path;
2528 	dprintk("path ");
2529 	path->ncomponents = 0;
2530 	while (path->ncomponents < n) {
2531 		struct nfs4_string *component = &path->components[path->ncomponents];
2532 		status = decode_opaque_inline(xdr, &component->len, &component->data);
2533 		if (unlikely(status != 0))
2534 			goto out_eio;
2535 		if (path->ncomponents != n)
2536 			dprintk("/");
2537 		dprintk("%s", component->data);
2538 		if (path->ncomponents < NFS4_PATHNAME_MAXCOMPONENTS)
2539 			path->ncomponents++;
2540 		else {
2541 			dprintk("cannot parse %d components in path\n", n);
2542 			goto out_eio;
2543 		}
2544 	}
2545 out:
2546 	dprintk("\n");
2547 	return status;
2548 root_path:
2549 /* a root pathname is sent as a zero component4 */
2550 	path->ncomponents = 1;
2551 	path->components[0].len=0;
2552 	path->components[0].data=NULL;
2553 	dprintk("path /\n");
2554 	goto out;
2555 out_eio:
2556 	dprintk(" status %d", status);
2557 	status = -EIO;
2558 	goto out;
2559 }
2560 
2561 static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs4_fs_locations *res)
2562 {
2563 	int n;
2564 	__be32 *p;
2565 	int status = -EIO;
2566 
2567 	if (unlikely(bitmap[0] & (FATTR4_WORD0_FS_LOCATIONS -1U)))
2568 		goto out;
2569 	status = 0;
2570 	if (unlikely(!(bitmap[0] & FATTR4_WORD0_FS_LOCATIONS)))
2571 		goto out;
2572 	dprintk("%s: fsroot ", __func__);
2573 	status = decode_pathname(xdr, &res->fs_path);
2574 	if (unlikely(status != 0))
2575 		goto out;
2576 	READ_BUF(4);
2577 	READ32(n);
2578 	if (n <= 0)
2579 		goto out_eio;
2580 	res->nlocations = 0;
2581 	while (res->nlocations < n) {
2582 		u32 m;
2583 		struct nfs4_fs_location *loc = &res->locations[res->nlocations];
2584 
2585 		READ_BUF(4);
2586 		READ32(m);
2587 
2588 		loc->nservers = 0;
2589 		dprintk("%s: servers ", __func__);
2590 		while (loc->nservers < m) {
2591 			struct nfs4_string *server = &loc->servers[loc->nservers];
2592 			status = decode_opaque_inline(xdr, &server->len, &server->data);
2593 			if (unlikely(status != 0))
2594 				goto out_eio;
2595 			dprintk("%s ", server->data);
2596 			if (loc->nservers < NFS4_FS_LOCATION_MAXSERVERS)
2597 				loc->nservers++;
2598 			else {
2599 				unsigned int i;
2600 				dprintk("%s: using first %u of %u servers "
2601 					"returned for location %u\n",
2602 						__func__,
2603 						NFS4_FS_LOCATION_MAXSERVERS,
2604 						m, res->nlocations);
2605 				for (i = loc->nservers; i < m; i++) {
2606 					unsigned int len;
2607 					char *data;
2608 					status = decode_opaque_inline(xdr, &len, &data);
2609 					if (unlikely(status != 0))
2610 						goto out_eio;
2611 				}
2612 			}
2613 		}
2614 		status = decode_pathname(xdr, &loc->rootpath);
2615 		if (unlikely(status != 0))
2616 			goto out_eio;
2617 		if (res->nlocations < NFS4_FS_LOCATIONS_MAXENTRIES)
2618 			res->nlocations++;
2619 	}
2620 out:
2621 	dprintk("%s: fs_locations done, error = %d\n", __func__, status);
2622 	return status;
2623 out_eio:
2624 	status = -EIO;
2625 	goto out;
2626 }
2627 
2628 static int decode_attr_maxfilesize(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
2629 {
2630 	__be32 *p;
2631 	int status = 0;
2632 
2633 	*res = 0;
2634 	if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXFILESIZE - 1U)))
2635 		return -EIO;
2636 	if (likely(bitmap[0] & FATTR4_WORD0_MAXFILESIZE)) {
2637 		READ_BUF(8);
2638 		READ64(*res);
2639 		bitmap[0] &= ~FATTR4_WORD0_MAXFILESIZE;
2640 	}
2641 	dprintk("%s: maxfilesize=%Lu\n", __func__, (unsigned long long)*res);
2642 	return status;
2643 }
2644 
2645 static int decode_attr_maxlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *maxlink)
2646 {
2647 	__be32 *p;
2648 	int status = 0;
2649 
2650 	*maxlink = 1;
2651 	if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXLINK - 1U)))
2652 		return -EIO;
2653 	if (likely(bitmap[0] & FATTR4_WORD0_MAXLINK)) {
2654 		READ_BUF(4);
2655 		READ32(*maxlink);
2656 		bitmap[0] &= ~FATTR4_WORD0_MAXLINK;
2657 	}
2658 	dprintk("%s: maxlink=%u\n", __func__, *maxlink);
2659 	return status;
2660 }
2661 
2662 static int decode_attr_maxname(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *maxname)
2663 {
2664 	__be32 *p;
2665 	int status = 0;
2666 
2667 	*maxname = 1024;
2668 	if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXNAME - 1U)))
2669 		return -EIO;
2670 	if (likely(bitmap[0] & FATTR4_WORD0_MAXNAME)) {
2671 		READ_BUF(4);
2672 		READ32(*maxname);
2673 		bitmap[0] &= ~FATTR4_WORD0_MAXNAME;
2674 	}
2675 	dprintk("%s: maxname=%u\n", __func__, *maxname);
2676 	return status;
2677 }
2678 
2679 static int decode_attr_maxread(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res)
2680 {
2681 	__be32 *p;
2682 	int status = 0;
2683 
2684 	*res = 1024;
2685 	if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXREAD - 1U)))
2686 		return -EIO;
2687 	if (likely(bitmap[0] & FATTR4_WORD0_MAXREAD)) {
2688 		uint64_t maxread;
2689 		READ_BUF(8);
2690 		READ64(maxread);
2691 		if (maxread > 0x7FFFFFFF)
2692 			maxread = 0x7FFFFFFF;
2693 		*res = (uint32_t)maxread;
2694 		bitmap[0] &= ~FATTR4_WORD0_MAXREAD;
2695 	}
2696 	dprintk("%s: maxread=%lu\n", __func__, (unsigned long)*res);
2697 	return status;
2698 }
2699 
2700 static int decode_attr_maxwrite(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res)
2701 {
2702 	__be32 *p;
2703 	int status = 0;
2704 
2705 	*res = 1024;
2706 	if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXWRITE - 1U)))
2707 		return -EIO;
2708 	if (likely(bitmap[0] & FATTR4_WORD0_MAXWRITE)) {
2709 		uint64_t maxwrite;
2710 		READ_BUF(8);
2711 		READ64(maxwrite);
2712 		if (maxwrite > 0x7FFFFFFF)
2713 			maxwrite = 0x7FFFFFFF;
2714 		*res = (uint32_t)maxwrite;
2715 		bitmap[0] &= ~FATTR4_WORD0_MAXWRITE;
2716 	}
2717 	dprintk("%s: maxwrite=%lu\n", __func__, (unsigned long)*res);
2718 	return status;
2719 }
2720 
2721 static int decode_attr_mode(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *mode)
2722 {
2723 	__be32 *p;
2724 
2725 	*mode = 0;
2726 	if (unlikely(bitmap[1] & (FATTR4_WORD1_MODE - 1U)))
2727 		return -EIO;
2728 	if (likely(bitmap[1] & FATTR4_WORD1_MODE)) {
2729 		READ_BUF(4);
2730 		READ32(*mode);
2731 		*mode &= ~S_IFMT;
2732 		bitmap[1] &= ~FATTR4_WORD1_MODE;
2733 	}
2734 	dprintk("%s: file mode=0%o\n", __func__, (unsigned int)*mode);
2735 	return 0;
2736 }
2737 
2738 static int decode_attr_nlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *nlink)
2739 {
2740 	__be32 *p;
2741 
2742 	*nlink = 1;
2743 	if (unlikely(bitmap[1] & (FATTR4_WORD1_NUMLINKS - 1U)))
2744 		return -EIO;
2745 	if (likely(bitmap[1] & FATTR4_WORD1_NUMLINKS)) {
2746 		READ_BUF(4);
2747 		READ32(*nlink);
2748 		bitmap[1] &= ~FATTR4_WORD1_NUMLINKS;
2749 	}
2750 	dprintk("%s: nlink=%u\n", __func__, (unsigned int)*nlink);
2751 	return 0;
2752 }
2753 
2754 static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs_client *clp, uint32_t *uid)
2755 {
2756 	uint32_t len;
2757 	__be32 *p;
2758 
2759 	*uid = -2;
2760 	if (unlikely(bitmap[1] & (FATTR4_WORD1_OWNER - 1U)))
2761 		return -EIO;
2762 	if (likely(bitmap[1] & FATTR4_WORD1_OWNER)) {
2763 		READ_BUF(4);
2764 		READ32(len);
2765 		READ_BUF(len);
2766 		if (len < XDR_MAX_NETOBJ) {
2767 			if (nfs_map_name_to_uid(clp, (char *)p, len, uid) != 0)
2768 				dprintk("%s: nfs_map_name_to_uid failed!\n",
2769 						__func__);
2770 		} else
2771 			dprintk("%s: name too long (%u)!\n",
2772 					__func__, len);
2773 		bitmap[1] &= ~FATTR4_WORD1_OWNER;
2774 	}
2775 	dprintk("%s: uid=%d\n", __func__, (int)*uid);
2776 	return 0;
2777 }
2778 
2779 static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs_client *clp, uint32_t *gid)
2780 {
2781 	uint32_t len;
2782 	__be32 *p;
2783 
2784 	*gid = -2;
2785 	if (unlikely(bitmap[1] & (FATTR4_WORD1_OWNER_GROUP - 1U)))
2786 		return -EIO;
2787 	if (likely(bitmap[1] & FATTR4_WORD1_OWNER_GROUP)) {
2788 		READ_BUF(4);
2789 		READ32(len);
2790 		READ_BUF(len);
2791 		if (len < XDR_MAX_NETOBJ) {
2792 			if (nfs_map_group_to_gid(clp, (char *)p, len, gid) != 0)
2793 				dprintk("%s: nfs_map_group_to_gid failed!\n",
2794 						__func__);
2795 		} else
2796 			dprintk("%s: name too long (%u)!\n",
2797 					__func__, len);
2798 		bitmap[1] &= ~FATTR4_WORD1_OWNER_GROUP;
2799 	}
2800 	dprintk("%s: gid=%d\n", __func__, (int)*gid);
2801 	return 0;
2802 }
2803 
2804 static int decode_attr_rdev(struct xdr_stream *xdr, uint32_t *bitmap, dev_t *rdev)
2805 {
2806 	uint32_t major = 0, minor = 0;
2807 	__be32 *p;
2808 
2809 	*rdev = MKDEV(0,0);
2810 	if (unlikely(bitmap[1] & (FATTR4_WORD1_RAWDEV - 1U)))
2811 		return -EIO;
2812 	if (likely(bitmap[1] & FATTR4_WORD1_RAWDEV)) {
2813 		dev_t tmp;
2814 
2815 		READ_BUF(8);
2816 		READ32(major);
2817 		READ32(minor);
2818 		tmp = MKDEV(major, minor);
2819 		if (MAJOR(tmp) == major && MINOR(tmp) == minor)
2820 			*rdev = tmp;
2821 		bitmap[1] &= ~ FATTR4_WORD1_RAWDEV;
2822 	}
2823 	dprintk("%s: rdev=(0x%x:0x%x)\n", __func__, major, minor);
2824 	return 0;
2825 }
2826 
2827 static int decode_attr_space_avail(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
2828 {
2829 	__be32 *p;
2830 	int status = 0;
2831 
2832 	*res = 0;
2833 	if (unlikely(bitmap[1] & (FATTR4_WORD1_SPACE_AVAIL - 1U)))
2834 		return -EIO;
2835 	if (likely(bitmap[1] & FATTR4_WORD1_SPACE_AVAIL)) {
2836 		READ_BUF(8);
2837 		READ64(*res);
2838 		bitmap[1] &= ~FATTR4_WORD1_SPACE_AVAIL;
2839 	}
2840 	dprintk("%s: space avail=%Lu\n", __func__, (unsigned long long)*res);
2841 	return status;
2842 }
2843 
2844 static int decode_attr_space_free(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
2845 {
2846 	__be32 *p;
2847 	int status = 0;
2848 
2849 	*res = 0;
2850 	if (unlikely(bitmap[1] & (FATTR4_WORD1_SPACE_FREE - 1U)))
2851 		return -EIO;
2852 	if (likely(bitmap[1] & FATTR4_WORD1_SPACE_FREE)) {
2853 		READ_BUF(8);
2854 		READ64(*res);
2855 		bitmap[1] &= ~FATTR4_WORD1_SPACE_FREE;
2856 	}
2857 	dprintk("%s: space free=%Lu\n", __func__, (unsigned long long)*res);
2858 	return status;
2859 }
2860 
2861 static int decode_attr_space_total(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
2862 {
2863 	__be32 *p;
2864 	int status = 0;
2865 
2866 	*res = 0;
2867 	if (unlikely(bitmap[1] & (FATTR4_WORD1_SPACE_TOTAL - 1U)))
2868 		return -EIO;
2869 	if (likely(bitmap[1] & FATTR4_WORD1_SPACE_TOTAL)) {
2870 		READ_BUF(8);
2871 		READ64(*res);
2872 		bitmap[1] &= ~FATTR4_WORD1_SPACE_TOTAL;
2873 	}
2874 	dprintk("%s: space total=%Lu\n", __func__, (unsigned long long)*res);
2875 	return status;
2876 }
2877 
2878 static int decode_attr_space_used(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *used)
2879 {
2880 	__be32 *p;
2881 
2882 	*used = 0;
2883 	if (unlikely(bitmap[1] & (FATTR4_WORD1_SPACE_USED - 1U)))
2884 		return -EIO;
2885 	if (likely(bitmap[1] & FATTR4_WORD1_SPACE_USED)) {
2886 		READ_BUF(8);
2887 		READ64(*used);
2888 		bitmap[1] &= ~FATTR4_WORD1_SPACE_USED;
2889 	}
2890 	dprintk("%s: space used=%Lu\n", __func__,
2891 			(unsigned long long)*used);
2892 	return 0;
2893 }
2894 
2895 static int decode_attr_time(struct xdr_stream *xdr, struct timespec *time)
2896 {
2897 	__be32 *p;
2898 	uint64_t sec;
2899 	uint32_t nsec;
2900 
2901 	READ_BUF(12);
2902 	READ64(sec);
2903 	READ32(nsec);
2904 	time->tv_sec = (time_t)sec;
2905 	time->tv_nsec = (long)nsec;
2906 	return 0;
2907 }
2908 
2909 static int decode_attr_time_access(struct xdr_stream *xdr, uint32_t *bitmap, struct timespec *time)
2910 {
2911 	int status = 0;
2912 
2913 	time->tv_sec = 0;
2914 	time->tv_nsec = 0;
2915 	if (unlikely(bitmap[1] & (FATTR4_WORD1_TIME_ACCESS - 1U)))
2916 		return -EIO;
2917 	if (likely(bitmap[1] & FATTR4_WORD1_TIME_ACCESS)) {
2918 		status = decode_attr_time(xdr, time);
2919 		bitmap[1] &= ~FATTR4_WORD1_TIME_ACCESS;
2920 	}
2921 	dprintk("%s: atime=%ld\n", __func__, (long)time->tv_sec);
2922 	return status;
2923 }
2924 
2925 static int decode_attr_time_metadata(struct xdr_stream *xdr, uint32_t *bitmap, struct timespec *time)
2926 {
2927 	int status = 0;
2928 
2929 	time->tv_sec = 0;
2930 	time->tv_nsec = 0;
2931 	if (unlikely(bitmap[1] & (FATTR4_WORD1_TIME_METADATA - 1U)))
2932 		return -EIO;
2933 	if (likely(bitmap[1] & FATTR4_WORD1_TIME_METADATA)) {
2934 		status = decode_attr_time(xdr, time);
2935 		bitmap[1] &= ~FATTR4_WORD1_TIME_METADATA;
2936 	}
2937 	dprintk("%s: ctime=%ld\n", __func__, (long)time->tv_sec);
2938 	return status;
2939 }
2940 
2941 static int decode_attr_time_modify(struct xdr_stream *xdr, uint32_t *bitmap, struct timespec *time)
2942 {
2943 	int status = 0;
2944 
2945 	time->tv_sec = 0;
2946 	time->tv_nsec = 0;
2947 	if (unlikely(bitmap[1] & (FATTR4_WORD1_TIME_MODIFY - 1U)))
2948 		return -EIO;
2949 	if (likely(bitmap[1] & FATTR4_WORD1_TIME_MODIFY)) {
2950 		status = decode_attr_time(xdr, time);
2951 		bitmap[1] &= ~FATTR4_WORD1_TIME_MODIFY;
2952 	}
2953 	dprintk("%s: mtime=%ld\n", __func__, (long)time->tv_sec);
2954 	return status;
2955 }
2956 
2957 static int verify_attr_len(struct xdr_stream *xdr, __be32 *savep, uint32_t attrlen)
2958 {
2959 	unsigned int attrwords = XDR_QUADLEN(attrlen);
2960 	unsigned int nwords = xdr->p - savep;
2961 
2962 	if (unlikely(attrwords != nwords)) {
2963 		dprintk("%s: server returned incorrect attribute length: "
2964 			"%u %c %u\n",
2965 				__func__,
2966 				attrwords << 2,
2967 				(attrwords < nwords) ? '<' : '>',
2968 				nwords << 2);
2969 		return -EIO;
2970 	}
2971 	return 0;
2972 }
2973 
2974 static int decode_change_info(struct xdr_stream *xdr, struct nfs4_change_info *cinfo)
2975 {
2976 	__be32 *p;
2977 
2978 	READ_BUF(20);
2979 	READ32(cinfo->atomic);
2980 	READ64(cinfo->before);
2981 	READ64(cinfo->after);
2982 	return 0;
2983 }
2984 
2985 static int decode_access(struct xdr_stream *xdr, struct nfs4_accessres *access)
2986 {
2987 	__be32 *p;
2988 	uint32_t supp, acc;
2989 	int status;
2990 
2991 	status = decode_op_hdr(xdr, OP_ACCESS);
2992 	if (status)
2993 		return status;
2994 	READ_BUF(8);
2995 	READ32(supp);
2996 	READ32(acc);
2997 	access->supported = supp;
2998 	access->access = acc;
2999 	return 0;
3000 }
3001 
3002 static int decode_close(struct xdr_stream *xdr, struct nfs_closeres *res)
3003 {
3004 	__be32 *p;
3005 	int status;
3006 
3007 	status = decode_op_hdr(xdr, OP_CLOSE);
3008 	if (status != -EIO)
3009 		nfs_increment_open_seqid(status, res->seqid);
3010 	if (status)
3011 		return status;
3012 	READ_BUF(NFS4_STATEID_SIZE);
3013 	COPYMEM(res->stateid.data, NFS4_STATEID_SIZE);
3014 	return 0;
3015 }
3016 
3017 static int decode_commit(struct xdr_stream *xdr, struct nfs_writeres *res)
3018 {
3019 	__be32 *p;
3020 	int status;
3021 
3022 	status = decode_op_hdr(xdr, OP_COMMIT);
3023 	if (status)
3024 		return status;
3025 	READ_BUF(8);
3026 	COPYMEM(res->verf->verifier, 8);
3027 	return 0;
3028 }
3029 
3030 static int decode_create(struct xdr_stream *xdr, struct nfs4_change_info *cinfo)
3031 {
3032 	__be32 *p;
3033 	uint32_t bmlen;
3034 	int status;
3035 
3036 	status = decode_op_hdr(xdr, OP_CREATE);
3037 	if (status)
3038 		return status;
3039 	if ((status = decode_change_info(xdr, cinfo)))
3040 		return status;
3041 	READ_BUF(4);
3042 	READ32(bmlen);
3043 	READ_BUF(bmlen << 2);
3044 	return 0;
3045 }
3046 
3047 static int decode_server_caps(struct xdr_stream *xdr, struct nfs4_server_caps_res *res)
3048 {
3049 	__be32 *savep;
3050 	uint32_t attrlen,
3051 		 bitmap[2] = {0};
3052 	int status;
3053 
3054 	if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0)
3055 		goto xdr_error;
3056 	if ((status = decode_attr_bitmap(xdr, bitmap)) != 0)
3057 		goto xdr_error;
3058 	if ((status = decode_attr_length(xdr, &attrlen, &savep)) != 0)
3059 		goto xdr_error;
3060 	if ((status = decode_attr_supported(xdr, bitmap, res->attr_bitmask)) != 0)
3061 		goto xdr_error;
3062 	if ((status = decode_attr_link_support(xdr, bitmap, &res->has_links)) != 0)
3063 		goto xdr_error;
3064 	if ((status = decode_attr_symlink_support(xdr, bitmap, &res->has_symlinks)) != 0)
3065 		goto xdr_error;
3066 	if ((status = decode_attr_aclsupport(xdr, bitmap, &res->acl_bitmask)) != 0)
3067 		goto xdr_error;
3068 	status = verify_attr_len(xdr, savep, attrlen);
3069 xdr_error:
3070 	dprintk("%s: xdr returned %d!\n", __func__, -status);
3071 	return status;
3072 }
3073 
3074 static int decode_statfs(struct xdr_stream *xdr, struct nfs_fsstat *fsstat)
3075 {
3076 	__be32 *savep;
3077 	uint32_t attrlen,
3078 		 bitmap[2] = {0};
3079 	int status;
3080 
3081 	if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0)
3082 		goto xdr_error;
3083 	if ((status = decode_attr_bitmap(xdr, bitmap)) != 0)
3084 		goto xdr_error;
3085 	if ((status = decode_attr_length(xdr, &attrlen, &savep)) != 0)
3086 		goto xdr_error;
3087 
3088 	if ((status = decode_attr_files_avail(xdr, bitmap, &fsstat->afiles)) != 0)
3089 		goto xdr_error;
3090 	if ((status = decode_attr_files_free(xdr, bitmap, &fsstat->ffiles)) != 0)
3091 		goto xdr_error;
3092 	if ((status = decode_attr_files_total(xdr, bitmap, &fsstat->tfiles)) != 0)
3093 		goto xdr_error;
3094 	if ((status = decode_attr_space_avail(xdr, bitmap, &fsstat->abytes)) != 0)
3095 		goto xdr_error;
3096 	if ((status = decode_attr_space_free(xdr, bitmap, &fsstat->fbytes)) != 0)
3097 		goto xdr_error;
3098 	if ((status = decode_attr_space_total(xdr, bitmap, &fsstat->tbytes)) != 0)
3099 		goto xdr_error;
3100 
3101 	status = verify_attr_len(xdr, savep, attrlen);
3102 xdr_error:
3103 	dprintk("%s: xdr returned %d!\n", __func__, -status);
3104 	return status;
3105 }
3106 
3107 static int decode_pathconf(struct xdr_stream *xdr, struct nfs_pathconf *pathconf)
3108 {
3109 	__be32 *savep;
3110 	uint32_t attrlen,
3111 		 bitmap[2] = {0};
3112 	int status;
3113 
3114 	if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0)
3115 		goto xdr_error;
3116 	if ((status = decode_attr_bitmap(xdr, bitmap)) != 0)
3117 		goto xdr_error;
3118 	if ((status = decode_attr_length(xdr, &attrlen, &savep)) != 0)
3119 		goto xdr_error;
3120 
3121 	if ((status = decode_attr_maxlink(xdr, bitmap, &pathconf->max_link)) != 0)
3122 		goto xdr_error;
3123 	if ((status = decode_attr_maxname(xdr, bitmap, &pathconf->max_namelen)) != 0)
3124 		goto xdr_error;
3125 
3126 	status = verify_attr_len(xdr, savep, attrlen);
3127 xdr_error:
3128 	dprintk("%s: xdr returned %d!\n", __func__, -status);
3129 	return status;
3130 }
3131 
3132 static int decode_getfattr(struct xdr_stream *xdr, struct nfs_fattr *fattr, const struct nfs_server *server)
3133 {
3134 	__be32 *savep;
3135 	uint32_t attrlen,
3136 		 bitmap[2] = {0},
3137 		 type;
3138 	int status, fmode = 0;
3139 	uint64_t fileid;
3140 
3141 	if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0)
3142 		goto xdr_error;
3143 	if ((status = decode_attr_bitmap(xdr, bitmap)) != 0)
3144 		goto xdr_error;
3145 
3146 	fattr->bitmap[0] = bitmap[0];
3147 	fattr->bitmap[1] = bitmap[1];
3148 
3149 	if ((status = decode_attr_length(xdr, &attrlen, &savep)) != 0)
3150 		goto xdr_error;
3151 
3152 
3153 	if ((status = decode_attr_type(xdr, bitmap, &type)) != 0)
3154 		goto xdr_error;
3155 	fattr->type = nfs_type2fmt[type].nfs2type;
3156 	fmode = nfs_type2fmt[type].mode;
3157 
3158 	if ((status = decode_attr_change(xdr, bitmap, &fattr->change_attr)) != 0)
3159 		goto xdr_error;
3160 	if ((status = decode_attr_size(xdr, bitmap, &fattr->size)) != 0)
3161 		goto xdr_error;
3162 	if ((status = decode_attr_fsid(xdr, bitmap, &fattr->fsid)) != 0)
3163 		goto xdr_error;
3164 	if ((status = decode_attr_fileid(xdr, bitmap, &fattr->fileid)) != 0)
3165 		goto xdr_error;
3166 	if ((status = decode_attr_fs_locations(xdr, bitmap, container_of(fattr,
3167 						struct nfs4_fs_locations,
3168 						fattr))) != 0)
3169 		goto xdr_error;
3170 	if ((status = decode_attr_mode(xdr, bitmap, &fattr->mode)) != 0)
3171 		goto xdr_error;
3172 	fattr->mode |= fmode;
3173 	if ((status = decode_attr_nlink(xdr, bitmap, &fattr->nlink)) != 0)
3174 		goto xdr_error;
3175 	if ((status = decode_attr_owner(xdr, bitmap, server->nfs_client, &fattr->uid)) != 0)
3176 		goto xdr_error;
3177 	if ((status = decode_attr_group(xdr, bitmap, server->nfs_client, &fattr->gid)) != 0)
3178 		goto xdr_error;
3179 	if ((status = decode_attr_rdev(xdr, bitmap, &fattr->rdev)) != 0)
3180 		goto xdr_error;
3181 	if ((status = decode_attr_space_used(xdr, bitmap, &fattr->du.nfs3.used)) != 0)
3182 		goto xdr_error;
3183 	if ((status = decode_attr_time_access(xdr, bitmap, &fattr->atime)) != 0)
3184 		goto xdr_error;
3185 	if ((status = decode_attr_time_metadata(xdr, bitmap, &fattr->ctime)) != 0)
3186 		goto xdr_error;
3187 	if ((status = decode_attr_time_modify(xdr, bitmap, &fattr->mtime)) != 0)
3188 		goto xdr_error;
3189 	if ((status = decode_attr_mounted_on_fileid(xdr, bitmap, &fileid)) != 0)
3190 		goto xdr_error;
3191 	if (fattr->fileid == 0 && fileid != 0)
3192 		fattr->fileid = fileid;
3193 	if ((status = verify_attr_len(xdr, savep, attrlen)) == 0)
3194 		fattr->valid = NFS_ATTR_FATTR | NFS_ATTR_FATTR_V3 | NFS_ATTR_FATTR_V4;
3195 xdr_error:
3196 	dprintk("%s: xdr returned %d\n", __func__, -status);
3197 	return status;
3198 }
3199 
3200 
3201 static int decode_fsinfo(struct xdr_stream *xdr, struct nfs_fsinfo *fsinfo)
3202 {
3203 	__be32 *savep;
3204 	uint32_t attrlen, bitmap[2];
3205 	int status;
3206 
3207 	if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0)
3208 		goto xdr_error;
3209 	if ((status = decode_attr_bitmap(xdr, bitmap)) != 0)
3210 		goto xdr_error;
3211 	if ((status = decode_attr_length(xdr, &attrlen, &savep)) != 0)
3212 		goto xdr_error;
3213 
3214 	fsinfo->rtmult = fsinfo->wtmult = 512;	/* ??? */
3215 
3216 	if ((status = decode_attr_lease_time(xdr, bitmap, &fsinfo->lease_time)) != 0)
3217 		goto xdr_error;
3218 	if ((status = decode_attr_maxfilesize(xdr, bitmap, &fsinfo->maxfilesize)) != 0)
3219 		goto xdr_error;
3220 	if ((status = decode_attr_maxread(xdr, bitmap, &fsinfo->rtmax)) != 0)
3221 		goto xdr_error;
3222 	fsinfo->rtpref = fsinfo->dtpref = fsinfo->rtmax;
3223 	if ((status = decode_attr_maxwrite(xdr, bitmap, &fsinfo->wtmax)) != 0)
3224 		goto xdr_error;
3225 	fsinfo->wtpref = fsinfo->wtmax;
3226 
3227 	status = verify_attr_len(xdr, savep, attrlen);
3228 xdr_error:
3229 	dprintk("%s: xdr returned %d!\n", __func__, -status);
3230 	return status;
3231 }
3232 
3233 static int decode_getfh(struct xdr_stream *xdr, struct nfs_fh *fh)
3234 {
3235 	__be32 *p;
3236 	uint32_t len;
3237 	int status;
3238 
3239 	/* Zero handle first to allow comparisons */
3240 	memset(fh, 0, sizeof(*fh));
3241 
3242 	status = decode_op_hdr(xdr, OP_GETFH);
3243 	if (status)
3244 		return status;
3245 
3246 	READ_BUF(4);
3247 	READ32(len);
3248 	if (len > NFS4_FHSIZE)
3249 		return -EIO;
3250 	fh->size = len;
3251 	READ_BUF(len);
3252 	COPYMEM(fh->data, len);
3253 	return 0;
3254 }
3255 
3256 static int decode_link(struct xdr_stream *xdr, struct nfs4_change_info *cinfo)
3257 {
3258 	int status;
3259 
3260 	status = decode_op_hdr(xdr, OP_LINK);
3261 	if (status)
3262 		return status;
3263 	return decode_change_info(xdr, cinfo);
3264 }
3265 
3266 /*
3267  * We create the owner, so we know a proper owner.id length is 4.
3268  */
3269 static int decode_lock_denied (struct xdr_stream *xdr, struct file_lock *fl)
3270 {
3271 	uint64_t offset, length, clientid;
3272 	__be32 *p;
3273 	uint32_t namelen, type;
3274 
3275 	READ_BUF(32);
3276 	READ64(offset);
3277 	READ64(length);
3278 	READ32(type);
3279 	if (fl != NULL) {
3280 		fl->fl_start = (loff_t)offset;
3281 		fl->fl_end = fl->fl_start + (loff_t)length - 1;
3282 		if (length == ~(uint64_t)0)
3283 			fl->fl_end = OFFSET_MAX;
3284 		fl->fl_type = F_WRLCK;
3285 		if (type & 1)
3286 			fl->fl_type = F_RDLCK;
3287 		fl->fl_pid = 0;
3288 	}
3289 	READ64(clientid);
3290 	READ32(namelen);
3291 	READ_BUF(namelen);
3292 	return -NFS4ERR_DENIED;
3293 }
3294 
3295 static int decode_lock(struct xdr_stream *xdr, struct nfs_lock_res *res)
3296 {
3297 	__be32 *p;
3298 	int status;
3299 
3300 	status = decode_op_hdr(xdr, OP_LOCK);
3301 	if (status == -EIO)
3302 		goto out;
3303 	if (status == 0) {
3304 		READ_BUF(NFS4_STATEID_SIZE);
3305 		COPYMEM(res->stateid.data, NFS4_STATEID_SIZE);
3306 	} else if (status == -NFS4ERR_DENIED)
3307 		status = decode_lock_denied(xdr, NULL);
3308 	if (res->open_seqid != NULL)
3309 		nfs_increment_open_seqid(status, res->open_seqid);
3310 	nfs_increment_lock_seqid(status, res->lock_seqid);
3311 out:
3312 	return status;
3313 }
3314 
3315 static int decode_lockt(struct xdr_stream *xdr, struct nfs_lockt_res *res)
3316 {
3317 	int status;
3318 	status = decode_op_hdr(xdr, OP_LOCKT);
3319 	if (status == -NFS4ERR_DENIED)
3320 		return decode_lock_denied(xdr, res->denied);
3321 	return status;
3322 }
3323 
3324 static int decode_locku(struct xdr_stream *xdr, struct nfs_locku_res *res)
3325 {
3326 	__be32 *p;
3327 	int status;
3328 
3329 	status = decode_op_hdr(xdr, OP_LOCKU);
3330 	if (status != -EIO)
3331 		nfs_increment_lock_seqid(status, res->seqid);
3332 	if (status == 0) {
3333 		READ_BUF(NFS4_STATEID_SIZE);
3334 		COPYMEM(res->stateid.data, NFS4_STATEID_SIZE);
3335 	}
3336 	return status;
3337 }
3338 
3339 static int decode_lookup(struct xdr_stream *xdr)
3340 {
3341 	return decode_op_hdr(xdr, OP_LOOKUP);
3342 }
3343 
3344 /* This is too sick! */
3345 static int decode_space_limit(struct xdr_stream *xdr, u64 *maxsize)
3346 {
3347         __be32 *p;
3348 	uint32_t limit_type, nblocks, blocksize;
3349 
3350 	READ_BUF(12);
3351 	READ32(limit_type);
3352 	switch (limit_type) {
3353 		case 1:
3354 			READ64(*maxsize);
3355 			break;
3356 		case 2:
3357 			READ32(nblocks);
3358 			READ32(blocksize);
3359 			*maxsize = (uint64_t)nblocks * (uint64_t)blocksize;
3360 	}
3361 	return 0;
3362 }
3363 
3364 static int decode_delegation(struct xdr_stream *xdr, struct nfs_openres *res)
3365 {
3366         __be32 *p;
3367         uint32_t delegation_type;
3368 
3369 	READ_BUF(4);
3370 	READ32(delegation_type);
3371 	if (delegation_type == NFS4_OPEN_DELEGATE_NONE) {
3372 		res->delegation_type = 0;
3373 		return 0;
3374 	}
3375 	READ_BUF(NFS4_STATEID_SIZE+4);
3376 	COPYMEM(res->delegation.data, NFS4_STATEID_SIZE);
3377 	READ32(res->do_recall);
3378 	switch (delegation_type) {
3379 		case NFS4_OPEN_DELEGATE_READ:
3380 			res->delegation_type = FMODE_READ;
3381 			break;
3382 		case NFS4_OPEN_DELEGATE_WRITE:
3383 			res->delegation_type = FMODE_WRITE|FMODE_READ;
3384 			if (decode_space_limit(xdr, &res->maxsize) < 0)
3385 				return -EIO;
3386 	}
3387 	return decode_ace(xdr, NULL, res->server->nfs_client);
3388 }
3389 
3390 static int decode_open(struct xdr_stream *xdr, struct nfs_openres *res)
3391 {
3392         __be32 *p;
3393 	uint32_t savewords, bmlen, i;
3394         int status;
3395 
3396         status = decode_op_hdr(xdr, OP_OPEN);
3397 	if (status != -EIO)
3398 		nfs_increment_open_seqid(status, res->seqid);
3399         if (status)
3400                 return status;
3401         READ_BUF(NFS4_STATEID_SIZE);
3402         COPYMEM(res->stateid.data, NFS4_STATEID_SIZE);
3403 
3404         decode_change_info(xdr, &res->cinfo);
3405 
3406         READ_BUF(8);
3407         READ32(res->rflags);
3408         READ32(bmlen);
3409         if (bmlen > 10)
3410                 goto xdr_error;
3411 
3412         READ_BUF(bmlen << 2);
3413 	savewords = min_t(uint32_t, bmlen, NFS4_BITMAP_SIZE);
3414 	for (i = 0; i < savewords; ++i)
3415 		READ32(res->attrset[i]);
3416 	for (; i < NFS4_BITMAP_SIZE; i++)
3417 		res->attrset[i] = 0;
3418 
3419 	return decode_delegation(xdr, res);
3420 xdr_error:
3421 	dprintk("%s: Bitmap too large! Length = %u\n", __func__, bmlen);
3422 	return -EIO;
3423 }
3424 
3425 static int decode_open_confirm(struct xdr_stream *xdr, struct nfs_open_confirmres *res)
3426 {
3427         __be32 *p;
3428 	int status;
3429 
3430         status = decode_op_hdr(xdr, OP_OPEN_CONFIRM);
3431 	if (status != -EIO)
3432 		nfs_increment_open_seqid(status, res->seqid);
3433         if (status)
3434                 return status;
3435         READ_BUF(NFS4_STATEID_SIZE);
3436         COPYMEM(res->stateid.data, NFS4_STATEID_SIZE);
3437         return 0;
3438 }
3439 
3440 static int decode_open_downgrade(struct xdr_stream *xdr, struct nfs_closeres *res)
3441 {
3442 	__be32 *p;
3443 	int status;
3444 
3445 	status = decode_op_hdr(xdr, OP_OPEN_DOWNGRADE);
3446 	if (status != -EIO)
3447 		nfs_increment_open_seqid(status, res->seqid);
3448 	if (status)
3449 		return status;
3450 	READ_BUF(NFS4_STATEID_SIZE);
3451 	COPYMEM(res->stateid.data, NFS4_STATEID_SIZE);
3452 	return 0;
3453 }
3454 
3455 static int decode_putfh(struct xdr_stream *xdr)
3456 {
3457 	return decode_op_hdr(xdr, OP_PUTFH);
3458 }
3459 
3460 static int decode_putrootfh(struct xdr_stream *xdr)
3461 {
3462 	return decode_op_hdr(xdr, OP_PUTROOTFH);
3463 }
3464 
3465 static int decode_read(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs_readres *res)
3466 {
3467 	struct kvec *iov = req->rq_rcv_buf.head;
3468 	__be32 *p;
3469 	uint32_t count, eof, recvd, hdrlen;
3470 	int status;
3471 
3472 	status = decode_op_hdr(xdr, OP_READ);
3473 	if (status)
3474 		return status;
3475 	READ_BUF(8);
3476 	READ32(eof);
3477 	READ32(count);
3478 	hdrlen = (u8 *) p - (u8 *) iov->iov_base;
3479 	recvd = req->rq_rcv_buf.len - hdrlen;
3480 	if (count > recvd) {
3481 		dprintk("NFS: server cheating in read reply: "
3482 				"count %u > recvd %u\n", count, recvd);
3483 		count = recvd;
3484 		eof = 0;
3485 	}
3486 	xdr_read_pages(xdr, count);
3487 	res->eof = eof;
3488 	res->count = count;
3489 	return 0;
3490 }
3491 
3492 static int decode_readdir(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs4_readdir_res *readdir)
3493 {
3494 	struct xdr_buf	*rcvbuf = &req->rq_rcv_buf;
3495 	struct page	*page = *rcvbuf->pages;
3496 	struct kvec	*iov = rcvbuf->head;
3497 	size_t		hdrlen;
3498 	u32		recvd, pglen = rcvbuf->page_len;
3499 	__be32		*end, *entry, *p, *kaddr;
3500 	unsigned int	nr = 0;
3501 	int		status;
3502 
3503 	status = decode_op_hdr(xdr, OP_READDIR);
3504 	if (status)
3505 		return status;
3506 	READ_BUF(8);
3507 	COPYMEM(readdir->verifier.data, 8);
3508 	dprintk("%s: verifier = %08x:%08x\n",
3509 			__func__,
3510 			((u32 *)readdir->verifier.data)[0],
3511 			((u32 *)readdir->verifier.data)[1]);
3512 
3513 
3514 	hdrlen = (char *) p - (char *) iov->iov_base;
3515 	recvd = rcvbuf->len - hdrlen;
3516 	if (pglen > recvd)
3517 		pglen = recvd;
3518 	xdr_read_pages(xdr, pglen);
3519 
3520 	BUG_ON(pglen + readdir->pgbase > PAGE_CACHE_SIZE);
3521 	kaddr = p = kmap_atomic(page, KM_USER0);
3522 	end = p + ((pglen + readdir->pgbase) >> 2);
3523 	entry = p;
3524 
3525 	/* Make sure the packet actually has a value_follows and EOF entry */
3526 	if ((entry + 1) > end)
3527 		goto short_pkt;
3528 
3529 	for (; *p++; nr++) {
3530 		u32 len, attrlen, xlen;
3531 		if (end - p < 3)
3532 			goto short_pkt;
3533 		dprintk("cookie = %Lu, ", *((unsigned long long *)p));
3534 		p += 2;			/* cookie */
3535 		len = ntohl(*p++);	/* filename length */
3536 		if (len > NFS4_MAXNAMLEN) {
3537 			dprintk("NFS: giant filename in readdir (len 0x%x)\n",
3538 					len);
3539 			goto err_unmap;
3540 		}
3541 		xlen = XDR_QUADLEN(len);
3542 		if (end - p < xlen + 1)
3543 			goto short_pkt;
3544 		dprintk("filename = %*s\n", len, (char *)p);
3545 		p += xlen;
3546 		len = ntohl(*p++);	/* bitmap length */
3547 		if (end - p < len + 1)
3548 			goto short_pkt;
3549 		p += len;
3550 		attrlen = XDR_QUADLEN(ntohl(*p++));
3551 		if (end - p < attrlen + 2)
3552 			goto short_pkt;
3553 		p += attrlen;		/* attributes */
3554 		entry = p;
3555 	}
3556 	/*
3557 	 * Apparently some server sends responses that are a valid size, but
3558 	 * contain no entries, and have value_follows==0 and EOF==0. For
3559 	 * those, just set the EOF marker.
3560 	 */
3561 	if (!nr && entry[1] == 0) {
3562 		dprintk("NFS: readdir reply truncated!\n");
3563 		entry[1] = 1;
3564 	}
3565 out:
3566 	kunmap_atomic(kaddr, KM_USER0);
3567 	return 0;
3568 short_pkt:
3569 	/*
3570 	 * When we get a short packet there are 2 possibilities. We can
3571 	 * return an error, or fix up the response to look like a valid
3572 	 * response and return what we have so far. If there are no
3573 	 * entries and the packet was short, then return -EIO. If there
3574 	 * are valid entries in the response, return them and pretend that
3575 	 * the call was successful, but incomplete. The caller can retry the
3576 	 * readdir starting at the last cookie.
3577 	 */
3578 	dprintk("%s: short packet at entry %d\n", __func__, nr);
3579 	entry[0] = entry[1] = 0;
3580 	if (nr)
3581 		goto out;
3582 err_unmap:
3583 	kunmap_atomic(kaddr, KM_USER0);
3584 	return -errno_NFSERR_IO;
3585 }
3586 
3587 static int decode_readlink(struct xdr_stream *xdr, struct rpc_rqst *req)
3588 {
3589 	struct xdr_buf *rcvbuf = &req->rq_rcv_buf;
3590 	struct kvec *iov = rcvbuf->head;
3591 	size_t hdrlen;
3592 	u32 len, recvd;
3593 	__be32 *p;
3594 	char *kaddr;
3595 	int status;
3596 
3597 	status = decode_op_hdr(xdr, OP_READLINK);
3598 	if (status)
3599 		return status;
3600 
3601 	/* Convert length of symlink */
3602 	READ_BUF(4);
3603 	READ32(len);
3604 	if (len >= rcvbuf->page_len || len <= 0) {
3605 		dprintk("nfs: server returned giant symlink!\n");
3606 		return -ENAMETOOLONG;
3607 	}
3608 	hdrlen = (char *) xdr->p - (char *) iov->iov_base;
3609 	recvd = req->rq_rcv_buf.len - hdrlen;
3610 	if (recvd < len) {
3611 		dprintk("NFS: server cheating in readlink reply: "
3612 				"count %u > recvd %u\n", len, recvd);
3613 		return -EIO;
3614 	}
3615 	xdr_read_pages(xdr, len);
3616 	/*
3617 	 * The XDR encode routine has set things up so that
3618 	 * the link text will be copied directly into the
3619 	 * buffer.  We just have to do overflow-checking,
3620 	 * and and null-terminate the text (the VFS expects
3621 	 * null-termination).
3622 	 */
3623 	kaddr = (char *)kmap_atomic(rcvbuf->pages[0], KM_USER0);
3624 	kaddr[len+rcvbuf->page_base] = '\0';
3625 	kunmap_atomic(kaddr, KM_USER0);
3626 	return 0;
3627 }
3628 
3629 static int decode_remove(struct xdr_stream *xdr, struct nfs4_change_info *cinfo)
3630 {
3631 	int status;
3632 
3633 	status = decode_op_hdr(xdr, OP_REMOVE);
3634 	if (status)
3635 		goto out;
3636 	status = decode_change_info(xdr, cinfo);
3637 out:
3638 	return status;
3639 }
3640 
3641 static int decode_rename(struct xdr_stream *xdr, struct nfs4_change_info *old_cinfo,
3642 	      struct nfs4_change_info *new_cinfo)
3643 {
3644 	int status;
3645 
3646 	status = decode_op_hdr(xdr, OP_RENAME);
3647 	if (status)
3648 		goto out;
3649 	if ((status = decode_change_info(xdr, old_cinfo)))
3650 		goto out;
3651 	status = decode_change_info(xdr, new_cinfo);
3652 out:
3653 	return status;
3654 }
3655 
3656 static int decode_renew(struct xdr_stream *xdr)
3657 {
3658 	return decode_op_hdr(xdr, OP_RENEW);
3659 }
3660 
3661 static int
3662 decode_restorefh(struct xdr_stream *xdr)
3663 {
3664 	return decode_op_hdr(xdr, OP_RESTOREFH);
3665 }
3666 
3667 static int decode_getacl(struct xdr_stream *xdr, struct rpc_rqst *req,
3668 		size_t *acl_len)
3669 {
3670 	__be32 *savep;
3671 	uint32_t attrlen,
3672 		 bitmap[2] = {0};
3673 	struct kvec *iov = req->rq_rcv_buf.head;
3674 	int status;
3675 
3676 	*acl_len = 0;
3677 	if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0)
3678 		goto out;
3679 	if ((status = decode_attr_bitmap(xdr, bitmap)) != 0)
3680 		goto out;
3681 	if ((status = decode_attr_length(xdr, &attrlen, &savep)) != 0)
3682 		goto out;
3683 
3684 	if (unlikely(bitmap[0] & (FATTR4_WORD0_ACL - 1U)))
3685 		return -EIO;
3686 	if (likely(bitmap[0] & FATTR4_WORD0_ACL)) {
3687 		size_t hdrlen;
3688 		u32 recvd;
3689 
3690 		/* We ignore &savep and don't do consistency checks on
3691 		 * the attr length.  Let userspace figure it out.... */
3692 		hdrlen = (u8 *)xdr->p - (u8 *)iov->iov_base;
3693 		recvd = req->rq_rcv_buf.len - hdrlen;
3694 		if (attrlen > recvd) {
3695 			dprintk("NFS: server cheating in getattr"
3696 					" acl reply: attrlen %u > recvd %u\n",
3697 					attrlen, recvd);
3698 			return -EINVAL;
3699 		}
3700 		xdr_read_pages(xdr, attrlen);
3701 		*acl_len = attrlen;
3702 	} else
3703 		status = -EOPNOTSUPP;
3704 
3705 out:
3706 	return status;
3707 }
3708 
3709 static int
3710 decode_savefh(struct xdr_stream *xdr)
3711 {
3712 	return decode_op_hdr(xdr, OP_SAVEFH);
3713 }
3714 
3715 static int decode_setattr(struct xdr_stream *xdr, struct nfs_setattrres *res)
3716 {
3717 	__be32 *p;
3718 	uint32_t bmlen;
3719 	int status;
3720 
3721 
3722 	status = decode_op_hdr(xdr, OP_SETATTR);
3723 	if (status)
3724 		return status;
3725 	READ_BUF(4);
3726 	READ32(bmlen);
3727 	READ_BUF(bmlen << 2);
3728 	return 0;
3729 }
3730 
3731 static int decode_setclientid(struct xdr_stream *xdr, struct nfs_client *clp)
3732 {
3733 	__be32 *p;
3734 	uint32_t opnum;
3735 	int32_t nfserr;
3736 
3737 	READ_BUF(8);
3738 	READ32(opnum);
3739 	if (opnum != OP_SETCLIENTID) {
3740 		dprintk("nfs: decode_setclientid: Server returned operation"
3741 			       	" %d\n", opnum);
3742 		return -EIO;
3743 	}
3744 	READ32(nfserr);
3745 	if (nfserr == NFS_OK) {
3746 		READ_BUF(8 + NFS4_VERIFIER_SIZE);
3747 		READ64(clp->cl_clientid);
3748 		COPYMEM(clp->cl_confirm.data, NFS4_VERIFIER_SIZE);
3749 	} else if (nfserr == NFSERR_CLID_INUSE) {
3750 		uint32_t len;
3751 
3752 		/* skip netid string */
3753 		READ_BUF(4);
3754 		READ32(len);
3755 		READ_BUF(len);
3756 
3757 		/* skip uaddr string */
3758 		READ_BUF(4);
3759 		READ32(len);
3760 		READ_BUF(len);
3761 		return -NFSERR_CLID_INUSE;
3762 	} else
3763 		return nfs4_stat_to_errno(nfserr);
3764 
3765 	return 0;
3766 }
3767 
3768 static int decode_setclientid_confirm(struct xdr_stream *xdr)
3769 {
3770 	return decode_op_hdr(xdr, OP_SETCLIENTID_CONFIRM);
3771 }
3772 
3773 static int decode_write(struct xdr_stream *xdr, struct nfs_writeres *res)
3774 {
3775 	__be32 *p;
3776 	int status;
3777 
3778 	status = decode_op_hdr(xdr, OP_WRITE);
3779 	if (status)
3780 		return status;
3781 
3782 	READ_BUF(16);
3783 	READ32(res->count);
3784 	READ32(res->verf->committed);
3785 	COPYMEM(res->verf->verifier, 8);
3786 	return 0;
3787 }
3788 
3789 static int decode_delegreturn(struct xdr_stream *xdr)
3790 {
3791 	return decode_op_hdr(xdr, OP_DELEGRETURN);
3792 }
3793 
3794 /*
3795  * Decode OPEN_DOWNGRADE response
3796  */
3797 static int nfs4_xdr_dec_open_downgrade(struct rpc_rqst *rqstp, __be32 *p, struct nfs_closeres *res)
3798 {
3799         struct xdr_stream xdr;
3800         struct compound_hdr hdr;
3801         int status;
3802 
3803         xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
3804         status = decode_compound_hdr(&xdr, &hdr);
3805         if (status)
3806                 goto out;
3807         status = decode_putfh(&xdr);
3808         if (status)
3809                 goto out;
3810         status = decode_open_downgrade(&xdr, res);
3811 	if (status != 0)
3812 		goto out;
3813 	decode_getfattr(&xdr, res->fattr, res->server);
3814 out:
3815         return status;
3816 }
3817 
3818 /*
3819  * END OF "GENERIC" DECODE ROUTINES.
3820  */
3821 
3822 /*
3823  * Decode ACCESS response
3824  */
3825 static int nfs4_xdr_dec_access(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_accessres *res)
3826 {
3827 	struct xdr_stream xdr;
3828 	struct compound_hdr hdr;
3829 	int status;
3830 
3831 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
3832 	if ((status = decode_compound_hdr(&xdr, &hdr)) != 0)
3833 		goto out;
3834 	status = decode_putfh(&xdr);
3835 	if (status != 0)
3836 		goto out;
3837 	status = decode_access(&xdr, res);
3838 	if (status != 0)
3839 		goto out;
3840 	decode_getfattr(&xdr, res->fattr, res->server);
3841 out:
3842 	return status;
3843 }
3844 
3845 /*
3846  * Decode LOOKUP response
3847  */
3848 static int nfs4_xdr_dec_lookup(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_lookup_res *res)
3849 {
3850 	struct xdr_stream xdr;
3851 	struct compound_hdr hdr;
3852 	int status;
3853 
3854 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
3855 	if ((status = decode_compound_hdr(&xdr, &hdr)) != 0)
3856 		goto out;
3857 	if ((status = decode_putfh(&xdr)) != 0)
3858 		goto out;
3859 	if ((status = decode_lookup(&xdr)) != 0)
3860 		goto out;
3861 	if ((status = decode_getfh(&xdr, res->fh)) != 0)
3862 		goto out;
3863 	status = decode_getfattr(&xdr, res->fattr, res->server);
3864 out:
3865 	return status;
3866 }
3867 
3868 /*
3869  * Decode LOOKUP_ROOT response
3870  */
3871 static int nfs4_xdr_dec_lookup_root(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_lookup_res *res)
3872 {
3873 	struct xdr_stream xdr;
3874 	struct compound_hdr hdr;
3875 	int status;
3876 
3877 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
3878 	if ((status = decode_compound_hdr(&xdr, &hdr)) != 0)
3879 		goto out;
3880 	if ((status = decode_putrootfh(&xdr)) != 0)
3881 		goto out;
3882 	if ((status = decode_getfh(&xdr, res->fh)) == 0)
3883 		status = decode_getfattr(&xdr, res->fattr, res->server);
3884 out:
3885 	return status;
3886 }
3887 
3888 /*
3889  * Decode REMOVE response
3890  */
3891 static int nfs4_xdr_dec_remove(struct rpc_rqst *rqstp, __be32 *p, struct nfs_removeres *res)
3892 {
3893 	struct xdr_stream xdr;
3894 	struct compound_hdr hdr;
3895 	int status;
3896 
3897 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
3898 	if ((status = decode_compound_hdr(&xdr, &hdr)) != 0)
3899 		goto out;
3900 	if ((status = decode_putfh(&xdr)) != 0)
3901 		goto out;
3902 	if ((status = decode_remove(&xdr, &res->cinfo)) != 0)
3903 		goto out;
3904 	decode_getfattr(&xdr, &res->dir_attr, res->server);
3905 out:
3906 	return status;
3907 }
3908 
3909 /*
3910  * Decode RENAME response
3911  */
3912 static int nfs4_xdr_dec_rename(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_rename_res *res)
3913 {
3914 	struct xdr_stream xdr;
3915 	struct compound_hdr hdr;
3916 	int status;
3917 
3918 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
3919 	if ((status = decode_compound_hdr(&xdr, &hdr)) != 0)
3920 		goto out;
3921 	if ((status = decode_putfh(&xdr)) != 0)
3922 		goto out;
3923 	if ((status = decode_savefh(&xdr)) != 0)
3924 		goto out;
3925 	if ((status = decode_putfh(&xdr)) != 0)
3926 		goto out;
3927 	if ((status = decode_rename(&xdr, &res->old_cinfo, &res->new_cinfo)) != 0)
3928 		goto out;
3929 	/* Current FH is target directory */
3930 	if (decode_getfattr(&xdr, res->new_fattr, res->server) != 0)
3931 		goto out;
3932 	if ((status = decode_restorefh(&xdr)) != 0)
3933 		goto out;
3934 	decode_getfattr(&xdr, res->old_fattr, res->server);
3935 out:
3936 	return status;
3937 }
3938 
3939 /*
3940  * Decode LINK response
3941  */
3942 static int nfs4_xdr_dec_link(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_link_res *res)
3943 {
3944 	struct xdr_stream xdr;
3945 	struct compound_hdr hdr;
3946 	int status;
3947 
3948 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
3949 	if ((status = decode_compound_hdr(&xdr, &hdr)) != 0)
3950 		goto out;
3951 	if ((status = decode_putfh(&xdr)) != 0)
3952 		goto out;
3953 	if ((status = decode_savefh(&xdr)) != 0)
3954 		goto out;
3955 	if ((status = decode_putfh(&xdr)) != 0)
3956 		goto out;
3957 	if ((status = decode_link(&xdr, &res->cinfo)) != 0)
3958 		goto out;
3959 	/*
3960 	 * Note order: OP_LINK leaves the directory as the current
3961 	 *             filehandle.
3962 	 */
3963 	if (decode_getfattr(&xdr, res->dir_attr, res->server) != 0)
3964 		goto out;
3965 	if ((status = decode_restorefh(&xdr)) != 0)
3966 		goto out;
3967 	decode_getfattr(&xdr, res->fattr, res->server);
3968 out:
3969 	return status;
3970 }
3971 
3972 /*
3973  * Decode CREATE response
3974  */
3975 static int nfs4_xdr_dec_create(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_create_res *res)
3976 {
3977 	struct xdr_stream xdr;
3978 	struct compound_hdr hdr;
3979 	int status;
3980 
3981 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
3982 	if ((status = decode_compound_hdr(&xdr, &hdr)) != 0)
3983 		goto out;
3984 	if ((status = decode_putfh(&xdr)) != 0)
3985 		goto out;
3986 	if ((status = decode_savefh(&xdr)) != 0)
3987 		goto out;
3988 	if ((status = decode_create(&xdr,&res->dir_cinfo)) != 0)
3989 		goto out;
3990 	if ((status = decode_getfh(&xdr, res->fh)) != 0)
3991 		goto out;
3992 	if (decode_getfattr(&xdr, res->fattr, res->server) != 0)
3993 		goto out;
3994 	if ((status = decode_restorefh(&xdr)) != 0)
3995 		goto out;
3996 	decode_getfattr(&xdr, res->dir_fattr, res->server);
3997 out:
3998 	return status;
3999 }
4000 
4001 /*
4002  * Decode SYMLINK response
4003  */
4004 static int nfs4_xdr_dec_symlink(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_create_res *res)
4005 {
4006 	return nfs4_xdr_dec_create(rqstp, p, res);
4007 }
4008 
4009 /*
4010  * Decode GETATTR response
4011  */
4012 static int nfs4_xdr_dec_getattr(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_getattr_res *res)
4013 {
4014 	struct xdr_stream xdr;
4015 	struct compound_hdr hdr;
4016 	int status;
4017 
4018 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
4019 	status = decode_compound_hdr(&xdr, &hdr);
4020 	if (status)
4021 		goto out;
4022 	status = decode_putfh(&xdr);
4023 	if (status)
4024 		goto out;
4025 	status = decode_getfattr(&xdr, res->fattr, res->server);
4026 out:
4027 	return status;
4028 
4029 }
4030 
4031 /*
4032  * Encode an SETACL request
4033  */
4034 static int
4035 nfs4_xdr_enc_setacl(struct rpc_rqst *req, __be32 *p, struct nfs_setaclargs *args)
4036 {
4037         struct xdr_stream xdr;
4038         struct compound_hdr hdr = {
4039                 .nops   = 2,
4040         };
4041         int status;
4042 
4043         xdr_init_encode(&xdr, &req->rq_snd_buf, p);
4044         encode_compound_hdr(&xdr, &hdr);
4045         status = encode_putfh(&xdr, args->fh);
4046         if (status)
4047                 goto out;
4048         status = encode_setacl(&xdr, args);
4049 out:
4050         return status;
4051 }
4052 /*
4053  * Decode SETACL response
4054  */
4055 static int
4056 nfs4_xdr_dec_setacl(struct rpc_rqst *rqstp, __be32 *p, void *res)
4057 {
4058 	struct xdr_stream xdr;
4059 	struct compound_hdr hdr;
4060 	int status;
4061 
4062 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
4063 	status = decode_compound_hdr(&xdr, &hdr);
4064 	if (status)
4065 		goto out;
4066 	status = decode_putfh(&xdr);
4067 	if (status)
4068 		goto out;
4069 	status = decode_setattr(&xdr, res);
4070 out:
4071 	return status;
4072 }
4073 
4074 /*
4075  * Decode GETACL response
4076  */
4077 static int
4078 nfs4_xdr_dec_getacl(struct rpc_rqst *rqstp, __be32 *p, size_t *acl_len)
4079 {
4080 	struct xdr_stream xdr;
4081 	struct compound_hdr hdr;
4082 	int status;
4083 
4084 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
4085 	status = decode_compound_hdr(&xdr, &hdr);
4086 	if (status)
4087 		goto out;
4088 	status = decode_putfh(&xdr);
4089 	if (status)
4090 		goto out;
4091 	status = decode_getacl(&xdr, rqstp, acl_len);
4092 
4093 out:
4094 	return status;
4095 }
4096 
4097 /*
4098  * Decode CLOSE response
4099  */
4100 static int nfs4_xdr_dec_close(struct rpc_rqst *rqstp, __be32 *p, struct nfs_closeres *res)
4101 {
4102         struct xdr_stream xdr;
4103         struct compound_hdr hdr;
4104         int status;
4105 
4106         xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
4107         status = decode_compound_hdr(&xdr, &hdr);
4108         if (status)
4109                 goto out;
4110         status = decode_putfh(&xdr);
4111         if (status)
4112                 goto out;
4113         status = decode_close(&xdr, res);
4114 	if (status != 0)
4115 		goto out;
4116 	/*
4117 	 * Note: Server may do delete on close for this file
4118 	 * 	in which case the getattr call will fail with
4119 	 * 	an ESTALE error. Shouldn't be a problem,
4120 	 * 	though, since fattr->valid will remain unset.
4121 	 */
4122 	decode_getfattr(&xdr, res->fattr, res->server);
4123 out:
4124         return status;
4125 }
4126 
4127 /*
4128  * Decode OPEN response
4129  */
4130 static int nfs4_xdr_dec_open(struct rpc_rqst *rqstp, __be32 *p, struct nfs_openres *res)
4131 {
4132         struct xdr_stream xdr;
4133         struct compound_hdr hdr;
4134         int status;
4135 
4136         xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
4137         status = decode_compound_hdr(&xdr, &hdr);
4138         if (status)
4139                 goto out;
4140         status = decode_putfh(&xdr);
4141         if (status)
4142                 goto out;
4143         status = decode_savefh(&xdr);
4144 	if (status)
4145 		goto out;
4146         status = decode_open(&xdr, res);
4147         if (status)
4148                 goto out;
4149 	if (decode_getfh(&xdr, &res->fh) != 0)
4150 		goto out;
4151 	if (decode_getfattr(&xdr, res->f_attr, res->server) != 0)
4152 		goto out;
4153 	if (decode_restorefh(&xdr) != 0)
4154 		goto out;
4155 	decode_getfattr(&xdr, res->dir_attr, res->server);
4156 out:
4157         return status;
4158 }
4159 
4160 /*
4161  * Decode OPEN_CONFIRM response
4162  */
4163 static int nfs4_xdr_dec_open_confirm(struct rpc_rqst *rqstp, __be32 *p, struct nfs_open_confirmres *res)
4164 {
4165         struct xdr_stream xdr;
4166         struct compound_hdr hdr;
4167         int status;
4168 
4169         xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
4170         status = decode_compound_hdr(&xdr, &hdr);
4171         if (status)
4172                 goto out;
4173         status = decode_putfh(&xdr);
4174         if (status)
4175                 goto out;
4176         status = decode_open_confirm(&xdr, res);
4177 out:
4178         return status;
4179 }
4180 
4181 /*
4182  * Decode OPEN response
4183  */
4184 static int nfs4_xdr_dec_open_noattr(struct rpc_rqst *rqstp, __be32 *p, struct nfs_openres *res)
4185 {
4186         struct xdr_stream xdr;
4187         struct compound_hdr hdr;
4188         int status;
4189 
4190         xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
4191         status = decode_compound_hdr(&xdr, &hdr);
4192         if (status)
4193                 goto out;
4194         status = decode_putfh(&xdr);
4195         if (status)
4196                 goto out;
4197         status = decode_open(&xdr, res);
4198         if (status)
4199                 goto out;
4200 	decode_getfattr(&xdr, res->f_attr, res->server);
4201 out:
4202         return status;
4203 }
4204 
4205 /*
4206  * Decode SETATTR response
4207  */
4208 static int nfs4_xdr_dec_setattr(struct rpc_rqst *rqstp, __be32 *p, struct nfs_setattrres *res)
4209 {
4210         struct xdr_stream xdr;
4211         struct compound_hdr hdr;
4212         int status;
4213 
4214         xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
4215         status = decode_compound_hdr(&xdr, &hdr);
4216         if (status)
4217                 goto out;
4218         status = decode_putfh(&xdr);
4219         if (status)
4220                 goto out;
4221         status = decode_setattr(&xdr, res);
4222         if (status)
4223                 goto out;
4224 	status = decode_getfattr(&xdr, res->fattr, res->server);
4225 	if (status == NFS4ERR_DELAY)
4226 		status = 0;
4227 out:
4228         return status;
4229 }
4230 
4231 /*
4232  * Decode LOCK response
4233  */
4234 static int nfs4_xdr_dec_lock(struct rpc_rqst *rqstp, __be32 *p, struct nfs_lock_res *res)
4235 {
4236 	struct xdr_stream xdr;
4237 	struct compound_hdr hdr;
4238 	int status;
4239 
4240 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
4241 	status = decode_compound_hdr(&xdr, &hdr);
4242 	if (status)
4243 		goto out;
4244 	status = decode_putfh(&xdr);
4245 	if (status)
4246 		goto out;
4247 	status = decode_lock(&xdr, res);
4248 out:
4249 	return status;
4250 }
4251 
4252 /*
4253  * Decode LOCKT response
4254  */
4255 static int nfs4_xdr_dec_lockt(struct rpc_rqst *rqstp, __be32 *p, struct nfs_lockt_res *res)
4256 {
4257 	struct xdr_stream xdr;
4258 	struct compound_hdr hdr;
4259 	int status;
4260 
4261 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
4262 	status = decode_compound_hdr(&xdr, &hdr);
4263 	if (status)
4264 		goto out;
4265 	status = decode_putfh(&xdr);
4266 	if (status)
4267 		goto out;
4268 	status = decode_lockt(&xdr, res);
4269 out:
4270 	return status;
4271 }
4272 
4273 /*
4274  * Decode LOCKU response
4275  */
4276 static int nfs4_xdr_dec_locku(struct rpc_rqst *rqstp, __be32 *p, struct nfs_locku_res *res)
4277 {
4278 	struct xdr_stream xdr;
4279 	struct compound_hdr hdr;
4280 	int status;
4281 
4282 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
4283 	status = decode_compound_hdr(&xdr, &hdr);
4284 	if (status)
4285 		goto out;
4286 	status = decode_putfh(&xdr);
4287 	if (status)
4288 		goto out;
4289 	status = decode_locku(&xdr, res);
4290 out:
4291 	return status;
4292 }
4293 
4294 /*
4295  * Decode READLINK response
4296  */
4297 static int nfs4_xdr_dec_readlink(struct rpc_rqst *rqstp, __be32 *p, void *res)
4298 {
4299 	struct xdr_stream xdr;
4300 	struct compound_hdr hdr;
4301 	int status;
4302 
4303 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
4304 	status = decode_compound_hdr(&xdr, &hdr);
4305 	if (status)
4306 		goto out;
4307 	status = decode_putfh(&xdr);
4308 	if (status)
4309 		goto out;
4310 	status = decode_readlink(&xdr, rqstp);
4311 out:
4312 	return status;
4313 }
4314 
4315 /*
4316  * Decode READDIR response
4317  */
4318 static int nfs4_xdr_dec_readdir(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_readdir_res *res)
4319 {
4320 	struct xdr_stream xdr;
4321 	struct compound_hdr hdr;
4322 	int status;
4323 
4324 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
4325 	status = decode_compound_hdr(&xdr, &hdr);
4326 	if (status)
4327 		goto out;
4328 	status = decode_putfh(&xdr);
4329 	if (status)
4330 		goto out;
4331 	status = decode_readdir(&xdr, rqstp, res);
4332 out:
4333 	return status;
4334 }
4335 
4336 /*
4337  * Decode Read response
4338  */
4339 static int nfs4_xdr_dec_read(struct rpc_rqst *rqstp, __be32 *p, struct nfs_readres *res)
4340 {
4341 	struct xdr_stream xdr;
4342 	struct compound_hdr hdr;
4343 	int status;
4344 
4345 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
4346 	status = decode_compound_hdr(&xdr, &hdr);
4347 	if (status)
4348 		goto out;
4349 	status = decode_putfh(&xdr);
4350 	if (status)
4351 		goto out;
4352 	status = decode_read(&xdr, rqstp, res);
4353 	if (!status)
4354 		status = res->count;
4355 out:
4356 	return status;
4357 }
4358 
4359 /*
4360  * Decode WRITE response
4361  */
4362 static int nfs4_xdr_dec_write(struct rpc_rqst *rqstp, __be32 *p, struct nfs_writeres *res)
4363 {
4364 	struct xdr_stream xdr;
4365 	struct compound_hdr hdr;
4366 	int status;
4367 
4368 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
4369 	status = decode_compound_hdr(&xdr, &hdr);
4370 	if (status)
4371 		goto out;
4372 	status = decode_putfh(&xdr);
4373 	if (status)
4374 		goto out;
4375 	status = decode_write(&xdr, res);
4376 	if (status)
4377 		goto out;
4378 	decode_getfattr(&xdr, res->fattr, res->server);
4379 	if (!status)
4380 		status = res->count;
4381 out:
4382 	return status;
4383 }
4384 
4385 /*
4386  * Decode COMMIT response
4387  */
4388 static int nfs4_xdr_dec_commit(struct rpc_rqst *rqstp, __be32 *p, struct nfs_writeres *res)
4389 {
4390 	struct xdr_stream xdr;
4391 	struct compound_hdr hdr;
4392 	int status;
4393 
4394 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
4395 	status = decode_compound_hdr(&xdr, &hdr);
4396 	if (status)
4397 		goto out;
4398 	status = decode_putfh(&xdr);
4399 	if (status)
4400 		goto out;
4401 	status = decode_commit(&xdr, res);
4402 	if (status)
4403 		goto out;
4404 	decode_getfattr(&xdr, res->fattr, res->server);
4405 out:
4406 	return status;
4407 }
4408 
4409 /*
4410  * FSINFO request
4411  */
4412 static int nfs4_xdr_dec_fsinfo(struct rpc_rqst *req, __be32 *p, struct nfs_fsinfo *fsinfo)
4413 {
4414 	struct xdr_stream xdr;
4415 	struct compound_hdr hdr;
4416 	int status;
4417 
4418 	xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
4419 	status = decode_compound_hdr(&xdr, &hdr);
4420 	if (!status)
4421 		status = decode_putfh(&xdr);
4422 	if (!status)
4423 		status = decode_fsinfo(&xdr, fsinfo);
4424 	if (!status)
4425 		status = nfs4_stat_to_errno(hdr.status);
4426 	return status;
4427 }
4428 
4429 /*
4430  * PATHCONF request
4431  */
4432 static int nfs4_xdr_dec_pathconf(struct rpc_rqst *req, __be32 *p, struct nfs_pathconf *pathconf)
4433 {
4434 	struct xdr_stream xdr;
4435 	struct compound_hdr hdr;
4436 	int status;
4437 
4438 	xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
4439 	status = decode_compound_hdr(&xdr, &hdr);
4440 	if (!status)
4441 		status = decode_putfh(&xdr);
4442 	if (!status)
4443 		status = decode_pathconf(&xdr, pathconf);
4444 	return status;
4445 }
4446 
4447 /*
4448  * STATFS request
4449  */
4450 static int nfs4_xdr_dec_statfs(struct rpc_rqst *req, __be32 *p, struct nfs_fsstat *fsstat)
4451 {
4452 	struct xdr_stream xdr;
4453 	struct compound_hdr hdr;
4454 	int status;
4455 
4456 	xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
4457 	status = decode_compound_hdr(&xdr, &hdr);
4458 	if (!status)
4459 		status = decode_putfh(&xdr);
4460 	if (!status)
4461 		status = decode_statfs(&xdr, fsstat);
4462 	return status;
4463 }
4464 
4465 /*
4466  * GETATTR_BITMAP request
4467  */
4468 static int nfs4_xdr_dec_server_caps(struct rpc_rqst *req, __be32 *p, struct nfs4_server_caps_res *res)
4469 {
4470 	struct xdr_stream xdr;
4471 	struct compound_hdr hdr;
4472 	int status;
4473 
4474 	xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
4475 	if ((status = decode_compound_hdr(&xdr, &hdr)) != 0)
4476 		goto out;
4477 	if ((status = decode_putfh(&xdr)) != 0)
4478 		goto out;
4479 	status = decode_server_caps(&xdr, res);
4480 out:
4481 	return status;
4482 }
4483 
4484 /*
4485  * Decode RENEW response
4486  */
4487 static int nfs4_xdr_dec_renew(struct rpc_rqst *rqstp, __be32 *p, void *dummy)
4488 {
4489 	struct xdr_stream xdr;
4490 	struct compound_hdr hdr;
4491 	int status;
4492 
4493 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
4494 	status = decode_compound_hdr(&xdr, &hdr);
4495 	if (!status)
4496 		status = decode_renew(&xdr);
4497 	return status;
4498 }
4499 
4500 /*
4501  * a SETCLIENTID request
4502  */
4503 static int nfs4_xdr_dec_setclientid(struct rpc_rqst *req, __be32 *p,
4504 		struct nfs_client *clp)
4505 {
4506 	struct xdr_stream xdr;
4507 	struct compound_hdr hdr;
4508 	int status;
4509 
4510 	xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
4511 	status = decode_compound_hdr(&xdr, &hdr);
4512 	if (!status)
4513 		status = decode_setclientid(&xdr, clp);
4514 	if (!status)
4515 		status = nfs4_stat_to_errno(hdr.status);
4516 	return status;
4517 }
4518 
4519 /*
4520  * a SETCLIENTID_CONFIRM request
4521  */
4522 static int nfs4_xdr_dec_setclientid_confirm(struct rpc_rqst *req, __be32 *p, struct nfs_fsinfo *fsinfo)
4523 {
4524 	struct xdr_stream xdr;
4525 	struct compound_hdr hdr;
4526 	int status;
4527 
4528 	xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
4529 	status = decode_compound_hdr(&xdr, &hdr);
4530 	if (!status)
4531 		status = decode_setclientid_confirm(&xdr);
4532 	if (!status)
4533 		status = decode_putrootfh(&xdr);
4534 	if (!status)
4535 		status = decode_fsinfo(&xdr, fsinfo);
4536 	if (!status)
4537 		status = nfs4_stat_to_errno(hdr.status);
4538 	return status;
4539 }
4540 
4541 /*
4542  * DELEGRETURN request
4543  */
4544 static int nfs4_xdr_dec_delegreturn(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_delegreturnres *res)
4545 {
4546 	struct xdr_stream xdr;
4547 	struct compound_hdr hdr;
4548 	int status;
4549 
4550 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
4551 	status = decode_compound_hdr(&xdr, &hdr);
4552 	if (status != 0)
4553 		goto out;
4554 	status = decode_putfh(&xdr);
4555 	if (status != 0)
4556 		goto out;
4557 	status = decode_delegreturn(&xdr);
4558 	decode_getfattr(&xdr, res->fattr, res->server);
4559 out:
4560 	return status;
4561 }
4562 
4563 /*
4564  * FS_LOCATIONS request
4565  */
4566 static int nfs4_xdr_dec_fs_locations(struct rpc_rqst *req, __be32 *p, struct nfs4_fs_locations *res)
4567 {
4568 	struct xdr_stream xdr;
4569 	struct compound_hdr hdr;
4570 	int status;
4571 
4572 	xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
4573 	status = decode_compound_hdr(&xdr, &hdr);
4574 	if (status != 0)
4575 		goto out;
4576 	if ((status = decode_putfh(&xdr)) != 0)
4577 		goto out;
4578 	if ((status = decode_lookup(&xdr)) != 0)
4579 		goto out;
4580 	xdr_enter_page(&xdr, PAGE_SIZE);
4581 	status = decode_getfattr(&xdr, &res->fattr, res->server);
4582 out:
4583 	return status;
4584 }
4585 
4586 __be32 *nfs4_decode_dirent(__be32 *p, struct nfs_entry *entry, int plus)
4587 {
4588 	uint32_t bitmap[2] = {0};
4589 	uint32_t len;
4590 
4591 	if (!*p++) {
4592 		if (!*p)
4593 			return ERR_PTR(-EAGAIN);
4594 		entry->eof = 1;
4595 		return ERR_PTR(-EBADCOOKIE);
4596 	}
4597 
4598 	entry->prev_cookie = entry->cookie;
4599 	p = xdr_decode_hyper(p, &entry->cookie);
4600 	entry->len = ntohl(*p++);
4601 	entry->name = (const char *) p;
4602 	p += XDR_QUADLEN(entry->len);
4603 
4604 	/*
4605 	 * In case the server doesn't return an inode number,
4606 	 * we fake one here.  (We don't use inode number 0,
4607 	 * since glibc seems to choke on it...)
4608 	 */
4609 	entry->ino = 1;
4610 
4611 	len = ntohl(*p++);		/* bitmap length */
4612 	if (len-- > 0) {
4613 		bitmap[0] = ntohl(*p++);
4614 		if (len-- > 0) {
4615 			bitmap[1] = ntohl(*p++);
4616 			p += len;
4617 		}
4618 	}
4619 	len = XDR_QUADLEN(ntohl(*p++));	/* attribute buffer length */
4620 	if (len > 0) {
4621 		if (bitmap[0] & FATTR4_WORD0_RDATTR_ERROR) {
4622 			bitmap[0] &= ~FATTR4_WORD0_RDATTR_ERROR;
4623 			/* Ignore the return value of rdattr_error for now */
4624 			p++;
4625 			len--;
4626 		}
4627 		if (bitmap[0] == 0 && bitmap[1] == FATTR4_WORD1_MOUNTED_ON_FILEID)
4628 			xdr_decode_hyper(p, &entry->ino);
4629 		else if (bitmap[0] == FATTR4_WORD0_FILEID)
4630 			xdr_decode_hyper(p, &entry->ino);
4631 		p += len;
4632 	}
4633 
4634 	entry->eof = !p[0] && p[1];
4635 	return p;
4636 }
4637 
4638 /*
4639  * We need to translate between nfs status return values and
4640  * the local errno values which may not be the same.
4641  */
4642 static struct {
4643 	int stat;
4644 	int errno;
4645 } nfs_errtbl[] = {
4646 	{ NFS4_OK,		0		},
4647 	{ NFS4ERR_PERM,		-EPERM		},
4648 	{ NFS4ERR_NOENT,	-ENOENT		},
4649 	{ NFS4ERR_IO,		-errno_NFSERR_IO},
4650 	{ NFS4ERR_NXIO,		-ENXIO		},
4651 	{ NFS4ERR_ACCESS,	-EACCES		},
4652 	{ NFS4ERR_EXIST,	-EEXIST		},
4653 	{ NFS4ERR_XDEV,		-EXDEV		},
4654 	{ NFS4ERR_NOTDIR,	-ENOTDIR	},
4655 	{ NFS4ERR_ISDIR,	-EISDIR		},
4656 	{ NFS4ERR_INVAL,	-EINVAL		},
4657 	{ NFS4ERR_FBIG,		-EFBIG		},
4658 	{ NFS4ERR_NOSPC,	-ENOSPC		},
4659 	{ NFS4ERR_ROFS,		-EROFS		},
4660 	{ NFS4ERR_MLINK,	-EMLINK		},
4661 	{ NFS4ERR_NAMETOOLONG,	-ENAMETOOLONG	},
4662 	{ NFS4ERR_NOTEMPTY,	-ENOTEMPTY	},
4663 	{ NFS4ERR_DQUOT,	-EDQUOT		},
4664 	{ NFS4ERR_STALE,	-ESTALE		},
4665 	{ NFS4ERR_BADHANDLE,	-EBADHANDLE	},
4666 	{ NFS4ERR_BADOWNER,	-EINVAL		},
4667 	{ NFS4ERR_BADNAME,	-EINVAL		},
4668 	{ NFS4ERR_BAD_COOKIE,	-EBADCOOKIE	},
4669 	{ NFS4ERR_NOTSUPP,	-ENOTSUPP	},
4670 	{ NFS4ERR_TOOSMALL,	-ETOOSMALL	},
4671 	{ NFS4ERR_SERVERFAULT,	-ESERVERFAULT	},
4672 	{ NFS4ERR_BADTYPE,	-EBADTYPE	},
4673 	{ NFS4ERR_LOCKED,	-EAGAIN		},
4674 	{ NFS4ERR_RESOURCE,	-EREMOTEIO	},
4675 	{ NFS4ERR_SYMLINK,	-ELOOP		},
4676 	{ NFS4ERR_OP_ILLEGAL,	-EOPNOTSUPP	},
4677 	{ NFS4ERR_DEADLOCK,	-EDEADLK	},
4678 	{ NFS4ERR_WRONGSEC,	-EPERM		}, /* FIXME: this needs
4679 						    * to be handled by a
4680 						    * middle-layer.
4681 						    */
4682 	{ -1,			-EIO		}
4683 };
4684 
4685 /*
4686  * Convert an NFS error code to a local one.
4687  * This one is used jointly by NFSv2 and NFSv3.
4688  */
4689 static int
4690 nfs4_stat_to_errno(int stat)
4691 {
4692 	int i;
4693 	for (i = 0; nfs_errtbl[i].stat != -1; i++) {
4694 		if (nfs_errtbl[i].stat == stat)
4695 			return nfs_errtbl[i].errno;
4696 	}
4697 	if (stat <= 10000 || stat > 10100) {
4698 		/* The server is looney tunes. */
4699 		return -ESERVERFAULT;
4700 	}
4701 	/* If we cannot translate the error, the recovery routines should
4702 	 * handle it.
4703 	 * Note: remaining NFSv4 error codes have values > 10000, so should
4704 	 * not conflict with native Linux error codes.
4705 	 */
4706 	return -stat;
4707 }
4708 
4709 #define PROC(proc, argtype, restype)				\
4710 [NFSPROC4_CLNT_##proc] = {					\
4711 	.p_proc   = NFSPROC4_COMPOUND,				\
4712 	.p_encode = (kxdrproc_t) nfs4_xdr_##argtype,		\
4713 	.p_decode = (kxdrproc_t) nfs4_xdr_##restype,		\
4714 	.p_arglen = NFS4_##argtype##_sz,			\
4715 	.p_replen = NFS4_##restype##_sz,			\
4716 	.p_statidx = NFSPROC4_CLNT_##proc,			\
4717 	.p_name   = #proc,					\
4718     }
4719 
4720 struct rpc_procinfo	nfs4_procedures[] = {
4721   PROC(READ,		enc_read,	dec_read),
4722   PROC(WRITE,		enc_write,	dec_write),
4723   PROC(COMMIT,		enc_commit,	dec_commit),
4724   PROC(OPEN,		enc_open,	dec_open),
4725   PROC(OPEN_CONFIRM,	enc_open_confirm,	dec_open_confirm),
4726   PROC(OPEN_NOATTR,	enc_open_noattr,	dec_open_noattr),
4727   PROC(OPEN_DOWNGRADE,	enc_open_downgrade,	dec_open_downgrade),
4728   PROC(CLOSE,		enc_close,	dec_close),
4729   PROC(SETATTR,		enc_setattr,	dec_setattr),
4730   PROC(FSINFO,		enc_fsinfo,	dec_fsinfo),
4731   PROC(RENEW,		enc_renew,	dec_renew),
4732   PROC(SETCLIENTID,	enc_setclientid,	dec_setclientid),
4733   PROC(SETCLIENTID_CONFIRM,	enc_setclientid_confirm,	dec_setclientid_confirm),
4734   PROC(LOCK,            enc_lock,       dec_lock),
4735   PROC(LOCKT,           enc_lockt,      dec_lockt),
4736   PROC(LOCKU,           enc_locku,      dec_locku),
4737   PROC(ACCESS,		enc_access,	dec_access),
4738   PROC(GETATTR,		enc_getattr,	dec_getattr),
4739   PROC(LOOKUP,		enc_lookup,	dec_lookup),
4740   PROC(LOOKUP_ROOT,	enc_lookup_root,	dec_lookup_root),
4741   PROC(REMOVE,		enc_remove,	dec_remove),
4742   PROC(RENAME,		enc_rename,	dec_rename),
4743   PROC(LINK,		enc_link,	dec_link),
4744   PROC(SYMLINK,		enc_symlink,	dec_symlink),
4745   PROC(CREATE,		enc_create,	dec_create),
4746   PROC(PATHCONF,	enc_pathconf,	dec_pathconf),
4747   PROC(STATFS,		enc_statfs,	dec_statfs),
4748   PROC(READLINK,	enc_readlink,	dec_readlink),
4749   PROC(READDIR,		enc_readdir,	dec_readdir),
4750   PROC(SERVER_CAPS,	enc_server_caps, dec_server_caps),
4751   PROC(DELEGRETURN,	enc_delegreturn, dec_delegreturn),
4752   PROC(GETACL,		enc_getacl,	dec_getacl),
4753   PROC(SETACL,		enc_setacl,	dec_setacl),
4754   PROC(FS_LOCATIONS,	enc_fs_locations, dec_fs_locations),
4755 };
4756 
4757 struct rpc_version		nfs_version4 = {
4758 	.number			= 4,
4759 	.nrprocs		= ARRAY_SIZE(nfs4_procedures),
4760 	.procs			= nfs4_procedures
4761 };
4762 
4763 /*
4764  * Local variables:
4765  *  c-basic-offset: 8
4766  * End:
4767  */
4768