/* * Copyright (c) 2015 Jiri Svoboda * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @addtogroup liblabel * @{ */ /** * @file Disk label library types. */ #ifndef LIBLABEL_TYPES_H_ #define LIBLABEL_TYPES_H_ #include <adt/list.h> #include <types/label.h> #include <offset.h> #include <stddef.h> #include <vol.h> #include <uuid.h> typedef struct label label_t; typedef struct label_info label_info_t; typedef struct label_part label_part_t; typedef struct label_part_info label_part_info_t; typedef struct label_part_spec label_part_spec_t; typedef struct label_bd label_bd_t; typedef struct label_bd_ops label_bd_ops_t; /** Ops for individual label type */ typedef struct { errno_t (*open)(label_bd_t *, label_t **); errno_t (*create)(label_bd_t *, label_t **); void (*close)(label_t *); errno_t (*destroy)(label_t *); errno_t (*get_info)(label_t *, label_info_t *); label_part_t *(*part_first)(label_t *); label_part_t *(*part_next)(label_part_t *); void (*part_get_info)(label_part_t *, label_part_info_t *); errno_t (*part_create)(label_t *, label_part_spec_t *, label_part_t **); errno_t (*part_destroy)(label_part_t *); errno_t (*suggest_ptype)(label_t *, label_pcnt_t, label_ptype_t *); } label_ops_t; struct label_info { /** Label type */ label_type_t ltype; /** Label flags */ label_flags_t flags; /** First block that can be allocated */ aoff64_t ablock0; /** Number of blocks that can be allocated */ aoff64_t anblocks; }; struct label_part_info { /** Partition index */ int index; /** Partition kind */ label_pkind_t pkind; /** Address of first block */ aoff64_t block0; /** Number of blocks */ aoff64_t nblocks; }; /** Partition */ struct label_part { /** Containing label */ struct label *label; /** Link to label_t.parts */ link_t lparts; /** Link to label_t.pri_parts */ link_t lpri; /** Link to label_t.log_parts */ link_t llog; /** Index */ int index; /** Number of EBR blocks preceding a logical partition */ aoff64_t hdr_blocks; /** First block */ aoff64_t block0; /** Number of blocks */ aoff64_t nblocks; /** Partition type */ label_ptype_t ptype; /** Partition UUID */ uuid_t part_uuid; }; /** Specification of new partition */ struct label_part_spec { /** Partition index */ int index; /** First block */ aoff64_t block0; /** Number of blocks */ aoff64_t nblocks; /** Number of header blocks (EBR for logical partitions) */ aoff64_t hdr_blocks; /** Partition kind */ label_pkind_t pkind; /** Partition type */ label_ptype_t ptype; }; typedef struct { uint64_t hdr_ba[2]; uint32_t hdr_size; uint64_t ptable_ba[2]; uint64_t pt_blocks; size_t esize; uint32_t pt_crc; } label_gpt_t; typedef struct { } label_mbr_t; /** Block device operations */ struct label_bd_ops { /** Get block size */ errno_t (*get_bsize)(void *, size_t *); /** Get number of blocks */ errno_t (*get_nblocks)(void *, aoff64_t *); /** Read blocks */ errno_t (*read)(void *, aoff64_t, size_t, void *); /** Write blocks */ errno_t (*write)(void *, aoff64_t, size_t, const void *); }; /** Block device */ struct label_bd { /** Ops structure */ label_bd_ops_t *ops; /** Argument */ void *arg; }; /** Label instance */ struct label { /** Label type ops */ label_ops_t *ops; /** Label type */ label_type_t ltype; /** Block device */ label_bd_t bd; /** Partitions */ list_t parts; /* of label_part_t */ /** Primary partitions */ list_t pri_parts; /* of label_part_t */ /** Logical partitions */ list_t log_parts; /* of label_part_t */ /** First block that can be allocated */ aoff64_t ablock0; /** Number of blocks that can be allocated */ aoff64_t anblocks; /** Number of primary partition entries */ int pri_entries; /** Extended partition or NULL if there is none */ label_part_t *ext_part; /** Block size */ size_t block_size; union { label_gpt_t gpt; label_mbr_t mbr; } lt; }; #endif /** @} */