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