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