Skip to content

Commit adaa7a5

Browse files
committed
NFSD: Add encoders for NFSv4 clientids and verifiers
Deduplicate some common code. Signed-off-by: Chuck Lever <[email protected]>
1 parent 88e4d41 commit adaa7a5

File tree

1 file changed

+55
-52
lines changed

1 file changed

+55
-52
lines changed

fs/nfsd/nfs4xdr.c

Lines changed: 55 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3688,6 +3688,30 @@ nfsd4_encode_dirent(void *ccdv, const char *name, int namlen,
36883688
return -EINVAL;
36893689
}
36903690

3691+
static __be32
3692+
nfsd4_encode_verifier4(struct xdr_stream *xdr, const nfs4_verifier *verf)
3693+
{
3694+
__be32 *p;
3695+
3696+
p = xdr_reserve_space(xdr, NFS4_VERIFIER_SIZE);
3697+
if (!p)
3698+
return nfserr_resource;
3699+
memcpy(p, verf->data, sizeof(verf->data));
3700+
return nfs_ok;
3701+
}
3702+
3703+
static __be32
3704+
nfsd4_encode_clientid4(struct xdr_stream *xdr, const clientid_t *clientid)
3705+
{
3706+
__be32 *p;
3707+
3708+
p = xdr_reserve_space(xdr, sizeof(__be64));
3709+
if (!p)
3710+
return nfserr_resource;
3711+
memcpy(p, clientid, sizeof(*clientid));
3712+
return nfs_ok;
3713+
}
3714+
36913715
static __be32
36923716
nfsd4_encode_stateid(struct xdr_stream *xdr, stateid_t *sid)
36933717
{
@@ -3752,15 +3776,8 @@ nfsd4_encode_commit(struct nfsd4_compoundres *resp, __be32 nfserr,
37523776
union nfsd4_op_u *u)
37533777
{
37543778
struct nfsd4_commit *commit = &u->commit;
3755-
struct xdr_stream *xdr = resp->xdr;
3756-
__be32 *p;
37573779

3758-
p = xdr_reserve_space(xdr, NFS4_VERIFIER_SIZE);
3759-
if (!p)
3760-
return nfserr_resource;
3761-
p = xdr_encode_opaque_fixed(p, commit->co_verf.data,
3762-
NFS4_VERIFIER_SIZE);
3763-
return 0;
3780+
return nfsd4_encode_verifier4(resp->xdr, &commit->co_verf);
37643781
}
37653782

37663783
static __be32
@@ -4213,15 +4230,9 @@ nfsd4_encode_readdir(struct nfsd4_compoundres *resp, __be32 nfserr,
42134230
int starting_len = xdr->buf->len;
42144231
__be32 *p;
42154232

4216-
p = xdr_reserve_space(xdr, NFS4_VERIFIER_SIZE);
4217-
if (!p)
4218-
return nfserr_resource;
4219-
4220-
/* XXX: Following NFSv3, we ignore the READDIR verifier for now. */
4221-
*p++ = cpu_to_be32(0);
4222-
*p++ = cpu_to_be32(0);
4223-
xdr->buf->head[0].iov_len = (char *)xdr->p -
4224-
(char *)xdr->buf->head[0].iov_base;
4233+
nfserr = nfsd4_encode_verifier4(xdr, &readdir->rd_verf);
4234+
if (nfserr != nfs_ok)
4235+
return nfserr;
42254236

42264237
/*
42274238
* Number of bytes left for directory entries allowing for the
@@ -4448,23 +4459,25 @@ nfsd4_encode_setclientid(struct nfsd4_compoundres *resp, __be32 nfserr,
44484459
{
44494460
struct nfsd4_setclientid *scd = &u->setclientid;
44504461
struct xdr_stream *xdr = resp->xdr;
4451-
__be32 *p;
44524462

44534463
if (!nfserr) {
4454-
p = xdr_reserve_space(xdr, 8 + NFS4_VERIFIER_SIZE);
4455-
if (!p)
4456-
return nfserr_resource;
4457-
p = xdr_encode_opaque_fixed(p, &scd->se_clientid, 8);
4458-
p = xdr_encode_opaque_fixed(p, &scd->se_confirm,
4459-
NFS4_VERIFIER_SIZE);
4460-
}
4461-
else if (nfserr == nfserr_clid_inuse) {
4462-
p = xdr_reserve_space(xdr, 8);
4463-
if (!p)
4464-
return nfserr_resource;
4465-
*p++ = cpu_to_be32(0);
4466-
*p++ = cpu_to_be32(0);
4464+
nfserr = nfsd4_encode_clientid4(xdr, &scd->se_clientid);
4465+
if (nfserr != nfs_ok)
4466+
goto out;
4467+
nfserr = nfsd4_encode_verifier4(xdr, &scd->se_confirm);
4468+
} else if (nfserr == nfserr_clid_inuse) {
4469+
/* empty network id */
4470+
if (xdr_stream_encode_u32(xdr, 0) < 0) {
4471+
nfserr = nfserr_resource;
4472+
goto out;
4473+
}
4474+
/* empty universal address */
4475+
if (xdr_stream_encode_u32(xdr, 0) < 0) {
4476+
nfserr = nfserr_resource;
4477+
goto out;
4478+
}
44674479
}
4480+
out:
44684481
return nfserr;
44694482
}
44704483

