1131476Spjd/*- 2142727Spjd * Copyright (c) 2004-2005 Pawel Jakub Dawidek <pjd@FreeBSD.org> 3131476Spjd * All rights reserved. 4131476Spjd * 5131476Spjd * Redistribution and use in source and binary forms, with or without 6131476Spjd * modification, are permitted provided that the following conditions 7131476Spjd * are met: 8131476Spjd * 1. Redistributions of source code must retain the above copyright 9131476Spjd * notice, this list of conditions and the following disclaimer. 10131476Spjd * 2. Redistributions in binary form must reproduce the above copyright 11131476Spjd * notice, this list of conditions and the following disclaimer in the 12131476Spjd * documentation and/or other materials provided with the distribution. 13155174Spjd * 14131476Spjd * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 15131476Spjd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16131476Spjd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17131476Spjd * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 18131476Spjd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19131476Spjd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20131476Spjd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21131476Spjd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22131476Spjd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23131476Spjd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24131476Spjd * SUCH DAMAGE. 25131476Spjd * 26131476Spjd * $FreeBSD$ 27131476Spjd */ 28131476Spjd 29131476Spjd#ifndef _G_LABEL_H_ 30131476Spjd#define _G_LABEL_H_ 31131476Spjd 32131476Spjd#include <sys/endian.h> 33199875Strasz#ifdef _KERNEL 34199875Strasz#include <sys/sysctl.h> 35199875Strasz#endif 36131476Spjd 37131476Spjd#define G_LABEL_CLASS_NAME "LABEL" 38131476Spjd 39131476Spjd#define G_LABEL_MAGIC "GEOM::LABEL" 40142727Spjd/* 41142727Spjd * Version history: 42142727Spjd * 1 - Initial version number. 43142727Spjd * 2 - Added md_provsize field to metadata. 44142727Spjd */ 45142727Spjd#define G_LABEL_VERSION 2 46131476Spjd#define G_LABEL_DIR "label" 47131476Spjd 48131476Spjd#ifdef _KERNEL 49131476Spjdextern u_int g_label_debug; 50131476Spjd 51131476Spjd#define G_LABEL_DEBUG(lvl, ...) do { \ 52131476Spjd if (g_label_debug >= (lvl)) { \ 53131476Spjd printf("GEOM_LABEL"); \ 54131476Spjd if (g_label_debug > 0) \ 55131476Spjd printf("[%u]", lvl); \ 56131476Spjd printf(": "); \ 57131476Spjd printf(__VA_ARGS__); \ 58131476Spjd printf("\n"); \ 59131476Spjd } \ 60131476Spjd} while (0) 61131476Spjd 62199875StraszSYSCTL_DECL(_kern_geom_label); 63199875Strasz 64199875Strasz#define G_LABEL_INIT(kind, label, descr) \ 65199875Strasz SYSCTL_NODE(_kern_geom_label, OID_AUTO, kind, CTLFLAG_RD, \ 66199875Strasz NULL, ""); \ 67199875Strasz SYSCTL_INT(_kern_geom_label_##kind, OID_AUTO, enable, \ 68199875Strasz CTLFLAG_RW, &label.ld_enabled, 1, descr); \ 69199875Strasz TUNABLE_INT("kern.geom.label." __XSTRING(kind) ".enable", \ 70199875Strasz &label.ld_enabled) 71199875Strasz 72131476Spjdtypedef void g_label_taste_t (struct g_consumer *cp, char *label, size_t size); 73131476Spjd 74131476Spjdstruct g_label_desc { 75131476Spjd g_label_taste_t *ld_taste; 76131476Spjd char *ld_dir; 77199875Strasz int ld_enabled; 78131476Spjd}; 79131476Spjd 80131476Spjd/* Supported labels. */ 81199875Straszextern struct g_label_desc g_label_ufs_id; 82199875Straszextern struct g_label_desc g_label_ufs_volume; 83199875Straszextern struct g_label_desc g_label_iso9660; 84199875Straszextern struct g_label_desc g_label_msdosfs; 85199875Straszextern struct g_label_desc g_label_ext2fs; 86199875Straszextern struct g_label_desc g_label_reiserfs; 87241706Sattilioextern struct g_label_desc g_label_ntfs; 88199875Straszextern struct g_label_desc g_label_gpt; 89199875Straszextern struct g_label_desc g_label_gpt_uuid; 90249508Sivorasextern struct g_label_desc g_label_disk_ident; 91286193Strasz 92286193Straszextern void g_label_rtrim(char *label, size_t size); 93131476Spjd#endif /* _KERNEL */ 94131476Spjd 95131476Spjdstruct g_label_metadata { 96131476Spjd char md_magic[16]; /* Magic value. */ 97131476Spjd uint32_t md_version; /* Version number. */ 98131476Spjd char md_label[16]; /* Label. */ 99142727Spjd uint64_t md_provsize; /* Provider's size. */ 100131476Spjd}; 101131476Spjdstatic __inline void 102131476Spjdlabel_metadata_encode(const struct g_label_metadata *md, u_char *data) 103131476Spjd{ 104131476Spjd 105131476Spjd bcopy(md->md_magic, data, sizeof(md->md_magic)); 106131476Spjd le32enc(data + 16, md->md_version); 107131476Spjd bcopy(md->md_label, data + 20, sizeof(md->md_label)); 108142727Spjd le64enc(data + 36, md->md_provsize); 109131476Spjd} 110131476Spjdstatic __inline void 111131476Spjdlabel_metadata_decode(const u_char *data, struct g_label_metadata *md) 112131476Spjd{ 113131476Spjd 114131476Spjd bcopy(data, md->md_magic, sizeof(md->md_magic)); 115131476Spjd md->md_version = le32dec(data + 16); 116131476Spjd bcopy(data + 20, md->md_label, sizeof(md->md_label)); 117142727Spjd md->md_provsize = le64dec(data + 36); 118131476Spjd} 119131476Spjd#endif /* _G_LABEL_H_ */ 120