1/* XDR types for nfsd. This is mainly a typing exercise. */
2
3#ifndef LINUX_NFSD_H
4#define LINUX_NFSD_H
5
6#include <linux/vfs.h>
7#include "nfsd.h"
8#include "nfsfh.h"
9
10struct nfsd_fhandle {
11	struct svc_fh		fh;
12};
13
14struct nfsd_sattrargs {
15	struct svc_fh		fh;
16	struct iattr		attrs;
17};
18
19struct nfsd_diropargs {
20	struct svc_fh		fh;
21	char *			name;
22	unsigned int		len;
23};
24
25struct nfsd_readargs {
26	struct svc_fh		fh;
27	__u32			offset;
28	__u32			count;
29	int			vlen;
30};
31
32struct nfsd_writeargs {
33	svc_fh			fh;
34	__u32			offset;
35	int			len;
36	int			vlen;
37};
38
39struct nfsd_createargs {
40	struct svc_fh		fh;
41	char *			name;
42	unsigned int		len;
43	struct iattr		attrs;
44};
45
46struct nfsd_renameargs {
47	struct svc_fh		ffh;
48	char *			fname;
49	unsigned int		flen;
50	struct svc_fh		tfh;
51	char *			tname;
52	unsigned int		tlen;
53};
54
55struct nfsd_readlinkargs {
56	struct svc_fh		fh;
57	char *			buffer;
58};
59
60struct nfsd_linkargs {
61	struct svc_fh		ffh;
62	struct svc_fh		tfh;
63	char *			tname;
64	unsigned int		tlen;
65};
66
67struct nfsd_symlinkargs {
68	struct svc_fh		ffh;
69	char *			fname;
70	unsigned int		flen;
71	char *			tname;
72	unsigned int		tlen;
73	struct iattr		attrs;
74};
75
76struct nfsd_readdirargs {
77	struct svc_fh		fh;
78	__u32			cookie;
79	__u32			count;
80	__be32 *		buffer;
81};
82
83struct nfsd_attrstat {
84	struct svc_fh		fh;
85	struct kstat		stat;
86};
87
88struct nfsd_diropres  {
89	struct svc_fh		fh;
90	struct kstat		stat;
91};
92
93struct nfsd_readlinkres {
94	int			len;
95};
96
97struct nfsd_readres {
98	struct svc_fh		fh;
99	unsigned long		count;
100	struct kstat		stat;
101};
102
103struct nfsd_readdirres {
104	int			count;
105
106	struct readdir_cd	common;
107	__be32 *		buffer;
108	int			buflen;
109	__be32 *		offset;
110};
111
112struct nfsd_statfsres {
113	struct kstatfs		stats;
114};
115
116/*
117 * Storage requirements for XDR arguments and results.
118 */
119union nfsd_xdrstore {
120	struct nfsd_sattrargs	sattr;
121	struct nfsd_diropargs	dirop;
122	struct nfsd_readargs	read;
123	struct nfsd_writeargs	write;
124	struct nfsd_createargs	create;
125	struct nfsd_renameargs	rename;
126	struct nfsd_linkargs	link;
127	struct nfsd_symlinkargs	symlink;
128	struct nfsd_readdirargs	readdir;
129};
130
131#define NFS2_SVC_XDRSIZE	sizeof(union nfsd_xdrstore)
132
133
134int nfssvc_decode_void(struct svc_rqst *, __be32 *, void *);
135int nfssvc_decode_fhandle(struct svc_rqst *, __be32 *, struct nfsd_fhandle *);
136int nfssvc_decode_sattrargs(struct svc_rqst *, __be32 *,
137				struct nfsd_sattrargs *);
138int nfssvc_decode_diropargs(struct svc_rqst *, __be32 *,
139				struct nfsd_diropargs *);
140int nfssvc_decode_readargs(struct svc_rqst *, __be32 *,
141				struct nfsd_readargs *);
142int nfssvc_decode_writeargs(struct svc_rqst *, __be32 *,
143				struct nfsd_writeargs *);
144int nfssvc_decode_createargs(struct svc_rqst *, __be32 *,
145				struct nfsd_createargs *);
146int nfssvc_decode_renameargs(struct svc_rqst *, __be32 *,
147				struct nfsd_renameargs *);
148int nfssvc_decode_readlinkargs(struct svc_rqst *, __be32 *,
149				struct nfsd_readlinkargs *);
150int nfssvc_decode_linkargs(struct svc_rqst *, __be32 *,
151				struct nfsd_linkargs *);
152int nfssvc_decode_symlinkargs(struct svc_rqst *, __be32 *,
153				struct nfsd_symlinkargs *);
154int nfssvc_decode_readdirargs(struct svc_rqst *, __be32 *,
155				struct nfsd_readdirargs *);
156int nfssvc_encode_void(struct svc_rqst *, __be32 *, void *);
157int nfssvc_encode_attrstat(struct svc_rqst *, __be32 *, struct nfsd_attrstat *);
158int nfssvc_encode_diropres(struct svc_rqst *, __be32 *, struct nfsd_diropres *);
159int nfssvc_encode_readlinkres(struct svc_rqst *, __be32 *, struct nfsd_readlinkres *);
160int nfssvc_encode_readres(struct svc_rqst *, __be32 *, struct nfsd_readres *);
161int nfssvc_encode_statfsres(struct svc_rqst *, __be32 *, struct nfsd_statfsres *);
162int nfssvc_encode_readdirres(struct svc_rqst *, __be32 *, struct nfsd_readdirres *);
163
164int nfssvc_encode_entry(void *, const char *name,
165			int namlen, loff_t offset, u64 ino, unsigned int);
166
167int nfssvc_release_fhandle(struct svc_rqst *, __be32 *, struct nfsd_fhandle *);
168
169/* Helper functions for NFSv2 ACL code */
170__be32 *nfs2svc_encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp);
171__be32 *nfs2svc_decode_fh(__be32 *p, struct svc_fh *fhp);
172
173#endif /* LINUX_NFSD_H */
174