2010-09-30 17:16:55 +04:00
/*
2010-10-01 00:47:18 +04:00
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
2013-07-05 19:10:47 +04:00
* Copyright ( C ) 2004 - 2013 Red Hat , Inc . All rights reserved .
2010-09-30 17:16:55 +04:00
*
* This file is part of LVM2 .
*
* This copyrighted material is made available to anyone wishing to use ,
* modify , copy , or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v .2 .1 .
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program ; if not , write to the Free Software Foundation ,
* Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
2010-10-25 16:01:59 +04:00
# ifndef _LVM_VG_H
# define _LVM_VG_H
2010-09-30 17:16:55 +04:00
2012-01-26 02:26:33 +04:00
# include "uuid.h"
# include "libdevmapper.h"
2010-09-30 17:16:55 +04:00
struct cmd_context ;
struct format_instance ;
2013-07-05 19:10:47 +04:00
struct logical_volume ;
2010-09-30 17:16:55 +04:00
typedef enum {
ALLOC_INVALID ,
ALLOC_CONTIGUOUS ,
ALLOC_CLING ,
2010-11-09 15:34:40 +03:00
ALLOC_CLING_BY_TAGS , /* Internal - never written or displayed. */
2010-09-30 17:16:55 +04:00
ALLOC_NORMAL ,
ALLOC_ANYWHERE ,
ALLOC_INHERIT
} alloc_policy_t ;
2011-06-01 23:29:31 +04:00
struct pv_to_create {
struct dm_list list ;
struct physical_volume * pv ;
struct pvcreate_params * pp ;
} ;
2011-11-05 02:49:53 +04:00
# define MAX_EXTENT_COUNT (UINT32_MAX)
2010-09-30 17:16:55 +04:00
struct volume_group {
struct cmd_context * cmd ;
struct dm_pool * vgmem ;
struct format_instance * fid ;
2011-08-11 21:24:23 +04:00
struct lvmcache_vginfo * vginfo ;
2010-09-30 17:16:55 +04:00
struct dm_list * cmd_vgs ; /* List of wanted/locked and opened VGs */
uint32_t cmd_missing_vgs ; /* Flag marks missing VG */
uint32_t seqno ; /* Metadata sequence number */
2013-03-17 19:27:44 +04:00
/*
* The parsed on - disk copy of this VG ; is NULL if this is the on - disk
* version ( i . e . vg_ondisk = = NULL * implies * this is the on - disk copy ,
* there is no guarantee that if this VG is the same as the on - disk one
* this will be NULL ) . The pointer is maintained by calls to
* _vg_update_vg_ondisk .
*/
struct volume_group * vg_ondisk ;
2014-03-01 01:40:00 +04:00
struct dm_config_tree * cft_precommitted ; /* Precommitted metadata */
struct volume_group * vg_precommitted ; /* Parsed from cft */
2013-03-17 19:27:44 +04:00
2010-09-30 17:16:55 +04:00
alloc_policy_t alloc ;
2013-06-25 14:28:36 +04:00
struct profile * profile ;
2010-09-30 17:16:55 +04:00
uint64_t status ;
struct id id ;
2010-12-20 16:40:46 +03:00
const char * name ;
const char * old_name ; /* Set during vgrename and vgcfgrestore */
2010-09-30 17:16:55 +04:00
char * system_id ;
uint32_t extent_size ;
uint32_t extent_count ;
uint32_t free_count ;
uint32_t max_lv ;
uint32_t max_pv ;
/* physical volumes */
uint32_t pv_count ;
struct dm_list pvs ;
2011-06-01 23:29:31 +04:00
/*
* List of physical volumes that were used in vgextend but do not carry
* a PV label yet . They need to be pvcreate ' d at vg_write time .
*/
struct dm_list pvs_to_create ;
2010-09-30 17:16:55 +04:00
/*
* logical volumes
* The following relationship should always hold :
* dm_list_size ( lvs ) = user visible lv_count + snapshot_count + other invisible LVs
*
* Snapshots consist of 2 instances of " struct logical_volume " :
* - cow ( lv_name is visible to the user )
* - snapshot ( lv_name is ' snapshotN ' )
*
* Mirrors consist of multiple instances of " struct logical_volume " :
* - one for the mirror log
* - one for each mirror leg
* - one for the user - visible mirror LV
*/
struct dm_list lvs ;
struct dm_list tags ;
/*
* FIXME : Move the next fields into a different struct ?
*/
/*
* List of removed physical volumes by pvreduce .
* They have to get cleared on vg_commit .
*/
struct dm_list removed_pvs ;
uint32_t open_mode ; /* FIXME: read or write - check lock type? */
/*
* Store result of the last vg_read ( ) .
* 0 for success else appropriate FAILURE_ * bits set .
*/
uint32_t read_status ;
uint32_t mda_copies ; /* target number of mdas for this VG */
2012-01-19 19:31:45 +04:00
struct dm_hash_table * hostnames ; /* map of creation hostnames */
2013-07-05 19:10:47 +04:00
struct logical_volume * pool_metadata_spare_lv ; /* one per VG */
2010-09-30 17:16:55 +04:00
} ;
2011-03-10 15:43:29 +03:00
struct volume_group * alloc_vg ( const char * pool_name , struct cmd_context * cmd ,
const char * vg_name ) ;
2011-08-11 00:25:29 +04:00
/*
* release_vg ( ) must be called on every struct volume_group allocated
* by vg_create ( ) or vg_read_internal ( ) to free it when no longer required .
*/
void release_vg ( struct volume_group * vg ) ;
2012-02-13 15:03:59 +04:00
void free_orphan_vg ( struct volume_group * vg ) ;
2011-08-11 00:25:29 +04:00
2010-09-30 18:08:33 +04:00
char * vg_fmt_dup ( const struct volume_group * vg ) ;
char * vg_name_dup ( const struct volume_group * vg ) ;
char * vg_system_id_dup ( const struct volume_group * vg ) ;
2010-09-30 17:16:55 +04:00
uint32_t vg_seqno ( const struct volume_group * vg ) ;
uint64_t vg_status ( const struct volume_group * vg ) ;
int vg_set_alloc_policy ( struct volume_group * vg , alloc_policy_t alloc ) ;
int vg_set_clustered ( struct volume_group * vg , int clustered ) ;
uint64_t vg_size ( const struct volume_group * vg ) ;
uint64_t vg_free ( const struct volume_group * vg ) ;
uint64_t vg_extent_size ( const struct volume_group * vg ) ;
2014-10-14 21:12:15 +04:00
int vg_check_new_extent_size ( const struct format_type * fmt , uint32_t new_extent_size ) ;
2010-09-30 17:16:55 +04:00
int vg_set_extent_size ( struct volume_group * vg , uint32_t new_extent_size ) ;
uint64_t vg_extent_count ( const struct volume_group * vg ) ;
uint64_t vg_free_count ( const struct volume_group * vg ) ;
uint64_t vg_pv_count ( const struct volume_group * vg ) ;
uint64_t vg_max_pv ( const struct volume_group * vg ) ;
int vg_set_max_pv ( struct volume_group * vg , uint32_t max_pv ) ;
uint64_t vg_max_lv ( const struct volume_group * vg ) ;
int vg_set_max_lv ( struct volume_group * vg , uint32_t max_lv ) ;
uint32_t vg_mda_count ( const struct volume_group * vg ) ;
uint32_t vg_mda_used_count ( const struct volume_group * vg ) ;
uint32_t vg_mda_copies ( const struct volume_group * vg ) ;
int vg_set_mda_copies ( struct volume_group * vg , uint32_t mda_copies ) ;
2013-07-02 16:34:52 +04:00
char * vg_profile_dup ( const struct volume_group * vg ) ;
2011-08-11 00:26:41 +04:00
2010-09-30 17:16:55 +04:00
/*
* Returns visible LV count - number of LVs from user perspective
*/
unsigned vg_visible_lvs ( const struct volume_group * vg ) ;
2011-08-11 00:26:41 +04:00
2010-09-30 17:16:55 +04:00
/*
* Count snapshot LVs .
*/
unsigned snapshot_count ( const struct volume_group * vg ) ;
uint64_t vg_mda_size ( const struct volume_group * vg ) ;
uint64_t vg_mda_free ( const struct volume_group * vg ) ;
2010-09-30 17:52:55 +04:00
char * vg_attr_dup ( struct dm_pool * mem , const struct volume_group * vg ) ;
2010-09-30 18:07:47 +04:00
char * vg_uuid_dup ( const struct volume_group * vg ) ;
2010-09-30 18:08:19 +04:00
char * vg_tags_dup ( const struct volume_group * vg ) ;
2010-09-30 17:16:55 +04:00
2010-10-25 16:01:59 +04:00
# endif /* _LVM_VG_H */