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