提交 030be321 编写于 作者: B Benoît Canet 提交者: Kevin Wolf

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: NBenoit Canet <benoit@irqsave.net>
Reviewed-by: NEric Blake <eblake@redhat.com>
Signed-off-by: NKevin Wolf <kwolf@redhat.com>
上级 2fe2e290
...@@ -792,7 +792,7 @@ static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file, ...@@ -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, ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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[] = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 { ...@@ -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,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册