g_stripe.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*-
  2. * SPDX-License-Identifier: BSD-2-Clause
  3. *
  4. * Copyright (c) 2004-2005 Pawel Jakub Dawidek <pjd@FreeBSD.org>
  5. * All rights reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions
  9. * are met:
  10. * 1. Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. * 2. Redistributions in binary form must reproduce the above copyright
  13. * notice, this list of conditions and the following disclaimer in the
  14. * documentation and/or other materials provided with the distribution.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
  17. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  18. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  19. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
  20. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  21. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  22. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  23. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  24. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  25. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  26. * SUCH DAMAGE.
  27. */
  28. #ifndef _G_STRIPE_H_
  29. #define _G_STRIPE_H_
  30. #include <sys/endian.h>
  31. #define G_STRIPE_CLASS_NAME "STRIPE"
  32. #define G_STRIPE_MAGIC "GEOM::STRIPE"
  33. /*
  34. * Version history:
  35. * 0 - Initial version number.
  36. * 1 - Added 'stop' command for gstripe(8).
  37. * 2 - Added md_provider field to metadata and '-h' option for gstripe(8).
  38. * 3 - Added md_provsize field to metadata.
  39. */
  40. #define G_STRIPE_VERSION 3
  41. #ifdef _KERNEL
  42. #define G_STRIPE_TYPE_MANUAL 0
  43. #define G_STRIPE_TYPE_AUTOMATIC 1
  44. #define G_STRIPE_FLAG_CANDELETE 0x00000001UL
  45. #define G_STRIPE_DEBUG(lvl, ...) \
  46. _GEOM_DEBUG("GEOM_STRIPE", g_stripe_debug, (lvl), NULL, __VA_ARGS__)
  47. #define G_STRIPE_LOGREQ(bp, ...) \
  48. _GEOM_DEBUG("GEOM_STRIPE", g_stripe_debug, 2, (bp), __VA_ARGS__)
  49. struct g_stripe_softc {
  50. u_int sc_type; /* provider type */
  51. struct g_geom *sc_geom;
  52. struct g_provider *sc_provider;
  53. uint32_t sc_id; /* stripe unique ID */
  54. struct g_consumer **sc_disks;
  55. uint16_t sc_ndisks;
  56. off_t sc_stripesize;
  57. uint32_t sc_stripebits;
  58. struct mtx sc_lock;
  59. int sc_flags;
  60. };
  61. #define sc_name sc_geom->name
  62. #endif /* _KERNEL */
  63. struct g_stripe_metadata {
  64. char md_magic[16]; /* Magic value. */
  65. uint32_t md_version; /* Version number. */
  66. char md_name[16]; /* Stripe name. */
  67. uint32_t md_id; /* Unique ID. */
  68. uint16_t md_no; /* Disk number. */
  69. uint16_t md_all; /* Number of all disks. */
  70. uint32_t md_stripesize; /* Stripe size. */
  71. char md_provider[16]; /* Hardcoded provider. */
  72. uint64_t md_provsize; /* Provider's size. */
  73. };
  74. static __inline void
  75. stripe_metadata_encode(const struct g_stripe_metadata *md, u_char *data)
  76. {
  77. bcopy(md->md_magic, data, sizeof(md->md_magic));
  78. le32enc(data + 16, md->md_version);
  79. bcopy(md->md_name, data + 20, sizeof(md->md_name));
  80. le32enc(data + 36, md->md_id);
  81. le16enc(data + 40, md->md_no);
  82. le16enc(data + 42, md->md_all);
  83. le32enc(data + 44, md->md_stripesize);
  84. bcopy(md->md_provider, data + 48, sizeof(md->md_provider));
  85. le64enc(data + 64, md->md_provsize);
  86. }
  87. static __inline void
  88. stripe_metadata_decode(const u_char *data, struct g_stripe_metadata *md)
  89. {
  90. bcopy(data, md->md_magic, sizeof(md->md_magic));
  91. md->md_version = le32dec(data + 16);
  92. bcopy(data + 20, md->md_name, sizeof(md->md_name));
  93. md->md_id = le32dec(data + 36);
  94. md->md_no = le16dec(data + 40);
  95. md->md_all = le16dec(data + 42);
  96. md->md_stripesize = le32dec(data + 44);
  97. bcopy(data + 48, md->md_provider, sizeof(md->md_provider));
  98. md->md_provsize = le64dec(data + 64);
  99. }
  100. #endif /* _G_STRIPE_H_ */