2002-11-18 17:04:08 +03:00
/*
2004-03-30 23:35:44 +04:00
* Copyright ( C ) 2002 - 2004 Sistina Software , Inc . All rights reserved .
2007-08-21 00:55:30 +04:00
* Copyright ( C ) 2004 - 2007 Red Hat , Inc . All rights reserved .
2002-11-18 17:04:08 +03:00
*
2004-03-30 23:35:44 +04:00
* This file is part of LVM2 .
2002-11-18 17:04:08 +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 .
2002-11-18 17:04:08 +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 ,
* Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
2002-11-18 17:04:08 +03:00
*/
# include "tools.h"
const char _really_wipe [ ] =
" Really WIPE LABELS from physical volume \" %s \" of volume group \" %s \" [y/n]? " ;
/*
* Decide whether it is " safe " to wipe the labels on this device .
* 0 indicates we may not .
*/
static int pvremove_check ( struct cmd_context * cmd , const char * name )
{
struct physical_volume * pv ;
2008-07-24 19:25:09 +04:00
/* FIXME Check partition type is LVM unless --force is given */
2006-04-06 02:24:16 +04:00
/* Is there a pv here already? */
/* If not, this is an error unless you used -f. */
2011-06-01 23:29:31 +04:00
if ( ! ( pv = pv_read ( cmd , name , 1 , 0 ) ) ) {
2006-04-06 02:24:16 +04:00
if ( arg_count ( cmd , force_ARG ) )
return 1 ;
2006-12-13 21:40:23 +03:00
log_error ( " Physical Volume %s not found " , name ) ;
return 0 ;
2006-04-06 02:24:16 +04:00
}
2002-11-18 17:04:08 +03:00
2008-07-31 16:38:31 +04:00
/*
* If a PV has no MDAs it may appear to be an
* orphan until the metadata is read off
* another PV in the same VG . Detecting this
* means checking every VG by scanning every
* PV on the system .
*/
2011-02-21 15:15:59 +03:00
if ( is_orphan ( pv ) & & ! dm_list_size ( & pv - > fid - > metadata_areas_in_use ) & &
! dm_list_size ( & pv - > fid - > metadata_areas_ignored ) ) {
2010-11-23 04:55:53 +03:00
if ( ! scan_vgs_for_pvs ( cmd , 0 ) ) {
2008-07-31 16:38:31 +04:00
log_error ( " Rescan for PVs without metadata areas "
" failed. " ) ;
2011-03-11 17:56:56 +03:00
goto bad ;
2008-07-31 16:38:31 +04:00
}
2011-03-11 17:56:56 +03:00
free_pv_fid ( pv ) ;
2011-06-01 23:29:31 +04:00
if ( ! ( pv = pv_read ( cmd , name , 1 , 0 ) ) ) {
2008-07-31 16:38:31 +04:00
log_error ( " Failed to read physical volume %s " , name ) ;
2011-03-11 17:56:56 +03:00
goto bad ;
2008-07-31 16:38:31 +04:00
}
}
2002-11-18 17:04:08 +03:00
/* orphan ? */
2011-03-11 17:56:56 +03:00
if ( is_orphan ( pv ) ) {
free_pv_fid ( pv ) ;
2002-11-18 17:04:08 +03:00
return 1 ;
2011-03-11 17:56:56 +03:00
}
2002-11-18 17:04:08 +03:00
/* Allow partial & exported VGs to be destroyed. */
/* we must have -ff to overwrite a non orphan */
if ( arg_count ( cmd , force_ARG ) < 2 ) {
2011-02-28 22:35:09 +03:00
log_error ( " PV %s belongs to Volume Group %s so please use vgreduce first. " , name , pv_vg_name ( pv ) ) ;
log_error ( " (If you are certain you need pvremove, then confirm by using --force twice.) " ) ;
2011-03-11 17:56:56 +03:00
goto bad ;
2002-11-18 17:04:08 +03:00
}
/* prompt */
if ( ! arg_count ( cmd , yes_ARG ) & &
2007-06-16 02:16:55 +04:00
yes_no_prompt ( _really_wipe , name , pv_vg_name ( pv ) ) = = ' n ' ) {
2009-12-03 22:18:33 +03:00
log_error ( " %s: physical volume label not removed " , name ) ;
2011-03-11 17:56:56 +03:00
goto bad ;
2002-11-18 17:04:08 +03:00
}
if ( arg_count ( cmd , force_ARG ) ) {
2007-06-28 21:33:44 +04:00
log_warn ( " WARNING: Wiping physical volume label from "
2002-11-18 17:04:08 +03:00
" %s%s%s%s " , name ,
2007-06-14 19:48:05 +04:00
! is_orphan ( pv ) ? " of volume group \" " : " " ,
2007-06-16 02:16:55 +04:00
! is_orphan ( pv ) ? pv_vg_name ( pv ) : " " ,
2007-06-14 19:48:05 +04:00
! is_orphan ( pv ) ? " \" " : " " ) ;
2002-11-18 17:04:08 +03:00
}
2011-03-11 17:56:56 +03:00
free_pv_fid ( pv ) ;
2002-11-18 17:04:08 +03:00
return 1 ;
2011-03-11 17:56:56 +03:00
bad :
free_pv_fid ( pv ) ;
return 0 ;
2002-11-18 17:04:08 +03:00
}
2003-10-22 02:06:07 +04:00
static int pvremove_single ( struct cmd_context * cmd , const char * pv_name ,
2010-07-09 19:34:40 +04:00
void * handle __attribute__ ( ( unused ) ) )
2002-11-18 17:04:08 +03:00
{
struct device * dev ;
2007-11-02 23:40:05 +03:00
int ret = ECMD_FAILED ;
2002-11-18 17:04:08 +03:00
2007-11-02 23:40:05 +03:00
if ( ! lock_vol ( cmd , VG_ORPHANS , LCK_VG_WRITE ) ) {
2002-11-18 17:04:08 +03:00
log_error ( " Can't get lock for orphan PVs " ) ;
2003-10-22 02:06:07 +04:00
return ECMD_FAILED ;
2002-11-18 17:04:08 +03:00
}
if ( ! pvremove_check ( cmd , pv_name ) )
goto error ;
if ( ! ( dev = dev_cache_get ( pv_name , cmd - > filter ) ) ) {
2004-09-14 18:54:58 +04:00
log_error ( " %s: Couldn't find device. Check your filters? " ,
pv_name ) ;
2002-11-18 17:04:08 +03:00
goto error ;
}
2005-10-04 01:10:41 +04:00
if ( ! dev_test_excl ( dev ) ) {
2007-11-22 04:25:06 +03:00
/* FIXME Detect whether device-mapper is still using the device */
2006-11-17 05:45:51 +03:00
log_error ( " Can't open %s exclusively - not removing. "
" Mounted filesystem? " , dev_name ( dev ) ) ;
goto error ;
2005-10-04 01:10:41 +04:00
}
2002-11-18 17:04:08 +03:00
/* Wipe existing label(s) */
if ( ! label_remove ( dev ) ) {
log_error ( " Failed to wipe existing label(s) on %s " , pv_name ) ;
goto error ;
}
2012-02-23 17:11:07 +04:00
lvmetad_pv_gone ( dev - > dev ) ;
2002-11-18 17:04:08 +03:00
log_print ( " Labels on physical volume \" %s \" successfully wiped " ,
pv_name ) ;
2007-11-02 23:40:05 +03:00
ret = ECMD_PROCESSED ;
2003-10-22 02:06:07 +04:00
2002-11-18 17:04:08 +03:00
error :
2007-11-02 23:40:05 +03:00
unlock_vg ( cmd , VG_ORPHANS ) ;
return ret ;
2002-11-18 17:04:08 +03:00
}
int pvremove ( struct cmd_context * cmd , int argc , char * * argv )
{
2003-10-22 02:06:07 +04:00
int i , r ;
int ret = ECMD_PROCESSED ;
2002-11-18 17:04:08 +03:00
if ( ! argc ) {
log_error ( " Please enter a physical volume path " ) ;
return EINVALID_CMD_LINE ;
}
for ( i = 0 ; i < argc ; i + + ) {
2011-08-30 18:55:15 +04:00
dm_unescape_colons_and_at_signs ( argv [ i ] , NULL , NULL ) ;
2003-10-22 02:06:07 +04:00
r = pvremove_single ( cmd , argv [ i ] , NULL ) ;
if ( r > ret )
ret = r ;
2002-11-18 17:04:08 +03:00
}
2003-10-22 02:06:07 +04:00
return ret ;
2002-11-18 17:04:08 +03:00
}