1*86d7f5d3SJohn Marino /* $NetBSD: metadata-exported.h,v 1.1.1.3 2009/12/02 00:26:42 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