mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	NFSD: Add common helpers to decode void args and encode void results
Start off the conversion to xdr_stream by de-duplicating the functions that decode void arguments and encode void results. Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
		
							parent
							
								
									5191955d6f
								
							
						
					
					
						commit
						788f7183fb
					
				
					 13 changed files with 64 additions and 86 deletions
				
			
		| 
						 | 
				
			
			@ -185,10 +185,6 @@ static __be32 nfsacld_proc_access(struct svc_rqst *rqstp)
 | 
			
		|||
/*
 | 
			
		||||
 * XDR decode functions
 | 
			
		||||
 */
 | 
			
		||||
static int nfsaclsvc_decode_voidarg(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		||||
{
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int nfsaclsvc_decode_getaclargs(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -255,15 +251,6 @@ static int nfsaclsvc_decode_accessargs(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		|||
 * XDR encode functions
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * There must be an encoding function for void results so svc_process
 | 
			
		||||
 * will work properly.
 | 
			
		||||
 */
 | 
			
		||||
static int nfsaclsvc_encode_voidres(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		||||
{
 | 
			
		||||
	return xdr_ressize_check(rqstp, p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* GETACL */
 | 
			
		||||
static int nfsaclsvc_encode_getaclres(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -378,10 +365,10 @@ struct nfsd3_voidargs { int dummy; };
 | 
			
		|||
static const struct svc_procedure nfsd_acl_procedures2[5] = {
 | 
			
		||||
	[ACLPROC2_NULL] = {
 | 
			
		||||
		.pc_func = nfsacld_proc_null,
 | 
			
		||||
		.pc_decode = nfsaclsvc_decode_voidarg,
 | 
			
		||||
		.pc_encode = nfsaclsvc_encode_voidres,
 | 
			
		||||
		.pc_argsize = sizeof(struct nfsd3_voidargs),
 | 
			
		||||
		.pc_ressize = sizeof(struct nfsd3_voidargs),
 | 
			
		||||
		.pc_decode = nfssvc_decode_voidarg,
 | 
			
		||||
		.pc_encode = nfssvc_encode_voidres,
 | 
			
		||||
		.pc_argsize = sizeof(struct nfsd_voidargs),
 | 
			
		||||
		.pc_ressize = sizeof(struct nfsd_voidres),
 | 
			
		||||
		.pc_cachetype = RC_NOCACHE,
 | 
			
		||||
		.pc_xdrressize = ST,
 | 
			
		||||
	},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -245,10 +245,10 @@ struct nfsd3_voidargs { int dummy; };
 | 
			
		|||
static const struct svc_procedure nfsd_acl_procedures3[3] = {
 | 
			
		||||
	[ACLPROC3_NULL] = {
 | 
			
		||||
		.pc_func = nfsd3_proc_null,
 | 
			
		||||
		.pc_decode = nfs3svc_decode_voidarg,
 | 
			
		||||
		.pc_encode = nfs3svc_encode_voidres,
 | 
			
		||||
		.pc_argsize = sizeof(struct nfsd3_voidargs),
 | 
			
		||||
		.pc_ressize = sizeof(struct nfsd3_voidargs),
 | 
			
		||||
		.pc_decode = nfssvc_decode_voidarg,
 | 
			
		||||
		.pc_encode = nfssvc_encode_voidres,
 | 
			
		||||
		.pc_argsize = sizeof(struct nfsd_voidargs),
 | 
			
		||||
		.pc_ressize = sizeof(struct nfsd_voidres),
 | 
			
		||||
		.pc_cachetype = RC_NOCACHE,
 | 
			
		||||
		.pc_xdrressize = ST,
 | 
			
		||||
	},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -692,8 +692,6 @@ nfsd3_proc_commit(struct svc_rqst *rqstp)
 | 
			
		|||
#define nfsd3_attrstatres		nfsd3_attrstat
 | 
			
		||||
#define nfsd3_wccstatres		nfsd3_attrstat
 | 
			
		||||
#define nfsd3_createres			nfsd3_diropres
 | 
			
		||||
#define nfsd3_voidres			nfsd3_voidargs
 | 
			
		||||
struct nfsd3_voidargs { int dummy; };
 | 
			
		||||
 | 
			
		||||
#define ST 1		/* status*/
 | 
			
		||||
#define FH 17		/* filehandle with length */
 | 
			
		||||
| 
						 | 
				
			
			@ -704,10 +702,10 @@ struct nfsd3_voidargs { int dummy; };
 | 
			
		|||
static const struct svc_procedure nfsd_procedures3[22] = {
 | 
			
		||||
	[NFS3PROC_NULL] = {
 | 
			
		||||
		.pc_func = nfsd3_proc_null,
 | 
			
		||||
		.pc_decode = nfs3svc_decode_voidarg,
 | 
			
		||||
		.pc_encode = nfs3svc_encode_voidres,
 | 
			
		||||
		.pc_argsize = sizeof(struct nfsd3_voidargs),
 | 
			
		||||
		.pc_ressize = sizeof(struct nfsd3_voidres),
 | 
			
		||||
		.pc_decode = nfssvc_decode_voidarg,
 | 
			
		||||
		.pc_encode = nfssvc_encode_voidres,
 | 
			
		||||
		.pc_argsize = sizeof(struct nfsd_voidargs),
 | 
			
		||||
		.pc_ressize = sizeof(struct nfsd_voidres),
 | 
			
		||||
		.pc_cachetype = RC_NOCACHE,
 | 
			
		||||
		.pc_xdrressize = ST,
 | 
			
		||||
	},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -304,11 +304,6 @@ void fill_post_wcc(struct svc_fh *fhp)
 | 
			
		|||
/*
 | 
			
		||||
 * XDR decode functions
 | 
			
		||||
 */
 | 
			
		||||
int
 | 
			
		||||
nfs3svc_decode_voidarg(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		||||
{
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
nfs3svc_decode_fhandle(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		||||
| 
						 | 
				
			
			@ -642,12 +637,6 @@ nfs3svc_decode_commitargs(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		|||
 * XDR encode functions
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
nfs3svc_encode_voidres(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		||||
{
 | 
			
		||||
	return xdr_ressize_check(rqstp, p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* GETATTR */
 | 
			
		||||
int
 | 
			
		||||
nfs3svc_encode_attrstat(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3295,16 +3295,13 @@ static const char *nfsd4_op_name(unsigned opnum)
 | 
			
		|||
	return "unknown_operation";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define nfsd4_voidres			nfsd4_voidargs
 | 
			
		||||
struct nfsd4_voidargs { int dummy; };
 | 
			
		||||
 | 
			
		||||
static const struct svc_procedure nfsd_procedures4[2] = {
 | 
			
		||||
	[NFSPROC4_NULL] = {
 | 
			
		||||
		.pc_func = nfsd4_proc_null,
 | 
			
		||||
		.pc_decode = nfs4svc_decode_voidarg,
 | 
			
		||||
		.pc_encode = nfs4svc_encode_voidres,
 | 
			
		||||
		.pc_argsize = sizeof(struct nfsd4_voidargs),
 | 
			
		||||
		.pc_ressize = sizeof(struct nfsd4_voidres),
 | 
			
		||||
		.pc_decode = nfssvc_decode_voidarg,
 | 
			
		||||
		.pc_encode = nfssvc_encode_voidres,
 | 
			
		||||
		.pc_argsize = sizeof(struct nfsd_voidargs),
 | 
			
		||||
		.pc_ressize = sizeof(struct nfsd_voidres),
 | 
			
		||||
		.pc_cachetype = RC_NOCACHE,
 | 
			
		||||
		.pc_xdrressize = 1,
 | 
			
		||||
	},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5271,12 +5271,6 @@ nfsd4_encode_replay(struct xdr_stream *xdr, struct nfsd4_op *op)
 | 
			
		|||
	p = xdr_encode_opaque_fixed(p, rp->rp_buf, rp->rp_buflen);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
nfs4svc_encode_voidres(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		||||
{
 | 
			
		||||
        return xdr_ressize_check(rqstp, p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nfsd4_release_compoundargs(struct svc_rqst *rqstp)
 | 
			
		||||
{
 | 
			
		||||
	struct nfsd4_compoundargs *args = rqstp->rq_argp;
 | 
			
		||||
| 
						 | 
				
			
			@ -5294,12 +5288,6 @@ void nfsd4_release_compoundargs(struct svc_rqst *rqstp)
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
nfs4svc_decode_voidarg(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		||||
{
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
nfs4svc_decode_compoundargs(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -73,6 +73,14 @@ extern unsigned long		nfsd_drc_mem_used;
 | 
			
		|||
 | 
			
		||||
extern const struct seq_operations nfs_exports_op;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Common void argument and result helpers
 | 
			
		||||
 */
 | 
			
		||||
struct nfsd_voidargs { };
 | 
			
		||||
struct nfsd_voidres { };
 | 
			
		||||
int		nfssvc_decode_voidarg(struct svc_rqst *rqstp, __be32 *p);
 | 
			
		||||
int		nfssvc_encode_voidres(struct svc_rqst *rqstp, __be32 *p);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Function prototypes.
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -609,7 +609,6 @@ nfsd_proc_statfs(struct svc_rqst *rqstp)
 | 
			
		|||
 * NFSv2 Server procedures.
 | 
			
		||||
 * Only the results of non-idempotent operations are cached.
 | 
			
		||||
 */
 | 
			
		||||
struct nfsd_void { int dummy; };
 | 
			
		||||
 | 
			
		||||
#define ST 1		/* status */
 | 
			
		||||
#define FH 8		/* filehandle */
 | 
			
		||||
| 
						 | 
				
			
			@ -618,10 +617,10 @@ struct nfsd_void { int dummy; };
 | 
			
		|||
static const struct svc_procedure nfsd_procedures2[18] = {
 | 
			
		||||
	[NFSPROC_NULL] = {
 | 
			
		||||
		.pc_func = nfsd_proc_null,
 | 
			
		||||
		.pc_decode = nfssvc_decode_void,
 | 
			
		||||
		.pc_encode = nfssvc_encode_void,
 | 
			
		||||
		.pc_argsize = sizeof(struct nfsd_void),
 | 
			
		||||
		.pc_ressize = sizeof(struct nfsd_void),
 | 
			
		||||
		.pc_decode = nfssvc_decode_voidarg,
 | 
			
		||||
		.pc_encode = nfssvc_encode_voidres,
 | 
			
		||||
		.pc_argsize = sizeof(struct nfsd_voidargs),
 | 
			
		||||
		.pc_ressize = sizeof(struct nfsd_voidres),
 | 
			
		||||
		.pc_cachetype = RC_NOCACHE,
 | 
			
		||||
		.pc_xdrressize = 0,
 | 
			
		||||
	},
 | 
			
		||||
| 
						 | 
				
			
			@ -647,10 +646,10 @@ static const struct svc_procedure nfsd_procedures2[18] = {
 | 
			
		|||
	},
 | 
			
		||||
	[NFSPROC_ROOT] = {
 | 
			
		||||
		.pc_func = nfsd_proc_root,
 | 
			
		||||
		.pc_decode = nfssvc_decode_void,
 | 
			
		||||
		.pc_encode = nfssvc_encode_void,
 | 
			
		||||
		.pc_argsize = sizeof(struct nfsd_void),
 | 
			
		||||
		.pc_ressize = sizeof(struct nfsd_void),
 | 
			
		||||
		.pc_decode = nfssvc_decode_voidarg,
 | 
			
		||||
		.pc_encode = nfssvc_encode_voidres,
 | 
			
		||||
		.pc_argsize = sizeof(struct nfsd_voidargs),
 | 
			
		||||
		.pc_ressize = sizeof(struct nfsd_voidres),
 | 
			
		||||
		.pc_cachetype = RC_NOCACHE,
 | 
			
		||||
		.pc_xdrressize = 0,
 | 
			
		||||
	},
 | 
			
		||||
| 
						 | 
				
			
			@ -685,10 +684,10 @@ static const struct svc_procedure nfsd_procedures2[18] = {
 | 
			
		|||
	},
 | 
			
		||||
	[NFSPROC_WRITECACHE] = {
 | 
			
		||||
		.pc_func = nfsd_proc_writecache,
 | 
			
		||||
		.pc_decode = nfssvc_decode_void,
 | 
			
		||||
		.pc_encode = nfssvc_encode_void,
 | 
			
		||||
		.pc_argsize = sizeof(struct nfsd_void),
 | 
			
		||||
		.pc_ressize = sizeof(struct nfsd_void),
 | 
			
		||||
		.pc_decode = nfssvc_decode_voidarg,
 | 
			
		||||
		.pc_encode = nfssvc_encode_voidres,
 | 
			
		||||
		.pc_argsize = sizeof(struct nfsd_voidargs),
 | 
			
		||||
		.pc_ressize = sizeof(struct nfsd_voidres),
 | 
			
		||||
		.pc_cachetype = RC_NOCACHE,
 | 
			
		||||
		.pc_xdrressize = 0,
 | 
			
		||||
	},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1075,6 +1075,34 @@ int nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp)
 | 
			
		|||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * nfssvc_decode_voidarg - Decode void arguments
 | 
			
		||||
 * @rqstp: Server RPC transaction context
 | 
			
		||||
 * @p: buffer containing arguments to decode
 | 
			
		||||
 *
 | 
			
		||||
 * Return values:
 | 
			
		||||
 *   %0: Arguments were not valid
 | 
			
		||||
 *   %1: Decoding was successful
 | 
			
		||||
 */
 | 
			
		||||
int nfssvc_decode_voidarg(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		||||
{
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * nfssvc_encode_voidres - Encode void results
 | 
			
		||||
 * @rqstp: Server RPC transaction context
 | 
			
		||||
 * @p: buffer in which to encode results
 | 
			
		||||
 *
 | 
			
		||||
 * Return values:
 | 
			
		||||
 *   %0: Local error while encoding
 | 
			
		||||
 *   %1: Encoding was successful
 | 
			
		||||
 */
 | 
			
		||||
int nfssvc_encode_voidres(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		||||
{
 | 
			
		||||
        return xdr_ressize_check(rqstp, p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int nfsd_pool_stats_open(struct inode *inode, struct file *file)
 | 
			
		||||
{
 | 
			
		||||
	int ret;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -192,11 +192,6 @@ __be32 *nfs2svc_encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *f
 | 
			
		|||
/*
 | 
			
		||||
 * XDR decode functions
 | 
			
		||||
 */
 | 
			
		||||
int
 | 
			
		||||
nfssvc_decode_void(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		||||
{
 | 
			
		||||
	return xdr_argsize_check(rqstp, p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
nfssvc_decode_fhandle(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		||||
| 
						 | 
				
			
			@ -423,11 +418,6 @@ nfssvc_decode_readdirargs(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		|||
/*
 | 
			
		||||
 * XDR encode functions
 | 
			
		||||
 */
 | 
			
		||||
int
 | 
			
		||||
nfssvc_encode_void(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		||||
{
 | 
			
		||||
	return xdr_ressize_check(rqstp, p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
nfssvc_encode_stat(struct svc_rqst *rqstp, __be32 *p)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -144,7 +144,6 @@ union nfsd_xdrstore {
 | 
			
		|||
#define NFS2_SVC_XDRSIZE	sizeof(union nfsd_xdrstore)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int nfssvc_decode_void(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfssvc_decode_fhandle(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfssvc_decode_sattrargs(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfssvc_decode_diropargs(struct svc_rqst *, __be32 *);
 | 
			
		||||
| 
						 | 
				
			
			@ -156,7 +155,6 @@ int nfssvc_decode_readlinkargs(struct svc_rqst *, __be32 *);
 | 
			
		|||
int nfssvc_decode_linkargs(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfssvc_decode_symlinkargs(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfssvc_decode_readdirargs(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfssvc_encode_void(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfssvc_encode_stat(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfssvc_encode_attrstat(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfssvc_encode_diropres(struct svc_rqst *, __be32 *);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -273,7 +273,6 @@ union nfsd3_xdrstore {
 | 
			
		|||
 | 
			
		||||
#define NFS3_SVC_XDRSIZE		sizeof(union nfsd3_xdrstore)
 | 
			
		||||
 | 
			
		||||
int nfs3svc_decode_voidarg(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfs3svc_decode_fhandle(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfs3svc_decode_sattrargs(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfs3svc_decode_diropargs(struct svc_rqst *, __be32 *);
 | 
			
		||||
| 
						 | 
				
			
			@ -290,7 +289,6 @@ int nfs3svc_decode_symlinkargs(struct svc_rqst *, __be32 *);
 | 
			
		|||
int nfs3svc_decode_readdirargs(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfs3svc_decode_readdirplusargs(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfs3svc_decode_commitargs(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfs3svc_encode_voidres(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfs3svc_encode_attrstat(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfs3svc_encode_wccstat(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfs3svc_encode_diropres(struct svc_rqst *, __be32 *);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -781,8 +781,6 @@ set_change_info(struct nfsd4_change_info *cinfo, struct svc_fh *fhp)
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
bool nfsd4_mach_creds_match(struct nfs4_client *cl, struct svc_rqst *rqstp);
 | 
			
		||||
int nfs4svc_decode_voidarg(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfs4svc_encode_voidres(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfs4svc_decode_compoundargs(struct svc_rqst *, __be32 *);
 | 
			
		||||
int nfs4svc_encode_compoundres(struct svc_rqst *, __be32 *);
 | 
			
		||||
__be32 nfsd4_check_resp_size(struct nfsd4_compoundres *, u32);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue