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