HelenOS sources

root/uspace/lib/label/include/types/liblabel.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


/*
 * 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

/** @}
 */

/* [<][>][^][v][top][bottom][index][help] */
HelenOS homepage, sources at GitHub