/* * See paragraph 5 of RFC 8881 S18.40.3.
*/ if (!gdp->gd_maxcount) { if (xdr_stream_encode_u32(xdr, 0) != XDR_UNIT) return nfserr_resource; return nfs_ok;
}
p = xdr_reserve_space(xdr, len + sizeof(__be32)); if (!p) return nfserr_resource;
for (i = 0; i < dev->nr_volumes; i++) {
ret = nfsd4_block_encode_volume(xdr, &dev->volumes[i]); if (ret < 0) return nfserrno(ret);
len += ret;
}
/* * Fill in the overall length and number of volumes at the beginning * of the layout.
*/
*p++ = cpu_to_be32(len);
*p++ = cpu_to_be32(dev->nr_volumes); return 0;
}
/** * nfsd4_block_decode_layoutupdate - decode the block layout extent array * @xdr: subbuf set to the encoded array * @iomapp: pointer to store the decoded extent array * @nr_iomapsp: pointer to store the number of extents * @block_size: alignment of extent offset and length * * This function decodes the opaque field of the layoutupdate4 structure * in a layoutcommit request for the block layout driver. The field is * actually an array of extents sent by the client. It also checks that * the file offset, storage offset and length of each extent are aligned * by @block_size. * * Return values: * %nfs_ok: Successful decoding, @iomapp and @nr_iomapsp are valid * %nfserr_bad_xdr: The encoded array in @xdr is invalid * %nfserr_inval: An unaligned extent found * %nfserr_delay: Failed to allocate memory for @iomapp
*/
__be32
nfsd4_block_decode_layoutupdate(struct xdr_stream *xdr, struct iomap **iomapp, int *nr_iomapsp, u32 block_size)
{ struct iomap *iomaps;
u32 nr_iomaps, expected, len, i;
__be32 nfserr;
if (xdr_stream_decode_u32(xdr, &nr_iomaps)) return nfserr_bad_xdr;
len = sizeof(__be32) + xdr_stream_remaining(xdr);
expected = sizeof(__be32) + nr_iomaps * PNFS_BLOCK_EXTENT_SIZE; if (len != expected) return nfserr_bad_xdr;
iomaps = kcalloc(nr_iomaps, sizeof(*iomaps), GFP_KERNEL); if (!iomaps) return nfserr_delay;
for (i = 0; i < nr_iomaps; i++) { struct pnfs_block_extent bex;
if (nfsd4_decode_deviceid4(xdr, &bex.vol_id)) {
nfserr = nfserr_bad_xdr; goto fail;
}
/** * nfsd4_scsi_decode_layoutupdate - decode the scsi layout extent array * @xdr: subbuf set to the encoded array * @iomapp: pointer to store the decoded extent array * @nr_iomapsp: pointer to store the number of extents * @block_size: alignment of extent offset and length * * This function decodes the opaque field of the layoutupdate4 structure * in a layoutcommit request for the scsi layout driver. The field is * actually an array of extents sent by the client. It also checks that * the offset and length of each extent are aligned by @block_size. * * Return values: * %nfs_ok: Successful decoding, @iomapp and @nr_iomapsp are valid * %nfserr_bad_xdr: The encoded array in @xdr is invalid * %nfserr_inval: An unaligned extent found * %nfserr_delay: Failed to allocate memory for @iomapp
*/
__be32
nfsd4_scsi_decode_layoutupdate(struct xdr_stream *xdr, struct iomap **iomapp, int *nr_iomapsp, u32 block_size)
{ struct iomap *iomaps;
u32 nr_iomaps, expected, len, i;
__be32 nfserr;
if (xdr_stream_decode_u32(xdr, &nr_iomaps)) return nfserr_bad_xdr;
len = sizeof(__be32) + xdr_stream_remaining(xdr);
expected = sizeof(__be32) + nr_iomaps * PNFS_SCSI_RANGE_SIZE; if (len != expected) return nfserr_bad_xdr;
iomaps = kcalloc(nr_iomaps, sizeof(*iomaps), GFP_KERNEL); if (!iomaps) return nfserr_delay;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.