2002-01-15 21:17:57 +03:00
/*
2008-01-30 17:00:02 +03:00
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
2009-05-13 17:02:52 +04:00
* Copyright ( C ) 2004 - 2009 Red Hat , Inc . All rights reserved .
2002-01-15 21:17:57 +03:00
*
2004-03-30 23:35:44 +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
2007-08-21 00:55:30 +04:00
* of the GNU Lesser General Public License v .2 .1 .
2004-03-30 23:35:44 +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
2002-01-15 21:17:57 +03:00
*/
# include "tools.h"
2016-06-18 00:37:30 +03:00
# include "lvmetad-client.h"
2002-01-15 21:17:57 +03:00
2002-02-11 23:50:53 +03:00
int vgcfgrestore ( struct cmd_context * cmd , int argc , char * * argv )
2002-01-15 21:17:57 +03:00
{
2011-02-18 17:47:28 +03:00
const char * vg_name = NULL ;
2016-06-18 00:37:30 +03:00
int lvmetad_rescan = 0 ;
2016-06-21 19:40:42 +03:00
int ret ;
2003-01-18 00:02:04 +03:00
2007-06-09 02:38:48 +04:00
if ( argc = = 1 ) {
vg_name = skip_dev_dir ( cmd , argv [ 0 ] , NULL ) ;
if ( ! validate_name ( vg_name ) ) {
log_error ( " Volume group name \" %s \" is invalid " , vg_name ) ;
2014-05-22 01:11:15 +04:00
return EINVALID_CMD_LINE ;
2007-06-09 02:38:48 +04:00
}
2016-06-22 00:24:52 +03:00
} else if ( ! ( arg_is_set ( cmd , list_ARG ) & & arg_is_set ( cmd , file_ARG ) ) ) {
2009-07-16 00:02:46 +04:00
log_error ( " Please specify a *single* volume group to restore. " ) ;
2014-05-22 01:11:15 +04:00
return EINVALID_CMD_LINE ;
2002-01-15 21:17:57 +03:00
}
2002-02-11 14:43:17 +03:00
/*
* FIXME : overloading the - l arg for now to display a
* list of archive files for a particular vg
*/
2016-06-22 00:24:52 +03:00
if ( arg_is_set ( cmd , list_ARG ) ) {
if ( ! ( arg_is_set ( cmd , file_ARG ) ?
2009-09-15 02:47:49 +04:00
archive_display_file ( cmd ,
arg_str_value ( cmd , file_ARG , " " ) ) :
2013-07-01 13:27:22 +04:00
archive_display ( cmd , vg_name ) ) )
return_ECMD_FAILED ;
2003-10-22 02:06:07 +04:00
return ECMD_PROCESSED ;
2002-02-11 14:43:17 +03:00
}
2016-06-18 00:37:30 +03:00
/*
* lvmetad does not handle a VG being restored , which would require
* vg_remove of the existing VG , then vg_update of the restored VG . A
* command failure after removing the existing VG from lvmetad would
* not be easily recovered from . So , disable the lvmetad cache before
* doing the restore . After the VG is restored on disk , rescan
* metadata from disk to populate lvmetad from scratch which will pick
* up the VG that was restored on disk .
*/
if ( lvmetad_used ( ) ) {
lvmetad_set_disabled ( cmd , LVMETAD_DISABLE_REASON_VGRESTORE ) ;
lvmetad_disconnect ( ) ;
lvmetad_rescan = 1 ;
}
2012-02-23 17:11:07 +04:00
2013-03-18 00:29:58 +04:00
if ( ! lock_vol ( cmd , vg_name , LCK_VG_WRITE , NULL ) ) {
2003-01-18 00:02:04 +03:00
log_error ( " Unable to lock volume group %s " , vg_name ) ;
2002-11-18 17:04:08 +03:00
return ECMD_FAILED ;
}
2013-03-18 00:29:58 +04:00
if ( ! lock_vol ( cmd , VG_ORPHANS , LCK_VG_WRITE , NULL ) ) {
2009-07-11 00:10:18 +04:00
log_error ( " Unable to lock orphans " ) ;
2009-08-13 21:16:38 +04:00
unlock_vg ( cmd , vg_name ) ;
2009-07-11 00:10:18 +04:00
return ECMD_FAILED ;
}
2009-10-16 21:41:49 +04:00
cmd - > handles_unknown_segments = 1 ;
2016-06-22 00:24:52 +03:00
if ( ! ( arg_is_set ( cmd , file_ARG ) ?
2003-01-18 00:02:04 +03:00
backup_restore_from_file ( cmd , vg_name ,
2012-11-27 02:45:35 +04:00
arg_str_value ( cmd , file_ARG , " " ) ,
arg_count ( cmd , force_long_ARG ) ) :
backup_restore ( cmd , vg_name , arg_count ( cmd , force_long_ARG ) ) ) ) {
2007-11-02 23:40:05 +03:00
unlock_vg ( cmd , VG_ORPHANS ) ;
2009-08-13 21:16:38 +04:00
unlock_vg ( cmd , vg_name ) ;
2009-07-16 00:02:46 +04:00
log_error ( " Restore failed. " ) ;
2016-06-21 19:40:42 +03:00
ret = ECMD_FAILED ;
goto rescan ;
2002-01-15 21:17:57 +03:00
}
2016-06-21 19:40:42 +03:00
ret = ECMD_PROCESSED ;
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 ( " Restored volume group %s " , vg_name ) ;
2003-01-18 00:02:04 +03:00
2007-11-02 23:40:05 +03:00
unlock_vg ( cmd , VG_ORPHANS ) ;
2009-07-11 00:10:18 +04:00
unlock_vg ( cmd , vg_name ) ;
2016-06-21 19:40:42 +03:00
rescan :
2016-06-18 00:37:30 +03:00
if ( lvmetad_rescan ) {
if ( ! lvmetad_connect ( cmd ) ) {
log_warn ( " WARNING: Failed to connect to lvmetad. " ) ;
log_warn ( " WARNING: Update lvmetad with pvscan --cache. " ) ;
goto out ;
}
2016-06-21 19:40:42 +03:00
if ( ! refresh_filters ( cmd ) )
stack ;
2016-06-18 00:37:30 +03:00
if ( ! lvmetad_pvscan_all_devs ( cmd , 1 ) ) {
log_warn ( " WARNING: Failed to scan devices. " ) ;
log_warn ( " WARNING: Update lvmetad with pvscan --cache. " ) ;
goto out ;
}
}
out :
2016-06-21 19:40:42 +03:00
return ret ;
2002-01-15 21:17:57 +03:00
}