2001-10-01 19:29:39 +04:00
/*
2001-11-07 11:50:07 +03:00
* Copyright ( C ) 2001 Sistina Software
*
* pvcreate is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 , or ( at your option )
* any later version .
*
* pvcreate is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with LVM ; see the file COPYING . If not , write to
* the Free Software Foundation , 59 Temple Place - Suite 330 ,
* Boston , MA 02111 - 1307 , USA .
2001-10-01 19:29:39 +04:00
*
*/
# include "tools.h"
2001-10-12 14:32:06 +04:00
const char _really_init [ ] =
" Really INITIALIZE physical volume %s of volume group %s [y/n]? " ;
2001-10-01 19:29:39 +04:00
2001-10-12 14:32:06 +04:00
/*
* See if we may pvcreate on this device .
* 0 indicates we may not .
*/
2001-10-15 22:39:40 +04:00
static int pvcreate_check ( const char * name )
2001-10-01 19:29:39 +04:00
{
2001-10-12 14:32:06 +04:00
struct physical_volume * pv ;
2001-10-01 19:29:39 +04:00
2001-10-12 14:32:06 +04:00
/* is the partition type set correctly ? */
if ( ( arg_count ( force_ARG ) < 1 ) & & ! is_lvm_partition ( name ) )
return 0 ;
2001-10-01 19:29:39 +04:00
2001-10-12 14:32:06 +04:00
/* is there a pv here already */
2001-11-12 18:10:01 +03:00
if ( ! ( pv = fid - > ops - > pv_read ( fid , name ) ) )
2001-10-12 14:32:06 +04:00
return 1 ;
2001-10-01 19:29:39 +04:00
2001-10-12 14:32:06 +04:00
/* orphan ? */
if ( ! pv - > vg_name [ 0 ] )
return 1 ;
2001-10-01 19:29:39 +04:00
2001-10-12 14:32:06 +04:00
/* never overwrite exported pv's */
if ( pv - > status & EXPORTED_VG ) {
log_error ( " Physical volume %s belongs to exported volume "
" group %s " , name , pv - > vg_name ) ;
return 0 ;
}
2001-10-01 19:29:39 +04:00
2001-10-15 22:39:40 +04:00
if ( pv - > status & ACTIVE ) {
log_error ( " Can't create on active physical volume %s " , name ) ;
return 0 ;
}
2001-10-12 14:32:06 +04:00
/* we must have -ff to overwrite a non orphan */
if ( arg_count ( force_ARG ) < 2 ) {
log_error ( " Can't initialize physical volume %s of "
" volume group %s without -ff " , name , pv - > vg_name ) ;
return 0 ;
2001-10-01 19:29:39 +04:00
}
2001-10-12 14:32:06 +04:00
/* prompt */
if ( ! arg_count ( yes_ARG ) & &
yes_no_prompt ( _really_init , name , pv - > vg_name ) = = ' n ' ) {
2001-10-12 16:21:43 +04:00
log_print ( " Physical volume %s not initialized " , name ) ;
2001-10-12 14:32:06 +04:00
return 0 ;
2001-10-01 19:29:39 +04:00
}
2001-10-15 22:39:40 +04:00
if ( arg_count ( force_ARG ) ) {
log_print ( " WARNING: Forcing physical volume creation on "
" %s%s%s " , name ,
pv - > vg_name [ 0 ] ? " of volume group " : " " ,
pv - > vg_name [ 0 ] ? pv - > vg_name : " " ) ;
2001-10-01 19:29:39 +04:00
}
2001-10-12 14:32:06 +04:00
return 1 ;
}
2001-10-15 22:39:40 +04:00
static void pvcreate_single ( const char * pv_name )
2001-10-12 14:32:06 +04:00
{
struct physical_volume * pv ;
2001-10-02 02:12:10 +04:00
2001-10-15 22:39:40 +04:00
if ( ! pvcreate_check ( pv_name ) )
return ;
2001-10-01 19:29:39 +04:00
2001-11-12 18:10:01 +03:00
if ( ! ( pv = pv_create ( fid , pv_name ) ) ) {
2001-10-15 22:39:40 +04:00
log_err ( " Failed to setup physical volume %s " , pv_name ) ;
2001-10-02 02:12:10 +04:00
return ;
}
2001-10-15 22:39:40 +04:00
log_verbose ( " Set up physical volume for %s with %llu sectors " ,
pv_name , pv - > size ) ;
2001-10-01 19:29:39 +04:00
2001-10-15 22:39:40 +04:00
log_verbose ( " Writing physical volume data to disk %s " , pv_name ) ;
2001-11-12 18:10:01 +03:00
if ( ! ( fid - > ops - > pv_write ( fid , pv ) ) ) {
2001-10-15 22:39:40 +04:00
log_error ( " Failed to write physical volume %s " , pv_name ) ;
2001-10-12 14:32:06 +04:00
return ;
2001-10-01 19:29:39 +04:00
}
2001-10-15 22:39:40 +04:00
log_print ( " Physical volume %s successfully created " , pv_name ) ;
2001-10-12 14:32:06 +04:00
}
2001-10-01 19:29:39 +04:00
2001-10-12 14:32:06 +04:00
int pvcreate ( int argc , char * * argv )
{
int i ;
2001-10-01 19:29:39 +04:00
2001-10-12 14:32:06 +04:00
if ( ! argc ) {
log_error ( " Please enter a physical volume path " ) ;
return EINVALID_CMD_LINE ;
}
2001-10-01 19:29:39 +04:00
2001-10-12 14:32:06 +04:00
if ( arg_count ( yes_ARG ) & & ! arg_count ( force_ARG ) ) {
2001-10-12 16:21:43 +04:00
log_error ( " Option y can only be given with option f " ) ;
2001-10-12 14:32:06 +04:00
return EINVALID_CMD_LINE ;
2001-10-01 19:29:39 +04:00
}
2001-10-12 14:32:06 +04:00
for ( i = 0 ; i < argc ; i + + ) {
2001-10-12 14:43:36 +04:00
pvcreate_single ( argv [ i ] ) ;
2001-11-12 18:10:01 +03:00
pool_empty ( fid - > cmd - > mem ) ;
2001-10-12 14:32:06 +04:00
}
2001-10-01 19:29:39 +04:00
2001-10-12 14:32:06 +04:00
return 0 ;
2001-10-01 19:29:39 +04:00
}