g_stripe.h revision 131649
1334592Sasomers/*- 2334592Sasomers * Copyright (c) 2003 Pawel Jakub Dawidek <pjd@FreeBSD.org> 3334592Sasomers * All rights reserved. 4334592Sasomers * 5334592Sasomers * Redistribution and use in source and binary forms, with or without 6334592Sasomers * modification, are permitted provided that the following conditions 7334592Sasomers * are met: 8334592Sasomers * 1. Redistributions of source code must retain the above copyright 9334592Sasomers * notice, this list of conditions and the following disclaimer. 10334592Sasomers * 2. Redistributions in binary form must reproduce the above copyright 11334592Sasomers * notice, this list of conditions and the following disclaimer in the 12334592Sasomers * documentation and/or other materials provided with the distribution. 13334592Sasomers * 14334592Sasomers * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 15334592Sasomers * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16334592Sasomers * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17334592Sasomers * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 18334592Sasomers * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19334592Sasomers * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20334592Sasomers * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21334592Sasomers * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22334592Sasomers * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23334592Sasomers * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24334592Sasomers * SUCH DAMAGE. 25334592Sasomers * 26334592Sasomers * $FreeBSD: head/sys/geom/stripe/g_stripe.h 131649 2004-07-05 21:16:37Z pjd $ 27334592Sasomers */ 28334592Sasomers 29334592Sasomers#ifndef _G_STRIPE_H_ 30334592Sasomers#define _G_STRIPE_H_ 31334592Sasomers 32334592Sasomers#include <sys/endian.h> 33334592Sasomers 34334592Sasomers#define G_STRIPE_CLASS_NAME "STRIPE" 35334592Sasomers 36334592Sasomers#define G_STRIPE_MAGIC "GEOM::STRIPE" 37334592Sasomers#define G_STRIPE_VERSION 1 38334592Sasomers 39334592Sasomers#ifdef _KERNEL 40334592Sasomers#define G_STRIPE_TYPE_MANUAL 0 41334592Sasomers#define G_STRIPE_TYPE_AUTOMATIC 1 42334592Sasomers 43339087Sasomers#define G_STRIPE_DEBUG(lvl, ...) do { \ 44334592Sasomers if (g_stripe_debug >= (lvl)) { \ 45334592Sasomers printf("GEOM_STRIPE"); \ 46334592Sasomers if (g_stripe_debug > 0) \ 47334592Sasomers printf("[%u]", lvl); \ 48334592Sasomers printf(": "); \ 49334592Sasomers printf(__VA_ARGS__); \ 50334592Sasomers printf("\n"); \ 51334592Sasomers } \ 52334592Sasomers} while (0) 53334592Sasomers#define G_STRIPE_LOGREQ(bp, ...) do { \ 54334592Sasomers if (g_stripe_debug >= 2) { \ 55334592Sasomers printf("GEOM_STRIPE[2]: "); \ 56334592Sasomers printf(__VA_ARGS__); \ 57334592Sasomers printf(" "); \ 58334592Sasomers g_print_bio(bp); \ 59334592Sasomers printf("\n"); \ 60334592Sasomers } \ 61334592Sasomers} while (0) 62334592Sasomers 63334592Sasomersstruct g_stripe_softc { 64334592Sasomers u_int sc_type; /* provider type */ 65334592Sasomers struct g_geom *sc_geom; 66334592Sasomers struct g_provider *sc_provider; 67334592Sasomers char sc_name[16]; /* stripe name */ 68334592Sasomers uint32_t sc_id; /* stripe unique ID */ 69334592Sasomers struct g_consumer **sc_disks; 70334592Sasomers uint16_t sc_ndisks; 71334592Sasomers uint32_t sc_stripesize; 72334592Sasomers uint32_t sc_stripebits; 73334592Sasomers}; 74334592Sasomers#endif /* _KERNEL */ 75334592Sasomers 76334592Sasomersstruct g_stripe_metadata { 77334592Sasomers char md_magic[16]; /* Magic value. */ 78334592Sasomers uint32_t md_version; /* Version number. */ 79334592Sasomers char md_name[16]; /* Concat name. */ 80334592Sasomers uint32_t md_id; /* Unique ID. */ 81334592Sasomers uint16_t md_no; /* Disk number. */ 82334592Sasomers uint16_t md_all; /* Number of all disks. */ 83334592Sasomers uint32_t md_stripesize; /* Stripe size. */ 84334592Sasomers}; 85334592Sasomersstatic __inline void 86334592Sasomersstripe_metadata_encode(const struct g_stripe_metadata *md, u_char *data) 87334592Sasomers{ 88334592Sasomers 89334592Sasomers bcopy(md->md_magic, data, sizeof(md->md_magic)); 90334592Sasomers le32enc(data + 16, md->md_version); 91334592Sasomers bcopy(md->md_name, data + 20, sizeof(md->md_name)); 92334592Sasomers le32enc(data + 36, md->md_id); 93334592Sasomers le16enc(data + 40, md->md_no); 94334592Sasomers le16enc(data + 42, md->md_all); 95334592Sasomers le32enc(data + 44, md->md_stripesize); 96334592Sasomers} 97334592Sasomersstatic __inline void 98334592Sasomersstripe_metadata_decode(const u_char *data, struct g_stripe_metadata *md) 99334592Sasomers{ 100334592Sasomers 101334592Sasomers bcopy(data, md->md_magic, sizeof(md->md_magic)); 102334592Sasomers md->md_version = le32dec(data + 16); 103334592Sasomers bcopy(data + 20, md->md_name, sizeof(md->md_name)); 104334592Sasomers md->md_id = le32dec(data + 36); 105334592Sasomers md->md_no = le16dec(data + 40); 106334592Sasomers md->md_all = le16dec(data + 42); 107334592Sasomers md->md_stripesize = le32dec(data + 44); 108334592Sasomers} 109334592Sasomers 110334592Sasomers#ifndef BITCOUNT 111334592Sasomers#define BITCOUNT(x) (((BX_(x) + (BX_(x) >> 4)) & 0x0F0F0F0F) % 255) 112334592Sasomers#define BX_(x) ((x) - (((x) >> 1) & 0x77777777) - \ 113334592Sasomers (((x) >> 2) & 0x33333333) - (((x) >> 3) & 0x11111111)) 114334592Sasomers#endif 115334592Sasomers 116334592Sasomers#endif /* _G_STRIPE_H_ */ 117334592Sasomers