blocklayoutxdr.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _NFSD_BLOCKLAYOUTXDR_H
  3. #define _NFSD_BLOCKLAYOUTXDR_H 1
  4. #include <linux/blkdev.h>
  5. #include "xdr4.h"
  6. struct iomap;
  7. struct xdr_stream;
  8. /* On the wire size of the layout4 struct with zero number of extents */
  9. #define PNFS_BLOCK_LAYOUT4_SIZE \
  10. (sizeof(__be32) * 2 + /* offset4 */ \
  11. sizeof(__be32) * 2 + /* length4 */ \
  12. sizeof(__be32) + /* layoutiomode4 */ \
  13. sizeof(__be32) + /* layouttype4 */ \
  14. sizeof(__be32) + /* number of bytes */ \
  15. sizeof(__be32)) /* number of extents */
  16. struct pnfs_block_extent {
  17. struct nfsd4_deviceid vol_id;
  18. u64 foff;
  19. u64 len;
  20. u64 soff;
  21. enum pnfs_block_extent_state es;
  22. };
  23. struct pnfs_block_range {
  24. u64 foff;
  25. u64 len;
  26. };
  27. struct pnfs_block_layout {
  28. u32 nr_extents;
  29. struct pnfs_block_extent extents[] __counted_by(nr_extents);
  30. };
  31. /*
  32. * Random upper cap for the uuid length to avoid unbounded allocation.
  33. * Not actually limited by the protocol.
  34. */
  35. #define PNFS_BLOCK_UUID_LEN 128
  36. struct pnfs_block_volume {
  37. enum pnfs_block_volume_type type;
  38. union {
  39. struct {
  40. u64 offset;
  41. u32 sig_len;
  42. u8 sig[PNFS_BLOCK_UUID_LEN];
  43. } simple;
  44. struct {
  45. enum scsi_code_set code_set;
  46. enum scsi_designator_type designator_type;
  47. int designator_len;
  48. u8 designator[256];
  49. u64 pr_key;
  50. } scsi;
  51. };
  52. };
  53. struct pnfs_block_deviceaddr {
  54. u32 nr_volumes;
  55. struct pnfs_block_volume volumes[] __counted_by(nr_volumes);
  56. };
  57. __be32 nfsd4_block_encode_getdeviceinfo(struct xdr_stream *xdr,
  58. const struct nfsd4_getdeviceinfo *gdp);
  59. __be32 nfsd4_block_encode_layoutget(struct xdr_stream *xdr,
  60. const struct nfsd4_layoutget *lgp);
  61. __be32 nfsd4_block_decode_layoutupdate(struct xdr_stream *xdr,
  62. struct iomap **iomapp, int *nr_iomapsp, u32 block_size);
  63. __be32 nfsd4_scsi_decode_layoutupdate(struct xdr_stream *xdr,
  64. struct iomap **iomapp, int *nr_iomapsp, u32 block_size);
  65. #endif /* _NFSD_BLOCKLAYOUTXDR_H */