@ -738,12 +738,11 @@ static int create_fixed_disk(int fd, uint8_t *buf, int64_t total_size)
return ret ;
}
static int vpc_create ( const char * filename , QEMUOptionParameter * options ,
Error * * errp )
static int vpc_create ( const char * filename , QemuOpts * opts , Error * * errp )
{
uint8_t buf [ 1024 ] ;
VHDFooter * footer = ( VHDFooter * ) buf ;
QEMUOptionParamete r * disk_type_param ;
cha r * disk_type_param ;
int fd , i ;
uint16_t cyls = 0 ;
uint8_t heads = 0 ;
@ -754,16 +753,16 @@ static int vpc_create(const char *filename, QEMUOptionParameter *options,
int ret = - EIO ;
/* Read out options */
total_size = get_option_parameter ( options , BLOCK_OPT_SIZE ) - > value . n ;
disk_type_param = get_option_parameter ( options , BLOCK_OPT_SUBFMT ) ;
if ( disk_type_param & & disk_type_param - > value . s ) {
if ( ! strcmp ( disk_type_param - > value . s , " dynamic " ) ) {
total_size = qemu_opt_get_size_del ( opts , BLOCK_OPT_SIZE , 0 ) ;
disk_type_param = qemu_opt_get_del ( opts , BLOCK_OPT_SUBFMT ) ;
if ( disk_type_param ) {
if ( ! strcmp ( disk_type_param , " dynamic " ) ) {
disk_type = VHD_DYNAMIC ;
} else if ( ! strcmp ( disk_type_param - > value . s , " fixed " ) ) {
} else if ( ! strcmp ( disk_type_param , " fixed " ) ) {
disk_type = VHD_FIXED ;
} else {
return - EINVAL ;
ret = - EINVAL ;
goto out ;
}
} else {
disk_type = VHD_DYNAMIC ;
@ -772,7 +771,8 @@ static int vpc_create(const char *filename, QEMUOptionParameter *options,
/* Create the file */
fd = qemu_open ( filename , O_WRONLY | O_CREAT | O_TRUNC | O_BINARY , 0644 ) ;
if ( fd < 0 ) {
return - EIO ;
ret = - EIO ;
goto out ;
}
/*
@ -837,8 +837,10 @@ static int vpc_create(const char *filename, QEMUOptionParameter *options,
ret = create_fixed_disk ( fd , buf , total_size ) ;
}
fail :
fail :
qemu_close ( fd ) ;
out :
g_free ( disk_type_param ) ;
return ret ;
}
@ -866,20 +868,24 @@ static void vpc_close(BlockDriverState *bs)
error_free ( s - > migration_blocker ) ;
}
static QEMUOptionParameter vpc_create_options [ ] = {
{
. name = BLOCK_OPT_SIZE ,
. type = OPT_SIZE ,
. help = " Virtual disk size "
} ,
{
. name = BLOCK_OPT_SUBFMT ,
. type = OPT_STRING ,
. help =
" Type of virtual hard disk format. Supported formats are "
" {dynamic (default) | fixed} "
} ,
{ NULL }
static QemuOptsList vpc_create_opts = {
. name = " vpc-create-opts " ,
. head = QTAILQ_HEAD_INITIALIZER ( vpc_create_opts . head ) ,
. desc = {
{
. name = BLOCK_OPT_SIZE ,
. type = QEMU_OPT_SIZE ,
. help = " Virtual disk size "
} ,
{
. name = BLOCK_OPT_SUBFMT ,
. type = QEMU_OPT_STRING ,
. help =
" Type of virtual hard disk format. Supported formats are "
" {dynamic (default) | fixed} "
} ,
{ /* end of list */ }
}
} ;
static BlockDriver bdrv_vpc = {
@ -890,14 +896,14 @@ static BlockDriver bdrv_vpc = {
. bdrv_open = vpc_open ,
. bdrv_close = vpc_close ,
. bdrv_reopen_prepare = vpc_reopen_prepare ,
. bdrv_create = vpc_create ,
. bdrv_create2 = vpc_create ,
. bdrv_read = vpc_co_read ,
. bdrv_write = vpc_co_write ,
. bdrv_get_info = vpc_get_info ,
. create_option s = vpc_create_option s ,
. create_opts = & vpc_create_opts ,
. bdrv_has_zero_init = vpc_has_zero_init ,
} ;