NFSD: Update the NFSv3 FSSTAT3res encoder to use struct xdr_stream
[ Upstream commit 8b7044984fd6eeadf72285e3617116bd15e9e676 ] Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
066dc317fa
commit
f6908e2bcd
@@ -17,6 +17,13 @@
|
|||||||
#define NFSDDBG_FACILITY NFSDDBG_XDR
|
#define NFSDDBG_FACILITY NFSDDBG_XDR
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Force construction of an empty post-op attr
|
||||||
|
*/
|
||||||
|
static const struct svc_fh nfs3svc_null_fh = {
|
||||||
|
.fh_no_wcc = true,
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mapping of S_IF* types to NFS file types
|
* Mapping of S_IF* types to NFS file types
|
||||||
*/
|
*/
|
||||||
@@ -1392,27 +1399,50 @@ nfs3svc_encode_entry_plus(void *cd, const char *name,
|
|||||||
return encode_entry(cd, name, namlen, offset, ino, d_type, 1);
|
return encode_entry(cd, name, namlen, offset, ino, d_type, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
svcxdr_encode_fsstat3resok(struct xdr_stream *xdr,
|
||||||
|
const struct nfsd3_fsstatres *resp)
|
||||||
|
{
|
||||||
|
const struct kstatfs *s = &resp->stats;
|
||||||
|
u64 bs = s->f_bsize;
|
||||||
|
__be32 *p;
|
||||||
|
|
||||||
|
p = xdr_reserve_space(xdr, XDR_UNIT * 13);
|
||||||
|
if (!p)
|
||||||
|
return false;
|
||||||
|
p = xdr_encode_hyper(p, bs * s->f_blocks); /* total bytes */
|
||||||
|
p = xdr_encode_hyper(p, bs * s->f_bfree); /* free bytes */
|
||||||
|
p = xdr_encode_hyper(p, bs * s->f_bavail); /* user available bytes */
|
||||||
|
p = xdr_encode_hyper(p, s->f_files); /* total inodes */
|
||||||
|
p = xdr_encode_hyper(p, s->f_ffree); /* free inodes */
|
||||||
|
p = xdr_encode_hyper(p, s->f_ffree); /* user available inodes */
|
||||||
|
*p = cpu_to_be32(resp->invarsec); /* mean unchanged time */
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/* FSSTAT */
|
/* FSSTAT */
|
||||||
int
|
int
|
||||||
nfs3svc_encode_fsstatres(struct svc_rqst *rqstp, __be32 *p)
|
nfs3svc_encode_fsstatres(struct svc_rqst *rqstp, __be32 *p)
|
||||||
{
|
{
|
||||||
|
struct xdr_stream *xdr = &rqstp->rq_res_stream;
|
||||||
struct nfsd3_fsstatres *resp = rqstp->rq_resp;
|
struct nfsd3_fsstatres *resp = rqstp->rq_resp;
|
||||||
struct kstatfs *s = &resp->stats;
|
|
||||||
u64 bs = s->f_bsize;
|
|
||||||
|
|
||||||
*p++ = resp->status;
|
if (!svcxdr_encode_nfsstat3(xdr, resp->status))
|
||||||
*p++ = xdr_zero; /* no post_op_attr */
|
return 0;
|
||||||
|
switch (resp->status) {
|
||||||
if (resp->status == 0) {
|
case nfs_ok:
|
||||||
p = xdr_encode_hyper(p, bs * s->f_blocks); /* total bytes */
|
if (!svcxdr_encode_post_op_attr(rqstp, xdr, &nfs3svc_null_fh))
|
||||||
p = xdr_encode_hyper(p, bs * s->f_bfree); /* free bytes */
|
return 0;
|
||||||
p = xdr_encode_hyper(p, bs * s->f_bavail); /* user available bytes */
|
if (!svcxdr_encode_fsstat3resok(xdr, resp))
|
||||||
p = xdr_encode_hyper(p, s->f_files); /* total inodes */
|
return 0;
|
||||||
p = xdr_encode_hyper(p, s->f_ffree); /* free inodes */
|
break;
|
||||||
p = xdr_encode_hyper(p, s->f_ffree); /* user available inodes */
|
default:
|
||||||
*p++ = htonl(resp->invarsec); /* mean unchanged time */
|
if (!svcxdr_encode_post_op_attr(rqstp, xdr, &nfs3svc_null_fh))
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
return xdr_ressize_check(rqstp, p);
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FSINFO */
|
/* FSINFO */
|
||||||
|
Reference in New Issue
Block a user