#ifndef _G_STRIPE_H_
#define _G_STRIPE_H_
#include <sys/endian.h>
#define G_STRIPE_CLASS_NAME "STRIPE"
#define G_STRIPE_MAGIC "GEOM::STRIPE"
#define G_STRIPE_VERSION 3
#ifdef _KERNEL
#define G_STRIPE_TYPE_MANUAL 0
#define G_STRIPE_TYPE_AUTOMATIC 1
#define G_STRIPE_FLAG_CANDELETE 0x00000001UL
#define G_STRIPE_DEBUG(lvl, ...) \
_GEOM_DEBUG("GEOM_STRIPE", g_stripe_debug, (lvl), NULL, __VA_ARGS__)
#define G_STRIPE_LOGREQ(bp, ...) \
_GEOM_DEBUG("GEOM_STRIPE", g_stripe_debug, 2, (bp), __VA_ARGS__)
struct g_stripe_softc {
u_int sc_type;
struct g_geom *sc_geom;
struct g_provider *sc_provider;
uint32_t sc_id;
struct g_consumer **sc_disks;
uint16_t sc_ndisks;
off_t sc_stripesize;
uint32_t sc_stripebits;
struct mtx sc_lock;
int sc_flags;
};
#define sc_name sc_geom->name
#endif
struct g_stripe_metadata {
char md_magic[16];
uint32_t md_version;
char md_name[16];
uint32_t md_id;
uint16_t md_no;
uint16_t md_all;
uint32_t md_stripesize;
char md_provider[16];
uint64_t md_provsize;
};
static __inline void
stripe_metadata_encode(const struct g_stripe_metadata *md, u_char *data)
{
bcopy(md->md_magic, data, sizeof(md->md_magic));
le32enc(data + 16, md->md_version);
bcopy(md->md_name, data + 20, sizeof(md->md_name));
le32enc(data + 36, md->md_id);
le16enc(data + 40, md->md_no);
le16enc(data + 42, md->md_all);
le32enc(data + 44, md->md_stripesize);
bcopy(md->md_provider, data + 48, sizeof(md->md_provider));
le64enc(data + 64, md->md_provsize);
}
static __inline void
stripe_metadata_decode(const u_char *data, struct g_stripe_metadata *md)
{
bcopy(data, md->md_magic, sizeof(md->md_magic));
md->md_version = le32dec(data + 16);
bcopy(data + 20, md->md_name, sizeof(md->md_name));
md->md_id = le32dec(data + 36);
md->md_no = le16dec(data + 40);
md->md_all = le16dec(data + 42);
md->md_stripesize = le32dec(data + 44);
bcopy(data + 48, md->md_provider, sizeof(md->md_provider));
md->md_provsize = le64dec(data + 64);
}
#endif