mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-19 04:14:49 +08:00
NFSv4: Clean up CB_GETATTR encoding
Replace the open coded bitmap implementation with a generic one. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
8bcbe7d98c
commit
8b06494624
@ -535,35 +535,10 @@ static __be32 encode_string(struct xdr_stream *xdr, unsigned int len, const char
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define CB_SUPPORTED_ATTR0 (FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE)
|
||||
#define CB_SUPPORTED_ATTR1 (FATTR4_WORD1_TIME_METADATA|FATTR4_WORD1_TIME_MODIFY)
|
||||
static __be32 encode_attr_bitmap(struct xdr_stream *xdr, const uint32_t *bitmap, __be32 **savep)
|
||||
static __be32 encode_attr_bitmap(struct xdr_stream *xdr, const uint32_t *bitmap, size_t sz)
|
||||
{
|
||||
__be32 bm[2];
|
||||
__be32 *p;
|
||||
|
||||
bm[0] = htonl(bitmap[0] & CB_SUPPORTED_ATTR0);
|
||||
bm[1] = htonl(bitmap[1] & CB_SUPPORTED_ATTR1);
|
||||
if (bm[1] != 0) {
|
||||
p = xdr_reserve_space(xdr, 16);
|
||||
if (unlikely(p == NULL))
|
||||
return htonl(NFS4ERR_RESOURCE);
|
||||
*p++ = htonl(2);
|
||||
*p++ = bm[0];
|
||||
*p++ = bm[1];
|
||||
} else if (bm[0] != 0) {
|
||||
p = xdr_reserve_space(xdr, 12);
|
||||
if (unlikely(p == NULL))
|
||||
return htonl(NFS4ERR_RESOURCE);
|
||||
*p++ = htonl(1);
|
||||
*p++ = bm[0];
|
||||
} else {
|
||||
p = xdr_reserve_space(xdr, 8);
|
||||
if (unlikely(p == NULL))
|
||||
return htonl(NFS4ERR_RESOURCE);
|
||||
*p++ = htonl(0);
|
||||
}
|
||||
*savep = p;
|
||||
if (xdr_stream_encode_uint32_array(xdr, bitmap, sz) < 0)
|
||||
return cpu_to_be32(NFS4ERR_RESOURCE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -656,9 +631,13 @@ static __be32 encode_getattr_res(struct svc_rqst *rqstp, struct xdr_stream *xdr,
|
||||
|
||||
if (unlikely(status != 0))
|
||||
goto out;
|
||||
status = encode_attr_bitmap(xdr, res->bitmap, &savep);
|
||||
status = encode_attr_bitmap(xdr, res->bitmap, ARRAY_SIZE(res->bitmap));
|
||||
if (unlikely(status != 0))
|
||||
goto out;
|
||||
status = cpu_to_be32(NFS4ERR_RESOURCE);
|
||||
savep = xdr_reserve_space(xdr, sizeof(*savep));
|
||||
if (unlikely(!savep))
|
||||
goto out;
|
||||
status = encode_attr_change(xdr, res->bitmap, res->change_attr);
|
||||
if (unlikely(status != 0))
|
||||
goto out;
|
||||
|
Loading…
Reference in New Issue
Block a user