2001-09-25 12:49:28 +00:00
/*
2004-03-30 19:35:44 +00:00
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
2017-06-24 16:03:21 +02:00
* Copyright ( C ) 2004 - 2017 Red Hat , Inc . All rights reserved .
2001-09-25 12:49:28 +00:00
*
2004-03-30 19:35:44 +00:00
* This file is part of LVM2 .
2001-09-25 12:49:28 +00:00
*
2004-03-30 19:35:44 +00:00
* This copyrighted material is made available to anyone wishing to use ,
* modify , copy , or redistribute it subject to the terms and conditions
2007-08-20 20:55:30 +00:00
* of the GNU Lesser General Public License v .2 .1 .
2001-09-25 12:49:28 +00:00
*
2007-08-20 20:55:30 +00:00
* You should have received a copy of the GNU Lesser General Public License
2004-03-30 19:35:44 +00:00
* along with this program ; if not , write to the Free Software Foundation ,
2016-01-21 11:49:46 +01:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
2001-09-25 12:49:28 +00:00
*/
2018-05-14 10:30:20 +01:00
# include "lib/misc/lib.h"
# include "lib/metadata/metadata.h"
# include "lib/display/display.h"
# include "lib/activate/activate.h"
# include "lib/commands/toolcontext.h"
# include "lib/metadata/segtype.h"
# include "lib/config/defaults.h"
# include "lib/misc/lvm-signal.h"
2014-05-01 20:07:17 +01:00
2014-04-15 13:27:47 +02:00
# include <stdarg.h>
2002-01-21 11:29:06 +00:00
2008-08-07 14:01:17 +00:00
static const struct {
2002-11-18 14:01:16 +00:00
alloc_policy_t alloc ;
2010-11-09 12:34:40 +00:00
const char str [ 14 ] ; /* must be changed when size extends 13 chars */
2010-10-25 13:54:29 +00:00
const char repchar ;
2002-11-18 14:01:16 +00:00
} _policies [ ] = {
{
2010-10-25 13:54:29 +00:00
ALLOC_CONTIGUOUS , " contiguous " , ' c ' } , {
ALLOC_CLING , " cling " , ' l ' } , {
2010-11-09 12:34:40 +00:00
ALLOC_CLING_BY_TAGS , " cling_by_tags " , ' t ' } , { /* Only used in log mesgs */
2010-10-25 13:54:29 +00:00
ALLOC_NORMAL , " normal " , ' n ' } , {
ALLOC_ANYWHERE , " anywhere " , ' a ' } , {
ALLOC_INHERIT , " inherit " , ' i ' }
2002-11-18 14:01:16 +00:00
} ;
2014-04-04 21:10:30 +02:00
static const int _num_policies = DM_ARRAY_SIZE ( _policies ) ;
2002-11-18 14:01:16 +00:00
2011-03-01 20:17:56 +00:00
char alloc_policy_char ( alloc_policy_t alloc )
2010-10-25 13:54:29 +00:00
{
int i ;
for ( i = 0 ; i < _num_policies ; i + + )
if ( _policies [ i ] . alloc = = alloc )
return _policies [ i ] . repchar ;
return ' - ' ;
}
2002-11-18 14:01:16 +00:00
const char * get_alloc_string ( alloc_policy_t alloc )
{
int i ;
for ( i = 0 ; i < _num_policies ; i + + )
if ( _policies [ i ] . alloc = = alloc )
return _policies [ i ] . str ;
return NULL ;
}
alloc_policy_t get_alloc_from_string ( const char * str )
{
int i ;
2010-11-09 12:34:40 +00:00
/* cling_by_tags is part of cling */
if ( ! strcmp ( " cling_by_tags " , str ) )
return ALLOC_CLING ;
2002-11-18 14:01:16 +00:00
for ( i = 0 ; i < _num_policies ; i + + )
if ( ! strcmp ( _policies [ i ] . str , str ) )
return _policies [ i ] . alloc ;
2004-05-18 22:12:53 +00:00
/* Special case for old metadata */
2010-11-09 12:34:40 +00:00
if ( ! strcmp ( " next free " , str ) )
2004-05-18 22:12:53 +00:00
return ALLOC_NORMAL ;
log_error ( " Unrecognised allocation policy %s " , str ) ;
return ALLOC_INVALID ;
2002-11-18 14:01:16 +00:00
}
2015-03-05 14:00:44 -06:00
const char * get_lock_type_string ( lock_type_t lock_type )
{
switch ( lock_type ) {
case LOCK_TYPE_INVALID :
return " invalid " ;
case LOCK_TYPE_NONE :
return " none " ;
case LOCK_TYPE_CLVM :
return " clvm " ;
case LOCK_TYPE_DLM :
return " dlm " ;
case LOCK_TYPE_SANLOCK :
return " sanlock " ;
2021-05-07 10:25:14 +08:00
case LOCK_TYPE_IDM :
return " idm " ;
2015-03-05 14:00:44 -06:00
}
return " invalid " ;
}
lock_type_t get_lock_type_from_string ( const char * str )
{
if ( ! str )
return LOCK_TYPE_NONE ;
if ( ! strcmp ( str , " none " ) )
return LOCK_TYPE_NONE ;
if ( ! strcmp ( str , " clvm " ) )
return LOCK_TYPE_CLVM ;
if ( ! strcmp ( str , " dlm " ) )
return LOCK_TYPE_DLM ;
if ( ! strcmp ( str , " sanlock " ) )
return LOCK_TYPE_SANLOCK ;
2021-05-07 10:25:14 +08:00
if ( ! strcmp ( str , " idm " ) )
return LOCK_TYPE_IDM ;
2015-03-05 14:00:44 -06:00
return LOCK_TYPE_INVALID ;
}
2014-08-22 01:26:14 +01:00
static const char * _percent_types [ 7 ] = { " NONE " , " VG " , " FREE " , " LV " , " PVS " , " ORIGIN " } ;
2014-02-22 00:26:01 +00:00
const char * get_percent_string ( percent_type_t def )
{
return _percent_types [ def ] ;
}
2016-04-21 00:30:17 +01:00
static const char * _lv_name ( const struct logical_volume * lv )
{
/* Never try to display names of the internal snapshot structures. */
if ( lv_is_snapshot ( lv ) )
return find_cow ( lv ) - > name ;
return lv - > name ;
}
2014-07-02 00:01:46 +02:00
const char * display_lvname ( const struct logical_volume * lv )
{
2015-06-16 13:47:43 +02:00
char * name ;
2016-04-21 00:30:17 +01:00
const char * lv_name = _lv_name ( lv ) ;
2015-06-16 13:47:43 +02:00
int r ;
if ( ( lv - > vg - > cmd - > display_lvname_idx + NAME_LEN ) > = sizeof ( ( lv - > vg - > cmd - > display_buffer ) ) )
lv - > vg - > cmd - > display_lvname_idx = 0 ;
name = lv - > vg - > cmd - > display_buffer + lv - > vg - > cmd - > display_lvname_idx ;
2016-04-21 00:30:17 +01:00
r = dm_snprintf ( name , NAME_LEN , " %s/%s " , lv - > vg - > name , lv_name ) ;
2015-06-16 13:47:43 +02:00
if ( r < 0 ) {
2016-04-21 00:30:17 +01:00
log_error ( " Full LV name \" %s/%s \" is too long. " , lv - > vg - > name , lv_name ) ;
2015-06-16 13:47:43 +02:00
return NULL ;
}
2015-07-02 00:04:38 +02:00
lv - > vg - > cmd - > display_lvname_idx + = r + 1 ;
2015-06-16 13:47:43 +02:00
return name ;
2014-07-02 00:01:46 +02:00
}
2017-06-24 16:03:21 +02:00
/* Display percentage with (TODO) configurable precision */
const char * display_percent ( struct cmd_context * cmd , dm_percent_t percent )
{
char * buf ;
int r ;
/* Reusing same ring buffer we use for displaying LV names */
if ( ( cmd - > display_lvname_idx + NAME_LEN ) > = sizeof ( ( cmd - > display_buffer ) ) )
cmd - > display_lvname_idx = 0 ;
buf = cmd - > display_buffer + cmd - > display_lvname_idx ;
/* TODO: Make configurable hardcoded 2 digits */
r = dm_snprintf ( buf , NAME_LEN , " %.2f " , dm_percent_to_round_float ( percent , 2 ) ) ;
if ( r < 0 ) {
log_error ( " Percentage %d does not fit. " , percent ) ;
return NULL ;
}
cmd - > display_lvname_idx + = r + 1 ;
return buf ;
}
2004-06-07 15:22:43 +00:00
/* Size supplied in sectors */
2007-08-07 09:06:05 +00:00
static const char * _display_size ( const struct cmd_context * cmd ,
2015-07-27 21:30:20 +01:00
uint64_t size , dm_size_suffix_t suffix_type )
2001-09-25 12:49:28 +00:00
{
2015-07-27 21:30:20 +01:00
return dm_size_to_string ( cmd - > mem , size , cmd - > current_settings . unit_type ,
cmd - > si_unit_consistency ,
cmd - > current_settings . unit_factor ,
cmd - > current_settings . suffix ,
suffix_type ) ;
2001-09-25 12:49:28 +00:00
}
2007-08-07 09:06:05 +00:00
const char * display_size_long ( const struct cmd_context * cmd , uint64_t size )
2006-05-09 21:23:51 +00:00
{
2015-07-27 21:30:20 +01:00
return _display_size ( cmd , size , DM_SIZE_LONG ) ;
2006-05-09 21:23:51 +00:00
}
2007-08-07 09:06:05 +00:00
const char * display_size_units ( const struct cmd_context * cmd , uint64_t size )
2006-05-09 21:23:51 +00:00
{
2015-07-27 21:30:20 +01:00
return _display_size ( cmd , size , DM_SIZE_UNIT ) ;
2006-05-09 21:23:51 +00:00
}
2007-08-07 09:06:05 +00:00
const char * display_size ( const struct cmd_context * cmd , uint64_t size )
2006-05-09 21:23:51 +00:00
{
2015-07-27 21:30:20 +01:00
return _display_size ( cmd , size , DM_SIZE_SHORT ) ;
2006-05-09 21:23:51 +00:00
}
2007-08-07 09:06:05 +00:00
void pvdisplay_colons ( const struct physical_volume * pv )
2001-10-18 16:55:19 +00:00
{
2010-07-09 15:34:40 +00:00
char uuid [ 64 ] __attribute__ ( ( aligned ( 8 ) ) ) ;
2001-10-18 16:55:19 +00:00
if ( ! pv )
return ;
2002-01-21 11:29:06 +00:00
if ( ! id_write_format ( & pv - > id , uuid , sizeof ( uuid ) ) ) {
stack ;
return ;
}
2001-10-18 16:55:19 +00:00
2009-11-24 22:55:55 +00:00
log_print ( " %s:%s:% " PRIu64 " :-1:% " PRIu64 " :% " PRIu64 " :-1:% " PRIu32 " :%u:%u:%u:%s " ,
2014-03-18 23:54:46 +01:00
pv_dev_name ( pv ) , pv_vg_name ( pv ) , pv - > size ,
2001-11-13 17:53:06 +00:00
/* FIXME pv->pv_number, Derive or remove? */
pv - > status , /* FIXME Support old or new format here? */
2002-04-24 18:20:51 +00:00
pv - > status & ALLOCATABLE_PV , /* FIXME remove? */
2001-11-13 17:53:06 +00:00
/* FIXME pv->lv_cur, Remove? */
pv - > pe_size / 2 ,
pv - > pe_count ,
2002-04-24 18:20:51 +00:00
pv - > pe_count - pv - > pe_alloc_count ,
pv - > pe_alloc_count , * uuid ? uuid : " none " ) ;
2001-10-18 16:55:19 +00:00
}
2007-08-07 09:06:05 +00:00
void pvdisplay_segments ( const struct physical_volume * pv )
2007-05-30 20:43:09 +00:00
{
2007-08-07 09:06:05 +00:00
const struct pv_segment * pvseg ;
2007-05-30 20:43:09 +00:00
2007-05-31 20:26:11 +00:00
if ( pv - > pe_size )
log_print ( " --- Physical Segments --- " ) ;
2007-05-30 20:43:09 +00:00
2008-11-03 22:14:30 +00:00
dm_list_iterate_items ( pvseg , & pv - > segments ) {
2007-05-30 20:43:09 +00:00
log_print ( " Physical extent %u to %u: " ,
2007-05-31 14:19:57 +00:00
pvseg - > pe , pvseg - > pe + pvseg - > len - 1 ) ;
2007-05-30 20:43:09 +00:00
2008-03-26 16:48:10 +00:00
if ( pvseg_is_allocated ( pvseg ) ) {
2007-05-30 20:43:09 +00:00
log_print ( " Logical volume \t %s%s/%s " ,
2007-05-31 14:19:57 +00:00
pvseg - > lvseg - > lv - > vg - > cmd - > dev_dir ,
pvseg - > lvseg - > lv - > vg - > name ,
pvseg - > lvseg - > lv - > name ) ;
2007-05-30 20:43:09 +00:00
log_print ( " Logical extents \t %d to %d " ,
2007-05-31 14:19:57 +00:00
pvseg - > lvseg - > le , pvseg - > lvseg - > le +
pvseg - > lvseg - > len - 1 ) ;
2007-05-30 20:43:09 +00:00
} else
log_print ( " FREE " ) ;
}
log_print ( " " ) ;
}
2002-11-18 14:01:16 +00:00
/* FIXME Include label fields */
2007-08-07 09:06:05 +00:00
void pvdisplay_full ( const struct cmd_context * cmd ,
const struct physical_volume * pv ,
2010-07-09 15:34:40 +00:00
void * handle __attribute__ ( ( unused ) ) )
2001-10-18 16:55:19 +00:00
{
2010-07-09 15:34:40 +00:00
char uuid [ 64 ] __attribute__ ( ( aligned ( 8 ) ) ) ;
2002-12-12 20:55:49 +00:00
const char * size ;
2001-10-18 16:55:19 +00:00
2002-12-19 23:25:55 +00:00
uint32_t pe_free ;
2007-11-05 02:10:39 +00:00
uint64_t data_size , pvsize , unusable ;
2001-10-18 16:55:19 +00:00
2001-11-13 17:53:06 +00:00
if ( ! pv )
return ;
2001-10-18 16:55:19 +00:00
2002-01-21 11:29:06 +00:00
if ( ! id_write_format ( & pv - > id , uuid , sizeof ( uuid ) ) ) {
stack ;
return ;
}
2001-10-18 16:55:19 +00:00
log_print ( " --- %sPhysical volume --- " , pv - > pe_size ? " " : " NEW " ) ;
2007-10-12 14:29:32 +00:00
log_print ( " PV Name %s " , pv_dev_name ( pv ) ) ;
2008-02-06 15:47:28 +00:00
log_print ( " VG Name %s%s " ,
is_orphan ( pv ) ? " " : pv - > vg_name ,
2002-01-29 16:30:18 +00:00
pv - > status & EXPORTED_VG ? " (exported) " : " " ) ;
2001-10-18 16:55:19 +00:00
2007-11-05 02:10:39 +00:00
data_size = ( uint64_t ) pv - > pe_count * pv - > pe_size ;
if ( pv - > size > data_size + pv - > pe_start ) {
2007-11-05 01:47:49 +00:00
pvsize = pv - > size ;
2007-11-05 02:10:39 +00:00
unusable = pvsize - data_size ;
2007-11-05 01:47:49 +00:00
} else {
2007-11-05 02:10:39 +00:00
pvsize = data_size + pv - > pe_start ;
unusable = pvsize - pv - > size ;
2007-11-05 01:47:49 +00:00
}
2001-10-18 16:55:19 +00:00
2007-11-05 01:47:49 +00:00
size = display_size ( cmd , pvsize ) ;
2007-11-05 02:10:39 +00:00
if ( data_size )
2007-11-05 01:47:49 +00:00
log_print ( " PV Size %s / not usable %s " , /* [LVM: %s]", */
size , display_size ( cmd , unusable ) ) ;
else
2001-10-18 16:55:19 +00:00
log_print ( " PV Size %s " , size ) ;
2002-11-18 14:01:16 +00:00
/* PV number not part of LVM2 design
log_print ( " PV# %u " , pv - > pv_number ) ;
*/
2001-10-18 16:55:19 +00:00
2002-04-24 18:20:51 +00:00
pe_free = pv - > pe_count - pv - > pe_alloc_count ;
2002-01-10 15:09:51 +00:00
if ( pv - > pe_count & & ( pv - > status & ALLOCATABLE_PV ) )
2001-10-18 16:55:19 +00:00
log_print ( " Allocatable yes %s " ,
( ! pe_free & & pv - > pe_count ) ? " (but full) " : " " ) ;
else
log_print ( " Allocatable NO " ) ;
2002-11-18 14:01:16 +00:00
/* LV count is no longer available when displaying PV
log_print ( " Cur LV %u " , vg - > lv_count ) ;
*/
2009-09-28 16:23:44 +00:00
if ( cmd - > si_unit_consistency )
log_print ( " PE Size %s " , display_size ( cmd , ( uint64_t ) pv - > pe_size ) ) ;
else
log_print ( " PE Size (KByte) % " PRIu32 , pv - > pe_size / 2 ) ;
2001-10-18 16:55:19 +00:00
log_print ( " Total PE %u " , pv - > pe_count ) ;
2002-12-19 23:25:55 +00:00
log_print ( " Free PE % " PRIu32 , pe_free ) ;
2002-04-24 18:20:51 +00:00
log_print ( " Allocated PE %u " , pv - > pe_alloc_count ) ;
2001-10-18 16:55:19 +00:00
log_print ( " PV UUID %s " , * uuid ? uuid : " none " ) ;
log_print ( " " ) ;
}
2010-07-09 15:34:40 +00:00
int pvdisplay_short ( const struct cmd_context * cmd __attribute__ ( ( unused ) ) ,
const struct volume_group * vg __attribute__ ( ( unused ) ) ,
2007-08-07 09:06:05 +00:00
const struct physical_volume * pv ,
2010-07-09 15:34:40 +00:00
void * handle __attribute__ ( ( unused ) ) )
2001-10-18 16:55:19 +00:00
{
2010-07-09 15:34:40 +00:00
char uuid [ 64 ] __attribute__ ( ( aligned ( 8 ) ) ) ;
2002-12-03 13:26:17 +00:00
2001-11-13 17:53:06 +00:00
if ( ! pv )
2015-03-09 14:16:41 +01:00
return_0 ;
2001-10-18 16:55:19 +00:00
2008-01-30 13:19:47 +00:00
if ( ! id_write_format ( & pv - > id , uuid , sizeof ( uuid ) ) )
return_0 ;
2002-12-03 13:26:17 +00:00
2007-10-12 14:29:32 +00:00
log_print ( " PV Name %s " , pv_dev_name ( pv ) ) ;
2001-10-18 16:55:19 +00:00
/* FIXME pv->pv_number); */
2002-12-03 13:26:17 +00:00
log_print ( " PV UUID %s " , * uuid ? uuid : " none " ) ;
2002-01-10 23:21:07 +00:00
log_print ( " PV Status %sallocatable " ,
2002-01-10 15:09:51 +00:00
( pv - > status & ALLOCATABLE_PV ) ? " " : " NOT " ) ;
2001-10-18 16:55:19 +00:00
log_print ( " Total PE / Free PE %u / %u " ,
2002-04-24 18:20:51 +00:00
pv - > pe_count , pv - > pe_count - pv - > pe_alloc_count ) ;
2001-10-18 16:55:19 +00:00
2001-11-19 15:20:50 +00:00
log_print ( " " ) ;
2015-03-09 14:16:41 +01:00
return 1 ; /* ECMD_PROCESSED */
2001-10-18 16:55:19 +00:00
}
2007-08-07 09:06:05 +00:00
void lvdisplay_colons ( const struct logical_volume * lv )
2001-10-18 16:55:19 +00:00
{
2001-11-21 19:32:35 +00:00
int inkernel ;
2003-01-08 22:44:07 +00:00
struct lvinfo info ;
2010-08-17 16:25:32 +00:00
inkernel = lv_info ( lv - > vg - > cmd , lv , 0 , & info , 1 , 0 ) & & info . exists ;
2001-11-21 19:32:35 +00:00
2009-11-24 22:55:55 +00:00
log_print ( " %s%s/%s:%s:% " PRIu64 " :%d:-1:%d:% " PRIu64 " :%d:-1:%d:%d:%d:%d " ,
2001-11-21 19:32:35 +00:00
lv - > vg - > cmd - > dev_dir ,
2001-11-08 16:15:58 +00:00
lv - > vg - > name ,
2001-11-13 17:53:06 +00:00
lv - > name ,
lv - > vg - > name ,
2012-01-12 16:58:43 +00:00
( ( lv - > status & ( LVM_READ | LVM_WRITE ) ) > > 8 ) |
2012-01-25 17:14:56 +00:00
( ( inkernel & & info . read_only ) ? 4 : 0 ) , inkernel ? 1 : 0 ,
2001-11-13 17:53:06 +00:00
/* FIXME lv->lv_number, */
2001-11-21 19:32:35 +00:00
inkernel ? info . open_count : 0 , lv - > size , lv - > le_count ,
2001-11-13 17:53:06 +00:00
/* FIXME Add num allocated to struct! lv->lv_allocated_le, */
2002-11-18 14:01:16 +00:00
( lv - > alloc = = ALLOC_CONTIGUOUS ? 2 : 0 ) , lv - > read_ahead ,
2002-04-24 18:20:51 +00:00
inkernel ? info . major : - 1 , inkernel ? info . minor : - 1 ) ;
2001-10-18 16:55:19 +00:00
}
2016-03-04 10:27:45 +01:00
static int _lvdisplay_historical_full ( struct cmd_context * cmd ,
const struct logical_volume * lv )
{
char uuid [ 64 ] __attribute__ ( ( aligned ( 8 ) ) ) ;
int lvm1compat = find_config_tree_bool ( cmd , global_lvdisplay_shows_full_device_path_CFG , NULL ) ;
struct historical_logical_volume * hlv = lv - > this_glv - > historical ;
if ( ! id_write_format ( & hlv - > lvid . id [ 1 ] , uuid , sizeof ( uuid ) ) )
return_0 ;
log_print ( " --- Historical Logical volume --- " ) ;
if ( lvm1compat )
/* /dev/vgname/lvname doen't actually exist for historical devices */
log_print ( " LV Name %s%s/%s " ,
hlv - > vg - > cmd - > dev_dir , hlv - > vg - > name , hlv - > name ) ;
else
log_print ( " LV Name %s%s " , HISTORICAL_LV_PREFIX , hlv - > name ) ;
log_print ( " VG Name %s " , hlv - > vg - > name ) ;
log_print ( " LV UUID %s " , uuid ) ;
log_print ( " LV Creation time %s " , lv_creation_time_dup ( cmd - > mem , lv , 1 ) ) ;
log_print ( " LV Removal time %s " , lv_removal_time_dup ( cmd - > mem , lv , 1 ) ) ;
log_print ( " " ) ;
return 1 ;
}
2007-08-07 09:06:05 +00:00
int lvdisplay_full ( struct cmd_context * cmd ,
const struct logical_volume * lv ,
2010-07-09 15:34:40 +00:00
void * handle __attribute__ ( ( unused ) ) )
2001-10-18 16:55:19 +00:00
{
2003-01-08 22:44:07 +00:00
struct lvinfo info ;
2021-01-26 19:32:24 +01:00
int inkernel , snap_active = 0 , partial = 0 , raid_is_avail = 1 ;
2010-07-09 15:34:40 +00:00
char uuid [ 64 ] __attribute__ ( ( aligned ( 8 ) ) ) ;
2012-01-12 16:58:43 +00:00
const char * access_str ;
2009-10-26 10:01:56 +00:00
struct lv_segment * snap_seg = NULL , * mirror_seg = NULL ;
2012-01-20 16:59:58 +00:00
struct lv_segment * seg = NULL ;
int lvm1compat ;
2014-06-09 12:08:27 +02:00
dm_percent_t snap_percent ;
2020-09-27 01:11:47 +02:00
int thin_pool_active = 0 ;
2020-10-25 21:56:02 +01:00
dm_percent_t thin_data_percent = 0 , thin_metadata_percent = 0 ;
2012-01-20 16:59:58 +00:00
int thin_active = 0 ;
2020-10-25 21:56:02 +01:00
dm_percent_t thin_percent = 0 ;
2020-09-27 01:11:47 +02:00
struct lv_status_thin * thin_status = NULL ;
struct lv_status_thin_pool * thin_pool_status = NULL ;
2017-03-02 00:15:11 +01:00
struct lv_status_cache * cache_status = NULL ;
2018-07-01 15:58:01 +02:00
struct lv_status_vdo * vdo_status = NULL ;
2002-02-21 15:26:44 +00:00
2016-03-04 10:27:45 +01:00
if ( lv_is_historical ( lv ) )
return _lvdisplay_historical_full ( cmd , lv ) ;
2008-01-30 13:19:47 +00:00
if ( ! id_write_format ( & lv - > lvid . id [ 1 ] , uuid , sizeof ( uuid ) ) )
return_0 ;
2001-11-21 19:32:35 +00:00
2010-08-17 16:25:32 +00:00
inkernel = lv_info ( cmd , lv , 0 , & info , 1 , 1 ) & & info . exists ;
2001-10-18 16:55:19 +00:00
2012-01-12 16:58:43 +00:00
if ( ( lv - > status & LVM_WRITE ) & & inkernel & & info . read_only )
access_str = " read/write (activated read only) " ;
else if ( lv - > status & LVM_WRITE )
access_str = " read/write " ;
else
access_str = " read only " ;
2001-11-13 17:53:06 +00:00
log_print ( " --- Logical volume --- " ) ;
2001-10-18 16:55:19 +00:00
2013-06-25 12:31:53 +02:00
lvm1compat = find_config_tree_bool ( cmd , global_lvdisplay_shows_full_device_path_CFG , NULL ) ;
2012-01-20 16:59:58 +00:00
2012-01-26 14:02:42 +00:00
if ( lvm1compat )
/* /dev/vgname/lvname doen't actually exist for internal devices */
2012-01-20 16:59:58 +00:00
log_print ( " LV Name %s%s/%s " ,
lv - > vg - > cmd - > dev_dir , lv - > vg - > name , lv - > name ) ;
2012-01-26 14:02:42 +00:00
else if ( lv_is_visible ( lv ) ) {
2012-01-20 16:59:58 +00:00
/* Thin pool does not have /dev/vg/name link */
if ( ! lv_is_thin_pool ( lv ) )
log_print ( " LV Path %s%s/%s " ,
lv - > vg - > cmd - > dev_dir ,
lv - > vg - > name , lv - > name ) ;
log_print ( " LV Name %s " , lv - > name ) ;
} else
2012-01-26 14:02:42 +00:00
log_print ( " Internal LV Name %s " , lv - > name ) ;
2001-11-08 16:15:58 +00:00
2012-01-20 16:59:58 +00:00
log_print ( " VG Name %s " , lv - > vg - > name ) ;
2002-02-21 15:26:44 +00:00
log_print ( " LV UUID %s " , uuid ) ;
2012-01-12 16:58:43 +00:00
log_print ( " LV Write Access %s " , access_str ) ;
2012-01-20 16:59:58 +00:00
log_print ( " LV Creation host, time %s, %s " ,
2016-03-01 15:23:23 +01:00
lv_host_dup ( cmd - > mem , lv ) , lv_creation_time_dup ( cmd - > mem , lv , 1 ) ) ;
2001-10-18 16:55:19 +00:00
2002-11-18 14:01:16 +00:00
if ( lv_is_origin ( lv ) ) {
2002-05-08 17:58:52 +00:00
log_print ( " LV snapshot status source of " ) ;
2002-11-18 14:01:16 +00:00
2008-11-03 22:14:30 +00:00
dm_list_iterate_items_gen ( snap_seg , & lv - > snapshot_segs ,
2005-04-07 12:39:44 +00:00
origin_list ) {
if ( inkernel & &
( snap_active = lv_snapshot_percent ( snap_seg - > cow ,
2010-11-30 11:53:31 +00:00
& snap_percent ) ) )
2014-06-09 12:08:27 +02:00
if ( snap_percent = = DM_PERCENT_INVALID )
2005-04-07 12:39:44 +00:00
snap_active = 0 ;
2012-01-20 16:59:58 +00:00
if ( lvm1compat )
log_print ( " %s%s/%s [%s] " ,
lv - > vg - > cmd - > dev_dir , lv - > vg - > name ,
snap_seg - > cow - > name ,
snap_active ? " active " : " INACTIVE " ) ;
else
log_print ( " %s [%s] " ,
snap_seg - > cow - > name ,
snap_active ? " active " : " INACTIVE " ) ;
2002-05-08 16:57:46 +00:00
}
2005-04-07 12:39:44 +00:00
snap_seg = NULL ;
2021-02-12 15:11:48 +01:00
} else if ( lv_is_cow ( lv ) & & ( snap_seg = find_snapshot ( lv ) ) ) {
2005-04-07 12:39:44 +00:00
if ( inkernel & &
( snap_active = lv_snapshot_percent ( snap_seg - > cow ,
2010-11-30 11:53:31 +00:00
& snap_percent ) ) )
2014-06-09 12:08:27 +02:00
if ( snap_percent = = DM_PERCENT_INVALID )
2005-04-07 12:39:44 +00:00
snap_active = 0 ;
2012-01-20 16:59:58 +00:00
if ( lvm1compat )
log_print ( " LV snapshot status %s destination for %s%s/%s " ,
snap_active ? " active " : " INACTIVE " ,
lv - > vg - > cmd - > dev_dir , lv - > vg - > name ,
snap_seg - > origin - > name ) ;
else
log_print ( " LV snapshot status %s destination for %s " ,
snap_active ? " active " : " INACTIVE " ,
snap_seg - > origin - > name ) ;
2001-10-18 16:55:19 +00:00
}
2002-05-09 21:17:57 +00:00
2011-09-26 13:11:02 +00:00
if ( lv_is_thin_volume ( lv ) ) {
2012-01-20 16:59:58 +00:00
seg = first_seg ( lv ) ;
log_print ( " LV Pool name %s " , seg - > pool_lv - > name ) ;
if ( seg - > origin )
log_print ( " LV Thin origin name %s " ,
seg - > origin - > name ) ;
2013-01-15 15:16:16 +01:00
if ( seg - > external_lv )
log_print ( " LV External origin name %s " ,
2013-04-19 21:03:38 +02:00
seg - > external_lv - > name ) ;
2013-11-29 15:54:51 +01:00
if ( seg - > merge_lv )
log_print ( " LV merging to %s " ,
seg - > merge_lv - > name ) ;
2020-09-27 01:11:47 +02:00
if ( inkernel & & ( thin_active = lv_thin_status ( lv , 0 , & thin_status ) ) ) {
thin_percent = thin_status - > usage ;
dm_pool_destroy ( thin_status - > mem ) ;
}
2013-11-29 15:54:51 +01:00
if ( lv_is_merging_origin ( lv ) )
log_print ( " LV merged with %s " ,
find_snapshot ( lv ) - > lv - > name ) ;
2011-09-26 13:11:02 +00:00
} else if ( lv_is_thin_pool ( lv ) ) {
2020-09-27 01:11:47 +02:00
if ( ( thin_pool_active = lv_thin_pool_status ( lv , 0 , & thin_pool_status ) ) ) {
thin_data_percent = thin_pool_status - > data_usage ;
thin_metadata_percent = thin_pool_status - > metadata_usage ;
dm_pool_destroy ( thin_pool_status - > mem ) ;
2012-01-20 16:59:58 +00:00
}
2011-10-03 18:31:03 +00:00
/* FIXME: display thin_pool targets transid for activated LV as well */
2012-01-20 16:59:58 +00:00
seg = first_seg ( lv ) ;
log_print ( " LV Pool metadata %s " , seg - > metadata_lv - > name ) ;
log_print ( " LV Pool data %s " , seg_lv ( seg , 0 ) - > name ) ;
2017-03-02 00:15:11 +01:00
} else if ( lv_is_cache_origin ( lv ) ) {
2017-06-27 00:24:34 +02:00
if ( ( seg = get_only_segment_using_this_lv ( lv ) ) )
log_print ( " LV origin of Cache LV %s " , seg - > lv - > name ) ;
2017-03-02 00:15:11 +01:00
} else if ( lv_is_cache ( lv ) ) {
seg = first_seg ( lv ) ;
2019-10-01 13:31:36 +02:00
if ( inkernel & & lv_cache_status ( lv , & cache_status ) ) {
log_print ( " LV Cache pool name %s " , seg - > pool_lv - > name ) ;
log_print ( " LV Cache origin name %s " , seg_lv ( seg , 0 ) - > name ) ;
}
2017-03-02 00:15:11 +01:00
} else if ( lv_is_cache_pool ( lv ) ) {
seg = first_seg ( lv ) ;
log_print ( " LV Pool metadata %s " , seg - > metadata_lv - > name ) ;
log_print ( " LV Pool data %s " , seg_lv ( seg , 0 ) - > name ) ;
2018-07-01 15:58:01 +02:00
} else if ( lv_is_vdo_pool ( lv ) ) {
seg = first_seg ( lv ) ;
log_print ( " LV VDO Pool data %s " , seg_lv ( seg , 0 ) - > name ) ;
2019-10-04 16:57:54 +02:00
if ( lv_vdo_pool_status ( lv , 0 , & vdo_status ) ) { /* FIXME: flush option? */
2018-07-01 15:58:01 +02:00
log_print ( " LV VDO Pool usage %s%% " ,
display_percent ( cmd , vdo_status - > usage ) ) ;
log_print ( " LV VDO Pool saving %s%% " ,
display_percent ( cmd , vdo_status - > saving ) ) ;
log_print ( " LV VDO Operating mode %s " ,
get_vdo_operating_mode_name ( vdo_status - > vdo - > operating_mode ) ) ;
log_print ( " LV VDO Index state %s " ,
get_vdo_index_state_name ( vdo_status - > vdo - > index_state ) ) ;
log_print ( " LV VDO Compression st %s " ,
get_vdo_compression_state_name ( vdo_status - > vdo - > compression_state ) ) ;
log_print ( " LV VDO Used size %s " ,
display_size ( cmd , vdo_status - > vdo - > used_blocks * DM_VDO_BLOCK_SIZE ) ) ;
dm_pool_destroy ( vdo_status - > mem ) ;
}
} else if ( lv_is_vdo ( lv ) ) {
seg = first_seg ( lv ) ;
log_print ( " LV VDO Pool name %s " , seg_lv ( seg , 0 ) - > name ) ;
2011-09-26 13:11:02 +00:00
}
2021-01-26 19:32:24 +01:00
if ( lv_is_partial ( lv ) )
partial = 1 ;
if ( lv_is_raid ( lv ) )
raid_is_avail = raid_is_available ( lv ) ? 1 : 0 ;
2001-11-21 19:32:35 +00:00
if ( inkernel & & info . suspended )
log_print ( " LV Status suspended " ) ;
2014-04-18 02:23:39 +01:00
else if ( activation ( ) )
2021-01-26 19:32:24 +01:00
log_print ( " LV Status %savailable%s " ,
( inkernel & & raid_is_avail ) ? " " : " NOT " ,
partial ? " (partial) " : " " ) ;
2001-11-08 16:15:58 +00:00
2002-11-18 14:01:16 +00:00
/********* FIXME lv_number
2001-11-08 16:15:58 +00:00
log_print ( " LV # %u " , lv - > lv_number + 1 ) ;
* * * * * * * * * * * */
2001-11-21 19:32:35 +00:00
if ( inkernel )
log_print ( " # open %u " , info . open_count ) ;
2001-11-08 16:15:58 +00:00
2002-12-12 20:55:49 +00:00
log_print ( " LV Size %s " ,
display_size ( cmd ,
2006-05-09 21:23:51 +00:00
snap_seg ? snap_seg - > origin - > size : lv - > size ) ) ;
2001-10-18 16:55:19 +00:00
2017-03-02 00:15:11 +01:00
if ( cache_status ) {
2017-06-24 16:22:36 +02:00
log_print ( " Cache used blocks %s%% " ,
display_percent ( cmd , cache_status - > data_usage ) ) ;
log_print ( " Cache metadata blocks %s%% " ,
display_percent ( cmd , cache_status - > metadata_usage ) ) ;
log_print ( " Cache dirty blocks %s%% " ,
display_percent ( cmd , cache_status - > dirty_usage ) ) ;
2017-03-02 00:15:11 +01:00
log_print ( " Cache read hits/misses " FMTu64 " / " FMTu64 ,
cache_status - > cache - > read_hits ,
cache_status - > cache - > read_misses ) ;
log_print ( " Cache wrt hits/misses " FMTu64 " / " FMTu64 ,
cache_status - > cache - > write_hits ,
cache_status - > cache - > write_misses ) ;
log_print ( " Cache demotions " FMTu64 ,
cache_status - > cache - > demotions ) ;
log_print ( " Cache promotions " FMTu64 ,
cache_status - > cache - > promotions ) ;
dm_pool_destroy ( cache_status - > mem ) ;
}
2020-09-27 01:11:47 +02:00
if ( thin_pool_active ) {
2017-06-24 16:22:36 +02:00
log_print ( " Allocated pool data %s%% " ,
display_percent ( cmd , thin_data_percent ) ) ;
log_print ( " Allocated metadata %s%% " ,
display_percent ( cmd , thin_metadata_percent ) ) ;
2020-09-27 01:11:47 +02:00
}
2012-01-20 16:59:58 +00:00
if ( thin_active )
2017-06-24 16:22:36 +02:00
log_print ( " Mapped size %s%% " ,
display_percent ( cmd , thin_percent ) ) ;
2012-01-20 16:59:58 +00:00
2002-11-18 14:01:16 +00:00
log_print ( " Current LE %u " ,
2005-04-07 12:39:44 +00:00
snap_seg ? snap_seg - > origin - > le_count : lv - > le_count ) ;
2001-11-28 13:45:50 +00:00
2005-04-07 12:39:44 +00:00
if ( snap_seg ) {
log_print ( " COW-table size %s " ,
2006-05-09 21:23:51 +00:00
display_size ( cmd , ( uint64_t ) lv - > size ) ) ;
2005-04-07 12:39:44 +00:00
log_print ( " COW-table LE %u " , lv - > le_count ) ;
2001-10-18 16:55:19 +00:00
2005-04-07 12:39:44 +00:00
if ( snap_active )
2017-06-24 16:22:36 +02:00
log_print ( " Allocated to snapshot %s%% " ,
display_percent ( cmd , snap_percent ) ) ;
2002-11-18 14:01:16 +00:00
2002-12-12 20:55:49 +00:00
log_print ( " Snapshot chunk size %s " ,
2006-05-09 21:23:51 +00:00
display_size ( cmd , ( uint64_t ) snap_seg - > chunk_size ) ) ;
2002-11-26 21:56:57 +00:00
}
2002-11-18 14:01:16 +00:00
2014-09-15 21:33:53 +01:00
if ( lv_is_mirrored ( lv ) ) {
2012-01-20 16:59:58 +00:00
mirror_seg = first_seg ( lv ) ;
2009-10-26 10:01:56 +00:00
log_print ( " Mirrored volumes % " PRIu32 , mirror_seg - > area_count ) ;
2014-09-15 21:33:53 +01:00
if ( lv_is_converting ( lv ) )
2009-10-26 10:01:56 +00:00
log_print ( " LV type Mirror undergoing conversion " ) ;
}
2008-11-03 22:14:30 +00:00
log_print ( " Segments %u " , dm_list_size ( & lv - > segments ) ) ;
2005-04-07 12:39:44 +00:00
/********* FIXME Stripes & stripesize for each segment
2009-09-28 16:23:44 +00:00
log_print ( " Stripe size %s " , display_size ( cmd , ( uint64_t ) lv - > stripesize ) ) ;
2005-04-07 12:39:44 +00:00
* * * * * * * * * * */
2001-10-18 16:55:19 +00:00
2002-07-11 14:21:49 +00:00
log_print ( " Allocation %s " , get_alloc_string ( lv - > alloc ) ) ;
2007-11-12 20:51:54 +00:00
if ( lv - > read_ahead = = DM_READ_AHEAD_AUTO )
log_print ( " Read ahead sectors auto " ) ;
else if ( lv - > read_ahead = = DM_READ_AHEAD_NONE )
log_print ( " Read ahead sectors 0 " ) ;
else
log_print ( " Read ahead sectors %u " , lv - > read_ahead ) ;
if ( inkernel & & lv - > read_ahead ! = info . read_ahead )
log_print ( " - currently set to %u " , info . read_ahead ) ;
2001-10-18 16:55:19 +00:00
2003-04-02 19:14:43 +00:00
if ( lv - > status & FIXED_MINOR ) {
if ( lv - > major > = 0 )
log_print ( " Persistent major %d " , lv - > major ) ;
2002-02-01 17:54:39 +00:00
log_print ( " Persistent minor %d " , lv - > minor ) ;
2003-04-02 19:14:43 +00:00
}
2002-02-01 17:54:39 +00:00
2001-11-21 19:32:35 +00:00
if ( inkernel )
2002-04-24 18:20:51 +00:00
log_print ( " Block device %d:%d " , info . major ,
2001-11-21 19:32:35 +00:00
info . minor ) ;
log_print ( " " ) ;
2001-11-08 16:15:58 +00:00
2015-03-09 14:16:41 +01:00
return 1 ; /* ECMD_PROCESSED */
2001-11-08 16:15:58 +00:00
}
2001-10-18 16:55:19 +00:00
2004-05-04 21:25:57 +00:00
void display_stripe ( const struct lv_segment * seg , uint32_t s , const char * pre )
2001-11-13 17:53:06 +00:00
{
2005-06-01 16:51:55 +00:00
switch ( seg_type ( seg , s ) ) {
2003-04-24 22:23:24 +00:00
case AREA_PV :
2005-05-03 17:28:23 +00:00
/* FIXME Re-check the conditions for 'Missing' */
2003-04-24 22:23:24 +00:00
log_print ( " %sPhysical volume \t %s " , pre ,
2005-06-01 16:51:55 +00:00
seg_pv ( seg , s ) ?
2007-10-12 14:29:32 +00:00
pv_dev_name ( seg_pv ( seg , s ) ) :
2005-05-03 17:28:23 +00:00
" Missing " ) ;
2003-04-24 22:23:24 +00:00
2005-06-01 16:51:55 +00:00
if ( seg_pv ( seg , s ) )
2003-04-24 22:23:24 +00:00
log_print ( " %sPhysical extents \t %d to %d " , pre ,
2005-06-01 16:51:55 +00:00
seg_pe ( seg , s ) ,
seg_pe ( seg , s ) + seg - > area_len - 1 ) ;
2003-04-24 22:23:24 +00:00
break ;
case AREA_LV :
log_print ( " %sLogical volume \t %s " , pre ,
2005-06-01 16:51:55 +00:00
seg_lv ( seg , s ) ?
seg_lv ( seg , s ) - > name : " Missing " ) ;
2001-11-13 17:53:06 +00:00
2005-06-01 16:51:55 +00:00
if ( seg_lv ( seg , s ) )
2003-04-24 22:23:24 +00:00
log_print ( " %sLogical extents \t %d to %d " , pre ,
2005-06-01 16:51:55 +00:00
seg_le ( seg , s ) ,
seg_le ( seg , s ) + seg - > area_len - 1 ) ;
2005-06-14 17:54:48 +00:00
break ;
case AREA_UNASSIGNED :
log_print ( " %sUnassigned area " , pre ) ;
2003-04-24 22:23:24 +00:00
}
2002-01-21 12:05:39 +00:00
}
2001-11-13 17:53:06 +00:00
2007-08-07 09:06:05 +00:00
int lvdisplay_segments ( const struct logical_volume * lv )
2002-01-21 12:05:39 +00:00
{
2007-08-07 09:06:05 +00:00
const struct lv_segment * seg ;
2001-11-13 17:53:06 +00:00
2002-01-21 12:05:39 +00:00
log_print ( " --- Segments --- " ) ;
2001-11-13 17:53:06 +00:00
2008-11-03 22:14:30 +00:00
dm_list_iterate_items ( seg , & lv - > segments ) {
2014-04-28 11:19:51 +02:00
log_print ( " %s extents %u to %u: " ,
lv_is_virtual ( lv ) ? " Virtual " : " Logical " ,
2002-01-21 12:05:39 +00:00
seg - > le , seg - > le + seg - > len - 1 ) ;
2001-11-13 17:53:06 +00:00
2014-10-20 18:40:39 +02:00
log_print ( " Type \t \t %s " , lvseg_name ( seg ) ) ;
2004-05-04 21:25:57 +00:00
2014-04-28 11:53:56 +02:00
if ( seg - > segtype - > ops - > target_monitored )
log_print ( " Monitoring \t \t %s " ,
lvseg_monitor_dup ( lv - > vg - > cmd - > mem , seg ) ) ;
2004-05-04 21:25:57 +00:00
if ( seg - > segtype - > ops - > display )
seg - > segtype - > ops - > display ( seg ) ;
2001-11-13 17:53:06 +00:00
}
2001-12-03 20:23:53 +00:00
log_print ( " " ) ;
2002-01-21 12:05:39 +00:00
return 1 ;
2001-11-19 15:20:50 +00:00
}
2010-07-09 15:34:40 +00:00
void vgdisplay_extents ( const struct volume_group * vg __attribute__ ( ( unused ) ) )
2001-11-19 15:20:50 +00:00
{
}
2007-08-07 09:06:05 +00:00
void vgdisplay_full ( const struct volume_group * vg )
2001-11-19 15:20:50 +00:00
{
2008-11-03 18:59:59 +00:00
uint32_t access_str ;
2002-11-18 14:01:16 +00:00
uint32_t active_pvs ;
2010-07-09 15:34:40 +00:00
char uuid [ 64 ] __attribute__ ( ( aligned ( 8 ) ) ) ;
2002-04-29 21:43:14 +00:00
2008-09-19 06:42:00 +00:00
active_pvs = vg - > pv_count - vg_missing_pv_count ( vg ) ;
2001-11-19 15:20:50 +00:00
log_print ( " --- Volume group --- " ) ;
log_print ( " VG Name %s " , vg - > name ) ;
2018-04-27 16:22:46 -05:00
log_print ( " System ID %s " , ( vg - > system_id & & * vg - > system_id ) ? vg - > system_id : " " ) ;
2002-11-18 14:01:16 +00:00
log_print ( " Format %s " , vg - > fid - > fmt - > name ) ;
2018-04-27 16:22:46 -05:00
log_print ( " Metadata Areas %d " , vg_mda_count ( vg ) ) ;
log_print ( " Metadata Sequence No %d " , vg - > seqno ) ;
2008-11-03 18:59:59 +00:00
access_str = vg - > status & ( LVM_READ | LVM_WRITE ) ;
2001-11-19 15:20:50 +00:00
log_print ( " VG Access %s%s%s%s " ,
2008-11-03 18:59:59 +00:00
access_str = = ( LVM_READ | LVM_WRITE ) ? " read/write " : " " ,
access_str = = LVM_READ ? " read " : " " ,
access_str = = LVM_WRITE ? " write " : " " ,
access_str = = 0 ? " error " : " " ) ;
2002-01-29 16:30:18 +00:00
log_print ( " VG Status %s%sresizable " ,
2009-09-14 19:44:15 +00:00
vg_is_exported ( vg ) ? " exported/ " : " " ,
2009-09-15 18:35:13 +00:00
vg_is_resizeable ( vg ) ? " " : " NOT " ) ;
2002-11-18 14:01:16 +00:00
/* vg number not part of LVM2 design
log_print ( " VG # %u \n " , vg - > vg_number ) ;
*/
2008-04-10 17:09:32 +00:00
if ( vg_is_clustered ( vg ) ) {
2001-11-19 15:20:50 +00:00
log_print ( " Clustered yes " ) ;
log_print ( " Shared %s " ,
vg - > status & SHARED ? " yes " : " no " ) ;
}
2008-04-10 17:19:02 +00:00
2001-11-19 15:20:50 +00:00
log_print ( " MAX LV %u " , vg - > max_lv ) ;
2009-05-13 21:27:43 +00:00
log_print ( " Cur LV %u " , vg_visible_lvs ( vg ) ) ;
2002-11-18 14:01:16 +00:00
log_print ( " Open LV %u " , lvs_in_vg_opened ( vg ) ) ;
/****** FIXME Max LV Size
log_print ( " MAX LV Size %s " ,
2006-05-09 21:23:51 +00:00
( s1 = display_size ( LVM_LV_SIZE_MAX ( vg ) ) ) ) ;
2002-11-18 14:01:16 +00:00
free ( s1 ) ;
* * * * * * * * */
2001-11-19 15:20:50 +00:00
log_print ( " Max PV %u " , vg - > max_pv ) ;
log_print ( " Cur PV %u " , vg - > pv_count ) ;
2002-11-18 14:01:16 +00:00
log_print ( " Act PV %u " , active_pvs ) ;
2001-11-19 15:20:50 +00:00
2002-12-12 20:55:49 +00:00
log_print ( " VG Size %s " ,
display_size ( vg - > cmd ,
2006-05-09 21:23:51 +00:00
( uint64_t ) vg - > extent_count * vg - > extent_size ) ) ;
2001-11-19 15:20:50 +00:00
2002-12-12 20:55:49 +00:00
log_print ( " PE Size %s " ,
2014-03-26 14:02:31 +01:00
display_size ( vg - > cmd , vg - > extent_size ) ) ;
2001-11-19 15:20:50 +00:00
log_print ( " Total PE %u " , vg - > extent_count ) ;
log_print ( " Alloc PE / Size %u / %s " ,
2004-06-07 15:22:43 +00:00
vg - > extent_count - vg - > free_count ,
display_size ( vg - > cmd ,
2014-03-26 14:02:31 +01:00
( uint64_t ) ( vg - > extent_count - vg - > free_count ) *
2006-05-09 21:23:51 +00:00
vg - > extent_size ) ) ;
2002-12-12 20:55:49 +00:00
log_print ( " Free PE / Size %u / %s " , vg - > free_count ,
2009-07-27 10:18:31 +00:00
display_size ( vg - > cmd , vg_free ( vg ) ) ) ;
2001-11-19 15:20:50 +00:00
2002-01-21 11:29:06 +00:00
if ( ! id_write_format ( & vg - > id , uuid , sizeof ( uuid ) ) ) {
stack ;
return ;
}
2001-11-19 15:20:50 +00:00
2002-01-21 11:29:06 +00:00
log_print ( " VG UUID %s " , uuid ) ;
2001-11-19 15:20:50 +00:00
log_print ( " " ) ;
}
2007-08-07 09:06:05 +00:00
void vgdisplay_colons ( const struct volume_group * vg )
2001-11-19 15:20:50 +00:00
{
2004-03-30 14:35:40 +00:00
uint32_t active_pvs ;
2008-11-03 18:59:59 +00:00
const char * access_str ;
2010-07-09 15:34:40 +00:00
char uuid [ 64 ] __attribute__ ( ( aligned ( 8 ) ) ) ;
2004-03-30 14:35:40 +00:00
2008-09-19 06:42:00 +00:00
active_pvs = vg - > pv_count - vg_missing_pv_count ( vg ) ;
2004-03-30 14:35:40 +00:00
switch ( vg - > status & ( LVM_READ | LVM_WRITE ) ) {
case LVM_READ | LVM_WRITE :
2008-11-03 18:59:59 +00:00
access_str = " r/w " ;
2004-03-30 14:35:40 +00:00
break ;
case LVM_READ :
2008-11-03 18:59:59 +00:00
access_str = " r " ;
2004-03-30 14:35:40 +00:00
break ;
case LVM_WRITE :
2008-11-03 18:59:59 +00:00
access_str = " w " ;
2004-03-30 14:35:40 +00:00
break ;
default :
2008-11-03 18:59:59 +00:00
access_str = " " ;
2004-03-30 14:35:40 +00:00
}
if ( ! id_write_format ( & vg - > id , uuid , sizeof ( uuid ) ) ) {
stack ;
return ;
}
2009-11-24 22:55:55 +00:00
log_print ( " %s:%s:% " PRIu64 " :-1:%u:%u:%u:-1:%u:%u:%u:% " PRIu64 " :% " PRIu32
2004-03-30 14:35:40 +00:00
" :%u:%u:%u:%s " ,
vg - > name ,
2008-11-03 18:59:59 +00:00
access_str ,
2004-03-30 14:35:40 +00:00
vg - > status ,
/* internal volume group number; obsolete */
vg - > max_lv ,
2009-05-13 21:27:43 +00:00
vg_visible_lvs ( vg ) ,
2004-03-30 14:35:40 +00:00
lvs_in_vg_opened ( vg ) ,
/* FIXME: maximum logical volume size */
vg - > max_pv ,
vg - > pv_count ,
active_pvs ,
( uint64_t ) vg - > extent_count * ( vg - > extent_size / 2 ) ,
vg - > extent_size / 2 ,
vg - > extent_count ,
2008-01-30 14:00:02 +00:00
vg - > extent_count - vg - > free_count ,
2004-03-30 14:35:40 +00:00
vg - > free_count ,
uuid [ 0 ] ? uuid : " none " ) ;
2001-11-19 15:20:50 +00:00
}
2007-08-07 09:06:05 +00:00
void vgdisplay_short ( const struct volume_group * vg )
2001-11-19 15:20:50 +00:00
{
2002-01-30 15:04:48 +00:00
log_print ( " \" %s \" %-9s [%-9s used / %s free] " , vg - > name ,
2001-11-19 15:20:50 +00:00
/********* FIXME if "open" print "/used" else print "/idle"??? ******/
2004-06-07 15:22:43 +00:00
display_size ( vg - > cmd ,
2006-05-09 21:23:51 +00:00
( uint64_t ) vg - > extent_count * vg - > extent_size ) ,
2002-12-19 23:25:55 +00:00
display_size ( vg - > cmd ,
( ( uint64_t ) vg - > extent_count -
2006-05-09 21:23:51 +00:00
vg - > free_count ) * vg - > extent_size ) ,
2009-07-27 10:18:31 +00:00
display_size ( vg - > cmd , vg_free ( vg ) ) ) ;
2001-11-13 17:53:06 +00:00
}
2004-09-14 16:42:46 +00:00
2007-08-07 09:06:05 +00:00
void display_formats ( const struct cmd_context * cmd )
2004-09-14 16:42:46 +00:00
{
2007-08-07 09:06:05 +00:00
const struct format_type * fmt ;
2004-09-14 16:42:46 +00:00
2008-11-03 22:14:30 +00:00
dm_list_iterate_items ( fmt , & cmd - > formats ) {
2004-09-14 16:42:46 +00:00
log_print ( " %s " , fmt - > name ) ;
}
}
2007-08-07 09:06:05 +00:00
void display_segtypes ( const struct cmd_context * cmd )
2004-09-14 16:42:46 +00:00
{
2007-08-07 09:06:05 +00:00
const struct segment_type * segtype ;
2004-09-14 16:42:46 +00:00
2008-11-03 22:14:30 +00:00
dm_list_iterate_items ( segtype , & cmd - > segtypes ) {
2004-09-14 16:42:46 +00:00
log_print ( " %s " , segtype - > name ) ;
}
}
2014-01-30 13:09:15 +00:00
void display_tags ( const struct cmd_context * cmd )
{
2014-05-29 09:41:03 +02:00
const struct dm_str_list * sl ;
2014-01-30 13:09:15 +00:00
dm_list_iterate_items ( sl , & cmd - > tags ) {
log_print ( " %s " , sl - > str ) ;
}
}
2013-09-26 11:37:40 -05:00
void display_name_error ( name_error_t name_error )
{
2014-04-28 10:17:30 +02:00
switch ( name_error ) {
case NAME_VALID :
/* Valid name */
break ;
case NAME_INVALID_EMPTY :
log_error ( " Name is zero length. " ) ;
break ;
2015-02-23 17:09:35 +00:00
case NAME_INVALID_HYPHEN :
2014-04-28 10:17:30 +02:00
log_error ( " Name cannot start with hyphen. " ) ;
break ;
case NAME_INVALID_DOTS :
log_error ( " Name starts with . or .. and has no "
" following character(s). " ) ;
break ;
case NAME_INVALID_CHARSET :
log_error ( " Name contains invalid character, valid set includes: "
" [a-zA-Z0-9.-_+]. " ) ;
break ;
case NAME_INVALID_LENGTH :
/* Report that name length - 1 to accommodate nul*/
log_error ( " Name length exceeds maximum limit of %d. " , ( NAME_LEN - 1 ) ) ;
break ;
default :
log_error ( INTERNAL_ERROR " Unknown error %d on name validation. " , name_error ) ;
break ;
2013-09-26 11:37:40 -05:00
}
}
2012-08-26 00:15:45 +01:00
/*
* Prompt for y or n from stdin .
* Defaults to ' no ' in silent mode .
* All callers should support - - yes and / or - - force to override this .
2016-06-08 20:52:14 +02:00
*
* Accepted are either _yes [ ] or _no [ ] strings or just their outset .
* When running without ' tty ' stdin is printed to stderr .
* ' Yes ' is accepted ONLY with ' \n ' .
2012-08-26 00:15:45 +01:00
*/
2007-08-20 17:04:53 +00:00
char yes_no_prompt ( const char * prompt , . . . )
{
2016-06-08 20:52:14 +02:00
/* Lowercase Yes/No strings */
static const char _yes [ ] = " yes " ;
static const char _no [ ] = " no " ;
const char * answer = NULL ;
int c = silent_mode ( ) ? EOF : 0 ;
2016-06-27 11:13:43 +02:00
int i = 0 , ret = 0 , sig = 0 ;
2016-06-08 20:52:14 +02:00
char buf [ 12 ] ;
2007-08-20 17:04:53 +00:00
va_list ap ;
sigint_allow ( ) ;
2016-06-08 20:52:14 +02:00
for ( ; ; ) {
if ( ! ret ) {
/* Show prompt */
2007-08-20 17:04:53 +00:00
va_start ( ap , prompt ) ;
2011-11-23 01:34:38 +00:00
vfprintf ( stderr , prompt , ap ) ;
2007-08-20 17:04:53 +00:00
va_end ( ap ) ;
2011-11-23 01:34:38 +00:00
fflush ( stderr ) ;
2016-06-08 20:52:14 +02:00
if ( c = = EOF )
2014-05-15 11:58:49 +02:00
break ;
2016-06-08 20:52:14 +02:00
i = 0 ;
answer = NULL ;
2007-08-20 17:04:53 +00:00
}
2016-06-08 20:52:14 +02:00
nextchar :
if ( ( sig = sigint_caught ( ) ) )
break ; /* Check if already interrupted before getchar() */
2007-08-20 17:04:53 +00:00
if ( ( c = getchar ( ) ) = = EOF ) {
2016-06-08 20:52:14 +02:00
/* SIGNAL or no chars on stdin (missing '\n') or ^D */
if ( ! i )
break ; /* Just shown prompt,-> print [n]\n */
goto invalid ; /* Note: c holds EOF */
2007-08-20 17:04:53 +00:00
}
2016-06-08 20:52:14 +02:00
if ( ( i < ( sizeof ( buf ) - 4 ) ) & & isprint ( c ) )
buf [ i + + ] = c ;
2007-08-20 17:04:53 +00:00
c = tolower ( c ) ;
2021-09-21 18:32:21 +02:00
if ( ( ret > 0 ) & & answer & & ( c = = answer [ 0 ] ) )
2016-06-08 20:52:14 +02:00
answer + + ; /* Matching, next char */
else if ( c = = ' \n ' ) {
if ( feof ( stdin ) )
fputc ( ' \n ' , stderr ) ;
if ( ret > 0 )
break ; /* Answered */
invalid :
if ( i > = ( sizeof ( buf ) - 4 ) ) {
/* '...' for missing input */
i = sizeof ( buf ) - 1 ;
buf [ i - 1 ] = buf [ i - 2 ] = buf [ i - 3 ] = ' . ' ;
}
buf [ i ] = 0 ;
log_warn ( " WARNING: Invalid input '%s'. " , buf ) ;
ret = 0 ; /* Otherwise refresh prompt */
} else if ( ! ret & & ( c = = _yes [ 0 ] ) ) {
ret = ' y ' ;
answer = _yes + 1 ; /* Expecting 'Yes' */
} else if ( ! ret & & ( c = = _no [ 0 ] ) ) {
ret = ' n ' ;
answer = _no + 1 ; /* Expecting 'No' */
} else if ( ! ret & & isspace ( c ) ) {
/* Ignore any whitespace before */
- - i ;
goto nextchar ;
2021-09-21 18:32:21 +02:00
} else if ( ( ret > 0 ) & & answer & & isspace ( c ) ) {
2016-06-08 20:52:14 +02:00
/* Ignore any whitespace after */
while ( * answer )
answer + + ; /* jump to end-of-word */
} else
ret = - 1 ; /* Read till '\n' and refresh */
}
2007-08-20 17:04:53 +00:00
2016-06-08 20:52:14 +02:00
sigint_restore ( ) ;
2014-07-07 21:03:15 +02:00
2016-06-08 20:52:14 +02:00
/* For other then Yes answer check there is really no interrupt */
if ( sig | | sigint_caught ( ) ) {
stack ;
ret = ' n ' ;
} else if ( c = = EOF ) {
fputs ( " [n] \n " , stderr ) ;
ret = ' n ' ;
} else
/* Not knowing if it's terminal, makes this hard.... */
log_verbose ( " Accepted input: [%c] " , ret ) ;
2007-08-20 17:04:53 +00:00
return ret ;
}