metadata-exported.h revision 1.1 1 /* $NetBSD: metadata-exported.h,v 1.1 2008/12/22 00:18:44 haad Exp $ */
2
3 /*
4 * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
5 * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved.
6 *
7 * This file is part of LVM2.
8 *
9 * This copyrighted material is made available to anyone wishing to use,
10 * modify, copy, or redistribute it subject to the terms and conditions
11 * of the GNU Lesser General Public License v.2.1.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program; if not, write to the Free Software Foundation,
15 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 */
17
18 /*
19 * This is the representation of LVM metadata that is being adapted
20 * for library export.
21 */
22
23 #ifndef _LVM_METADATA_EXPORTED_H
24 #define _LVM_METADATA_EXPORTED_H
25
26 #include "uuid.h"
27
28 struct physical_volume;
29 typedef struct physical_volume pv_t;
30 struct volume_group;
31 typedef struct volume_group vg_t;
32
33 struct logical_volume;
34
35 struct lv_segment;
36 struct pv_segment;
37
38 #define MAX_STRIPES 128U
39 #define SECTOR_SHIFT 9L
40 #define STRIPE_SIZE_MIN ( (unsigned) lvm_getpagesize() >> SECTOR_SHIFT) /* PAGESIZE in sectors */
41 #define STRIPE_SIZE_MAX ( 512L * 1024L >> SECTOR_SHIFT) /* 512 KB in sectors */
42 #define STRIPE_SIZE_LIMIT ((UINT_MAX >> 2) + 1)
43 #define PV_MIN_SIZE ( 512L * 1024L >> SECTOR_SHIFT) /* 512 KB in sectors */
44 #define MAX_RESTRICTED_LVS 255 /* Used by FMT_RESTRICTED_LVIDS */
45
46 /* Layer suffix */
47 #define MIRROR_SYNC_LAYER "_mimagetmp"
48
49 /* Various flags */
50 /* Note that the bits no longer necessarily correspond to LVM1 disk format */
51
52 #define PARTIAL_VG 0x00000001U /* VG */
53 #define EXPORTED_VG 0x00000002U /* VG PV */
54 #define RESIZEABLE_VG 0x00000004U /* VG */
55
56 /* May any free extents on this PV be used or must they be left free? */
57 #define ALLOCATABLE_PV 0x00000008U /* PV */
58
59 //#define SPINDOWN_LV 0x00000010U /* LV */
60 //#define BADBLOCK_ON 0x00000020U /* LV */
61 #define VISIBLE_LV 0x00000040U /* LV */
62 #define FIXED_MINOR 0x00000080U /* LV */
63 /* FIXME Remove when metadata restructuring is completed */
64 #define SNAPSHOT 0x00001000U /* LV - internal use only */
65 #define PVMOVE 0x00002000U /* VG LV SEG */
66 #define LOCKED 0x00004000U /* LV */
67 #define MIRRORED 0x00008000U /* LV - internal use only */
68 //#define VIRTUAL 0x00010000U /* LV - internal use only */
69 #define MIRROR_LOG 0x00020000U /* LV */
70 #define MIRROR_IMAGE 0x00040000U /* LV */
71 #define MIRROR_NOTSYNCED 0x00080000U /* LV */
72 //#define ACTIVATE_EXCL 0x00100000U /* LV - internal use only */
73 //#define PRECOMMITTED 0x00200000U /* VG - internal use only */
74 #define CONVERTING 0x00400000U /* LV */
75
76 #define MISSING_PV 0x00800000U /* PV */
77 #define PARTIAL_LV 0x01000000U /* LV - derived flag, not
78 written out in metadata*/
79
80 //#define POSTORDER_FLAG 0x02000000U /* Not real flags, reserved for
81 //#define POSTORDER_OPEN_FLAG 0x04000000U temporary use inside vg_read. */
82
83 #define LVM_READ 0x00000100U /* LV VG */
84 #define LVM_WRITE 0x00000200U /* LV VG */
85 #define CLUSTERED 0x00000400U /* VG */
86 //#define SHARED 0x00000800U /* VG */
87
88 /* Format features flags */
89 #define FMT_SEGMENTS 0x00000001U /* Arbitrary segment params? */
90 #define FMT_MDAS 0x00000002U /* Proper metadata areas? */
91 #define FMT_TAGS 0x00000004U /* Tagging? */
92 #define FMT_UNLIMITED_VOLS 0x00000008U /* Unlimited PVs/LVs? */
93 #define FMT_RESTRICTED_LVIDS 0x00000010U /* LVID <= 255 */
94 #define FMT_ORPHAN_ALLOCATABLE 0x00000020U /* Orphan PV allocatable? */
95 //#define FMT_PRECOMMIT 0x00000040U /* Supports pre-commit? */
96 #define FMT_RESIZE_PV 0x00000080U /* Supports pvresize? */
97 #define FMT_UNLIMITED_STRIPESIZE 0x00000100U /* Unlimited stripe size? */
98 #define FMT_RESTRICTED_READAHEAD 0x00000200U /* Readahead restricted to 2-120? */
99
100 /* LVM2 external library flags */
101 #define CORRECT_INCONSISTENT 0x00000001U /* Correct inconsistent metadata */
102 #define FAIL_INCONSISTENT 0x00000002U /* Fail if metadata inconsistent */
103
104 /* Mirror conversion type flags */
105 #define MIRROR_BY_SEG 0x00000001U /* segment-by-segment mirror */
106 #define MIRROR_BY_LV 0x00000002U /* mirror using whole mimage LVs */
107 #define MIRROR_SKIP_INIT_SYNC 0x00000010U /* skip initial sync */
108
109 /* Ordered list - see lv_manip.c */
110 typedef enum {
111 ALLOC_INVALID,
112 ALLOC_CONTIGUOUS,
113 ALLOC_CLING,
114 ALLOC_NORMAL,
115 ALLOC_ANYWHERE,
116 ALLOC_INHERIT
117 } alloc_policy_t;
118
119 typedef enum {
120 AREA_UNASSIGNED,
121 AREA_PV,
122 AREA_LV
123 } area_type_t;
124
125 /*
126 * Whether or not to force an operation.
127 */
128 typedef enum {
129 PROMPT = 0, /* Issue yes/no prompt to confirm operation */
130 DONT_PROMPT = 1, /* Skip yes/no prompt */
131 DONT_PROMPT_OVERRIDE = 2 /* Skip prompt + override a second condition */
132 } force_t;
133
134 struct cmd_context;
135 struct format_handler;
136 struct labeller;
137
138 struct format_type {
139 struct dm_list list;
140 struct cmd_context *cmd;
141 struct format_handler *ops;
142 struct labeller *labeller;
143 const char *name;
144 const char *alias;
145 const char *orphan_vg_name;
146 uint32_t features;
147 void *library;
148 void *private;
149 };
150
151 struct pv_segment {
152 struct dm_list list; /* Member of pv->segments: ordered list
153 * covering entire data area on this PV */
154
155 struct physical_volume *pv;
156 uint32_t pe;
157 uint32_t len;
158
159 struct lv_segment *lvseg; /* NULL if free space */
160 uint32_t lv_area; /* Index to area in LV segment */
161 };
162
163 #define pvseg_is_allocated(pvseg) ((pvseg)->lvseg)
164
165 struct physical_volume {
166 struct id id;
167 struct device *dev;
168 const struct format_type *fmt;
169 const char *vg_name;
170 struct id vgid;
171
172 uint32_t status;
173 uint64_t size;
174
175 /* physical extents */
176 uint32_t pe_size;
177 uint64_t pe_start;
178 uint32_t pe_count;
179 uint32_t pe_alloc_count;
180 unsigned long pe_align;
181
182 struct dm_list segments; /* Ordered pv_segments covering complete PV */
183 struct dm_list tags;
184 };
185
186 struct format_instance {
187 const struct format_type *fmt;
188 struct dm_list metadata_areas; /* e.g. metadata locations */
189 void *private;
190 };
191
192 struct volume_group {
193 struct cmd_context *cmd;
194 struct format_instance *fid;
195 uint32_t seqno; /* Metadata sequence number */
196
197 struct id id;
198 char *name;
199 char *system_id;
200
201 uint32_t status;
202 alloc_policy_t alloc;
203
204 uint32_t extent_size;
205 uint32_t extent_count;
206 uint32_t free_count;
207
208 uint32_t max_lv;
209 uint32_t max_pv;
210
211 /* physical volumes */
212 uint32_t pv_count;
213 struct dm_list pvs;
214
215 /*
216 * logical volumes
217 * The following relationship should always hold:
218 * dm_list_size(lvs) = lv_count + 2 * snapshot_count
219 *
220 * Snapshots consist of 2 instances of "struct logical_volume":
221 * - cow (lv_name is visible to the user)
222 * - snapshot (lv_name is 'snapshotN')
223 * Neither of these instances is reflected in lv_count, but we
224 * multiply the snapshot_count by 2.
225 *
226 * Mirrors consist of multiple instances of "struct logical_volume":
227 * - one for the mirror log
228 * - one for each mirror leg
229 * - one for the user-visible mirror LV
230 * all of the instances are reflected in lv_count.
231 */
232 uint32_t lv_count;
233 uint32_t snapshot_count;
234 struct dm_list lvs;
235
236 struct dm_list tags;
237 };
238
239 /* There will be one area for each stripe */
240 struct lv_segment_area {
241 area_type_t type;
242 union {
243 struct {
244 struct pv_segment *pvseg;
245 } pv;
246 struct {
247 struct logical_volume *lv;
248 uint32_t le;
249 } lv;
250 } u;
251 };
252
253 struct segment_type;
254 struct lv_segment {
255 struct dm_list list;
256 struct logical_volume *lv;
257
258 const struct segment_type *segtype;
259 uint32_t le;
260 uint32_t len;
261
262 uint32_t status;
263
264 /* FIXME Fields depend on segment type */
265 uint32_t stripe_size;
266 uint32_t area_count;
267 uint32_t area_len;
268 struct logical_volume *origin;
269 struct logical_volume *cow;
270 struct dm_list origin_list;
271 uint32_t chunk_size; /* For snapshots - in sectors */
272 uint32_t region_size; /* For mirrors - in sectors */
273 uint32_t extents_copied;
274 struct logical_volume *log_lv;
275
276 struct dm_list tags;
277
278 struct lv_segment_area *areas;
279 };
280
281 #define seg_type(seg, s) (seg)->areas[(s)].type
282 #define seg_pv(seg, s) (seg)->areas[(s)].u.pv.pvseg->pv
283 #define seg_lv(seg, s) (seg)->areas[(s)].u.lv.lv
284
285 struct logical_volume {
286 union lvid lvid;
287 char *name;
288
289 struct volume_group *vg;
290
291 uint32_t status;
292 alloc_policy_t alloc;
293 uint32_t read_ahead;
294 int32_t major;
295 int32_t minor;
296
297 uint64_t size; /* Sectors */
298 uint32_t le_count;
299
300 uint32_t origin_count;
301 struct dm_list snapshot_segs;
302 struct lv_segment *snapshot;
303
304 struct dm_list segments;
305 struct dm_list tags;
306 struct dm_list segs_using_this_lv;
307 };
308
309 struct pe_range {
310 struct dm_list list;
311 uint32_t start; /* PEs */
312 uint32_t count; /* PEs */
313 };
314
315 struct pv_list {
316 struct dm_list list;
317 struct physical_volume *pv;
318 struct dm_list *mdas; /* Metadata areas */
319 struct dm_list *pe_ranges; /* Ranges of PEs e.g. for allocation */
320 };
321
322 struct lv_list {
323 struct dm_list list;
324 struct logical_volume *lv;
325 };
326
327 /*
328 * Utility functions
329 */
330 int vg_write(struct volume_group *vg);
331 int vg_commit(struct volume_group *vg);
332 int vg_revert(struct volume_group *vg);
333 struct volume_group *vg_read(struct cmd_context *cmd, const char *vg_name,
334 const char *vgid, int *consistent);
335 struct physical_volume *pv_read(struct cmd_context *cmd, const char *pv_name,
336 struct dm_list *mdas, uint64_t *label_sector,
337 int warnings);
338 struct dm_list *get_pvs(struct cmd_context *cmd);
339
340 /* Set full_scan to 1 to re-read every (filtered) device label */
341 struct dm_list *get_vgs(struct cmd_context *cmd, int full_scan);
342 struct dm_list *get_vgids(struct cmd_context *cmd, int full_scan);
343 int scan_vgs_for_pvs(struct cmd_context *cmd);
344
345 int pv_write(struct cmd_context *cmd, struct physical_volume *pv,
346 struct dm_list *mdas, int64_t label_sector);
347 int is_pv(pv_t *pv);
348 int is_orphan_vg(const char *vg_name);
349 int is_orphan(const pv_t *pv);
350 int vgs_are_compatible(struct cmd_context *cmd,
351 struct volume_group *vg_from,
352 struct volume_group *vg_to);
353 vg_t *vg_lock_and_read(struct cmd_context *cmd, const char *vg_name,
354 const char *vgid,
355 uint32_t lock_flags, uint32_t status_flags,
356 uint32_t misc_flags);
357
358 /* pe_start and pe_end relate to any existing data so that new metadata
359 * areas can avoid overlap */
360 pv_t *pv_create(const struct cmd_context *cmd,
361 struct device *dev,
362 struct id *id,
363 uint64_t size,
364 uint64_t pe_start,
365 uint32_t existing_extent_count,
366 uint32_t existing_extent_size,
367 int pvmetadatacopies,
368 uint64_t pvmetadatasize, struct dm_list *mdas);
369 int pv_resize(struct physical_volume *pv, struct volume_group *vg,
370 uint32_t new_pe_count);
371 int pv_analyze(struct cmd_context *cmd, const char *pv_name,
372 uint64_t label_sector);
373
374 /* FIXME: move internal to library */
375 uint32_t pv_list_extents_free(const struct dm_list *pvh);
376
377 struct volume_group *vg_create(struct cmd_context *cmd, const char *name,
378 uint32_t extent_size, uint32_t max_pv,
379 uint32_t max_lv, alloc_policy_t alloc,
380 int pv_count, char **pv_names);
381 int vg_remove(struct volume_group *vg);
382 int vg_remove_single(struct cmd_context *cmd, const char *vg_name,
383 struct volume_group *vg, int consistent,
384 force_t force);
385 int vg_rename(struct cmd_context *cmd, struct volume_group *vg,
386 const char *new_name);
387 int vg_extend(struct volume_group *vg, int pv_count, char **pv_names);
388 int vg_change_pesize(struct cmd_context *cmd, struct volume_group *vg,
389 uint32_t new_extent_size);
390 int vg_split_mdas(struct cmd_context *cmd, struct volume_group *vg_from,
391 struct volume_group *vg_to);
392
393 /* Manipulate LVs */
394 struct logical_volume *lv_create_empty(const char *name,
395 union lvid *lvid,
396 uint32_t status,
397 alloc_policy_t alloc,
398 int import,
399 struct volume_group *vg);
400
401 /* Write out LV contents */
402 int set_lv(struct cmd_context *cmd, struct logical_volume *lv,
403 uint64_t sectors, int value);
404
405 /* Reduce the size of an LV by extents */
406 int lv_reduce(struct logical_volume *lv, uint32_t extents);
407
408 /* Empty an LV prior to deleting it */
409 int lv_empty(struct logical_volume *lv);
410
411 /* Empty an LV and add error segment */
412 int replace_lv_with_error_segment(struct logical_volume *lv);
413
414 /* Entry point for all LV extent allocations */
415 int lv_extend(struct logical_volume *lv,
416 const struct segment_type *segtype,
417 uint32_t stripes, uint32_t stripe_size,
418 uint32_t mirrors, uint32_t extents,
419 struct physical_volume *mirrored_pv, uint32_t mirrored_pe,
420 uint32_t status, struct dm_list *allocatable_pvs,
421 alloc_policy_t alloc);
422
423 /* lv must be part of lv->vg->lvs */
424 int lv_remove(struct logical_volume *lv);
425
426 int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv,
427 force_t force);
428
429 int lv_remove_with_dependencies(struct cmd_context *cmd, struct logical_volume *lv,
430 force_t force);
431
432 int lv_rename(struct cmd_context *cmd, struct logical_volume *lv,
433 const char *new_name);
434
435 /*
436 * Functions for layer manipulation
437 */
438 int insert_layer_for_segments_on_pv(struct cmd_context *cmd,
439 struct logical_volume *lv_where,
440 struct logical_volume *layer_lv,
441 uint32_t status,
442 struct pv_list *pv,
443 struct dm_list *lvs_changed);
444 int remove_layers_for_segments(struct cmd_context *cmd,
445 struct logical_volume *lv,
446 struct logical_volume *layer_lv,
447 uint32_t status_mask, struct dm_list *lvs_changed);
448 int remove_layers_for_segments_all(struct cmd_context *cmd,
449 struct logical_volume *layer_lv,
450 uint32_t status_mask,
451 struct dm_list *lvs_changed);
452 int split_parent_segments_for_layer(struct cmd_context *cmd,
453 struct logical_volume *layer_lv);
454 int remove_layer_from_lv(struct logical_volume *lv,
455 struct logical_volume *layer_lv);
456 struct logical_volume *insert_layer_for_lv(struct cmd_context *cmd,
457 struct logical_volume *lv_where,
458 uint32_t status,
459 const char *layer_suffix);
460
461 /* Find a PV within a given VG */
462 struct pv_list *find_pv_in_vg(const struct volume_group *vg,
463 const char *pv_name);
464 pv_t *find_pv_in_vg_by_uuid(const struct volume_group *vg,
465 const struct id *id);
466
467 /* Find an LV within a given VG */
468 struct lv_list *find_lv_in_vg(const struct volume_group *vg,
469 const char *lv_name);
470
471 /* FIXME Merge these functions with ones above */
472 struct logical_volume *find_lv(const struct volume_group *vg,
473 const char *lv_name);
474 struct physical_volume *find_pv_by_name(struct cmd_context *cmd,
475 const char *pv_name);
476
477 /* Find LV segment containing given LE */
478 struct lv_segment *first_seg(const struct logical_volume *lv);
479
480
481 /*
482 * Useful functions for managing snapshots.
483 */
484 int lv_is_origin(const struct logical_volume *lv);
485 int lv_is_cow(const struct logical_volume *lv);
486 int lv_is_visible(const struct logical_volume *lv);
487
488 int pv_is_in_vg(struct volume_group *vg, struct physical_volume *pv);
489
490 /* Given a cow LV, return return the snapshot lv_segment that uses it */
491 struct lv_segment *find_cow(const struct logical_volume *lv);
492
493 /* Given a cow LV, return its origin */
494 struct logical_volume *origin_from_cow(const struct logical_volume *lv);
495
496 int vg_add_snapshot(const char *name,
497 struct logical_volume *origin, struct logical_volume *cow,
498 union lvid *lvid, uint32_t extent_count,
499 uint32_t chunk_size);
500
501 int vg_remove_snapshot(struct logical_volume *cow);
502
503 int vg_check_status(const struct volume_group *vg, uint32_t status);
504
505 /*
506 * Mirroring functions
507 */
508 struct lv_segment *find_mirror_seg(struct lv_segment *seg);
509 int lv_add_mirrors(struct cmd_context *cmd, struct logical_volume *lv,
510 uint32_t mirrors, uint32_t stripes,
511 uint32_t region_size, uint32_t log_count,
512 struct dm_list *pvs, alloc_policy_t alloc, uint32_t flags);
513 int lv_remove_mirrors(struct cmd_context *cmd, struct logical_volume *lv,
514 uint32_t mirrors, uint32_t log_count,
515 struct dm_list *pvs, uint32_t status_mask);
516
517 int is_temporary_mirror_layer(const struct logical_volume *lv);
518 struct logical_volume * find_temporary_mirror(const struct logical_volume *lv);
519 uint32_t lv_mirror_count(const struct logical_volume *lv);
520 uint32_t adjusted_mirror_region_size(uint32_t extent_size, uint32_t extents,
521 uint32_t region_size);
522 int remove_mirrors_from_segments(struct logical_volume *lv,
523 uint32_t new_mirrors, uint32_t status_mask);
524 int add_mirrors_to_segments(struct cmd_context *cmd, struct logical_volume *lv,
525 uint32_t mirrors, uint32_t region_size,
526 struct dm_list *allocatable_pvs, alloc_policy_t alloc);
527
528 int remove_mirror_images(struct logical_volume *lv, uint32_t num_mirrors,
529 struct dm_list *removable_pvs, unsigned remove_log);
530 int add_mirror_images(struct cmd_context *cmd, struct logical_volume *lv,
531 uint32_t mirrors, uint32_t stripes, uint32_t region_size,
532 struct dm_list *allocatable_pvs, alloc_policy_t alloc,
533 uint32_t log_count);
534 struct logical_volume *detach_mirror_log(struct lv_segment *seg);
535 int attach_mirror_log(struct lv_segment *seg, struct logical_volume *lv);
536 int remove_mirror_log(struct cmd_context *cmd, struct logical_volume *lv,
537 struct dm_list *removable_pvs);
538 int add_mirror_log(struct cmd_context *cmd, struct logical_volume *lv,
539 uint32_t log_count, uint32_t region_size,
540 struct dm_list *allocatable_pvs, alloc_policy_t alloc);
541
542 int reconfigure_mirror_images(struct lv_segment *mirrored_seg, uint32_t num_mirrors,
543 struct dm_list *removable_pvs, unsigned remove_log);
544 int collapse_mirrored_lv(struct logical_volume *lv);
545 int shift_mirror_images(struct lv_segment *mirrored_seg, unsigned mimage);
546
547 struct logical_volume *find_pvmove_lv(struct volume_group *vg,
548 struct device *dev, uint32_t lv_type);
549 struct logical_volume *find_pvmove_lv_from_pvname(struct cmd_context *cmd,
550 struct volume_group *vg,
551 const char *name,
552 uint32_t lv_type);
553 const char *get_pvmove_pvname_from_lv(struct logical_volume *lv);
554 const char *get_pvmove_pvname_from_lv_mirr(struct logical_volume *lv_mirr);
555 float copy_percent(struct logical_volume *lv_mirr);
556 struct dm_list *lvs_using_lv(struct cmd_context *cmd, struct volume_group *vg,
557 struct logical_volume *lv);
558
559 uint32_t find_free_lvnum(struct logical_volume *lv);
560 char *generate_lv_name(struct volume_group *vg, const char *format,
561 char *buffer, size_t len);
562
563 /*
564 * Begin skeleton for external LVM library
565 */
566 struct device *pv_dev(const pv_t *pv);
567 const char *pv_vg_name(const pv_t *pv);
568 const char *pv_dev_name(const pv_t *pv);
569 uint64_t pv_size(const pv_t *pv);
570 uint32_t pv_status(const pv_t *pv);
571 uint32_t pv_pe_size(const pv_t *pv);
572 uint64_t pv_pe_start(const pv_t *pv);
573 uint32_t pv_pe_count(const pv_t *pv);
574 uint32_t pv_pe_alloc_count(const pv_t *pv);
575
576 int vg_missing_pv_count(const vg_t *vg);
577 uint32_t vg_status(const vg_t *vg);
578 #define vg_is_clustered(vg) (vg_status((vg)) & CLUSTERED)
579
580 struct vgcreate_params {
581 char *vg_name;
582 uint32_t extent_size;
583 size_t max_pv;
584 size_t max_lv;
585 alloc_policy_t alloc;
586 int clustered; /* FIXME: put this into a 'status' variable instead? */
587 };
588
589 int validate_vg_create_params(struct cmd_context *cmd,
590 struct vgcreate_params *vp);
591
592 int validate_vg_rename_params(struct cmd_context *cmd,
593 const char *vg_name_old,
594 const char *vg_name_new);
595 #endif
596