1*86d7f5d3SJohn Marino /*	$NetBSD: metadata-exported.h,v 1.1.1.3 2009/12/02 00:25:43 haad Exp $	*/
2*86d7f5d3SJohn Marino 
3*86d7f5d3SJohn Marino /*
4*86d7f5d3SJohn Marino  * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
5*86d7f5d3SJohn Marino  * Copyright (C) 2004-2009 Red Hat, Inc. All rights reserved.
6*86d7f5d3SJohn Marino  *
7*86d7f5d3SJohn Marino  * This file is part of LVM2.
8*86d7f5d3SJohn Marino  *
9*86d7f5d3SJohn Marino  * This copyrighted material is made available to anyone wishing to use,
10*86d7f5d3SJohn Marino  * modify, copy, or redistribute it subject to the terms and conditions
11*86d7f5d3SJohn Marino  * of the GNU Lesser General Public License v.2.1.
12*86d7f5d3SJohn Marino  *
13*86d7f5d3SJohn Marino  * You should have received a copy of the GNU Lesser General Public License
14*86d7f5d3SJohn Marino  * along with this program; if not, write to the Free Software Foundation,
15*86d7f5d3SJohn Marino  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16*86d7f5d3SJohn Marino  */
17*86d7f5d3SJohn Marino 
18*86d7f5d3SJohn Marino /*
19*86d7f5d3SJohn Marino  * This is the representation of LVM metadata that is being adapted
20*86d7f5d3SJohn Marino  * for library export.
21*86d7f5d3SJohn Marino  */
22*86d7f5d3SJohn Marino 
23*86d7f5d3SJohn Marino #ifndef _LVM_METADATA_EXPORTED_H
24*86d7f5d3SJohn Marino #define _LVM_METADATA_EXPORTED_H
25*86d7f5d3SJohn Marino 
26*86d7f5d3SJohn Marino #include "uuid.h"
27*86d7f5d3SJohn Marino 
28*86d7f5d3SJohn Marino #define MAX_STRIPES 128U
29*86d7f5d3SJohn Marino #define SECTOR_SHIFT 9L
30*86d7f5d3SJohn Marino #define STRIPE_SIZE_MIN ( (unsigned) lvm_getpagesize() >> SECTOR_SHIFT)	/* PAGESIZE in sectors */
31*86d7f5d3SJohn Marino #define STRIPE_SIZE_MAX ( 512L * 1024L >> SECTOR_SHIFT)	/* 512 KB in sectors */
32*86d7f5d3SJohn Marino #define STRIPE_SIZE_LIMIT ((UINT_MAX >> 2) + 1)
33*86d7f5d3SJohn Marino #define PV_MIN_SIZE ( 512L * 1024L >> SECTOR_SHIFT)	/* 512 KB in sectors */
34*86d7f5d3SJohn Marino #define MAX_RESTRICTED_LVS 255	/* Used by FMT_RESTRICTED_LVIDS */
35*86d7f5d3SJohn Marino 
36*86d7f5d3SJohn Marino /* Layer suffix */
37*86d7f5d3SJohn Marino #define MIRROR_SYNC_LAYER "_mimagetmp"
38*86d7f5d3SJohn Marino 
39*86d7f5d3SJohn Marino /* Various flags */
40*86d7f5d3SJohn Marino /* Note that the bits no longer necessarily correspond to LVM1 disk format */
41*86d7f5d3SJohn Marino 
42*86d7f5d3SJohn Marino #define PARTIAL_VG		0x00000001U	/* VG */
43*86d7f5d3SJohn Marino #define EXPORTED_VG          	0x00000002U	/* VG PV */
44*86d7f5d3SJohn Marino #define RESIZEABLE_VG        	0x00000004U	/* VG */
45*86d7f5d3SJohn Marino 
46*86d7f5d3SJohn Marino /* May any free extents on this PV be used or must they be left free? */
47*86d7f5d3SJohn Marino #define ALLOCATABLE_PV         	0x00000008U	/* PV */
48*86d7f5d3SJohn Marino 
49*86d7f5d3SJohn Marino //#define SPINDOWN_LV          	0x00000010U	/* LV */
50*86d7f5d3SJohn Marino //#define BADBLOCK_ON       	0x00000020U	/* LV */
51*86d7f5d3SJohn Marino #define VISIBLE_LV		0x00000040U	/* LV */
52*86d7f5d3SJohn Marino #define FIXED_MINOR		0x00000080U	/* LV */
53*86d7f5d3SJohn Marino /* FIXME Remove when metadata restructuring is completed */
54*86d7f5d3SJohn Marino #define SNAPSHOT		0x00001000U	/* LV - internal use only */
55*86d7f5d3SJohn Marino #define PVMOVE			0x00002000U	/* VG LV SEG */
56*86d7f5d3SJohn Marino #define LOCKED			0x00004000U	/* LV */
57*86d7f5d3SJohn Marino #define MIRRORED		0x00008000U	/* LV - internal use only */
58*86d7f5d3SJohn Marino //#define VIRTUAL			0x00010000U	/* LV - internal use only */
59*86d7f5d3SJohn Marino #define MIRROR_LOG		0x00020000U	/* LV */
60*86d7f5d3SJohn Marino #define MIRROR_IMAGE		0x00040000U	/* LV */
61*86d7f5d3SJohn Marino #define MIRROR_NOTSYNCED	0x00080000U	/* LV */
62*86d7f5d3SJohn Marino //#define ACTIVATE_EXCL		0x00100000U	/* LV - internal use only */
63*86d7f5d3SJohn Marino //#define PRECOMMITTED		0x00200000U	/* VG - internal use only */
64*86d7f5d3SJohn Marino #define CONVERTING		0x00400000U	/* LV */
65*86d7f5d3SJohn Marino 
66*86d7f5d3SJohn Marino #define MISSING_PV              0x00800000U	/* PV */
67*86d7f5d3SJohn Marino #define PARTIAL_LV              0x01000000U	/* LV - derived flag, not
68*86d7f5d3SJohn Marino 						   written out in metadata*/
69*86d7f5d3SJohn Marino 
70*86d7f5d3SJohn Marino //#define POSTORDER_FLAG	0x02000000U /* Not real flags, reserved for
71*86d7f5d3SJohn Marino //#define POSTORDER_OPEN_FLAG	0x04000000U    temporary use inside vg_read_internal. */
72*86d7f5d3SJohn Marino //#define VIRTUAL_ORIGIN	0x08000000U	/* LV - internal use only */
73*86d7f5d3SJohn Marino 
74*86d7f5d3SJohn Marino #define LVM_READ              	0x00000100U	/* LV VG */
75*86d7f5d3SJohn Marino #define LVM_WRITE             	0x00000200U	/* LV VG */
76*86d7f5d3SJohn Marino #define CLUSTERED         	0x00000400U	/* VG */
77*86d7f5d3SJohn Marino //#define SHARED            	0x00000800U	/* VG */
78*86d7f5d3SJohn Marino 
79*86d7f5d3SJohn Marino /* Format features flags */
80*86d7f5d3SJohn Marino #define FMT_SEGMENTS		0x00000001U	/* Arbitrary segment params? */
81*86d7f5d3SJohn Marino #define FMT_MDAS		0x00000002U	/* Proper metadata areas? */
82*86d7f5d3SJohn Marino #define FMT_TAGS		0x00000004U	/* Tagging? */
83*86d7f5d3SJohn Marino #define FMT_UNLIMITED_VOLS	0x00000008U	/* Unlimited PVs/LVs? */
84*86d7f5d3SJohn Marino #define FMT_RESTRICTED_LVIDS	0x00000010U	/* LVID <= 255 */
85*86d7f5d3SJohn Marino #define FMT_ORPHAN_ALLOCATABLE	0x00000020U	/* Orphan PV allocatable? */
86*86d7f5d3SJohn Marino //#define FMT_PRECOMMIT		0x00000040U	/* Supports pre-commit? */
87*86d7f5d3SJohn Marino #define FMT_RESIZE_PV		0x00000080U	/* Supports pvresize? */
88*86d7f5d3SJohn Marino #define FMT_UNLIMITED_STRIPESIZE 0x00000100U	/* Unlimited stripe size? */
89*86d7f5d3SJohn Marino #define FMT_RESTRICTED_READAHEAD 0x00000200U	/* Readahead restricted to 2-120? */
90*86d7f5d3SJohn Marino 
91*86d7f5d3SJohn Marino /* Mirror conversion type flags */
92*86d7f5d3SJohn Marino #define MIRROR_BY_SEG		0x00000001U	/* segment-by-segment mirror */
93*86d7f5d3SJohn Marino #define MIRROR_BY_LV		0x00000002U	/* mirror using whole mimage LVs */
94*86d7f5d3SJohn Marino #define MIRROR_SKIP_INIT_SYNC	0x00000010U	/* skip initial sync */
95*86d7f5d3SJohn Marino 
96*86d7f5d3SJohn Marino /* vg_read and vg_read_for_update flags */
97*86d7f5d3SJohn Marino #define READ_ALLOW_INCONSISTENT	0x00010000U
98*86d7f5d3SJohn Marino #define READ_ALLOW_EXPORTED	0x00020000U
99*86d7f5d3SJohn Marino #define READ_WITHOUT_LOCK       0x00040000U
100*86d7f5d3SJohn Marino 
101*86d7f5d3SJohn Marino /* A meta-flag, useful with toollib for_each_* functions. */
102*86d7f5d3SJohn Marino #define READ_FOR_UPDATE 	0x00100000U
103*86d7f5d3SJohn Marino 
104*86d7f5d3SJohn Marino /* vg's "read_status" field */
105*86d7f5d3SJohn Marino #define FAILED_INCONSISTENT	0x00000001U
106*86d7f5d3SJohn Marino #define FAILED_LOCKING		0x00000002U
107*86d7f5d3SJohn Marino #define FAILED_NOTFOUND		0x00000004U
108*86d7f5d3SJohn Marino #define FAILED_READ_ONLY	0x00000008U
109*86d7f5d3SJohn Marino #define FAILED_EXPORTED		0x00000010U
110*86d7f5d3SJohn Marino #define FAILED_RESIZEABLE	0x00000020U
111*86d7f5d3SJohn Marino #define FAILED_CLUSTERED	0x00000040U
112*86d7f5d3SJohn Marino #define FAILED_ALLOCATION	0x00000080U
113*86d7f5d3SJohn Marino #define FAILED_EXIST		0x00000100U
114*86d7f5d3SJohn Marino #define SUCCESS			0x00000000U
115*86d7f5d3SJohn Marino 
116*86d7f5d3SJohn Marino /* Ordered list - see lv_manip.c */
117*86d7f5d3SJohn Marino typedef enum {
118*86d7f5d3SJohn Marino 	ALLOC_INVALID,
119*86d7f5d3SJohn Marino 	ALLOC_CONTIGUOUS,
120*86d7f5d3SJohn Marino 	ALLOC_CLING,
121*86d7f5d3SJohn Marino 	ALLOC_NORMAL,
122*86d7f5d3SJohn Marino 	ALLOC_ANYWHERE,
123*86d7f5d3SJohn Marino 	ALLOC_INHERIT
124*86d7f5d3SJohn Marino } alloc_policy_t;
125*86d7f5d3SJohn Marino 
126*86d7f5d3SJohn Marino typedef enum {
127*86d7f5d3SJohn Marino 	AREA_UNASSIGNED,
128*86d7f5d3SJohn Marino 	AREA_PV,
129*86d7f5d3SJohn Marino 	AREA_LV
130*86d7f5d3SJohn Marino } area_type_t;
131*86d7f5d3SJohn Marino 
132*86d7f5d3SJohn Marino /*
133*86d7f5d3SJohn Marino  * Whether or not to force an operation.
134*86d7f5d3SJohn Marino  */
135*86d7f5d3SJohn Marino typedef enum {
136*86d7f5d3SJohn Marino 	PROMPT = 0, /* Issue yes/no prompt to confirm operation */
137*86d7f5d3SJohn Marino 	DONT_PROMPT = 1, /* Skip yes/no prompt */
138*86d7f5d3SJohn Marino 	DONT_PROMPT_OVERRIDE = 2 /* Skip prompt + override a second condition */
139*86d7f5d3SJohn Marino } force_t;
140*86d7f5d3SJohn Marino 
141*86d7f5d3SJohn Marino typedef enum {
142*86d7f5d3SJohn Marino 	PERCENT_0 = 0,
143*86d7f5d3SJohn Marino 	PERCENT_0_TO_100 = 1,
144*86d7f5d3SJohn Marino 	PERCENT_100 = 2,
145*86d7f5d3SJohn Marino 	PERCENT_INVALID = 3
146*86d7f5d3SJohn Marino } percent_range_t;
147*86d7f5d3SJohn Marino 
148*86d7f5d3SJohn Marino struct cmd_context;
149*86d7f5d3SJohn Marino struct format_handler;
150*86d7f5d3SJohn Marino struct labeller;
151*86d7f5d3SJohn Marino 
152*86d7f5d3SJohn Marino struct format_type {
153*86d7f5d3SJohn Marino 	struct dm_list list;
154*86d7f5d3SJohn Marino 	struct cmd_context *cmd;
155*86d7f5d3SJohn Marino 	struct format_handler *ops;
156*86d7f5d3SJohn Marino 	struct labeller *labeller;
157*86d7f5d3SJohn Marino 	const char *name;
158*86d7f5d3SJohn Marino 	const char *alias;
159*86d7f5d3SJohn Marino 	const char *orphan_vg_name;
160*86d7f5d3SJohn Marino 	uint32_t features;
161*86d7f5d3SJohn Marino 	void *library;
162*86d7f5d3SJohn Marino 	void *private;
163*86d7f5d3SJohn Marino };
164*86d7f5d3SJohn Marino 
165*86d7f5d3SJohn Marino struct pv_segment {
166*86d7f5d3SJohn Marino 	struct dm_list list;	/* Member of pv->segments: ordered list
167*86d7f5d3SJohn Marino 				 * covering entire data area on this PV */
168*86d7f5d3SJohn Marino 
169*86d7f5d3SJohn Marino 	struct physical_volume *pv;
170*86d7f5d3SJohn Marino 	uint32_t pe;
171*86d7f5d3SJohn Marino 	uint32_t len;
172*86d7f5d3SJohn Marino 
173*86d7f5d3SJohn Marino 	struct lv_segment *lvseg;	/* NULL if free space */
174*86d7f5d3SJohn Marino 	uint32_t lv_area;	/* Index to area in LV segment */
175*86d7f5d3SJohn Marino };
176*86d7f5d3SJohn Marino 
177*86d7f5d3SJohn Marino #define pvseg_is_allocated(pvseg) ((pvseg)->lvseg)
178*86d7f5d3SJohn Marino 
179*86d7f5d3SJohn Marino struct physical_volume {
180*86d7f5d3SJohn Marino 	struct id id;
181*86d7f5d3SJohn Marino 	struct device *dev;
182*86d7f5d3SJohn Marino 	const struct format_type *fmt;
183*86d7f5d3SJohn Marino 	const char *vg_name;
184*86d7f5d3SJohn Marino 	struct id vgid;
185*86d7f5d3SJohn Marino 
186*86d7f5d3SJohn Marino 	uint32_t status;
187*86d7f5d3SJohn Marino 	uint64_t size;
188*86d7f5d3SJohn Marino 
189*86d7f5d3SJohn Marino 	/* physical extents */
190*86d7f5d3SJohn Marino 	uint32_t pe_size;
191*86d7f5d3SJohn Marino 	uint64_t pe_start;
192*86d7f5d3SJohn Marino 	uint32_t pe_count;
193*86d7f5d3SJohn Marino 	uint32_t pe_alloc_count;
194*86d7f5d3SJohn Marino 	unsigned long pe_align;
195*86d7f5d3SJohn Marino 	unsigned long pe_align_offset;
196*86d7f5d3SJohn Marino 
197*86d7f5d3SJohn Marino 	struct dm_list segments;	/* Ordered pv_segments covering complete PV */
198*86d7f5d3SJohn Marino 	struct dm_list tags;
199*86d7f5d3SJohn Marino };
200*86d7f5d3SJohn Marino 
201*86d7f5d3SJohn Marino struct format_instance {
202*86d7f5d3SJohn Marino 	const struct format_type *fmt;
203*86d7f5d3SJohn Marino 	struct dm_list metadata_areas;	/* e.g. metadata locations */
204*86d7f5d3SJohn Marino 	void *private;
205*86d7f5d3SJohn Marino };
206*86d7f5d3SJohn Marino 
207*86d7f5d3SJohn Marino struct volume_group {
208*86d7f5d3SJohn Marino 	struct cmd_context *cmd;
209*86d7f5d3SJohn Marino 	struct dm_pool *vgmem;
210*86d7f5d3SJohn Marino 	struct format_instance *fid;
211*86d7f5d3SJohn Marino 	uint32_t seqno;		/* Metadata sequence number */
212*86d7f5d3SJohn Marino 
213*86d7f5d3SJohn Marino 	struct id id;
214*86d7f5d3SJohn Marino 	char *name;
215*86d7f5d3SJohn Marino 	char *system_id;
216*86d7f5d3SJohn Marino 
217*86d7f5d3SJohn Marino 	uint32_t status;
218*86d7f5d3SJohn Marino 	alloc_policy_t alloc;
219*86d7f5d3SJohn Marino 
220*86d7f5d3SJohn Marino 	uint32_t extent_size;
221*86d7f5d3SJohn Marino 	uint32_t extent_count;
222*86d7f5d3SJohn Marino 	uint32_t free_count;
223*86d7f5d3SJohn Marino 
224*86d7f5d3SJohn Marino 	uint32_t max_lv;
225*86d7f5d3SJohn Marino 	uint32_t max_pv;
226*86d7f5d3SJohn Marino 
227*86d7f5d3SJohn Marino 	/* physical volumes */
228*86d7f5d3SJohn Marino 	uint32_t pv_count;
229*86d7f5d3SJohn Marino 	struct dm_list pvs;
230*86d7f5d3SJohn Marino 
231*86d7f5d3SJohn Marino 	/*
232*86d7f5d3SJohn Marino 	 * logical volumes
233*86d7f5d3SJohn Marino 	 * The following relationship should always hold:
234*86d7f5d3SJohn Marino 	 * dm_list_size(lvs) = user visible lv_count + snapshot_count + other invisible LVs
235*86d7f5d3SJohn Marino 	 *
236*86d7f5d3SJohn Marino 	 * Snapshots consist of 2 instances of "struct logical_volume":
237*86d7f5d3SJohn Marino 	 * - cow (lv_name is visible to the user)
238*86d7f5d3SJohn Marino 	 * - snapshot (lv_name is 'snapshotN')
239*86d7f5d3SJohn Marino 	 *
240*86d7f5d3SJohn Marino 	 * Mirrors consist of multiple instances of "struct logical_volume":
241*86d7f5d3SJohn Marino 	 * - one for the mirror log
242*86d7f5d3SJohn Marino 	 * - one for each mirror leg
243*86d7f5d3SJohn Marino 	 * - one for the user-visible mirror LV
244*86d7f5d3SJohn Marino 	 */
245*86d7f5d3SJohn Marino 	struct dm_list lvs;
246*86d7f5d3SJohn Marino 
247*86d7f5d3SJohn Marino 	struct dm_list tags;
248*86d7f5d3SJohn Marino 
249*86d7f5d3SJohn Marino 	/*
250*86d7f5d3SJohn Marino 	 * FIXME: Move the next fields into a different struct?
251*86d7f5d3SJohn Marino 	 */
252*86d7f5d3SJohn Marino 
253*86d7f5d3SJohn Marino 	/*
254*86d7f5d3SJohn Marino 	 * List of removed physical volumes by pvreduce.
255*86d7f5d3SJohn Marino 	 * They have to get cleared on vg_commit.
256*86d7f5d3SJohn Marino 	 */
257*86d7f5d3SJohn Marino 	struct dm_list removed_pvs;
258*86d7f5d3SJohn Marino 	uint32_t open_mode; /* FIXME: read or write - check lock type? */
259*86d7f5d3SJohn Marino 
260*86d7f5d3SJohn Marino 	/*
261*86d7f5d3SJohn Marino 	 * Store result of the last vg_read().
262*86d7f5d3SJohn Marino 	 * 0 for success else appropriate FAILURE_* bits set.
263*86d7f5d3SJohn Marino 	 */
264*86d7f5d3SJohn Marino 	uint32_t read_status;
265*86d7f5d3SJohn Marino };
266*86d7f5d3SJohn Marino 
267*86d7f5d3SJohn Marino /* There will be one area for each stripe */
268*86d7f5d3SJohn Marino struct lv_segment_area {
269*86d7f5d3SJohn Marino 	area_type_t type;
270*86d7f5d3SJohn Marino 	union {
271*86d7f5d3SJohn Marino 		struct {
272*86d7f5d3SJohn Marino 			struct pv_segment *pvseg;
273*86d7f5d3SJohn Marino 		} pv;
274*86d7f5d3SJohn Marino 		struct {
275*86d7f5d3SJohn Marino 			struct logical_volume *lv;
276*86d7f5d3SJohn Marino 			uint32_t le;
277*86d7f5d3SJohn Marino 		} lv;
278*86d7f5d3SJohn Marino 	} u;
279*86d7f5d3SJohn Marino };
280*86d7f5d3SJohn Marino 
281*86d7f5d3SJohn Marino struct segment_type;
282*86d7f5d3SJohn Marino struct lv_segment {
283*86d7f5d3SJohn Marino 	struct dm_list list;
284*86d7f5d3SJohn Marino 	struct logical_volume *lv;
285*86d7f5d3SJohn Marino 
286*86d7f5d3SJohn Marino 	const struct segment_type *segtype;
287*86d7f5d3SJohn Marino 	uint32_t le;
288*86d7f5d3SJohn Marino 	uint32_t len;
289*86d7f5d3SJohn Marino 
290*86d7f5d3SJohn Marino 	uint32_t status;
291*86d7f5d3SJohn Marino 
292*86d7f5d3SJohn Marino 	/* FIXME Fields depend on segment type */
293*86d7f5d3SJohn Marino 	uint32_t stripe_size;
294*86d7f5d3SJohn Marino 	uint32_t area_count;
295*86d7f5d3SJohn Marino 	uint32_t area_len;
296*86d7f5d3SJohn Marino 	struct logical_volume *origin;
297*86d7f5d3SJohn Marino 	struct logical_volume *cow;
298*86d7f5d3SJohn Marino 	struct dm_list origin_list;
299*86d7f5d3SJohn Marino 	uint32_t chunk_size;	/* For snapshots - in sectors */
300*86d7f5d3SJohn Marino 	uint32_t region_size;	/* For mirrors - in sectors */
301*86d7f5d3SJohn Marino 	uint32_t extents_copied;
302*86d7f5d3SJohn Marino 	struct logical_volume *log_lv;
303*86d7f5d3SJohn Marino 	void *segtype_private;
304*86d7f5d3SJohn Marino 
305*86d7f5d3SJohn Marino 	struct dm_list tags;
306*86d7f5d3SJohn Marino 
307*86d7f5d3SJohn Marino 	struct lv_segment_area *areas;
308*86d7f5d3SJohn Marino };
309*86d7f5d3SJohn Marino 
310*86d7f5d3SJohn Marino #define seg_type(seg, s)	(seg)->areas[(s)].type
311*86d7f5d3SJohn Marino #define seg_pv(seg, s)		(seg)->areas[(s)].u.pv.pvseg->pv
312*86d7f5d3SJohn Marino #define seg_lv(seg, s)		(seg)->areas[(s)].u.lv.lv
313*86d7f5d3SJohn Marino 
314*86d7f5d3SJohn Marino struct logical_volume {
315*86d7f5d3SJohn Marino 	union lvid lvid;
316*86d7f5d3SJohn Marino 	char *name;
317*86d7f5d3SJohn Marino 
318*86d7f5d3SJohn Marino 	struct volume_group *vg;
319*86d7f5d3SJohn Marino 
320*86d7f5d3SJohn Marino 	uint32_t status;
321*86d7f5d3SJohn Marino 	alloc_policy_t alloc;
322*86d7f5d3SJohn Marino 	uint32_t read_ahead;
323*86d7f5d3SJohn Marino 	int32_t major;
324*86d7f5d3SJohn Marino 	int32_t minor;
325*86d7f5d3SJohn Marino 
326*86d7f5d3SJohn Marino 	uint64_t size;		/* Sectors */
327*86d7f5d3SJohn Marino 	uint32_t le_count;
328*86d7f5d3SJohn Marino 
329*86d7f5d3SJohn Marino 	uint32_t origin_count;
330*86d7f5d3SJohn Marino 	struct dm_list snapshot_segs;
331*86d7f5d3SJohn Marino 	struct lv_segment *snapshot;
332*86d7f5d3SJohn Marino 
333*86d7f5d3SJohn Marino 	struct dm_list segments;
334*86d7f5d3SJohn Marino 	struct dm_list tags;
335*86d7f5d3SJohn Marino 	struct dm_list segs_using_this_lv;
336*86d7f5d3SJohn Marino };
337*86d7f5d3SJohn Marino 
338*86d7f5d3SJohn Marino struct pe_range {
339*86d7f5d3SJohn Marino 	struct dm_list list;
340*86d7f5d3SJohn Marino 	uint32_t start;		/* PEs */
341*86d7f5d3SJohn Marino 	uint32_t count;		/* PEs */
342*86d7f5d3SJohn Marino };
343*86d7f5d3SJohn Marino 
344*86d7f5d3SJohn Marino struct pv_list {
345*86d7f5d3SJohn Marino 	struct dm_list list;
346*86d7f5d3SJohn Marino 	struct physical_volume *pv;
347*86d7f5d3SJohn Marino 	struct dm_list *mdas;	/* Metadata areas */
348*86d7f5d3SJohn Marino 	struct dm_list *pe_ranges;	/* Ranges of PEs e.g. for allocation */
349*86d7f5d3SJohn Marino };
350*86d7f5d3SJohn Marino 
351*86d7f5d3SJohn Marino struct lv_list {
352*86d7f5d3SJohn Marino 	struct dm_list list;
353*86d7f5d3SJohn Marino 	struct logical_volume *lv;
354*86d7f5d3SJohn Marino };
355*86d7f5d3SJohn Marino 
356*86d7f5d3SJohn Marino struct pvcreate_params {
357*86d7f5d3SJohn Marino 	int zero;
358*86d7f5d3SJohn Marino 	uint64_t size;
359*86d7f5d3SJohn Marino 	uint64_t data_alignment;
360*86d7f5d3SJohn Marino 	uint64_t data_alignment_offset;
361*86d7f5d3SJohn Marino 	int pvmetadatacopies;
362*86d7f5d3SJohn Marino 	uint64_t pvmetadatasize;
363*86d7f5d3SJohn Marino 	int64_t labelsector;
364*86d7f5d3SJohn Marino 	struct id id; /* FIXME: redundant */
365*86d7f5d3SJohn Marino 	struct id *idp; /* 0 if no --uuid option */
366*86d7f5d3SJohn Marino 	uint64_t pe_start;
367*86d7f5d3SJohn Marino 	uint32_t extent_count;
368*86d7f5d3SJohn Marino 	uint32_t extent_size;
369*86d7f5d3SJohn Marino 	const char *restorefile; /* 0 if no --restorefile option */
370*86d7f5d3SJohn Marino 	force_t force;
371*86d7f5d3SJohn Marino 	unsigned yes;
372*86d7f5d3SJohn Marino };
373*86d7f5d3SJohn Marino 
374*86d7f5d3SJohn Marino struct physical_volume *pvcreate_single(struct cmd_context *cmd,
375*86d7f5d3SJohn Marino 					const char *pv_name,
376*86d7f5d3SJohn Marino 					struct pvcreate_params *pp);
377*86d7f5d3SJohn Marino void pvcreate_params_set_defaults(struct pvcreate_params *pp);
378*86d7f5d3SJohn Marino 
379*86d7f5d3SJohn Marino /*
380*86d7f5d3SJohn Marino * Utility functions
381*86d7f5d3SJohn Marino */
382*86d7f5d3SJohn Marino int vg_write(struct volume_group *vg);
383*86d7f5d3SJohn Marino int vg_commit(struct volume_group *vg);
384*86d7f5d3SJohn Marino int vg_revert(struct volume_group *vg);
385*86d7f5d3SJohn Marino struct volume_group *vg_read_internal(struct cmd_context *cmd, const char *vg_name,
386*86d7f5d3SJohn Marino 			     const char *vgid, int *consistent);
387*86d7f5d3SJohn Marino struct physical_volume *pv_read(struct cmd_context *cmd, const char *pv_name,
388*86d7f5d3SJohn Marino 				struct dm_list *mdas, uint64_t *label_sector,
389*86d7f5d3SJohn Marino 				int warnings, int scan_label_only);
390*86d7f5d3SJohn Marino struct dm_list *get_pvs(struct cmd_context *cmd);
391*86d7f5d3SJohn Marino 
392*86d7f5d3SJohn Marino /*
393*86d7f5d3SJohn Marino  * Add/remove LV to/from volume group
394*86d7f5d3SJohn Marino  */
395*86d7f5d3SJohn Marino int link_lv_to_vg(struct volume_group *vg, struct logical_volume *lv);
396*86d7f5d3SJohn Marino int unlink_lv_from_vg(struct logical_volume *lv);
397*86d7f5d3SJohn Marino void lv_set_visible(struct logical_volume *lv);
398*86d7f5d3SJohn Marino void lv_set_hidden(struct logical_volume *lv);
399*86d7f5d3SJohn Marino 
400*86d7f5d3SJohn Marino /* Set full_scan to 1 to re-read every (filtered) device label */
401*86d7f5d3SJohn Marino struct dm_list *get_vgnames(struct cmd_context *cmd, int full_scan);
402*86d7f5d3SJohn Marino struct dm_list *get_vgids(struct cmd_context *cmd, int full_scan);
403*86d7f5d3SJohn Marino int scan_vgs_for_pvs(struct cmd_context *cmd);
404*86d7f5d3SJohn Marino 
405*86d7f5d3SJohn Marino int pv_write(struct cmd_context *cmd, struct physical_volume *pv,
406*86d7f5d3SJohn Marino 	     struct dm_list *mdas, int64_t label_sector);
407*86d7f5d3SJohn Marino int is_pv(struct physical_volume *pv);
408*86d7f5d3SJohn Marino int move_pv(struct volume_group *vg_from, struct volume_group *vg_to,
409*86d7f5d3SJohn Marino 	    const char *pv_name);
410*86d7f5d3SJohn Marino int move_pvs_used_by_lv(struct volume_group *vg_from,
411*86d7f5d3SJohn Marino 			struct volume_group *vg_to,
412*86d7f5d3SJohn Marino 			const char *lv_name);
413*86d7f5d3SJohn Marino int is_orphan_vg(const char *vg_name);
414*86d7f5d3SJohn Marino int is_orphan(const struct physical_volume *pv);
415*86d7f5d3SJohn Marino int vgs_are_compatible(struct cmd_context *cmd,
416*86d7f5d3SJohn Marino 		       struct volume_group *vg_from,
417*86d7f5d3SJohn Marino 		       struct volume_group *vg_to);
418*86d7f5d3SJohn Marino uint32_t vg_lock_newname(struct cmd_context *cmd, const char *vgname);
419*86d7f5d3SJohn Marino 
420*86d7f5d3SJohn Marino /*
421*86d7f5d3SJohn Marino  * Return a handle to VG metadata.
422*86d7f5d3SJohn Marino  */
423*86d7f5d3SJohn Marino struct volume_group *vg_read(struct cmd_context *cmd, const char *vg_name,
424*86d7f5d3SJohn Marino               const char *vgid, uint32_t flags);
425*86d7f5d3SJohn Marino struct volume_group *vg_read_for_update(struct cmd_context *cmd, const char *vg_name,
426*86d7f5d3SJohn Marino                          const char *vgid, uint32_t flags);
427*86d7f5d3SJohn Marino 
428*86d7f5d3SJohn Marino /*
429*86d7f5d3SJohn Marino  * Test validity of a VG handle.
430*86d7f5d3SJohn Marino  */
431*86d7f5d3SJohn Marino uint32_t vg_read_error(struct volume_group *vg_handle);
432*86d7f5d3SJohn Marino 
433*86d7f5d3SJohn Marino /* pe_start and pe_end relate to any existing data so that new metadata
434*86d7f5d3SJohn Marino * areas can avoid overlap */
435*86d7f5d3SJohn Marino struct physical_volume *pv_create(const struct cmd_context *cmd,
436*86d7f5d3SJohn Marino 		      struct device *dev,
437*86d7f5d3SJohn Marino 		      struct id *id,
438*86d7f5d3SJohn Marino 		      uint64_t size,
439*86d7f5d3SJohn Marino 		      unsigned long data_alignment,
440*86d7f5d3SJohn Marino 		      unsigned long data_alignment_offset,
441*86d7f5d3SJohn Marino 		      uint64_t pe_start,
442*86d7f5d3SJohn Marino 		      uint32_t existing_extent_count,
443*86d7f5d3SJohn Marino 		      uint32_t existing_extent_size,
444*86d7f5d3SJohn Marino 		      int pvmetadatacopies,
445*86d7f5d3SJohn Marino 		      uint64_t pvmetadatasize, struct dm_list *mdas);
446*86d7f5d3SJohn Marino int pv_resize(struct physical_volume *pv, struct volume_group *vg,
447*86d7f5d3SJohn Marino              uint32_t new_pe_count);
448*86d7f5d3SJohn Marino int pv_analyze(struct cmd_context *cmd, const char *pv_name,
449*86d7f5d3SJohn Marino 	       uint64_t label_sector);
450*86d7f5d3SJohn Marino 
451*86d7f5d3SJohn Marino /* FIXME: move internal to library */
452*86d7f5d3SJohn Marino uint32_t pv_list_extents_free(const struct dm_list *pvh);
453*86d7f5d3SJohn Marino 
454*86d7f5d3SJohn Marino struct volume_group *vg_create(struct cmd_context *cmd, const char *vg_name);
455*86d7f5d3SJohn Marino int vg_remove_mdas(struct volume_group *vg);
456*86d7f5d3SJohn Marino int vg_remove_check(struct volume_group *vg);
457*86d7f5d3SJohn Marino int vg_remove(struct volume_group *vg);
458*86d7f5d3SJohn Marino int vg_rename(struct cmd_context *cmd, struct volume_group *vg,
459*86d7f5d3SJohn Marino 	      const char *new_name);
460*86d7f5d3SJohn Marino int vg_extend(struct volume_group *vg, int pv_count, char **pv_names,
461*86d7f5d3SJohn Marino 	      struct pvcreate_params *pp);
462*86d7f5d3SJohn Marino int vg_reduce(struct volume_group *vg, char *pv_name);
463*86d7f5d3SJohn Marino int vg_set_extent_size(struct volume_group *vg, uint32_t new_extent_size);
464*86d7f5d3SJohn Marino int vg_set_max_lv(struct volume_group *vg, uint32_t max_lv);
465*86d7f5d3SJohn Marino int vg_set_max_pv(struct volume_group *vg, uint32_t max_pv);
466*86d7f5d3SJohn Marino int vg_set_alloc_policy(struct volume_group *vg, alloc_policy_t alloc);
467*86d7f5d3SJohn Marino int vg_set_clustered(struct volume_group *vg, int clustered);
468*86d7f5d3SJohn Marino int vg_split_mdas(struct cmd_context *cmd, struct volume_group *vg_from,
469*86d7f5d3SJohn Marino 		  struct volume_group *vg_to);
470*86d7f5d3SJohn Marino 
471*86d7f5d3SJohn Marino /* FIXME: refactor / unexport when lvremove liblvm refactoring dones */
472*86d7f5d3SJohn Marino int remove_lvs_in_vg(struct cmd_context *cmd,
473*86d7f5d3SJohn Marino 		     struct volume_group *vg,
474*86d7f5d3SJohn Marino 		     force_t force);
475*86d7f5d3SJohn Marino /*
476*86d7f5d3SJohn Marino  * vg_release() must be called on every struct volume_group allocated
477*86d7f5d3SJohn Marino  * by vg_create() or vg_read_internal() to free it when no longer required.
478*86d7f5d3SJohn Marino  */
479*86d7f5d3SJohn Marino void vg_release(struct volume_group *vg);
480*86d7f5d3SJohn Marino 
481*86d7f5d3SJohn Marino /* Manipulate LVs */
482*86d7f5d3SJohn Marino struct logical_volume *lv_create_empty(const char *name,
483*86d7f5d3SJohn Marino 				       union lvid *lvid,
484*86d7f5d3SJohn Marino 				       uint32_t status,
485*86d7f5d3SJohn Marino 				       alloc_policy_t alloc,
486*86d7f5d3SJohn Marino 				       struct volume_group *vg);
487*86d7f5d3SJohn Marino 
488*86d7f5d3SJohn Marino /* Write out LV contents */
489*86d7f5d3SJohn Marino int set_lv(struct cmd_context *cmd, struct logical_volume *lv,
490*86d7f5d3SJohn Marino            uint64_t sectors, int value);
491*86d7f5d3SJohn Marino 
492*86d7f5d3SJohn Marino /* Reduce the size of an LV by extents */
493*86d7f5d3SJohn Marino int lv_reduce(struct logical_volume *lv, uint32_t extents);
494*86d7f5d3SJohn Marino 
495*86d7f5d3SJohn Marino /* Empty an LV prior to deleting it */
496*86d7f5d3SJohn Marino int lv_empty(struct logical_volume *lv);
497*86d7f5d3SJohn Marino 
498*86d7f5d3SJohn Marino /* Empty an LV and add error segment */
499*86d7f5d3SJohn Marino int replace_lv_with_error_segment(struct logical_volume *lv);
500*86d7f5d3SJohn Marino 
501*86d7f5d3SJohn Marino /* Entry point for all LV extent allocations */
502*86d7f5d3SJohn Marino int lv_extend(struct logical_volume *lv,
503*86d7f5d3SJohn Marino 	      const struct segment_type *segtype,
504*86d7f5d3SJohn Marino 	      uint32_t stripes, uint32_t stripe_size,
505*86d7f5d3SJohn Marino 	      uint32_t mirrors, uint32_t extents,
506*86d7f5d3SJohn Marino 	      struct physical_volume *mirrored_pv, uint32_t mirrored_pe,
507*86d7f5d3SJohn Marino 	      uint32_t status, struct dm_list *allocatable_pvs,
508*86d7f5d3SJohn Marino 	      alloc_policy_t alloc);
509*86d7f5d3SJohn Marino 
510*86d7f5d3SJohn Marino /* lv must be part of lv->vg->lvs */
511*86d7f5d3SJohn Marino int lv_remove(struct logical_volume *lv);
512*86d7f5d3SJohn Marino 
513*86d7f5d3SJohn Marino int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv,
514*86d7f5d3SJohn Marino 		     force_t force);
515*86d7f5d3SJohn Marino 
516*86d7f5d3SJohn Marino int lv_remove_with_dependencies(struct cmd_context *cmd, struct logical_volume *lv,
517*86d7f5d3SJohn Marino 				force_t force);
518*86d7f5d3SJohn Marino 
519*86d7f5d3SJohn Marino int lv_rename(struct cmd_context *cmd, struct logical_volume *lv,
520*86d7f5d3SJohn Marino 	      const char *new_name);
521*86d7f5d3SJohn Marino 
522*86d7f5d3SJohn Marino uint64_t extents_from_size(struct cmd_context *cmd, uint64_t size,
523*86d7f5d3SJohn Marino 			   uint32_t extent_size);
524*86d7f5d3SJohn Marino 
525*86d7f5d3SJohn Marino /* FIXME: refactor and reduce the size of this struct! */
526*86d7f5d3SJohn Marino struct lvcreate_params {
527*86d7f5d3SJohn Marino 	/* flags */
528*86d7f5d3SJohn Marino 	int snapshot; /* snap */
529*86d7f5d3SJohn Marino 	int zero; /* all */
530*86d7f5d3SJohn Marino 	int major; /* all */
531*86d7f5d3SJohn Marino 	int minor; /* all */
532*86d7f5d3SJohn Marino 	int corelog; /* mirror */
533*86d7f5d3SJohn Marino 	int nosync; /* mirror */
534*86d7f5d3SJohn Marino 
535*86d7f5d3SJohn Marino 	char *origin; /* snap */
536*86d7f5d3SJohn Marino 	const char *vg_name; /* all */
537*86d7f5d3SJohn Marino 	const char *lv_name; /* all */
538*86d7f5d3SJohn Marino 
539*86d7f5d3SJohn Marino 	uint32_t stripes; /* striped */
540*86d7f5d3SJohn Marino 	uint32_t stripe_size; /* striped */
541*86d7f5d3SJohn Marino 	uint32_t chunk_size; /* snapshot */
542*86d7f5d3SJohn Marino 	uint32_t region_size; /* mirror */
543*86d7f5d3SJohn Marino 
544*86d7f5d3SJohn Marino 	uint32_t mirrors; /* mirror */
545*86d7f5d3SJohn Marino 
546*86d7f5d3SJohn Marino 	const struct segment_type *segtype; /* all */
547*86d7f5d3SJohn Marino 
548*86d7f5d3SJohn Marino 	/* size */
549*86d7f5d3SJohn Marino 	uint32_t extents; /* all */
550*86d7f5d3SJohn Marino 	uint32_t voriginextents; /* snapshot */
551*86d7f5d3SJohn Marino 	uint64_t voriginsize; /* snapshot */
552*86d7f5d3SJohn Marino 	struct dm_list *pvh; /* all */
553*86d7f5d3SJohn Marino 
554*86d7f5d3SJohn Marino 	uint32_t permission; /* all */
555*86d7f5d3SJohn Marino 	uint32_t read_ahead; /* all */
556*86d7f5d3SJohn Marino 	alloc_policy_t alloc; /* all */
557*86d7f5d3SJohn Marino 
558*86d7f5d3SJohn Marino 	const char *tag; /* all */
559*86d7f5d3SJohn Marino };
560*86d7f5d3SJohn Marino 
561*86d7f5d3SJohn Marino int lv_create_single(struct volume_group *vg,
562*86d7f5d3SJohn Marino 		     struct lvcreate_params *lp);
563*86d7f5d3SJohn Marino 
564*86d7f5d3SJohn Marino /*
565*86d7f5d3SJohn Marino  * Functions for layer manipulation
566*86d7f5d3SJohn Marino  */
567*86d7f5d3SJohn Marino int insert_layer_for_segments_on_pv(struct cmd_context *cmd,
568*86d7f5d3SJohn Marino 				    struct logical_volume *lv_where,
569*86d7f5d3SJohn Marino 				    struct logical_volume *layer_lv,
570*86d7f5d3SJohn Marino 				    uint32_t status,
571*86d7f5d3SJohn Marino 				    struct pv_list *pv,
572*86d7f5d3SJohn Marino 				    struct dm_list *lvs_changed);
573*86d7f5d3SJohn Marino int remove_layers_for_segments(struct cmd_context *cmd,
574*86d7f5d3SJohn Marino 			       struct logical_volume *lv,
575*86d7f5d3SJohn Marino 			       struct logical_volume *layer_lv,
576*86d7f5d3SJohn Marino 			       uint32_t status_mask, struct dm_list *lvs_changed);
577*86d7f5d3SJohn Marino int remove_layers_for_segments_all(struct cmd_context *cmd,
578*86d7f5d3SJohn Marino 				   struct logical_volume *layer_lv,
579*86d7f5d3SJohn Marino 				   uint32_t status_mask,
580*86d7f5d3SJohn Marino 				   struct dm_list *lvs_changed);
581*86d7f5d3SJohn Marino int split_parent_segments_for_layer(struct cmd_context *cmd,
582*86d7f5d3SJohn Marino 				    struct logical_volume *layer_lv);
583*86d7f5d3SJohn Marino int remove_layer_from_lv(struct logical_volume *lv,
584*86d7f5d3SJohn Marino 			 struct logical_volume *layer_lv);
585*86d7f5d3SJohn Marino struct logical_volume *insert_layer_for_lv(struct cmd_context *cmd,
586*86d7f5d3SJohn Marino 					   struct logical_volume *lv_where,
587*86d7f5d3SJohn Marino 					   uint32_t status,
588*86d7f5d3SJohn Marino 					   const char *layer_suffix);
589*86d7f5d3SJohn Marino 
590*86d7f5d3SJohn Marino /* Find a PV within a given VG */
591*86d7f5d3SJohn Marino struct pv_list *find_pv_in_vg(const struct volume_group *vg,
592*86d7f5d3SJohn Marino 			      const char *pv_name);
593*86d7f5d3SJohn Marino struct physical_volume *find_pv_in_vg_by_uuid(const struct volume_group *vg,
594*86d7f5d3SJohn Marino 			    const struct id *id);
595*86d7f5d3SJohn Marino 
596*86d7f5d3SJohn Marino /* Find an LV within a given VG */
597*86d7f5d3SJohn Marino struct lv_list *find_lv_in_vg(const struct volume_group *vg,
598*86d7f5d3SJohn Marino 			      const char *lv_name);
599*86d7f5d3SJohn Marino 
600*86d7f5d3SJohn Marino /* FIXME Merge these functions with ones above */
601*86d7f5d3SJohn Marino struct logical_volume *find_lv(const struct volume_group *vg,
602*86d7f5d3SJohn Marino 			       const char *lv_name);
603*86d7f5d3SJohn Marino struct physical_volume *find_pv_by_name(struct cmd_context *cmd,
604*86d7f5d3SJohn Marino 					const char *pv_name);
605*86d7f5d3SJohn Marino 
606*86d7f5d3SJohn Marino /* Find LV segment containing given LE */
607*86d7f5d3SJohn Marino struct lv_segment *first_seg(const struct logical_volume *lv);
608*86d7f5d3SJohn Marino 
609*86d7f5d3SJohn Marino 
610*86d7f5d3SJohn Marino /*
611*86d7f5d3SJohn Marino * Useful functions for managing snapshots.
612*86d7f5d3SJohn Marino */
613*86d7f5d3SJohn Marino int lv_is_origin(const struct logical_volume *lv);
614*86d7f5d3SJohn Marino int lv_is_virtual_origin(const struct logical_volume *lv);
615*86d7f5d3SJohn Marino int lv_is_cow(const struct logical_volume *lv);
616*86d7f5d3SJohn Marino 
617*86d7f5d3SJohn Marino /* Test if given LV is visible from user's perspective */
618*86d7f5d3SJohn Marino int lv_is_visible(const struct logical_volume *lv);
619*86d7f5d3SJohn Marino 
620*86d7f5d3SJohn Marino int pv_is_in_vg(struct volume_group *vg, struct physical_volume *pv);
621*86d7f5d3SJohn Marino 
622*86d7f5d3SJohn Marino /* Given a cow LV, return return the snapshot lv_segment that uses it */
623*86d7f5d3SJohn Marino struct lv_segment *find_cow(const struct logical_volume *lv);
624*86d7f5d3SJohn Marino 
625*86d7f5d3SJohn Marino /* Given a cow LV, return its origin */
626*86d7f5d3SJohn Marino struct logical_volume *origin_from_cow(const struct logical_volume *lv);
627*86d7f5d3SJohn Marino 
628*86d7f5d3SJohn Marino void init_snapshot_seg(struct lv_segment *seg, struct logical_volume *origin,
629*86d7f5d3SJohn Marino 		       struct logical_volume *cow, uint32_t chunk_size);
630*86d7f5d3SJohn Marino 
631*86d7f5d3SJohn Marino int vg_add_snapshot(struct logical_volume *origin, struct logical_volume *cow,
632*86d7f5d3SJohn Marino 		    union lvid *lvid, uint32_t extent_count,
633*86d7f5d3SJohn Marino 		    uint32_t chunk_size);
634*86d7f5d3SJohn Marino 
635*86d7f5d3SJohn Marino int vg_remove_snapshot(struct logical_volume *cow);
636*86d7f5d3SJohn Marino 
637*86d7f5d3SJohn Marino int vg_check_status(const struct volume_group *vg, uint32_t status);
638*86d7f5d3SJohn Marino 
639*86d7f5d3SJohn Marino /*
640*86d7f5d3SJohn Marino  * Returns visible LV count - number of LVs from user perspective
641*86d7f5d3SJohn Marino  */
642*86d7f5d3SJohn Marino unsigned vg_visible_lvs(const struct volume_group *vg);
643*86d7f5d3SJohn Marino 
644*86d7f5d3SJohn Marino /*
645*86d7f5d3SJohn Marino  * Check if the VG reached maximal LVs count (if set)
646*86d7f5d3SJohn Marino  */
647*86d7f5d3SJohn Marino int vg_max_lv_reached(struct volume_group *vg);
648*86d7f5d3SJohn Marino 
649*86d7f5d3SJohn Marino /*
650*86d7f5d3SJohn Marino * Mirroring functions
651*86d7f5d3SJohn Marino */
652*86d7f5d3SJohn Marino struct lv_segment *find_mirror_seg(struct lv_segment *seg);
653*86d7f5d3SJohn Marino int lv_add_mirrors(struct cmd_context *cmd, struct logical_volume *lv,
654*86d7f5d3SJohn Marino 		   uint32_t mirrors, uint32_t stripes,
655*86d7f5d3SJohn Marino 		   uint32_t region_size, uint32_t log_count,
656*86d7f5d3SJohn Marino 		   struct dm_list *pvs, alloc_policy_t alloc, uint32_t flags);
657*86d7f5d3SJohn Marino int lv_remove_mirrors(struct cmd_context *cmd, struct logical_volume *lv,
658*86d7f5d3SJohn Marino 		      uint32_t mirrors, uint32_t log_count,
659*86d7f5d3SJohn Marino 		      struct dm_list *pvs, uint32_t status_mask);
660*86d7f5d3SJohn Marino 
661*86d7f5d3SJohn Marino int is_temporary_mirror_layer(const struct logical_volume *lv);
662*86d7f5d3SJohn Marino struct logical_volume * find_temporary_mirror(const struct logical_volume *lv);
663*86d7f5d3SJohn Marino uint32_t lv_mirror_count(const struct logical_volume *lv);
664*86d7f5d3SJohn Marino uint32_t adjusted_mirror_region_size(uint32_t extent_size, uint32_t extents,
665*86d7f5d3SJohn Marino                                     uint32_t region_size);
666*86d7f5d3SJohn Marino int remove_mirrors_from_segments(struct logical_volume *lv,
667*86d7f5d3SJohn Marino 				 uint32_t new_mirrors, uint32_t status_mask);
668*86d7f5d3SJohn Marino int add_mirrors_to_segments(struct cmd_context *cmd, struct logical_volume *lv,
669*86d7f5d3SJohn Marino 			    uint32_t mirrors, uint32_t region_size,
670*86d7f5d3SJohn Marino 			    struct dm_list *allocatable_pvs, alloc_policy_t alloc);
671*86d7f5d3SJohn Marino 
672*86d7f5d3SJohn Marino int remove_mirror_images(struct logical_volume *lv, uint32_t num_mirrors,
673*86d7f5d3SJohn Marino 			 struct dm_list *removable_pvs, unsigned remove_log);
674*86d7f5d3SJohn Marino int add_mirror_images(struct cmd_context *cmd, struct logical_volume *lv,
675*86d7f5d3SJohn Marino 		      uint32_t mirrors, uint32_t stripes, uint32_t region_size,
676*86d7f5d3SJohn Marino 		      struct dm_list *allocatable_pvs, alloc_policy_t alloc,
677*86d7f5d3SJohn Marino 		      uint32_t log_count);
678*86d7f5d3SJohn Marino struct logical_volume *detach_mirror_log(struct lv_segment *seg);
679*86d7f5d3SJohn Marino int attach_mirror_log(struct lv_segment *seg, struct logical_volume *lv);
680*86d7f5d3SJohn Marino int remove_mirror_log(struct cmd_context *cmd, struct logical_volume *lv,
681*86d7f5d3SJohn Marino 		      struct dm_list *removable_pvs);
682*86d7f5d3SJohn Marino int add_mirror_log(struct cmd_context *cmd, struct logical_volume *lv,
683*86d7f5d3SJohn Marino 		   uint32_t log_count, uint32_t region_size,
684*86d7f5d3SJohn Marino 		   struct dm_list *allocatable_pvs, alloc_policy_t alloc);
685*86d7f5d3SJohn Marino 
686*86d7f5d3SJohn Marino int reconfigure_mirror_images(struct lv_segment *mirrored_seg, uint32_t num_mirrors,
687*86d7f5d3SJohn Marino 			      struct dm_list *removable_pvs, unsigned remove_log);
688*86d7f5d3SJohn Marino int collapse_mirrored_lv(struct logical_volume *lv);
689*86d7f5d3SJohn Marino int shift_mirror_images(struct lv_segment *mirrored_seg, unsigned mimage);
690*86d7f5d3SJohn Marino 
691*86d7f5d3SJohn Marino struct logical_volume *find_pvmove_lv(struct volume_group *vg,
692*86d7f5d3SJohn Marino 				      struct device *dev, uint32_t lv_type);
693*86d7f5d3SJohn Marino struct logical_volume *find_pvmove_lv_from_pvname(struct cmd_context *cmd,
694*86d7f5d3SJohn Marino 						  struct volume_group *vg,
695*86d7f5d3SJohn Marino 						  const char *name,
696*86d7f5d3SJohn Marino 						  const char *uuid,
697*86d7f5d3SJohn Marino 						  uint32_t lv_type);
698*86d7f5d3SJohn Marino const char *get_pvmove_pvname_from_lv(struct logical_volume *lv);
699*86d7f5d3SJohn Marino const char *get_pvmove_pvname_from_lv_mirr(struct logical_volume *lv_mirr);
700*86d7f5d3SJohn Marino float copy_percent(struct logical_volume *lv_mirr,
701*86d7f5d3SJohn Marino 		   percent_range_t *percent_range);
702*86d7f5d3SJohn Marino struct dm_list *lvs_using_lv(struct cmd_context *cmd, struct volume_group *vg,
703*86d7f5d3SJohn Marino 			  struct logical_volume *lv);
704*86d7f5d3SJohn Marino 
705*86d7f5d3SJohn Marino uint32_t find_free_lvnum(struct logical_volume *lv);
706*86d7f5d3SJohn Marino char *generate_lv_name(struct volume_group *vg, const char *format,
707*86d7f5d3SJohn Marino 		       char *buffer, size_t len);
708*86d7f5d3SJohn Marino 
709*86d7f5d3SJohn Marino /*
710*86d7f5d3SJohn Marino * Begin skeleton for external LVM library
711*86d7f5d3SJohn Marino */
712*86d7f5d3SJohn Marino struct device *pv_dev(const struct physical_volume *pv);
713*86d7f5d3SJohn Marino const char *pv_vg_name(const struct physical_volume *pv);
714*86d7f5d3SJohn Marino const char *pv_dev_name(const struct physical_volume *pv);
715*86d7f5d3SJohn Marino uint64_t pv_size(const struct physical_volume *pv);
716*86d7f5d3SJohn Marino uint32_t pv_status(const struct physical_volume *pv);
717*86d7f5d3SJohn Marino uint32_t pv_pe_size(const struct physical_volume *pv);
718*86d7f5d3SJohn Marino uint64_t pv_pe_start(const struct physical_volume *pv);
719*86d7f5d3SJohn Marino uint32_t pv_pe_count(const struct physical_volume *pv);
720*86d7f5d3SJohn Marino uint32_t pv_pe_alloc_count(const struct physical_volume *pv);
721*86d7f5d3SJohn Marino uint32_t pv_mda_count(const struct physical_volume *pv);
722*86d7f5d3SJohn Marino 
723*86d7f5d3SJohn Marino uint64_t lv_size(const struct logical_volume *lv);
724*86d7f5d3SJohn Marino 
725*86d7f5d3SJohn Marino int vg_missing_pv_count(const struct volume_group *vg);
726*86d7f5d3SJohn Marino uint32_t vg_seqno(const struct volume_group *vg);
727*86d7f5d3SJohn Marino uint32_t vg_status(const struct volume_group *vg);
728*86d7f5d3SJohn Marino uint64_t vg_size(const struct volume_group *vg);
729*86d7f5d3SJohn Marino uint64_t vg_free(const struct volume_group *vg);
730*86d7f5d3SJohn Marino uint64_t vg_extent_size(const struct volume_group *vg);
731*86d7f5d3SJohn Marino uint64_t vg_extent_count(const struct volume_group *vg);
732*86d7f5d3SJohn Marino uint64_t vg_free_count(const struct volume_group *vg);
733*86d7f5d3SJohn Marino uint64_t vg_pv_count(const struct volume_group *vg);
734*86d7f5d3SJohn Marino uint64_t vg_max_pv(const struct volume_group *vg);
735*86d7f5d3SJohn Marino uint64_t vg_max_lv(const struct volume_group *vg);
736*86d7f5d3SJohn Marino uint32_t vg_mda_count(const struct volume_group *vg);
737*86d7f5d3SJohn Marino int vg_check_write_mode(struct volume_group *vg);
738*86d7f5d3SJohn Marino #define vg_is_clustered(vg) (vg_status((vg)) & CLUSTERED)
739*86d7f5d3SJohn Marino #define vg_is_exported(vg) (vg_status((vg)) & EXPORTED_VG)
740*86d7f5d3SJohn Marino #define vg_is_resizeable(vg) (vg_status((vg)) & RESIZEABLE_VG)
741*86d7f5d3SJohn Marino 
742*86d7f5d3SJohn Marino int lv_has_unknown_segments(const struct logical_volume *lv);
743*86d7f5d3SJohn Marino int vg_has_unknown_segments(const struct volume_group *vg);
744*86d7f5d3SJohn Marino 
745*86d7f5d3SJohn Marino struct vgcreate_params {
746*86d7f5d3SJohn Marino 	char *vg_name;
747*86d7f5d3SJohn Marino 	uint32_t extent_size;
748*86d7f5d3SJohn Marino 	size_t max_pv;
749*86d7f5d3SJohn Marino 	size_t max_lv;
750*86d7f5d3SJohn Marino 	alloc_policy_t alloc;
751*86d7f5d3SJohn Marino 	int clustered; /* FIXME: put this into a 'status' variable instead? */
752*86d7f5d3SJohn Marino };
753*86d7f5d3SJohn Marino 
754*86d7f5d3SJohn Marino int vgcreate_params_validate(struct cmd_context *cmd,
755*86d7f5d3SJohn Marino 			     struct vgcreate_params *vp);
756*86d7f5d3SJohn Marino 
757*86d7f5d3SJohn Marino int validate_vg_rename_params(struct cmd_context *cmd,
758*86d7f5d3SJohn Marino 			      const char *vg_name_old,
759*86d7f5d3SJohn Marino 			      const char *vg_name_new);
760*86d7f5d3SJohn Marino #endif
761