2001-10-29 21:23:35 +03:00
/*
2008-01-30 17:00:02 +03:00
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
2007-08-21 00:55:30 +04:00
* Copyright ( C ) 2004 - 2006 Red Hat , Inc . All rights reserved .
2001-10-29 21:23:35 +03:00
*
2004-03-30 23:35:44 +04:00
* This file is part of LVM2 .
2001-10-29 21:23:35 +03: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-10-29 21:23:35 +03: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-10-29 21:23:35 +03:00
*/
# include "tools.h"
2014-07-21 05:55:46 +04:00
static int _lvscan_single_lvmetad ( struct cmd_context * cmd , struct logical_volume * lv )
{
struct pv_list * pvl ;
2014-08-04 19:36:12 +04:00
struct dm_list all_pvs ;
char pvid_s [ 64 ] __attribute__ ( ( aligned ( 8 ) ) ) ;
2014-07-21 05:55:46 +04:00
2016-01-29 01:40:26 +03:00
if ( ! lvmetad_used ( ) )
2014-07-21 05:55:46 +04:00
return ECMD_PROCESSED ;
2014-08-04 19:36:12 +04:00
dm_list_init ( & all_pvs ) ;
2014-07-21 05:55:46 +04:00
2014-08-04 19:36:12 +04:00
if ( ! get_pv_list_for_lv ( lv - > vg - > vgmem , lv , & all_pvs ) )
2014-07-21 05:55:46 +04:00
return ECMD_FAILED ;
2014-08-04 19:36:12 +04:00
dm_list_iterate_items ( pvl , & all_pvs ) {
2014-08-04 19:02:26 +04:00
if ( ! pvl - > pv - > dev ) {
2014-08-19 16:26:06 +04:00
if ( ! id_write_format ( & pvl - > pv - > id , pvid_s , sizeof ( pvid_s ) ) )
stack ;
else
log_warn ( " WARNING: Device for PV %s already missing, skipping. " ,
pvid_s ) ;
2014-08-04 19:02:26 +04:00
continue ;
}
pvscan: use process_each_vg for autoactivate
This refactors the code for autoactivation. Previously,
as each PV was found, it would be sent to lvmetad, and
the VG would be autoactivated using a non-standard VG
processing function (the "activation_handler") called via
a function pointer from within the lvmetad notification path.
Now, any scanning that the command needs to do (scanning
only the named device args, or scanning all devices when
there are no args), is done first, before any activation
is attempted. During the scans, the VG names are saved.
After scanning is complete, process_each_vg is used to do
autoactivation of the saved VG names. This makes pvscan
activation much more similar to activation done with
vgchange or lvchange.
The separate autoactivate phase also means that if lvmetad
is disabled (either before or during the scan), the command
can continue with the activation step by simply not using
lvmetad and reverting to disk scanning to do the
activation.
2016-04-28 17:37:03 +03:00
if ( ! lvmetad_pvscan_single ( cmd , pvl - > pv - > dev , NULL , NULL ) )
2014-07-21 05:55:46 +04:00
return ECMD_FAILED ;
2014-08-04 19:02:26 +04:00
}
2014-07-21 05:55:46 +04:00
return ECMD_PROCESSED ;
}
2017-10-18 17:57:46 +03:00
static int _lvscan_single ( struct cmd_context * cmd , struct logical_volume * lv ,
struct processing_handle * handle __attribute__ ( ( unused ) ) )
2001-10-29 21:23:35 +03:00
{
2003-01-09 01:44:07 +03:00
struct lvinfo info ;
2005-12-08 20:49:34 +03:00
int inkernel , snap_active = 1 ;
2014-06-09 14:08:27 +04:00
dm_percent_t snap_percent ; /* fused, fsize; */
2001-10-29 21:23:35 +03:00
const char * active_str , * snapshot_str ;
2016-06-22 00:24:52 +03:00
if ( arg_is_set ( cmd , cache_long_ARG ) )
2014-07-21 05:55:46 +04:00
return _lvscan_single_lvmetad ( cmd , lv ) ;
2016-06-22 00:24:52 +03:00
if ( ! arg_is_set ( cmd , all_ARG ) & & ! lv_is_visible ( lv ) )
2005-10-17 20:41:38 +04:00
return ECMD_PROCESSED ;
2011-02-03 04:24:46 +03:00
inkernel = lv_info ( cmd , lv , 0 , & info , 0 , 0 ) & & info . exists ;
2014-04-28 13:58:26 +04:00
if ( lv_is_cow ( lv ) ) {
2005-12-08 20:49:34 +03:00
if ( inkernel & &
2010-11-30 14:53:31 +03:00
( snap_active = lv_snapshot_percent ( lv , & snap_percent ) ) )
2014-06-09 14:08:27 +04:00
if ( snap_percent = = DM_PERCENT_INVALID )
2005-12-08 20:49:34 +03:00
snap_active = 0 ;
}
2002-12-20 02:25:55 +03:00
/* FIXME Add -D arg to skip this! */
2005-12-08 20:49:34 +03:00
if ( inkernel & & snap_active )
2001-11-14 21:38:07 +03:00
active_str = " ACTIVE " ;
2002-03-11 22:02:28 +03:00
else
2001-11-14 21:38:07 +03:00
active_str = " inactive " ;
2001-10-29 21:23:35 +03:00
2002-02-20 22:04:55 +03:00
if ( lv_is_origin ( lv ) )
2001-11-14 21:38:07 +03:00
snapshot_str = " Original " ;
2002-02-20 22:04:55 +03:00
else if ( lv_is_cow ( lv ) )
2001-11-14 21:38:07 +03:00
snapshot_str = " Snapshot " ;
else
snapshot_str = " " ;
2001-10-29 21:23:35 +03:00
config: add silent mode
Accept -q as the short form of --quiet.
Suppress non-essential standard output if -q is given twice.
Treat log/silent in lvm.conf as equivalent to -qq.
Review all log_print messages and change some to
log_print_unless_silent.
When silent, the following commands still produce output:
dumpconfig, lvdisplay, lvmdiskscan, lvs, pvck, pvdisplay,
pvs, version, vgcfgrestore -l, vgdisplay, vgs.
[Needs checking.]
Non-essential messages are shifted from log level 4 to log level 5
for syslog and lvm2_log_fn purposes.
2012-08-25 23:35:48 +04:00
log_print_unless_silent ( " %s%s '%s%s/%s' [%s] %s " , active_str , snapshot_str ,
cmd - > dev_dir , lv - > vg - > name , lv - > name ,
display_size ( cmd , lv - > size ) ,
get_alloc_string ( lv - > alloc ) ) ;
2001-10-29 21:23:35 +03:00
2003-10-22 02:06:07 +04:00
return ECMD_PROCESSED ;
2001-10-29 21:23:35 +03:00
}
2002-11-18 17:04:08 +03:00
int lvscan ( struct cmd_context * cmd , int argc , char * * argv )
{
2016-04-06 23:31:15 +03:00
const char * reason = NULL ;
2016-06-22 00:24:52 +03:00
if ( argc & & ! arg_is_set ( cmd , cache_long_ARG ) ) {
2002-11-18 17:04:08 +03:00
log_error ( " No additional command line arguments allowed " ) ;
return EINVALID_CMD_LINE ;
}
2016-01-29 01:40:26 +03:00
if ( ! lvmetad_used ( ) & & arg_is_set ( cmd , cache_long_ARG ) )
log_verbose ( " Ignoring lvscan --cache because lvmetad is not in use. " ) ;
/* Needed because this command has NO_LVMETAD_AUTOSCAN. */
2016-04-06 23:31:15 +03:00
if ( lvmetad_used ( ) & & ( ! lvmetad_token_matches ( cmd ) | | lvmetad_is_disabled ( cmd , & reason ) ) ) {
pvscan: use process_each_vg for autoactivate
This refactors the code for autoactivation. Previously,
as each PV was found, it would be sent to lvmetad, and
the VG would be autoactivated using a non-standard VG
processing function (the "activation_handler") called via
a function pointer from within the lvmetad notification path.
Now, any scanning that the command needs to do (scanning
only the named device args, or scanning all devices when
there are no args), is done first, before any activation
is attempted. During the scans, the VG names are saved.
After scanning is complete, process_each_vg is used to do
autoactivation of the saved VG names. This makes pvscan
activation much more similar to activation done with
vgchange or lvchange.
The separate autoactivate phase also means that if lvmetad
is disabled (either before or during the scan), the command
can continue with the activation step by simply not using
lvmetad and reverting to disk scanning to do the
activation.
2016-04-28 17:37:03 +03:00
if ( lvmetad_used ( ) & & ! lvmetad_pvscan_all_devs ( cmd , 0 ) ) {
2016-01-29 01:40:26 +03:00
log_warn ( " WARNING: Not using lvmetad because cache update failed. " ) ;
2016-04-14 01:00:01 +03:00
lvmetad_make_unused ( cmd ) ;
2016-01-29 01:40:26 +03:00
}
2016-04-06 23:31:15 +03:00
if ( lvmetad_used ( ) & & lvmetad_is_disabled ( cmd , & reason ) ) {
log_warn ( " WARNING: Not using lvmetad because %s. " , reason ) ;
2016-04-14 01:00:01 +03:00
lvmetad_make_unused ( cmd ) ;
2016-04-06 23:31:15 +03:00
}
2016-01-29 01:40:26 +03:00
/*
* FIXME : doing lvscan - - cache after a full scan is pointless .
* Should the cache case just exit here ?
*/
}
2017-10-18 17:57:46 +03:00
return process_each_lv ( cmd , argc , argv , NULL , NULL , 0 , NULL , NULL , & _lvscan_single ) ;
2002-11-18 17:04:08 +03:00
}