1#ifndef _LINUX_NFS_XDR_H
2#define _LINUX_NFS_XDR_H
3
4struct nfs_fattr {
5	unsigned short		valid;		/* which fields are valid */
6	__u64			pre_size;	/* pre_op_attr.size	  */
7	__u64			pre_mtime;	/* pre_op_attr.mtime	  */
8	__u64			pre_ctime;	/* pre_op_attr.ctime	  */
9	enum nfs_ftype		type;		/* always use NFSv2 types */
10	__u32			mode;
11	__u32			nlink;
12	__u32			uid;
13	__u32			gid;
14	__u64			size;
15	union {
16		struct {
17			__u32	blocksize;
18			__u32	blocks;
19		} nfs2;
20		struct {
21			__u64	used;
22		} nfs3;
23	} du;
24	__u32			rdev;
25	__u64			fsid;
26	__u64			fileid;
27	__u64			atime;
28	__u64			mtime;
29	__u64			ctime;
30};
31
32#define NFS_ATTR_WCC		0x0001		/* pre-op WCC data    */
33#define NFS_ATTR_FATTR		0x0002		/* post-op attributes */
34#define NFS_ATTR_FATTR_V3	0x0004		/* NFSv3 attributes */
35
36/*
37 * Info on the file system
38 */
39struct nfs_fsinfo {
40	__u32			rtmax;	/* max.  read transfer size */
41	__u32			rtpref;	/* pref. read transfer size */
42	__u32			rtmult;	/* reads should be multiple of this */
43	__u32			wtmax;	/* max.  write transfer size */
44	__u32			wtpref;	/* pref. write transfer size */
45	__u32			wtmult;	/* writes should be multiple of this */
46	__u32			dtpref;	/* pref. readdir transfer size */
47	__u64			maxfilesize;
48	__u64			bsize;	/* block size */
49	__u64			tbytes;	/* total size in bytes */
50	__u64			fbytes;	/* # of free bytes */
51	__u64			abytes;	/* # of bytes available to user */
52	__u64			tfiles;	/* # of files */
53	__u64			ffiles;	/* # of free files */
54	__u64			afiles;	/* # of files available to user */
55	__u32			linkmax;/* max # of hard links */
56	__u32			namelen;/* max name length */
57};
58
59/* Arguments to the read call.
60 * Note that NFS_READ_MAXIOV must be <= (MAX_IOVEC-2) from sunrpc/xprt.h
61 */
62#define NFS_READ_MAXIOV 8
63
64struct nfs_readargs {
65	struct nfs_fh *		fh;
66	__u64			offset;
67	__u32			count;
68	unsigned int		pgbase;
69	struct page **		pages;
70};
71
72struct nfs_readres {
73	struct nfs_fattr *	fattr;
74	__u32			count;
75	int                     eof;
76};
77
78/* Arguments to the write call.
79 * Note that NFS_WRITE_MAXIOV must be <= (MAX_IOVEC-2) from sunrpc/xprt.h
80 */
81#define NFS_WRITE_MAXIOV        8
82struct nfs_writeargs {
83	struct nfs_fh *		fh;
84	__u64			offset;
85	__u32			count;
86	enum nfs3_stable_how	stable;
87	unsigned int		pgbase;
88	struct page **		pages;
89};
90
91struct nfs_writeverf {
92	enum nfs3_stable_how	committed;
93	__u32			verifier[2];
94};
95
96struct nfs_writeres {
97	struct nfs_fattr *	fattr;
98	struct nfs_writeverf *	verf;
99	__u32			count;
100};
101
102/*
103 * Argument struct for decode_entry function
104 */
105struct nfs_entry {
106	__u64			ino;
107	__u64			cookie,
108				prev_cookie;
109	const char *		name;
110	unsigned int		len;
111	int			eof;
112	struct nfs_fh		fh;
113	struct nfs_fattr	fattr;
114};
115
116/*
117 * The following types are for NFSv2 only.
118 */
119struct nfs_sattrargs {
120	struct nfs_fh *		fh;
121	struct iattr *		sattr;
122};
123
124struct nfs_diropargs {
125	struct nfs_fh *		fh;
126	const char *		name;
127	unsigned int		len;
128};
129
130struct nfs_createargs {
131	struct nfs_fh *		fh;
132	const char *		name;
133	unsigned int		len;
134	struct iattr *		sattr;
135};
136
137struct nfs_renameargs {
138	struct nfs_fh *		fromfh;
139	const char *		fromname;
140	unsigned int		fromlen;
141	struct nfs_fh *		tofh;
142	const char *		toname;
143	unsigned int		tolen;
144};
145
146struct nfs_linkargs {
147	struct nfs_fh *		fromfh;
148	struct nfs_fh *		tofh;
149	const char *		toname;
150	unsigned int		tolen;
151};
152
153struct nfs_symlinkargs {
154	struct nfs_fh *		fromfh;
155	const char *		fromname;
156	unsigned int		fromlen;
157	const char *		topath;
158	unsigned int		tolen;
159	struct iattr *		sattr;
160};
161
162struct nfs_readdirargs {
163	struct nfs_fh *		fh;
164	__u32			cookie;
165	unsigned int		count;
166	struct page **		pages;
167};
168
169struct nfs_diropok {
170	struct nfs_fh *		fh;
171	struct nfs_fattr *	fattr;
172};
173
174struct nfs_readlinkargs {
175	struct nfs_fh *		fh;
176	unsigned int		count;
177	struct page **		pages;
178};
179
180struct nfs3_sattrargs {
181	struct nfs_fh *		fh;
182	struct iattr *		sattr;
183	unsigned int		guard;
184	__u64			guardtime;
185};
186
187struct nfs3_diropargs {
188	struct nfs_fh *		fh;
189	const char *		name;
190	unsigned int		len;
191};
192
193struct nfs3_accessargs {
194	struct nfs_fh *		fh;
195	__u32			access;
196};
197
198struct nfs3_createargs {
199	struct nfs_fh *		fh;
200	const char *		name;
201	unsigned int		len;
202	struct iattr *		sattr;
203	enum nfs3_createmode	createmode;
204	__u32			verifier[2];
205};
206
207struct nfs3_mkdirargs {
208	struct nfs_fh *		fh;
209	const char *		name;
210	unsigned int		len;
211	struct iattr *		sattr;
212};
213
214struct nfs3_symlinkargs {
215	struct nfs_fh *		fromfh;
216	const char *		fromname;
217	unsigned int		fromlen;
218	const char *		topath;
219	unsigned int		tolen;
220	struct iattr *		sattr;
221};
222
223struct nfs3_mknodargs {
224	struct nfs_fh *		fh;
225	const char *		name;
226	unsigned int		len;
227	enum nfs3_ftype		type;
228	struct iattr *		sattr;
229	dev_t			rdev;
230};
231
232struct nfs3_renameargs {
233	struct nfs_fh *		fromfh;
234	const char *		fromname;
235	unsigned int		fromlen;
236	struct nfs_fh *		tofh;
237	const char *		toname;
238	unsigned int		tolen;
239};
240
241struct nfs3_linkargs {
242	struct nfs_fh *		fromfh;
243	struct nfs_fh *		tofh;
244	const char *		toname;
245	unsigned int		tolen;
246};
247
248struct nfs3_readdirargs {
249	struct nfs_fh *		fh;
250	__u64			cookie;
251	__u32			verf[2];
252	int			plus;
253	unsigned int            count;
254	struct page **		pages;
255};
256
257struct nfs3_diropres {
258	struct nfs_fattr *	dir_attr;
259	struct nfs_fh *		fh;
260	struct nfs_fattr *	fattr;
261};
262
263struct nfs3_accessres {
264	struct nfs_fattr *	fattr;
265	__u32			access;
266};
267
268struct nfs3_readlinkargs {
269	struct nfs_fh *		fh;
270	unsigned int		count;
271	struct page **		pages;
272};
273
274struct nfs3_renameres {
275	struct nfs_fattr *	fromattr;
276	struct nfs_fattr *	toattr;
277};
278
279struct nfs3_linkres {
280	struct nfs_fattr *	dir_attr;
281	struct nfs_fattr *	fattr;
282};
283
284struct nfs3_readdirres {
285	struct nfs_fattr *	dir_attr;
286	__u32 *			verf;
287	int			plus;
288};
289
290/*
291 * RPC procedure vector for NFSv2/NFSv3 demuxing
292 */
293struct nfs_rpc_ops {
294	int	version;		/* Protocol version */
295
296	int	(*getroot) (struct nfs_server *, struct nfs_fh *,
297			    struct nfs_fattr *);
298	int	(*getattr) (struct inode *, struct nfs_fattr *);
299	int	(*setattr) (struct inode *, struct nfs_fattr *,
300			    struct iattr *);
301	int	(*lookup)  (struct inode *, struct qstr *,
302			    struct nfs_fh *, struct nfs_fattr *);
303	int	(*access)  (struct inode *, int , int);
304	int	(*readlink)(struct inode *, struct page *);
305	int	(*read)    (struct inode *, struct rpc_cred *,
306			    struct nfs_fattr *,
307			    int, unsigned int, unsigned int,
308			    struct page *, int *eofp);
309	int	(*write)   (struct inode *, struct rpc_cred *,
310			    struct nfs_fattr *,
311			    int, unsigned int, unsigned int,
312			    struct page *, struct nfs_writeverf *verfp);
313	int	(*commit)  (struct inode *, struct nfs_fattr *,
314			    unsigned long, unsigned int);
315	int	(*create)  (struct inode *, struct qstr *, struct iattr *,
316			    int, struct nfs_fh *, struct nfs_fattr *);
317	int	(*remove)  (struct inode *, struct qstr *);
318	int	(*unlink_setup)  (struct rpc_message *,
319			    struct dentry *, struct qstr *);
320	void	(*unlink_done) (struct dentry *, struct rpc_message *);
321	int	(*rename)  (struct inode *, struct qstr *,
322			    struct inode *, struct qstr *);
323	int	(*link)    (struct inode *, struct inode *, struct qstr *);
324	int	(*symlink) (struct inode *, struct qstr *, struct qstr *,
325			    struct iattr *, struct nfs_fh *,
326			    struct nfs_fattr *);
327	int	(*mkdir)   (struct inode *, struct qstr *, struct iattr *,
328			    struct nfs_fh *, struct nfs_fattr *);
329	int	(*rmdir)   (struct inode *, struct qstr *);
330	int	(*readdir) (struct inode *, struct rpc_cred *,
331			    u64, struct page *, unsigned int, int);
332	int	(*mknod)   (struct inode *, struct qstr *, struct iattr *,
333			    dev_t, struct nfs_fh *, struct nfs_fattr *);
334	int	(*statfs)  (struct nfs_server *, struct nfs_fh *,
335			    struct nfs_fsinfo *);
336	u32 *	(*decode_dirent)(u32 *, struct nfs_entry *, int plus);
337};
338
339/*
340 * 	NFS_CALL(getattr, inode, (fattr));
341 * into
342 *	NFS_PROTO(inode)->getattr(fattr);
343 */
344#define NFS_CALL(op, inode, args)	NFS_PROTO(inode)->op args
345
346/*
347 * Function vectors etc. for the NFS client
348 */
349extern struct nfs_rpc_ops	nfs_v2_clientops;
350extern struct nfs_rpc_ops	nfs_v3_clientops;
351extern struct rpc_version	nfs_version2;
352extern struct rpc_version	nfs_version3;
353extern struct rpc_program	nfs_program;
354extern struct rpc_stat		nfs_rpcstat;
355
356#endif
357