@@ -4473,17 +4486,12 @@ nfsd4_encode_write(struct nfsd4_compoundres *resp, __be32 nfserr,
44734486
union nfsd4_op_u *u)
44744487
{
44754488
struct nfsd4_write *write = &u->write;
4476-
struct xdr_stream *xdr = resp->xdr;
4477-
__be32 *p;
44784489

4479-
p = xdr_reserve_space(xdr, 16);
4480-
if (!p)
4490+
if (xdr_stream_encode_u32(resp->xdr, write->wr_bytes_written) < 0)
44814491
return nfserr_resource;
4482-
*p++ = cpu_to_be32(write->wr_bytes_written);
4483-
*p++ = cpu_to_be32(write->wr_how_written);
4484-
p = xdr_encode_opaque_fixed(p, write->wr_verifier.data,
4485-
NFS4_VERIFIER_SIZE);
4486-
return 0;
4492+
if (xdr_stream_encode_u32(resp->xdr, write->wr_how_written) < 0)
4493+
return nfserr_resource;
4494+
return nfsd4_encode_verifier4(resp->xdr, &write->wr_verifier);
44874495
}
44884496

44894497
static __be32
@@ -4505,20 +4513,15 @@ nfsd4_encode_exchange_id(struct nfsd4_compoundres *resp, __be32 nfserr,
45054513
server_scope = nn->nfsd_name;
45064514
server_scope_sz = strlen(nn->nfsd_name);
45074515

4508-
p = xdr_reserve_space(xdr,
4509-
8 /* eir_clientid */ +
4510-
4 /* eir_sequenceid */ +
4511-
4 /* eir_flags */ +
4512-
4 /* spr_how */);
4513-
if (!p)
4516+
if (nfsd4_encode_clientid4(xdr, &exid->clientid) != nfs_ok)
4517+
return nfserr_resource;
4518+
if (xdr_stream_encode_u32(xdr, exid->seqid) < 0)
4519+
return nfserr_resource;
4520+
if (xdr_stream_encode_u32(xdr, exid->flags) < 0)
45144521
return nfserr_resource;
45154522

4516-
p = xdr_encode_opaque_fixed(p, &exid->clientid, 8);
4517-
*p++ = cpu_to_be32(exid->seqid);
4518-
*p++ = cpu_to_be32(exid->flags);
4519-
4520-
*p++ = cpu_to_be32(exid->spa_how);
4521-
4523+
if (xdr_stream_encode_u32(xdr, exid->spa_how) < 0)
4524+
return nfserr_resource;
45224525
switch (exid->spa_how) {
45234526
case SP4_NONE:
45244527
break;

0 commit comments

Comments
 (0)