Loading fs/nfs/callback_xdr.c +8 −29 Original line number Original line Diff line number Diff line Loading @@ -535,35 +535,10 @@ static __be32 encode_string(struct xdr_stream *xdr, unsigned int len, const char return 0; return 0; } } #define CB_SUPPORTED_ATTR0 (FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE) static __be32 encode_attr_bitmap(struct xdr_stream *xdr, const uint32_t *bitmap, size_t sz) #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) { { __be32 bm[2]; if (xdr_stream_encode_uint32_array(xdr, bitmap, sz) < 0) __be32 *p; return cpu_to_be32(NFS4ERR_RESOURCE); 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; return 0; return 0; } } Loading Loading @@ -656,9 +631,13 @@ static __be32 encode_getattr_res(struct svc_rqst *rqstp, struct xdr_stream *xdr, if (unlikely(status != 0)) if (unlikely(status != 0)) goto out; 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)) if (unlikely(status != 0)) goto out; 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); status = encode_attr_change(xdr, res->bitmap, res->change_attr); if (unlikely(status != 0)) if (unlikely(status != 0)) goto out; goto out; Loading Loading
fs/nfs/callback_xdr.c +8 −29 Original line number Original line Diff line number Diff line Loading @@ -535,35 +535,10 @@ static __be32 encode_string(struct xdr_stream *xdr, unsigned int len, const char return 0; return 0; } } #define CB_SUPPORTED_ATTR0 (FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE) static __be32 encode_attr_bitmap(struct xdr_stream *xdr, const uint32_t *bitmap, size_t sz) #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) { { __be32 bm[2]; if (xdr_stream_encode_uint32_array(xdr, bitmap, sz) < 0) __be32 *p; return cpu_to_be32(NFS4ERR_RESOURCE); 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; return 0; return 0; } } Loading Loading @@ -656,9 +631,13 @@ static __be32 encode_getattr_res(struct svc_rqst *rqstp, struct xdr_stream *xdr, if (unlikely(status != 0)) if (unlikely(status != 0)) goto out; 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)) if (unlikely(status != 0)) goto out; 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); status = encode_attr_change(xdr, res->bitmap, res->change_attr); if (unlikely(status != 0)) if (unlikely(status != 0)) goto out; goto out; Loading