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 [ ] =
2002-01-30 18:04:48 +03:00
" 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 .
*/
2002-02-11 23:50:53 +03:00
static int pvcreate_check ( struct cmd_context * cmd , 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 ? */
2002-02-20 21:29:30 +03:00
if ( ( arg_count ( cmd , force_ARG ) < 1 ) & & ! is_lvm_partition ( name ) ) {
log_error ( " %s: Not LVM partition type: use -f to override " ,
name ) ;
2001-10-12 14:32:06 +04:00
return 0 ;
2002-02-20 21:29:30 +03:00
}
2001-10-01 19:29:39 +04:00
2001-10-12 14:32:06 +04:00
/* is there a pv here already */
2002-04-24 22:20:51 +04:00
if ( ! ( pv = pv_read ( cmd , 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
2002-01-29 22:19:37 +03:00
/* Allow partial & exported VGs to be destroyed. */
2001-10-12 14:32:06 +04:00
/* we must have -ff to overwrite a non orphan */
2002-02-12 00:00:35 +03:00
if ( arg_count ( cmd , force_ARG ) < 2 ) {
2002-01-30 18:04:48 +03:00
log_error ( " Can't initialize physical volume \" %s \" of "
" volume group \" %s \" without -ff " , name , pv - > vg_name ) ;
2001-10-12 14:32:06 +04:00
return 0 ;
2001-10-01 19:29:39 +04:00
}
2001-10-12 14:32:06 +04:00
/* prompt */
2002-02-12 00:00:35 +03:00
if ( ! arg_count ( cmd , yes_ARG ) & &
2001-10-12 14:32:06 +04:00
yes_no_prompt ( _really_init , name , pv - > vg_name ) = = ' n ' ) {
2002-02-20 21:29:30 +03:00
log_print ( " %s: physical volume not initialized " , name ) ;
2001-10-12 14:32:06 +04:00
return 0 ;
2001-10-01 19:29:39 +04:00
}
2002-02-12 00:00:35 +03:00
if ( arg_count ( cmd , force_ARG ) ) {
2001-10-15 22:39:40 +04:00
log_print ( " WARNING: Forcing physical volume creation on "
2002-01-30 18:04:48 +03:00
" %s%s%s%s " , name ,
pv - > vg_name [ 0 ] ? " of volume group \" " : " " ,
pv - > vg_name [ 0 ] ? pv - > vg_name : " " ,
pv - > vg_name [ 0 ] ? " \" " : " " ) ;
2001-10-01 19:29:39 +04:00
}
2001-10-12 14:32:06 +04:00
return 1 ;
}
2002-02-11 23:50:53 +03:00
static void pvcreate_single ( struct cmd_context * cmd , const char * pv_name )
2001-10-12 14:32:06 +04:00
{
struct physical_volume * pv ;
2002-04-24 22:20:51 +04:00
struct format_instance * fid ;
2002-01-16 21:10:08 +03:00
struct id id , * idp = NULL ;
char * uuid ;
2002-02-15 04:26:16 +03:00
uint64_t size = 0 ;
2002-01-16 21:10:08 +03:00
struct device * dev ;
2002-02-12 00:00:35 +03:00
if ( arg_count ( cmd , uuidstr_ARG ) ) {
uuid = arg_str_value ( cmd , uuidstr_ARG , " " ) ;
2002-01-16 21:10:08 +03:00
if ( ! id_read_format ( & id , uuid ) )
return ;
2002-02-11 23:50:53 +03:00
if ( ( dev = uuid_map_lookup ( cmd - > um , & id ) ) ) {
2002-01-30 18:04:48 +03:00
log_error ( " uuid %s already in use on \" %s \" " , uuid ,
2002-01-16 21:10:08 +03:00
dev_name ( dev ) ) ;
return ;
}
idp = & id ;
}
2001-10-02 02:12:10 +04:00
2002-02-11 23:50:53 +03:00
if ( ! pvcreate_check ( cmd , pv_name ) )
2001-10-15 22:39:40 +04:00
return ;
2001-10-01 19:29:39 +04:00
2002-04-24 22:20:51 +04:00
size = arg_int64_value ( cmd , physicalvolumesize_ARG , 0 ) * 2 ;
/* FIXME Use config file/cmd line to specify format */
if ( ! ( fid = cmd - > fmt1 - > ops - > create_instance ( cmd - > fmt1 , NULL , NULL ) ) ) {
log_error ( " Failed to create format1 instance " ) ;
return ;
}
if ( ! ( pv = pv_create ( fid , pv_name , idp , size ) ) ) {
2002-02-20 21:29:30 +03:00
log_error ( " Failed to setup physical volume \" %s \" " , pv_name ) ;
2001-10-02 02:12:10 +04:00
return ;
}
2002-01-30 18:04:48 +03:00
log_verbose ( " Set up physical volume for \" %s \" with % " PRIu64
2002-02-12 00:00:35 +03:00
" sectors " , pv_name , pv - > size ) ;
2001-10-01 19:29:39 +04:00
2002-02-20 21:29:30 +03:00
log_very_verbose ( " Writing physical volume data to disk \" %s \" " ,
pv_name ) ;
2002-04-24 22:20:51 +04:00
if ( ! ( pv_write ( cmd , pv ) ) ) {
2002-01-30 18:04:48 +03: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
}
2002-01-30 18:04:48 +03: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
2002-02-11 23:50:53 +03:00
int pvcreate ( struct cmd_context * cmd , int argc , char * * argv )
2001-10-12 14:32:06 +04:00
{
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
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 " ) ;
return EINVALID_CMD_LINE ;
}
2002-02-12 00:00:35 +03:00
if ( arg_count ( cmd , yes_ARG ) & & ! arg_count ( cmd , 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 + + ) {
2002-02-11 23:50:53 +03:00
pvcreate_single ( cmd , argv [ i ] ) ;
pool_empty ( 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
}