2001-09-25 16:49:28 +04:00
/*
* Copyright ( C ) 2001 Sistina Software
*
* LVM is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 , or ( at your option )
* any later version .
*
* LVM is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with LVM ; see the file COPYING . If not , write to
* the Free Software Foundation , 59 Temple Place - Suite 330 ,
* Boston , MA 02111 - 1307 , USA .
*
*/
# include "tools.h"
2001-10-18 20:55:19 +04:00
void pvdisplay_single ( struct physical_volume * pv ) ;
2001-09-25 16:49:28 +04:00
int pvdisplay ( int argc , char * * argv )
{
2001-10-18 20:55:19 +04:00
int opt = 0 ;
2001-09-25 16:49:28 +04:00
2001-10-31 15:47:01 +03:00
struct list * pvh , * pvs ;
2001-10-18 20:55:19 +04:00
struct physical_volume * pv ;
2001-09-25 16:49:28 +04:00
2001-12-03 23:23:53 +03:00
if ( arg_count ( colon_ARG ) & & arg_count ( maps_ARG ) ) {
2001-10-18 20:55:19 +04:00
log_error ( " Option -v not allowed with option -c " ) ;
2001-10-05 02:53:37 +04:00
return EINVALID_CMD_LINE ;
2001-09-25 16:49:28 +04:00
}
2001-10-18 20:55:19 +04:00
if ( argc ) {
log_very_verbose ( " Using physical volume(s) on command line " ) ;
for ( ; opt < argc ; opt + + ) {
2001-11-12 18:10:01 +03:00
if ( ! ( pv = fid - > ops - > pv_read ( fid , argv [ opt ] ) ) ) {
2001-10-18 20:55:19 +04:00
log_error ( " Failed to read physical volume %s " ,
argv [ opt ] ) ;
continue ;
}
pvdisplay_single ( pv ) ;
}
} else {
log_verbose ( " Scanning for physical volume names " ) ;
2001-11-12 18:10:01 +03:00
if ( ! ( pvs = fid - > ops - > get_pvs ( fid ) ) )
2001-10-18 20:55:19 +04:00
return ECMD_FAILED ;
2001-10-31 15:47:01 +03:00
list_iterate ( pvh , pvs )
pvdisplay_single ( & list_item ( pvh , struct pv_list ) - > pv ) ;
2001-10-18 20:55:19 +04:00
}
2001-09-25 16:49:28 +04:00
return 0 ;
}
2001-10-18 20:55:19 +04:00
void pvdisplay_single ( struct physical_volume * pv )
2001-09-25 16:49:28 +04:00
{
2001-10-18 20:55:19 +04:00
char * sz ;
uint64_t size ;
2001-09-25 16:49:28 +04:00
2001-10-25 18:04:18 +04:00
const char * pv_name = dev_name ( pv - > dev ) ;
2001-09-25 16:49:28 +04:00
2001-10-18 20:55:19 +04:00
if ( ! * pv - > vg_name )
size = pv - > size ;
2001-10-25 18:04:18 +04:00
else
2001-10-18 20:55:19 +04:00
size = ( pv - > pe_count - pv - > pe_allocated ) * pv - > pe_size ;
2001-09-25 16:49:28 +04:00
if ( arg_count ( short_ARG ) ) {
sz = display_size ( size / 2 , SIZE_SHORT ) ;
2001-10-18 20:55:19 +04:00
log_print ( " Device '%s' has a capacity of %s " , pv_name , sz ) ;
2001-09-25 16:49:28 +04:00
dbg_free ( sz ) ;
return ;
}
2001-10-25 18:04:18 +04:00
if ( pv - > status & EXPORTED_VG )
2001-10-18 20:55:19 +04:00
log_print ( " Physical volume '%s' of volume group '%s' "
" is exported " , pv_name , pv - > vg_name ) ;
2001-09-25 16:49:28 +04:00
2001-10-18 20:55:19 +04:00
/********* FIXME
2001-09-25 16:49:28 +04:00
log_error ( " no physical volume identifier on \" %s \" " , pv_name ) ;
2001-10-18 20:55:19 +04:00
* * * * * * * * */
2001-09-25 16:49:28 +04:00
2001-10-18 20:55:19 +04:00
if ( ! pv - > vg_name ) {
log_print ( " '%s' is a new physical volume of %s " ,
2001-10-25 18:04:18 +04:00
pv_name , ( sz = display_size ( size / 2 ,
2001-10-18 20:55:19 +04:00
SIZE_SHORT ) ) ) ;
dbg_free ( sz ) ;
}
2001-09-25 16:49:28 +04:00
/* FIXME: Check active - no point?
log_very_verbose ( " checking physical volume activity " ) ;
pv_check_active ( pv - > vg_name , pv - > pv_name )
pv_status ( pv - > vg_name , pv - > pv_name , & pv )
*/
2001-10-18 20:55:19 +04:00
/* FIXME: Check consistency - do this when reading metadata BUT trigger mesgs
2001-09-25 16:49:28 +04:00
log_very_verbose ( " checking physical volume consistency " ) ;
ret = pv_check_consistency ( pv )
*/
if ( arg_count ( colon_ARG ) ) {
2001-10-18 20:55:19 +04:00
pvdisplay_colons ( pv ) ;
return ;
2001-09-25 16:49:28 +04:00
}
2001-10-18 20:55:19 +04:00
pvdisplay_full ( pv ) ;
2001-09-25 16:49:28 +04:00
2001-12-03 23:23:53 +03:00
if ( ! arg_count ( maps_ARG ) )
2001-10-18 20:55:19 +04:00
return ;
2001-09-25 16:49:28 +04:00
2001-10-18 20:55:19 +04:00
/******* FIXME
2001-09-25 16:49:28 +04:00
if ( pv - > pe_allocated ) {
2001-10-02 21:09:05 +04:00
if ( ! ( pv - > pe = pv_read_pe ( pv_name , pv ) ) )
goto pvdisplay_device_out ;
2001-09-25 16:49:28 +04:00
if ( ! ( lvs = pv_read_lvs ( pv ) ) ) {
2001-10-02 21:09:05 +04:00
log_error ( " Failed to read LVs on %s " , pv - > pv_name ) ;
2001-09-25 16:49:28 +04:00
goto pvdisplay_device_out ;
}
2001-10-02 21:09:05 +04:00
pv_display_pe_text ( pv , pv - > pe , lvs ) ;
2001-09-25 16:49:28 +04:00
} else
2001-10-02 21:09:05 +04:00
log_print ( " no logical volume on physical volume %s " , pv_name ) ;
2001-10-18 20:55:19 +04:00
* * * * * * * * * */
2001-09-25 16:49:28 +04:00
return ;
}
2001-10-18 20:55:19 +04:00