block: introduce BlockDriver.bdrv_needs_filename to enable some drivers.
Some drivers will have driver specifics options but no filename. This new bool allow the block layer to treat them correctly. The .bdrv_needs_filename is set in drivers not having .bdrv_parse_filename and not having .bdrv_open. The first exception to this rule will be the quorum driver. Signed-off-by: Benoit Canet <benoit@irqsave.net> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
2fe2e29071
commit
030be32184
4
block.c
4
block.c
@ -792,7 +792,7 @@ static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file,
|
|||||||
/* Open the image, either directly or using a protocol */
|
/* Open the image, either directly or using a protocol */
|
||||||
if (drv->bdrv_file_open) {
|
if (drv->bdrv_file_open) {
|
||||||
assert(file == NULL);
|
assert(file == NULL);
|
||||||
assert(drv->bdrv_parse_filename || filename != NULL);
|
assert(!drv->bdrv_needs_filename || filename != NULL);
|
||||||
ret = drv->bdrv_file_open(bs, options, open_flags, &local_err);
|
ret = drv->bdrv_file_open(bs, options, open_flags, &local_err);
|
||||||
} else {
|
} else {
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
@ -911,7 +911,7 @@ int bdrv_file_open(BlockDriverState **pbs, const char *filename,
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
qdict_del(options, "filename");
|
qdict_del(options, "filename");
|
||||||
} else if (!drv->bdrv_parse_filename && !filename) {
|
} else if (drv->bdrv_needs_filename && !filename) {
|
||||||
error_setg(errp, "The '%s' block driver requires a file name",
|
error_setg(errp, "The '%s' block driver requires a file name",
|
||||||
drv->format_name);
|
drv->format_name);
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
|
@ -611,6 +611,7 @@ static BlockDriver bdrv_gluster = {
|
|||||||
.format_name = "gluster",
|
.format_name = "gluster",
|
||||||
.protocol_name = "gluster",
|
.protocol_name = "gluster",
|
||||||
.instance_size = sizeof(BDRVGlusterState),
|
.instance_size = sizeof(BDRVGlusterState),
|
||||||
|
.bdrv_needs_filename = true,
|
||||||
.bdrv_file_open = qemu_gluster_open,
|
.bdrv_file_open = qemu_gluster_open,
|
||||||
.bdrv_close = qemu_gluster_close,
|
.bdrv_close = qemu_gluster_close,
|
||||||
.bdrv_create = qemu_gluster_create,
|
.bdrv_create = qemu_gluster_create,
|
||||||
@ -631,6 +632,7 @@ static BlockDriver bdrv_gluster_tcp = {
|
|||||||
.format_name = "gluster",
|
.format_name = "gluster",
|
||||||
.protocol_name = "gluster+tcp",
|
.protocol_name = "gluster+tcp",
|
||||||
.instance_size = sizeof(BDRVGlusterState),
|
.instance_size = sizeof(BDRVGlusterState),
|
||||||
|
.bdrv_needs_filename = true,
|
||||||
.bdrv_file_open = qemu_gluster_open,
|
.bdrv_file_open = qemu_gluster_open,
|
||||||
.bdrv_close = qemu_gluster_close,
|
.bdrv_close = qemu_gluster_close,
|
||||||
.bdrv_create = qemu_gluster_create,
|
.bdrv_create = qemu_gluster_create,
|
||||||
@ -651,6 +653,7 @@ static BlockDriver bdrv_gluster_unix = {
|
|||||||
.format_name = "gluster",
|
.format_name = "gluster",
|
||||||
.protocol_name = "gluster+unix",
|
.protocol_name = "gluster+unix",
|
||||||
.instance_size = sizeof(BDRVGlusterState),
|
.instance_size = sizeof(BDRVGlusterState),
|
||||||
|
.bdrv_needs_filename = true,
|
||||||
.bdrv_file_open = qemu_gluster_open,
|
.bdrv_file_open = qemu_gluster_open,
|
||||||
.bdrv_close = qemu_gluster_close,
|
.bdrv_close = qemu_gluster_close,
|
||||||
.bdrv_create = qemu_gluster_create,
|
.bdrv_create = qemu_gluster_create,
|
||||||
@ -671,6 +674,7 @@ static BlockDriver bdrv_gluster_rdma = {
|
|||||||
.format_name = "gluster",
|
.format_name = "gluster",
|
||||||
.protocol_name = "gluster+rdma",
|
.protocol_name = "gluster+rdma",
|
||||||
.instance_size = sizeof(BDRVGlusterState),
|
.instance_size = sizeof(BDRVGlusterState),
|
||||||
|
.bdrv_needs_filename = true,
|
||||||
.bdrv_file_open = qemu_gluster_open,
|
.bdrv_file_open = qemu_gluster_open,
|
||||||
.bdrv_close = qemu_gluster_close,
|
.bdrv_close = qemu_gluster_close,
|
||||||
.bdrv_create = qemu_gluster_create,
|
.bdrv_create = qemu_gluster_create,
|
||||||
|
@ -1520,6 +1520,7 @@ static BlockDriver bdrv_iscsi = {
|
|||||||
.protocol_name = "iscsi",
|
.protocol_name = "iscsi",
|
||||||
|
|
||||||
.instance_size = sizeof(IscsiLun),
|
.instance_size = sizeof(IscsiLun),
|
||||||
|
.bdrv_needs_filename = true,
|
||||||
.bdrv_file_open = iscsi_open,
|
.bdrv_file_open = iscsi_open,
|
||||||
.bdrv_close = iscsi_close,
|
.bdrv_close = iscsi_close,
|
||||||
.bdrv_create = iscsi_create,
|
.bdrv_create = iscsi_create,
|
||||||
|
@ -1200,6 +1200,7 @@ static BlockDriver bdrv_file = {
|
|||||||
.format_name = "file",
|
.format_name = "file",
|
||||||
.protocol_name = "file",
|
.protocol_name = "file",
|
||||||
.instance_size = sizeof(BDRVRawState),
|
.instance_size = sizeof(BDRVRawState),
|
||||||
|
.bdrv_needs_filename = true,
|
||||||
.bdrv_probe = NULL, /* no probe for protocols */
|
.bdrv_probe = NULL, /* no probe for protocols */
|
||||||
.bdrv_file_open = raw_open,
|
.bdrv_file_open = raw_open,
|
||||||
.bdrv_reopen_prepare = raw_reopen_prepare,
|
.bdrv_reopen_prepare = raw_reopen_prepare,
|
||||||
@ -1542,6 +1543,7 @@ static BlockDriver bdrv_host_device = {
|
|||||||
.format_name = "host_device",
|
.format_name = "host_device",
|
||||||
.protocol_name = "host_device",
|
.protocol_name = "host_device",
|
||||||
.instance_size = sizeof(BDRVRawState),
|
.instance_size = sizeof(BDRVRawState),
|
||||||
|
.bdrv_needs_filename = true,
|
||||||
.bdrv_probe_device = hdev_probe_device,
|
.bdrv_probe_device = hdev_probe_device,
|
||||||
.bdrv_file_open = hdev_open,
|
.bdrv_file_open = hdev_open,
|
||||||
.bdrv_close = raw_close,
|
.bdrv_close = raw_close,
|
||||||
@ -1667,6 +1669,7 @@ static BlockDriver bdrv_host_floppy = {
|
|||||||
.format_name = "host_floppy",
|
.format_name = "host_floppy",
|
||||||
.protocol_name = "host_floppy",
|
.protocol_name = "host_floppy",
|
||||||
.instance_size = sizeof(BDRVRawState),
|
.instance_size = sizeof(BDRVRawState),
|
||||||
|
.bdrv_needs_filename = true,
|
||||||
.bdrv_probe_device = floppy_probe_device,
|
.bdrv_probe_device = floppy_probe_device,
|
||||||
.bdrv_file_open = floppy_open,
|
.bdrv_file_open = floppy_open,
|
||||||
.bdrv_close = raw_close,
|
.bdrv_close = raw_close,
|
||||||
@ -1769,6 +1772,7 @@ static BlockDriver bdrv_host_cdrom = {
|
|||||||
.format_name = "host_cdrom",
|
.format_name = "host_cdrom",
|
||||||
.protocol_name = "host_cdrom",
|
.protocol_name = "host_cdrom",
|
||||||
.instance_size = sizeof(BDRVRawState),
|
.instance_size = sizeof(BDRVRawState),
|
||||||
|
.bdrv_needs_filename = true,
|
||||||
.bdrv_probe_device = cdrom_probe_device,
|
.bdrv_probe_device = cdrom_probe_device,
|
||||||
.bdrv_file_open = cdrom_open,
|
.bdrv_file_open = cdrom_open,
|
||||||
.bdrv_close = raw_close,
|
.bdrv_close = raw_close,
|
||||||
@ -1890,6 +1894,7 @@ static BlockDriver bdrv_host_cdrom = {
|
|||||||
.format_name = "host_cdrom",
|
.format_name = "host_cdrom",
|
||||||
.protocol_name = "host_cdrom",
|
.protocol_name = "host_cdrom",
|
||||||
.instance_size = sizeof(BDRVRawState),
|
.instance_size = sizeof(BDRVRawState),
|
||||||
|
.bdrv_needs_filename = true,
|
||||||
.bdrv_probe_device = cdrom_probe_device,
|
.bdrv_probe_device = cdrom_probe_device,
|
||||||
.bdrv_file_open = cdrom_open,
|
.bdrv_file_open = cdrom_open,
|
||||||
.bdrv_close = raw_close,
|
.bdrv_close = raw_close,
|
||||||
|
@ -459,6 +459,7 @@ static BlockDriver bdrv_file = {
|
|||||||
.format_name = "file",
|
.format_name = "file",
|
||||||
.protocol_name = "file",
|
.protocol_name = "file",
|
||||||
.instance_size = sizeof(BDRVRawState),
|
.instance_size = sizeof(BDRVRawState),
|
||||||
|
.bdrv_needs_filename = true,
|
||||||
.bdrv_file_open = raw_open,
|
.bdrv_file_open = raw_open,
|
||||||
.bdrv_close = raw_close,
|
.bdrv_close = raw_close,
|
||||||
.bdrv_create = raw_create,
|
.bdrv_create = raw_create,
|
||||||
@ -601,6 +602,7 @@ static BlockDriver bdrv_host_device = {
|
|||||||
.format_name = "host_device",
|
.format_name = "host_device",
|
||||||
.protocol_name = "host_device",
|
.protocol_name = "host_device",
|
||||||
.instance_size = sizeof(BDRVRawState),
|
.instance_size = sizeof(BDRVRawState),
|
||||||
|
.bdrv_needs_filename = true,
|
||||||
.bdrv_probe_device = hdev_probe_device,
|
.bdrv_probe_device = hdev_probe_device,
|
||||||
.bdrv_file_open = hdev_open,
|
.bdrv_file_open = hdev_open,
|
||||||
.bdrv_close = raw_close,
|
.bdrv_close = raw_close,
|
||||||
|
@ -1002,6 +1002,7 @@ static QEMUOptionParameter qemu_rbd_create_options[] = {
|
|||||||
static BlockDriver bdrv_rbd = {
|
static BlockDriver bdrv_rbd = {
|
||||||
.format_name = "rbd",
|
.format_name = "rbd",
|
||||||
.instance_size = sizeof(BDRVRBDState),
|
.instance_size = sizeof(BDRVRBDState),
|
||||||
|
.bdrv_needs_filename = true,
|
||||||
.bdrv_file_open = qemu_rbd_open,
|
.bdrv_file_open = qemu_rbd_open,
|
||||||
.bdrv_close = qemu_rbd_close,
|
.bdrv_close = qemu_rbd_close,
|
||||||
.bdrv_create = qemu_rbd_create,
|
.bdrv_create = qemu_rbd_create,
|
||||||
|
@ -2338,6 +2338,7 @@ static BlockDriver bdrv_sheepdog = {
|
|||||||
.format_name = "sheepdog",
|
.format_name = "sheepdog",
|
||||||
.protocol_name = "sheepdog",
|
.protocol_name = "sheepdog",
|
||||||
.instance_size = sizeof(BDRVSheepdogState),
|
.instance_size = sizeof(BDRVSheepdogState),
|
||||||
|
.bdrv_needs_filename = true,
|
||||||
.bdrv_file_open = sd_open,
|
.bdrv_file_open = sd_open,
|
||||||
.bdrv_close = sd_close,
|
.bdrv_close = sd_close,
|
||||||
.bdrv_create = sd_create,
|
.bdrv_create = sd_create,
|
||||||
@ -2366,6 +2367,7 @@ static BlockDriver bdrv_sheepdog_tcp = {
|
|||||||
.format_name = "sheepdog",
|
.format_name = "sheepdog",
|
||||||
.protocol_name = "sheepdog+tcp",
|
.protocol_name = "sheepdog+tcp",
|
||||||
.instance_size = sizeof(BDRVSheepdogState),
|
.instance_size = sizeof(BDRVSheepdogState),
|
||||||
|
.bdrv_needs_filename = true,
|
||||||
.bdrv_file_open = sd_open,
|
.bdrv_file_open = sd_open,
|
||||||
.bdrv_close = sd_close,
|
.bdrv_close = sd_close,
|
||||||
.bdrv_create = sd_create,
|
.bdrv_create = sd_create,
|
||||||
@ -2394,6 +2396,7 @@ static BlockDriver bdrv_sheepdog_unix = {
|
|||||||
.format_name = "sheepdog",
|
.format_name = "sheepdog",
|
||||||
.protocol_name = "sheepdog+unix",
|
.protocol_name = "sheepdog+unix",
|
||||||
.instance_size = sizeof(BDRVSheepdogState),
|
.instance_size = sizeof(BDRVSheepdogState),
|
||||||
|
.bdrv_needs_filename = true,
|
||||||
.bdrv_file_open = sd_open,
|
.bdrv_file_open = sd_open,
|
||||||
.bdrv_close = sd_close,
|
.bdrv_close = sd_close,
|
||||||
.bdrv_create = sd_create,
|
.bdrv_create = sd_create,
|
||||||
|
@ -73,6 +73,12 @@ struct BlockDriver {
|
|||||||
/* Any driver implementing this callback is expected to be able to handle
|
/* Any driver implementing this callback is expected to be able to handle
|
||||||
* NULL file names in its .bdrv_open() implementation */
|
* NULL file names in its .bdrv_open() implementation */
|
||||||
void (*bdrv_parse_filename)(const char *filename, QDict *options, Error **errp);
|
void (*bdrv_parse_filename)(const char *filename, QDict *options, Error **errp);
|
||||||
|
/* Drivers not implementing bdrv_parse_filename nor bdrv_open should have
|
||||||
|
* this field set to true, except ones that are defined only by their
|
||||||
|
* child's bs.
|
||||||
|
* An example of the last type will be the quorum block driver.
|
||||||
|
*/
|
||||||
|
bool bdrv_needs_filename;
|
||||||
|
|
||||||
/* For handling image reopen for split or non-split files */
|
/* For handling image reopen for split or non-split files */
|
||||||
int (*bdrv_reopen_prepare)(BDRVReopenState *reopen_state,
|
int (*bdrv_reopen_prepare)(BDRVReopenState *reopen_state,
|
||||||
|
Loading…
Reference in New Issue
Block a user