2001-10-01 19:29:39 +04:00
/*
2004-03-30 23:35:44 +04:00
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
2009-10-06 00:03:25 +04:00
* Copyright ( C ) 2004 - 2009 Red Hat , Inc . All rights reserved .
2001-11-07 11:50:07 +03:00
*
2004-03-30 23:35:44 +04:00
* This file is part of LVM2 .
2001-11-07 11:50:07 +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-11-07 11:50:07 +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-01 19:29:39 +04:00
*/
# include "tools.h"
2008-07-21 23:26:33 +04:00
/*
2009-10-06 00:03:25 +04:00
* Intial sanity checking of recovery - related command - line arguments .
* These args are : - - restorefile , - - uuid , and - - physicalvolumesize
2008-07-21 23:27:22 +04:00
*
* Output arguments :
* pp : structure allocated by caller , fields written / validated here
2008-07-21 23:26:33 +04:00
*/
2016-02-15 23:09:42 +03:00
static int pvcreate_each_restore_params_from_args ( struct cmd_context * cmd , int argc ,
struct pvcreate_each_params * pp )
2001-10-12 14:32:06 +04:00
{
2016-02-15 23:09:42 +03:00
pp - > restorefile = arg_str_value ( cmd , restorefile_ARG , NULL ) ;
2008-07-25 04:30:57 +04:00
2002-11-18 17:04:08 +03:00
if ( arg_count ( cmd , restorefile_ARG ) & & ! arg_count ( cmd , uuidstr_ARG ) ) {
log_error ( " --uuid is required with --restorefile " ) ;
2008-07-21 23:26:33 +04:00
return 0 ;
2002-11-18 17:04:08 +03:00
}
2010-08-12 08:08:59 +04:00
if ( ! arg_count ( cmd , restorefile_ARG ) & & arg_count ( cmd , uuidstr_ARG ) ) {
if ( ! arg_count ( cmd , norestorefile_ARG ) & &
2013-06-25 14:31:53 +04:00
find_config_tree_bool ( cmd , devices_require_restorefile_with_uuid_CFG , NULL ) ) {
2010-08-12 08:08:59 +04:00
log_error ( " --restorefile is required with --uuid " ) ;
return 0 ;
}
}
2002-02-12 00:00:35 +03:00
if ( arg_count ( cmd , uuidstr_ARG ) & & argc ! = 1 ) {
2002-01-16 21:10:08 +03:00
log_error ( " Can only set uuid on one volume at once " ) ;
2008-07-21 23:26:33 +04:00
return 0 ;
2002-01-16 21:10:08 +03:00
}
2016-02-15 23:09:42 +03:00
if ( arg_count ( cmd , uuidstr_ARG ) ) {
pp - > uuid_str = arg_str_value ( cmd , uuidstr_ARG , " " ) ;
if ( ! id_read_format ( & pp - > id , pp - > uuid_str ) )
2008-07-25 04:30:57 +04:00
return 0 ;
}
2012-02-28 18:24:57 +04:00
if ( arg_sign_value ( cmd , physicalvolumesize_ARG , SIGN_NONE ) = = SIGN_MINUS ) {
2009-10-06 00:03:25 +04:00
log_error ( " Physical volume size may not be negative " ) ;
return 0 ;
}
pp - > size = arg_uint64_value ( cmd , physicalvolumesize_ARG , UINT64_C ( 0 ) ) ;
if ( arg_count ( cmd , restorefile_ARG ) | | arg_count ( cmd , uuidstr_ARG ) )
pp - > zero = 0 ;
return 1 ;
}
2016-02-15 23:09:42 +03:00
static int pvcreate_each_restore_params_from_backup ( struct cmd_context * cmd ,
struct pvcreate_each_params * pp )
{
struct volume_group * vg ;
struct pv_list * existing_pvl ;
/*
* When restoring a PV , params need to be read from a backup file .
*/
if ( ! pp - > restorefile )
return 1 ;
if ( ! ( vg = backup_read_vg ( cmd , NULL , pp - > restorefile ) ) ) {
log_error ( " Unable to read volume group from %s " , pp - > restorefile ) ;
return 0 ;
}
if ( ! ( existing_pvl = find_pv_in_vg_by_uuid ( vg , & pp - > id ) ) ) {
release_vg ( vg ) ;
log_error ( " Can't find uuid %s in backup file %s " ,
pp - > uuid_str , pp - > restorefile ) ;
return 0 ;
}
pp - > ba_start = pv_ba_start ( existing_pvl - > pv ) ;
pp - > ba_size = pv_ba_size ( existing_pvl - > pv ) ;
pp - > pe_start = pv_pe_start ( existing_pvl - > pv ) ;
pp - > extent_size = pv_pe_size ( existing_pvl - > pv ) ;
pp - > extent_count = pv_pe_count ( existing_pvl - > pv ) ;
release_vg ( vg ) ;
return 1 ;
}
2008-07-21 23:26:33 +04:00
int pvcreate ( struct cmd_context * cmd , int argc , char * * argv )
{
2016-02-15 23:09:42 +03:00
struct processing_handle * handle ;
struct pvcreate_each_params pp ;
int ret ;
2008-07-21 23:26:33 +04:00
2016-02-15 23:09:42 +03:00
if ( ! argc ) {
log_error ( " Please enter a physical volume path. " ) ;
return 0 ;
}
2015-03-05 23:00:44 +03:00
2016-02-15 23:09:42 +03:00
/*
* Device info needs to be available for reading the VG backup file in
* pvcreate_each_restore_params_from_backup .
*/
lvmcache_seed_infos_from_lvmetad ( cmd ) ;
/*
* Five kinds of pvcreate param values :
* 1. defaults
* 2. recovery - related command line args
* 3. recovery - related args from backup file
* 4. normal command line args
* ( this also checks some settings from 2 & 3 )
* 5. argc / argv free args specifying devices
*/
pvcreate_each_params_set_defaults ( & pp ) ;
if ( ! pvcreate_each_restore_params_from_args ( cmd , argc , & pp ) )
return EINVALID_CMD_LINE ;
2009-10-06 00:03:25 +04:00
2016-02-15 23:09:42 +03:00
if ( ! pvcreate_each_restore_params_from_backup ( cmd , & pp ) )
2009-10-06 00:03:25 +04:00
return EINVALID_CMD_LINE ;
2016-02-15 23:09:42 +03:00
if ( ! pvcreate_each_params_from_args ( cmd , & pp ) )
2008-07-21 23:26:33 +04:00
return EINVALID_CMD_LINE ;
2016-02-15 23:09:42 +03:00
pp . pv_count = argc ;
pp . pv_names = argv ;
2013-07-01 18:30:12 +04:00
2016-02-15 23:09:42 +03:00
/*
* Needed to change the set of orphan PVs .
* ( disable afterward to prevent process_each_pv from doing
* a shared global lock since it ' s already acquired it ex . )
*/
if ( ! lockd_gl ( cmd , " ex " , 0 ) )
return_ECMD_FAILED ;
cmd - > lockd_gl_disable = 1 ;
if ( ! ( handle = init_processing_handle ( cmd ) ) ) {
log_error ( " Failed to initialize processing handle. " ) ;
return ECMD_FAILED ;
}
2010-09-23 16:02:33 +04:00
2016-02-15 23:09:42 +03:00
if ( ! pvcreate_each_device ( cmd , handle , & pp ) )
ret = ECMD_FAILED ;
else {
/* pvcreate_each_device returns with orphans locked */
unlock_vg ( cmd , VG_ORPHANS ) ;
ret = ECMD_PROCESSED ;
2001-10-12 14:32:06 +04:00
}
2001-10-01 19:29:39 +04:00
2016-02-15 23:09:42 +03:00
destroy_processing_handle ( cmd , handle ) ;
2003-10-22 02:06:07 +04:00
return ret ;
2001-10-01 19:29:39 +04:00
}