1/*-
2 * Copyright (c) 2008 Andrew Thompson <thompsa@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD$
27 */
28
29#define	G_LLVM_DEBUG(lvl, ...)	do {					\
30	if (g_llvm_debug >= (lvl)) {					\
31		printf("GEOM_LINUX_LVM");				\
32		if (g_llvm_debug > 0)					\
33			printf("[%u]", lvl);				\
34		printf(": ");						\
35		printf(__VA_ARGS__);					\
36		printf("\n");						\
37	}								\
38} while (0)
39
40#define	G_LLVM_CLASS_NAME	"LINUX_LVM"
41#define	G_LLVM_NAMELEN		128
42#define	G_LLVM_UUIDLEN		40
43#define	G_LLVM_MAGIC		"\040\114\126\115\062\040\170\133" \
44				"\065\101\045\162\060\116\052\076"
45
46struct g_llvm_label {
47	uint64_t	ll_sector;
48	uint32_t	ll_crc;
49	uint32_t	ll_offset;
50	char		ll_uuid[G_LLVM_UUIDLEN];
51	uint64_t	ll_size;
52	uint64_t	ll_pestart;
53	uint64_t	ll_md_offset;
54	uint64_t	ll_md_size;
55};
56
57struct g_llvm_metadata {
58	uint32_t		md_csum;
59	uint32_t		md_version;
60	uint64_t		md_start;
61	uint64_t		md_size;
62	uint64_t		md_reloffset;
63	uint64_t		md_relsize;
64	struct g_llvm_vg	*md_vg;
65};
66
67struct g_llvm_lv {
68	LIST_ENTRY(g_llvm_lv)	lv_next;
69	struct g_llvm_vg	*lv_vg;
70	char			lv_name[G_LLVM_NAMELEN];
71	char			lv_uuid[G_LLVM_UUIDLEN];
72	int			lv_sgcount;
73	int			lv_sgactive;
74	struct g_provider	*lv_gprov;
75	int			lv_extentcount;
76	LIST_HEAD(, g_llvm_segment) lv_segs;
77	int			lv_numsegs;
78	struct g_llvm_segment	*lv_firstsg;
79};
80
81struct g_llvm_pv {
82	LIST_ENTRY(g_llvm_pv)	pv_next;
83	struct g_llvm_vg	*pv_vg;
84	char			pv_name[G_LLVM_NAMELEN];
85	char			pv_uuid[G_LLVM_UUIDLEN];
86	size_t			pv_size;
87	off_t			pv_start;
88	int			pv_count;
89	struct g_provider	*pv_gprov;
90	struct g_consumer	*pv_gcons;
91};
92
93struct g_llvm_segment {
94	LIST_ENTRY(g_llvm_segment)	sg_next;
95	int			sg_start;
96	int			sg_end;
97	int			sg_count;
98	char			sg_pvname[G_LLVM_NAMELEN];
99	struct g_llvm_pv	*sg_pv;
100	int			sg_pvstart;
101	off_t			sg_pvoffset;
102};
103
104struct g_llvm_vg {
105	LIST_ENTRY(g_llvm_vg)	vg_next;
106	char			vg_name[G_LLVM_NAMELEN];
107	char			vg_uuid[G_LLVM_UUIDLEN];
108	size_t			vg_extentsize;
109	int			vg_sectorsize;
110	struct g_geom		*vg_geom;
111	LIST_HEAD(, g_llvm_pv)	vg_pvs;
112	LIST_HEAD(, g_llvm_lv)	vg_lvs;
113};
114