iscsi: add iscsi_create support
PATCH 1/1 iscsi: add iscsi_create support
This patch adds support for bdrv_create. This allows e.g. to use qemu-img to convert from any supported device to an iscsi backed storage as destination.
Signed-off-by Peter Lieven <[email protected]>
block/iscsi.c +50 -0
@@ -952,6 +952,54 @@ static void iscsi_close(BlockDriverState *bs)memset (iscsilun,0 ,sizeof (IscsiLun)); } +static int iscsi_create (const char *filename,QEMUOptionParameter *options) { +int ret =0 ; +int64_t total_size =0 ; +BlockDriverState bs; +IscsiLun *iscsilun =NULL ; + +memset (&bs,0 ,sizeof (BlockDriverState)); + +/* Read out options */ +while (options && options->name) { +if (!strcmp (options->name,"size" )) { + total_size = options->value.n /BDRV_SECTOR_SIZE ; + } + options++; + } + + bs.opaque =g_malloc0 (sizeof (struct IscsiLun )); + iscsilun = bs.opaque; + +if ((ret =iscsi_open (&bs, filename,0 )) !=0 ) { + goto out; + } +if (iscsilun->type !=TYPE_DISK ) { + ret = -ENODEV ; + goto out; + } +if (bs.total_sectors < total_size) { + ret = -ENOSPC ; + } + + ret =0 ; +out: +if (iscsilun->iscsi !=NULL ) { +iscsi_destroy_context (iscsilun->iscsi); + } +g_free (bs.opaque); +return ret; +} + +static QEMUOptionParameter iscsi_create_options[] = { + { + .name =BLOCK_OPT_SIZE , + .type =OPT_SIZE , + .help ="Virtual disk size" + }, + {NULL } +}; +static BlockDriver bdrv_iscsi = { .format_name ="iscsi" , .protocol_name ="iscsi" ,
@@ -959,6 +1007,8 @@ static BlockDriver bdrv_iscsi = { .instance_size = sizeof(IscsiLun), .bdrv_file_open = iscsi_open, .bdrv_close = iscsi_close, + .bdrv_create = iscsi_create, + .create_options = iscsi_create_options, .bdrv_getlength = iscsi_getlength,
Signature · 1 line
1.7.9.5
Paolo Bonzini
AppliedIl 17/11/2012 16:13, Peter Lieven ha scritto:
Quoted 11 lines
This patch adds support for
bdrv_create. This allows e.g. to use qemu-img to convert from any supported device to an iscsi backed storage as destination.Signed-off-by Peter Lieven <[email protected]>block/iscsi.c +0
-0
block/iscsi.c static void iscsi_close(BlockDriverState *bs) · line 955
Quoted 4 lines
block/iscsi.c +1
-0@@ -952,6 +952,54 @@ static void iscsi_close(BlockDriverState *bs)memset (iscsilun,0 ,sizeof (IscsiLun)); } +static int iscsi_create (const char *filename,QEMUOptionParameter *options) {
Incorrect brace positioning, fixed it myself.
+ int ret = 0;
Quoted 51 lines
block/iscsi.c +46
-0+int64_t total_size =0 ; +BlockDriverState bs; +IscsiLun *iscsilun =NULL ; + +memset (&bs,0 ,sizeof (BlockDriverState)); + +/* Read out options */ +while (options && options->name) { +if (!strcmp (options->name,"size" )) { + total_size = options->value.n /BDRV_SECTOR_SIZE ; + } + options++; + } + + bs.opaque =g_malloc0 (sizeof (struct IscsiLun )); + iscsilun = bs.opaque; + +if ((ret =iscsi_open (&bs, filename,0 )) !=0 ) { + goto out; + } +if (iscsilun->type !=TYPE_DISK ) { + ret = -ENODEV ; + goto out; + } +if (bs.total_sectors < total_size) { + ret = -ENOSPC ; + } + + ret =0 ; +out: +if (iscsilun->iscsi !=NULL ) { +iscsi_destroy_context (iscsilun->iscsi); + } +g_free (bs.opaque); +return ret; +} + +static QEMUOptionParameter iscsi_create_options[] = { + { + .name =BLOCK_OPT_SIZE , + .type =OPT_SIZE , + .help ="Virtual disk size" + }, + {NULL } +}; +static BlockDriver bdrv_iscsi = { .format_name ="iscsi" , .protocol_name ="iscsi" ,
block/iscsi.c static BlockDriver bdrv_iscsi = { · line 1014
Quoted 8 lines
block/iscsi.c +2
-0@@ -959,6 +1007,8 @@ static BlockDriver bdrv_iscsi = { .instance_size = sizeof(IscsiLun), .bdrv_file_open = iscsi_open, .bdrv_close = iscsi_close, + .bdrv_create = iscsi_create, + .create_options = iscsi_create_options, .bdrv_getlength = iscsi_getlength,
Applied to scsi-next branch.
Paolo