2001-09-25 16:49:28 +04:00
/*
2004-03-30 23:35:44 +04:00
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
2007-08-21 00:55:30 +04:00
* Copyright ( C ) 2004 - 2007 Red Hat , Inc . All rights reserved .
2001-09-25 16:49:28 +04:00
*
2004-03-30 23:35:44 +04:00
* This file is part of LVM2 .
2001-09-25 16:49:28 +04:00
*
2004-03-30 23:35:44 +04: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-21 00:55:30 +04:00
* of the GNU Lesser General Public License v .2 .1 .
2001-09-25 16:49:28 +04:00
*
2007-08-21 00:55:30 +04:00
* You should have received a copy of the GNU Lesser General Public License
2004-03-30 23:35:44 +04:00
* along with this program ; if not , write to the Free Software Foundation ,
2016-01-21 13:49:46 +03:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
2001-09-25 16:49:28 +04:00
*/
# include "tools.h"
2006-05-10 01:23:51 +04:00
static int _pvdisplay_single ( struct cmd_context * cmd ,
2007-11-14 21:41:05 +03:00
struct volume_group * vg ,
2014-11-27 17:02:13 +03:00
struct physical_volume * pv ,
struct processing_handle * handle __attribute__ ( ( unused ) ) )
2001-09-25 16:49:28 +04:00
{
2014-10-07 03:34:04 +04:00
const char * pv_name = pv_dev_name ( pv ) ;
2006-10-16 20:29:40 +04:00
int ret = ECMD_PROCESSED ;
2002-02-12 00:00:35 +03:00
uint64_t size ;
2006-10-16 20:29:40 +04:00
2007-11-02 17:54:40 +03:00
if ( is_orphan ( pv ) )
2007-06-16 02:16:55 +04:00
size = pv_size ( pv ) ;
2001-10-25 18:04:18 +04:00
else
2012-08-16 22:07:30 +04:00
size = ( uint64_t ) ( pv_pe_count ( pv ) - pv_pe_alloc_count ( pv ) ) *
2007-06-16 02:16:55 +04:00
pv_pe_size ( pv ) ;
2001-09-25 16:49:28 +04:00
2016-06-22 00:24:52 +03:00
if ( arg_is_set ( cmd , short_ARG ) ) {
2002-12-12 23:55:49 +03:00
log_print ( " Device \" %s \" has a capacity of %s " , pv_name ,
2006-05-10 01:23:51 +04:00
display_size ( cmd , size ) ) ;
2006-10-16 20:29:40 +04:00
goto out ;
2001-09-25 16:49:28 +04:00
}
2007-06-16 02:16:55 +04:00
if ( pv_status ( pv ) & EXPORTED_VG )
2014-03-19 03:35:27 +04:00
log_print_unless_silent ( " Physical volume \" %s \" of volume group \" %s \" "
" is exported " , pv_name , pv_vg_name ( pv ) ) ;
2001-09-25 16:49:28 +04:00
2007-11-02 17:54:40 +03:00
if ( is_orphan ( pv ) )
2014-03-19 03:35:27 +04:00
log_print_unless_silent ( " \" %s \" is a new physical volume of \" %s \" " ,
pv_name , display_size ( cmd , size ) ) ;
2001-09-25 16:49:28 +04:00
2016-06-22 00:24:52 +03:00
if ( arg_is_set ( cmd , colon_ARG ) ) {
2001-10-18 20:55:19 +04:00
pvdisplay_colons ( pv ) ;
2006-10-16 20:29:40 +04:00
goto out ;
2001-09-25 16:49:28 +04:00
}
2014-11-27 17:02:13 +03:00
pvdisplay_full ( cmd , pv , NULL ) ;
2001-09-25 16:49:28 +04:00
2016-06-22 00:24:52 +03:00
if ( arg_is_set ( cmd , maps_ARG ) )
2007-05-31 00:43:09 +04:00
pvdisplay_segments ( pv ) ;
2006-10-16 20:29:40 +04:00
out :
return ret ;
2002-11-18 17:04:08 +03:00
}
int pvdisplay ( struct cmd_context * cmd , int argc , char * * argv )
{
2014-10-07 03:34:04 +04:00
int lock_global = 0 ;
int ret ;
2016-06-22 00:24:52 +03:00
if ( arg_is_set ( cmd , columns_ARG ) ) {
if ( arg_is_set ( cmd , colon_ARG ) | | arg_is_set ( cmd , maps_ARG ) | |
arg_is_set ( cmd , short_ARG ) ) {
2002-12-12 23:55:49 +03:00
log_error ( " Incompatible options selected " ) ;
return EINVALID_CMD_LINE ;
}
return pvs ( cmd , argc , argv ) ;
2014-03-31 01:10:42 +04:00
}
2016-06-22 00:24:52 +03:00
if ( arg_is_set ( cmd , aligned_ARG ) | |
arg_is_set ( cmd , all_ARG ) | |
arg_is_set ( cmd , binary_ARG ) | |
arg_is_set ( cmd , noheadings_ARG ) | |
arg_is_set ( cmd , options_ARG ) | |
arg_is_set ( cmd , separator_ARG ) | |
arg_is_set ( cmd , sort_ARG ) | |
arg_is_set ( cmd , unbuffered_ARG ) ) {
2002-12-12 23:55:49 +03:00
log_error ( " Incompatible options selected " ) ;
return EINVALID_CMD_LINE ;
}
2002-11-18 17:04:08 +03:00
2016-06-22 00:24:52 +03:00
if ( arg_is_set ( cmd , colon_ARG ) & & arg_is_set ( cmd , maps_ARG ) ) {
2014-03-31 01:12:09 +04:00
log_error ( " Option -c not allowed with option -m " ) ;
return EINVALID_CMD_LINE ;
}
2016-06-22 00:24:52 +03:00
if ( arg_is_set ( cmd , colon_ARG ) & & arg_is_set ( cmd , short_ARG ) ) {
2014-03-31 01:12:09 +04:00
log_error ( " Option -c is not allowed with option -s " ) ;
2002-11-18 17:04:08 +03:00
return EINVALID_CMD_LINE ;
}
2014-10-07 03:34:04 +04:00
/*
* If the lock_type is LCK_VG_READ ( used only in reporting commands ) ,
* we lock VG_GLOBAL to enable use of metadata cache .
* This can pause alongide pvscan or vgscan process for a while .
*/
2016-04-14 01:00:01 +03:00
if ( ! lvmetad_used ( ) ) {
2014-10-07 03:34:04 +04:00
lock_global = 1 ;
if ( ! lock_vol ( cmd , VG_GLOBAL , LCK_VG_READ , NULL ) ) {
log_error ( " Unable to obtain global lock. " ) ;
return ECMD_FAILED ;
}
}
2016-02-16 23:15:24 +03:00
ret = process_each_pv ( cmd , argc , argv , NULL ,
arg_is_set ( cmd , all_ARG ) , 0 ,
NULL , _pvdisplay_single ) ;
2014-10-07 03:34:04 +04:00
if ( lock_global )
unlock_vg ( cmd , VG_GLOBAL ) ;
return ret ;
2001-09-25 16:49:28 +04:00
}