2001-10-09 21:20:02 +04:00
/*
2008-01-30 17:00:02 +03:00
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
2014-10-04 19:05:29 +04:00
* Copyright ( C ) 2004 - 2014 Red Hat , Inc . All rights reserved .
2001-10-09 21:20:02 +04:00
*
2004-03-30 23:35:44 +04:00
* This file is part of LVM2 .
2001-10-09 21:20:02 +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-10-09 21:20:02 +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-10-09 21:20:02 +04:00
*/
# include "tools.h"
2017-10-18 17:57:46 +03:00
static int _vgremove_single ( struct cmd_context * cmd , const char * vg_name ,
struct volume_group * vg ,
struct processing_handle * handle __attribute__ ( ( unused ) ) )
2007-08-21 20:40:33 +04:00
{
2015-03-04 12:44:31 +03:00
/*
* Though vgremove operates per VG by definition , internally , it
* actually means iterating over each LV it contains to do the remove .
*
* Use processing handle with void_handle . internal_report_for_select = 0
* for the process_each_lv_in_vg that is called later in this fn .
* We need to disable internal selection for process_each_lv_in_vg
* here as selection is already done by process_each_vg which calls
* vgremove_single . Otherwise selection would be done per - LV and
* not per - VG as we intend !
*/
struct processing_handle void_handle = { 0 } ;
2014-10-04 19:05:29 +04:00
/*
* Single force is equivalent to sinle - - yes
* Even multiple - - yes are equivalent to single - - force
* When we require - ff it cannot be replaces with - f - y
*/
force_t force = ( force_t ) arg_count ( cmd , force_ARG )
? : ( arg_is_set ( cmd , yes_ARG ) ? DONT_PROMPT : PROMPT ) ;
2010-01-08 17:03:54 +03:00
unsigned lv_count , missing ;
2014-10-07 19:45:45 +04:00
int ret ;
2009-07-11 00:07:02 +04:00
2013-07-01 13:27:22 +04:00
if ( ! vg_check_status ( vg , EXPORTED_VG ) )
return_ECMD_FAILED ;
2009-07-11 00:07:02 +04:00
lv_count = vg_visible_lvs ( vg ) ;
if ( lv_count ) {
2010-01-08 17:03:54 +03:00
if ( force = = PROMPT ) {
if ( ( missing = vg_missing_pv_count ( vg ) ) )
log_warn ( " WARNING: %d physical volumes are currently missing "
" from the system. " , missing ) ;
if ( yes_no_prompt ( " Do you really want to remove volume "
" group \" %s \" containing %u "
" logical volumes? [y/n]: " ,
vg_name , lv_count ) = = ' n ' ) {
log_error ( " Volume group \" %s \" not removed " , vg_name ) ;
return ECMD_FAILED ;
}
2009-07-11 00:07:02 +04:00
}
2015-03-04 12:44:31 +03:00
if ( ( ret = process_each_lv_in_vg ( cmd , vg , NULL , NULL , 1 , & void_handle ,
2016-11-29 21:00:15 +03:00
NULL , ( process_single_lv_fn_t ) lvremove_single ) ) ! = ECMD_PROCESSED ) {
2014-10-07 19:45:45 +04:00
stack ;
return ret ;
}
2009-07-11 00:07:02 +04:00
}
2015-08-24 23:06:23 +03:00
if ( ! lockd_free_vg_before ( cmd , vg , 0 ) )
2015-03-05 23:00:44 +03:00
return_ECMD_FAILED ;
2013-07-01 13:27:22 +04:00
if ( ! force & & ! vg_remove_check ( vg ) )
return_ECMD_FAILED ;
2009-09-03 01:39:29 +04:00
2010-06-30 22:03:52 +04:00
vg_remove_pvs ( vg ) ;
2013-07-01 13:27:22 +04:00
if ( ! vg_remove ( vg ) )
return_ECMD_FAILED ;
2007-08-21 20:40:33 +04:00
2015-03-05 23:00:44 +03:00
lockd_free_vg_final ( cmd , vg ) ;
2007-08-21 20:40:33 +04:00
return ECMD_PROCESSED ;
}
2002-11-18 17:04:08 +03:00
int vgremove ( struct cmd_context * cmd , int argc , char * * argv )
{
int ret ;
2014-12-12 11:34:50 +03:00
if ( ! argc & & ! arg_is_set ( cmd , select_ARG ) ) {
log_error ( " Please enter one or more volume group paths "
2015-03-04 16:40:04 +03:00
" or use --select for selection. " ) ;
2007-03-15 17:00:30 +03:00
return EINVALID_CMD_LINE ;
}
2015-03-05 23:00:44 +03:00
/*
* Needed to change the global VG namespace ,
* and to change the set of orphan PVs .
*/
if ( ! lockd_gl ( cmd , " ex " , LDGL_UPDATE_NAMES ) )
return ECMD_FAILED ;
/*
* This is a special case : if vgremove is given a tag , it causes
* process_each_vg to do lockd_gl ( sh ) when getting a list of all
* VG names . We don ' t want the gl converted to sh , so disable it .
*/
cmd - > lockd_gl_disable = 1 ;
2010-01-08 17:03:54 +03:00
cmd - > handles_missing_pvs = 1 ;
2016-04-29 00:18:20 +03:00
ret = process_each_vg ( cmd , argc , argv , NULL , NULL ,
2016-05-03 12:46:28 +03:00
READ_FOR_UPDATE , 0 ,
2017-10-18 17:57:46 +03:00
NULL , & _vgremove_single ) ;
2002-11-18 17:04:08 +03:00
return ret ;
}