1140074Spjd/*- 2141993Spjd * Copyright (c) 2005 Pawel Jakub Dawidek <pjd@FreeBSD.org> 3140074Spjd * All rights reserved. 4140074Spjd * 5140074Spjd * Redistribution and use in source and binary forms, with or without 6140074Spjd * modification, are permitted provided that the following conditions 7140074Spjd * are met: 8140074Spjd * 1. Redistributions of source code must retain the above copyright 9140074Spjd * notice, this list of conditions and the following disclaimer. 10140074Spjd * 2. Redistributions in binary form must reproduce the above copyright 11140074Spjd * notice, this list of conditions and the following disclaimer in the 12140074Spjd * documentation and/or other materials provided with the distribution. 13155174Spjd * 14140074Spjd * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 15140074Spjd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16140074Spjd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17140074Spjd * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 18140074Spjd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19140074Spjd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20140074Spjd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21140074Spjd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22140074Spjd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23140074Spjd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24140074Spjd * SUCH DAMAGE. 25140074Spjd * 26140074Spjd * $FreeBSD: releng/10.3/sys/geom/shsec/g_shsec.h 155174 2006-02-01 12:06:01Z pjd $ 27140074Spjd */ 28140074Spjd 29140074Spjd#ifndef _G_SHSEC_H_ 30140074Spjd#define _G_SHSEC_H_ 31140074Spjd 32140074Spjd#include <sys/endian.h> 33140074Spjd 34140074Spjd#define G_SHSEC_CLASS_NAME "SHSEC" 35140074Spjd 36140074Spjd#define G_SHSEC_MAGIC "GEOM::SHSEC" 37140074Spjd/* 38140074Spjd * Version history: 39140074Spjd * 0 - Initial version number. 40142727Spjd * 1 - Added md_provsize field to metadata. 41140074Spjd */ 42142727Spjd#define G_SHSEC_VERSION 1 43140074Spjd 44140074Spjd#ifdef _KERNEL 45140074Spjd#define G_SHSEC_BFLAG_FIRST 0x1 46140074Spjd 47140074Spjd#define G_SHSEC_DEBUG(lvl, ...) do { \ 48140074Spjd if (g_shsec_debug >= (lvl)) { \ 49140074Spjd printf("GEOM_SHSEC"); \ 50140074Spjd if (g_shsec_debug > 0) \ 51140074Spjd printf("[%u]", lvl); \ 52140074Spjd printf(": "); \ 53140074Spjd printf(__VA_ARGS__); \ 54140074Spjd printf("\n"); \ 55140074Spjd } \ 56140074Spjd} while (0) 57140074Spjd#define G_SHSEC_LOGREQ(lvl, bp, ...) do { \ 58140074Spjd if (g_shsec_debug >= (lvl)) { \ 59140074Spjd printf("GEOM_SHSEC"); \ 60140074Spjd if (g_shsec_debug > 0) \ 61140074Spjd printf("[%u]", lvl); \ 62140074Spjd printf(": "); \ 63140074Spjd printf(__VA_ARGS__); \ 64140074Spjd printf(" "); \ 65140074Spjd g_print_bio(bp); \ 66140074Spjd printf("\n"); \ 67140074Spjd } \ 68140074Spjd} while (0) 69140074Spjd 70140074Spjdstruct g_shsec_softc { 71140074Spjd u_int sc_type; /* provider type */ 72140074Spjd struct g_geom *sc_geom; 73140074Spjd struct g_provider *sc_provider; 74140074Spjd uint32_t sc_id; /* device unique ID */ 75140074Spjd struct g_consumer **sc_disks; 76140074Spjd uint16_t sc_ndisks; 77140074Spjd}; 78140074Spjd#define sc_name sc_geom->name 79140074Spjd#endif /* _KERNEL */ 80140074Spjd 81140074Spjdstruct g_shsec_metadata { 82140074Spjd char md_magic[16]; /* Magic value. */ 83140074Spjd uint32_t md_version; /* Version number. */ 84140074Spjd char md_name[16]; /* Stripe name. */ 85140074Spjd uint32_t md_id; /* Unique ID. */ 86140074Spjd uint16_t md_no; /* Disk number. */ 87140074Spjd uint16_t md_all; /* Number of all disks. */ 88140074Spjd char md_provider[16]; /* Hardcoded provider. */ 89142727Spjd uint64_t md_provsize; /* Provider's size. */ 90140074Spjd}; 91140074Spjdstatic __inline void 92140074Spjdshsec_metadata_encode(const struct g_shsec_metadata *md, u_char *data) 93140074Spjd{ 94140074Spjd 95140074Spjd bcopy(md->md_magic, data, sizeof(md->md_magic)); 96140074Spjd le32enc(data + 16, md->md_version); 97140074Spjd bcopy(md->md_name, data + 20, sizeof(md->md_name)); 98140074Spjd le32enc(data + 36, md->md_id); 99140074Spjd le16enc(data + 40, md->md_no); 100140074Spjd le16enc(data + 42, md->md_all); 101140074Spjd bcopy(md->md_provider, data + 44, sizeof(md->md_provider)); 102142727Spjd le64enc(data + 60, md->md_provsize); 103140074Spjd} 104140074Spjdstatic __inline void 105140074Spjdshsec_metadata_decode(const u_char *data, struct g_shsec_metadata *md) 106140074Spjd{ 107140074Spjd 108140074Spjd bcopy(data, md->md_magic, sizeof(md->md_magic)); 109140074Spjd md->md_version = le32dec(data + 16); 110140074Spjd bcopy(data + 20, md->md_name, sizeof(md->md_name)); 111140074Spjd md->md_id = le32dec(data + 36); 112140074Spjd md->md_no = le16dec(data + 40); 113140074Spjd md->md_all = le16dec(data + 42); 114140074Spjd bcopy(data + 44, md->md_provider, sizeof(md->md_provider)); 115142727Spjd md->md_provsize = le64dec(data + 60); 116140074Spjd} 117140074Spjd#endif /* _G_SHSEC_H_ */ 118