[PATCH] NFSv4: Client-side xdr for writing NFSv4 acls
[linux-2.6.git] / include / linux / nfs_xdr.h
1 #ifndef _LINUX_NFS_XDR_H
2 #define _LINUX_NFS_XDR_H
3
4 #include <linux/sunrpc/xprt.h>
5
6 struct nfs4_fsid {
7         __u64 major;
8         __u64 minor;
9 };
10
11 struct nfs_fattr {
12         unsigned short          valid;          /* which fields are valid */
13         __u64                   pre_size;       /* pre_op_attr.size       */
14         struct timespec         pre_mtime;      /* pre_op_attr.mtime      */
15         struct timespec         pre_ctime;      /* pre_op_attr.ctime      */
16         enum nfs_ftype          type;           /* always use NFSv2 types */
17         __u32                   mode;
18         __u32                   nlink;
19         __u32                   uid;
20         __u32                   gid;
21         __u64                   size;
22         union {
23                 struct {
24                         __u32   blocksize;
25                         __u32   blocks;
26                 } nfs2;
27                 struct {
28                         __u64   used;
29                 } nfs3;
30         } du;
31         dev_t                   rdev;
32         union {
33                 __u64           nfs3;           /* also nfs2 */
34                 struct nfs4_fsid nfs4;
35         } fsid_u;
36         __u64                   fileid;
37         struct timespec         atime;
38         struct timespec         mtime;
39         struct timespec         ctime;
40         __u32                   bitmap[2];      /* NFSv4 returned attribute bitmap */
41         __u64                   change_attr;    /* NFSv4 change attribute */
42         __u64                   pre_change_attr;/* pre-op NFSv4 change attribute */
43         unsigned long           timestamp;
44 };
45
46 #define NFS_ATTR_WCC            0x0001          /* pre-op WCC data    */
47 #define NFS_ATTR_FATTR          0x0002          /* post-op attributes */
48 #define NFS_ATTR_FATTR_V3       0x0004          /* NFSv3 attributes */
49 #define NFS_ATTR_FATTR_V4       0x0008
50 #define NFS_ATTR_PRE_CHANGE     0x0010
51
52 /*
53  * Info on the file system
54  */
55 struct nfs_fsinfo {
56         struct nfs_fattr        *fattr; /* Post-op attributes */
57         __u32                   rtmax;  /* max.  read transfer size */
58         __u32                   rtpref; /* pref. read transfer size */
59         __u32                   rtmult; /* reads should be multiple of this */
60         __u32                   wtmax;  /* max.  write transfer size */
61         __u32                   wtpref; /* pref. write transfer size */
62         __u32                   wtmult; /* writes should be multiple of this */
63         __u32                   dtpref; /* pref. readdir transfer size */
64         __u64                   maxfilesize;
65         __u32                   lease_time; /* in seconds */
66 };
67
68 struct nfs_fsstat {
69         struct nfs_fattr        *fattr; /* Post-op attributes */
70         __u64                   tbytes; /* total size in bytes */
71         __u64                   fbytes; /* # of free bytes */
72         __u64                   abytes; /* # of bytes available to user */
73         __u64                   tfiles; /* # of files */
74         __u64                   ffiles; /* # of free files */
75         __u64                   afiles; /* # of files available to user */
76 };
77
78 struct nfs2_fsstat {
79         __u32                   tsize;  /* Server transfer size */
80         __u32                   bsize;  /* Filesystem block size */
81         __u32                   blocks; /* No. of "bsize" blocks on filesystem */
82         __u32                   bfree;  /* No. of free "bsize" blocks */
83         __u32                   bavail; /* No. of available "bsize" blocks */
84 };
85
86 struct nfs_pathconf {
87         struct nfs_fattr        *fattr; /* Post-op attributes */
88         __u32                   max_link; /* max # of hard links */
89         __u32                   max_namelen; /* max name length */
90 };
91
92 struct nfs4_change_info {
93         u32                     atomic;
94         u64                     before;
95         u64                     after;
96 };
97
98 /*
99  * Arguments to the open call.
100  */
101 struct nfs_openargs {
102         const struct nfs_fh *   fh;
103         __u32                   seqid;
104         int                     open_flags;
105         __u64                   clientid;
106         __u32                   id;
107         union {
108                 struct iattr *  attrs;    /* UNCHECKED, GUARDED */
109                 nfs4_verifier   verifier; /* EXCLUSIVE */
110                 nfs4_stateid    delegation;             /* CLAIM_DELEGATE_CUR */
111                 int             delegation_type;        /* CLAIM_PREVIOUS */
112         } u;
113         const struct qstr *     name;
114         const struct nfs_server *server;         /* Needed for ID mapping */
115         const u32 *             bitmask;
116         __u32                   claim;
117 };
118
119 struct nfs_openres {
120         nfs4_stateid            stateid;
121         struct nfs_fh           fh;
122         struct nfs4_change_info cinfo;
123         __u32                   rflags;
124         struct nfs_fattr *      f_attr;
125         const struct nfs_server *server;
126         int                     delegation_type;
127         nfs4_stateid            delegation;
128         __u32                   do_recall;
129         __u64                   maxsize;
130 };
131
132 /*
133  * Arguments to the open_confirm call.
134  */
135 struct nfs_open_confirmargs {
136         const struct nfs_fh *   fh;
137         nfs4_stateid            stateid;
138         __u32                   seqid;
139 };
140
141 struct nfs_open_confirmres {
142         nfs4_stateid            stateid;
143 };
144
145 /*
146  * Arguments to the close call.
147  */
148 struct nfs_closeargs {
149         struct nfs_fh *         fh;
150         nfs4_stateid            stateid;
151         __u32                   seqid;
152         int                     open_flags;
153 };
154
155 struct nfs_closeres {
156         nfs4_stateid            stateid;
157 };
158 /*
159  *  * Arguments to the lock,lockt, and locku call.
160  *   */
161 struct nfs_lowner {
162         __u64           clientid;
163         u32                     id;
164 };
165
166 struct nfs_open_to_lock {
167         __u32                   open_seqid;
168         nfs4_stateid            open_stateid;
169         __u32                   lock_seqid;
170         struct nfs_lowner       lock_owner;
171 };
172
173 struct nfs_exist_lock {
174         nfs4_stateid            stateid;
175         __u32                   seqid;
176 };
177
178 struct nfs_lock_opargs {
179         __u32                   reclaim;
180         __u32                   new_lock_owner;
181         union {
182                 struct nfs_open_to_lock *open_lock;
183                 struct nfs_exist_lock   *exist_lock;
184         } u;
185 };
186
187 struct nfs_locku_opargs {
188         __u32                   seqid;
189         nfs4_stateid            stateid;
190 };
191
192 struct nfs_lockargs {
193         struct nfs_fh *         fh;
194         __u32                   type;
195         __u64                   offset; 
196         __u64                   length; 
197         union {
198                 struct nfs_lock_opargs  *lock;    /* LOCK  */
199                 struct nfs_lowner       *lockt;  /* LOCKT */
200                 struct nfs_locku_opargs *locku;  /* LOCKU */
201         } u;
202 };
203
204 struct nfs_lock_denied {
205         __u64                   offset;
206         __u64                   length;
207         __u32                   type;
208         struct nfs_lowner       owner;
209 };
210
211 struct nfs_lockres {
212         union {
213                 nfs4_stateid            stateid;/* LOCK success, LOCKU */
214                 struct nfs_lock_denied  denied; /* LOCK failed, LOCKT success */
215         } u;
216         const struct nfs_server *       server;
217 };
218
219 struct nfs4_delegreturnargs {
220         const struct nfs_fh *fhandle;
221         const nfs4_stateid *stateid;
222 };
223
224 /*
225  * Arguments to the read call.
226  */
227
228 #define NFS_READ_MAXIOV         (9U)
229 #if (NFS_READ_MAXIOV > (MAX_IOVEC -2))
230 #error "NFS_READ_MAXIOV is too large"
231 #endif
232
233 struct nfs_readargs {
234         struct nfs_fh *         fh;
235         struct nfs_open_context *context;
236         __u64                   offset;
237         __u32                   count;
238         unsigned int            pgbase;
239         struct page **          pages;
240 };
241
242 struct nfs_readres {
243         struct nfs_fattr *      fattr;
244         __u32                   count;
245         int                     eof;
246 };
247
248 /*
249  * Arguments to the write call.
250  */
251 #define NFS_WRITE_MAXIOV        (9U)
252 #if (NFS_WRITE_MAXIOV > (MAX_IOVEC -2))
253 #error "NFS_WRITE_MAXIOV is too large"
254 #endif
255
256 struct nfs_writeargs {
257         struct nfs_fh *         fh;
258         struct nfs_open_context *context;
259         __u64                   offset;
260         __u32                   count;
261         enum nfs3_stable_how    stable;
262         unsigned int            pgbase;
263         struct page **          pages;
264 };
265
266 struct nfs_writeverf {
267         enum nfs3_stable_how    committed;
268         __u32                   verifier[2];
269 };
270
271 struct nfs_writeres {
272         struct nfs_fattr *      fattr;
273         struct nfs_writeverf *  verf;
274         __u32                   count;
275 };
276
277 /*
278  * Argument struct for decode_entry function
279  */
280 struct nfs_entry {
281         __u64                   ino;
282         __u64                   cookie,
283                                 prev_cookie;
284         const char *            name;
285         unsigned int            len;
286         int                     eof;
287         struct nfs_fh *         fh;
288         struct nfs_fattr *      fattr;
289 };
290
291 /*
292  * The following types are for NFSv2 only.
293  */
294 struct nfs_sattrargs {
295         struct nfs_fh *         fh;
296         struct iattr *          sattr;
297 };
298
299 struct nfs_diropargs {
300         struct nfs_fh *         fh;
301         const char *            name;
302         unsigned int            len;
303 };
304
305 struct nfs_createargs {
306         struct nfs_fh *         fh;
307         const char *            name;
308         unsigned int            len;
309         struct iattr *          sattr;
310 };
311
312 struct nfs_renameargs {
313         struct nfs_fh *         fromfh;
314         const char *            fromname;
315         unsigned int            fromlen;
316         struct nfs_fh *         tofh;
317         const char *            toname;
318         unsigned int            tolen;
319 };
320
321 struct nfs_setattrargs {
322         struct nfs_fh *                 fh;
323         nfs4_stateid                    stateid;
324         struct iattr *                  iap;
325         const struct nfs_server *       server; /* Needed for name mapping */
326         const u32 *                     bitmask;
327 };
328
329 struct nfs_setaclargs {
330         struct nfs_fh *                 fh;
331         size_t                          acl_len;
332         unsigned int                    acl_pgbase;
333         struct page **                  acl_pages;
334 };
335
336 struct nfs_getaclargs {
337         struct nfs_fh *                 fh;
338         size_t                          acl_len;
339         unsigned int                    acl_pgbase;
340         struct page **                  acl_pages;
341 };
342
343 struct nfs_setattrres {
344         struct nfs_fattr *              fattr;
345         const struct nfs_server *       server;
346 };
347
348 struct nfs_linkargs {
349         struct nfs_fh *         fromfh;
350         struct nfs_fh *         tofh;
351         const char *            toname;
352         unsigned int            tolen;
353 };
354
355 struct nfs_symlinkargs {
356         struct nfs_fh *         fromfh;
357         const char *            fromname;
358         unsigned int            fromlen;
359         const char *            topath;
360         unsigned int            tolen;
361         struct iattr *          sattr;
362 };
363
364 struct nfs_readdirargs {
365         struct nfs_fh *         fh;
366         __u32                   cookie;
367         unsigned int            count;
368         struct page **          pages;
369 };
370
371 struct nfs_diropok {
372         struct nfs_fh *         fh;
373         struct nfs_fattr *      fattr;
374 };
375
376 struct nfs_readlinkargs {
377         struct nfs_fh *         fh;
378         unsigned int            pgbase;
379         unsigned int            pglen;
380         struct page **          pages;
381 };
382
383 struct nfs3_sattrargs {
384         struct nfs_fh *         fh;
385         struct iattr *          sattr;
386         unsigned int            guard;
387         struct timespec         guardtime;
388 };
389
390 struct nfs3_diropargs {
391         struct nfs_fh *         fh;
392         const char *            name;
393         unsigned int            len;
394 };
395
396 struct nfs3_accessargs {
397         struct nfs_fh *         fh;
398         __u32                   access;
399 };
400
401 struct nfs3_createargs {
402         struct nfs_fh *         fh;
403         const char *            name;
404         unsigned int            len;
405         struct iattr *          sattr;
406         enum nfs3_createmode    createmode;
407         __u32                   verifier[2];
408 };
409
410 struct nfs3_mkdirargs {
411         struct nfs_fh *         fh;
412         const char *            name;
413         unsigned int            len;
414         struct iattr *          sattr;
415 };
416
417 struct nfs3_symlinkargs {
418         struct nfs_fh *         fromfh;
419         const char *            fromname;
420         unsigned int            fromlen;
421         const char *            topath;
422         unsigned int            tolen;
423         struct iattr *          sattr;
424 };
425
426 struct nfs3_mknodargs {
427         struct nfs_fh *         fh;
428         const char *            name;
429         unsigned int            len;
430         enum nfs3_ftype         type;
431         struct iattr *          sattr;
432         dev_t                   rdev;
433 };
434
435 struct nfs3_renameargs {
436         struct nfs_fh *         fromfh;
437         const char *            fromname;
438         unsigned int            fromlen;
439         struct nfs_fh *         tofh;
440         const char *            toname;
441         unsigned int            tolen;
442 };
443
444 struct nfs3_linkargs {
445         struct nfs_fh *         fromfh;
446         struct nfs_fh *         tofh;
447         const char *            toname;
448         unsigned int            tolen;
449 };
450
451 struct nfs3_readdirargs {
452         struct nfs_fh *         fh;
453         __u64                   cookie;
454         __u32                   verf[2];
455         int                     plus;
456         unsigned int            count;
457         struct page **          pages;
458 };
459
460 struct nfs3_diropres {
461         struct nfs_fattr *      dir_attr;
462         struct nfs_fh *         fh;
463         struct nfs_fattr *      fattr;
464 };
465
466 struct nfs3_accessres {
467         struct nfs_fattr *      fattr;
468         __u32                   access;
469 };
470
471 struct nfs3_readlinkargs {
472         struct nfs_fh *         fh;
473         unsigned int            pgbase;
474         unsigned int            pglen;
475         struct page **          pages;
476 };
477
478 struct nfs3_renameres {
479         struct nfs_fattr *      fromattr;
480         struct nfs_fattr *      toattr;
481 };
482
483 struct nfs3_linkres {
484         struct nfs_fattr *      dir_attr;
485         struct nfs_fattr *      fattr;
486 };
487
488 struct nfs3_readdirres {
489         struct nfs_fattr *      dir_attr;
490         __u32 *                 verf;
491         int                     plus;
492 };
493
494 #ifdef CONFIG_NFS_V4
495
496 typedef u64 clientid4;
497
498 struct nfs4_accessargs {
499         const struct nfs_fh *           fh;
500         u32                             access;
501 };
502
503 struct nfs4_accessres {
504         u32                             supported;
505         u32                             access;
506 };
507
508 struct nfs4_create_arg {
509         u32                             ftype;
510         union {
511                 struct qstr *           symlink;    /* NF4LNK */
512                 struct {
513                         u32             specdata1;
514                         u32             specdata2;
515                 } device;    /* NF4BLK, NF4CHR */
516         } u;
517         const struct qstr *             name;
518         const struct nfs_server *       server;
519         const struct iattr *            attrs;
520         const struct nfs_fh *           dir_fh;
521         const u32 *                     bitmask;
522 };
523
524 struct nfs4_create_res {
525         const struct nfs_server *       server;
526         struct nfs_fh *                 fh;
527         struct nfs_fattr *              fattr;
528         struct nfs4_change_info         dir_cinfo;
529 };
530
531 struct nfs4_fsinfo_arg {
532         const struct nfs_fh *           fh;
533         const u32 *                     bitmask;
534 };
535
536 struct nfs4_getattr_arg {
537         const struct nfs_fh *           fh;
538         const u32 *                     bitmask;
539 };
540
541 struct nfs4_getattr_res {
542         const struct nfs_server *       server;
543         struct nfs_fattr *              fattr;
544 };
545
546 struct nfs4_link_arg {
547         const struct nfs_fh *           fh;
548         const struct nfs_fh *           dir_fh;
549         const struct qstr *             name;
550 };
551
552 struct nfs4_lookup_arg {
553         const struct nfs_fh *           dir_fh;
554         const struct qstr *             name;
555         const u32 *                     bitmask;
556 };
557
558 struct nfs4_lookup_res {
559         const struct nfs_server *       server;
560         struct nfs_fattr *              fattr;
561         struct nfs_fh *                 fh;
562 };
563
564 struct nfs4_lookup_root_arg {
565         const u32 *                     bitmask;
566 };
567
568 struct nfs4_pathconf_arg {
569         const struct nfs_fh *           fh;
570         const u32 *                     bitmask;
571 };
572
573 struct nfs4_readdir_arg {
574         const struct nfs_fh *           fh;
575         u64                             cookie;
576         nfs4_verifier                   verifier;
577         u32                             count;
578         struct page **                  pages;  /* zero-copy data */
579         unsigned int                    pgbase; /* zero-copy data */
580         const u32 *                     bitmask;
581 };
582
583 struct nfs4_readdir_res {
584         nfs4_verifier                   verifier;
585         unsigned int                    pgbase;
586 };
587
588 struct nfs4_readlink {
589         const struct nfs_fh *           fh;
590         unsigned int                    pgbase;
591         unsigned int                    pglen;   /* zero-copy data */
592         struct page **                  pages;   /* zero-copy data */
593 };
594
595 struct nfs4_remove_arg {
596         const struct nfs_fh *           fh;
597         const struct qstr *             name;
598 };
599
600 struct nfs4_rename_arg {
601         const struct nfs_fh *           old_dir;
602         const struct nfs_fh *           new_dir;
603         const struct qstr *             old_name;
604         const struct qstr *             new_name;
605 };
606
607 struct nfs4_rename_res {
608         struct nfs4_change_info         old_cinfo;
609         struct nfs4_change_info         new_cinfo;
610 };
611
612 struct nfs4_setclientid {
613         const nfs4_verifier *           sc_verifier;      /* request */
614         unsigned int                    sc_name_len;
615         char                            sc_name[32];      /* request */
616         u32                             sc_prog;          /* request */
617         unsigned int                    sc_netid_len;
618         char                            sc_netid[4];      /* request */
619         unsigned int                    sc_uaddr_len;
620         char                            sc_uaddr[24];     /* request */
621         u32                             sc_cb_ident;      /* request */
622 };
623
624 struct nfs4_statfs_arg {
625         const struct nfs_fh *           fh;
626         const u32 *                     bitmask;
627 };
628
629 struct nfs4_server_caps_res {
630         u32                             attr_bitmask[2];
631         u32                             acl_bitmask;
632         u32                             has_links;
633         u32                             has_symlinks;
634 };
635
636 #endif /* CONFIG_NFS_V4 */
637
638 struct nfs_page;
639
640 struct nfs_read_data {
641         int                     flags;
642         struct rpc_task         task;
643         struct inode            *inode;
644         struct rpc_cred         *cred;
645         struct nfs_fattr        fattr;  /* fattr storage */
646         struct list_head        pages;  /* Coalesced read requests */
647         struct nfs_page         *req;   /* multi ops per nfs_page */
648         struct page             *pagevec[NFS_READ_MAXIOV];
649         struct nfs_readargs args;
650         struct nfs_readres  res;
651 #ifdef CONFIG_NFS_V4
652         unsigned long           timestamp;      /* For lease renewal */
653 #endif
654         void (*complete) (struct nfs_read_data *, int);
655 };
656
657 struct nfs_write_data {
658         int                     flags;
659         struct rpc_task         task;
660         struct inode            *inode;
661         struct rpc_cred         *cred;
662         struct nfs_fattr        fattr;
663         struct nfs_writeverf    verf;
664         struct list_head        pages;          /* Coalesced requests we wish to flush */
665         struct nfs_page         *req;           /* multi ops per nfs_page */
666         struct page             *pagevec[NFS_WRITE_MAXIOV];
667         struct nfs_writeargs    args;           /* argument struct */
668         struct nfs_writeres     res;            /* result struct */
669 #ifdef CONFIG_NFS_V4
670         unsigned long           timestamp;      /* For lease renewal */
671 #endif
672         void (*complete) (struct nfs_write_data *, int);
673 };
674
675 struct nfs_access_entry;
676
677 /*
678  * RPC procedure vector for NFSv2/NFSv3 demuxing
679  */
680 struct nfs_rpc_ops {
681         int     version;                /* Protocol version */
682         struct dentry_operations *dentry_ops;
683         struct inode_operations *dir_inode_ops;
684         struct inode_operations *file_inode_ops;
685
686         int     (*getroot) (struct nfs_server *, struct nfs_fh *,
687                             struct nfs_fsinfo *);
688         int     (*getattr) (struct nfs_server *, struct nfs_fh *,
689                             struct nfs_fattr *);
690         int     (*setattr) (struct dentry *, struct nfs_fattr *,
691                             struct iattr *);
692         int     (*lookup)  (struct inode *, struct qstr *,
693                             struct nfs_fh *, struct nfs_fattr *);
694         int     (*access)  (struct inode *, struct nfs_access_entry *);
695         int     (*readlink)(struct inode *, struct page *, unsigned int,
696                             unsigned int);
697         int     (*read)    (struct nfs_read_data *);
698         int     (*write)   (struct nfs_write_data *);
699         int     (*commit)  (struct nfs_write_data *);
700         int     (*create)  (struct inode *, struct dentry *,
701                             struct iattr *, int);
702         int     (*remove)  (struct inode *, struct qstr *);
703         int     (*unlink_setup)  (struct rpc_message *,
704                             struct dentry *, struct qstr *);
705         int     (*unlink_done) (struct dentry *, struct rpc_task *);
706         int     (*rename)  (struct inode *, struct qstr *,
707                             struct inode *, struct qstr *);
708         int     (*link)    (struct inode *, struct inode *, struct qstr *);
709         int     (*symlink) (struct inode *, struct qstr *, struct qstr *,
710                             struct iattr *, struct nfs_fh *,
711                             struct nfs_fattr *);
712         int     (*mkdir)   (struct inode *, struct dentry *, struct iattr *);
713         int     (*rmdir)   (struct inode *, struct qstr *);
714         int     (*readdir) (struct dentry *, struct rpc_cred *,
715                             u64, struct page *, unsigned int, int);
716         int     (*mknod)   (struct inode *, struct dentry *, struct iattr *,
717                             dev_t);
718         int     (*statfs)  (struct nfs_server *, struct nfs_fh *,
719                             struct nfs_fsstat *);
720         int     (*fsinfo)  (struct nfs_server *, struct nfs_fh *,
721                             struct nfs_fsinfo *);
722         int     (*pathconf) (struct nfs_server *, struct nfs_fh *,
723                              struct nfs_pathconf *);
724         u32 *   (*decode_dirent)(u32 *, struct nfs_entry *, int plus);
725         void    (*read_setup)   (struct nfs_read_data *);
726         void    (*write_setup)  (struct nfs_write_data *, int how);
727         void    (*commit_setup) (struct nfs_write_data *, int how);
728         int     (*file_open)   (struct inode *, struct file *);
729         int     (*file_release) (struct inode *, struct file *);
730         int     (*lock)(struct file *, int, struct file_lock *);
731         void    (*clear_acl_cache)(struct inode *);
732 };
733
734 /*
735  *      NFS_CALL(getattr, inode, (fattr));
736  * into
737  *      NFS_PROTO(inode)->getattr(fattr);
738  */
739 #define NFS_CALL(op, inode, args)       NFS_PROTO(inode)->op args
740
741 /*
742  * Function vectors etc. for the NFS client
743  */
744 extern struct nfs_rpc_ops       nfs_v2_clientops;
745 extern struct nfs_rpc_ops       nfs_v3_clientops;
746 extern struct nfs_rpc_ops       nfs_v4_clientops;
747 extern struct rpc_version       nfs_version2;
748 extern struct rpc_version       nfs_version3;
749 extern struct rpc_version       nfs_version4;
750
751 #endif